Algorithm-Dependency-1.112/000770 000766 000024 00000000000 13651717723 016004 5ustar00etherstaff000000 000000 Algorithm-Dependency-1.112/INSTALL000644 000766 000024 00000004412 13651717723 017041 0ustar00etherstaff000000 000000 This is the Perl distribution Algorithm-Dependency. Installing Algorithm-Dependency is straightforward. ## Installation with cpanm If you have cpanm, you only need one line: % cpanm Algorithm::Dependency If it does not have permission to install modules to the current perl, cpanm will automatically set up and install to a local::lib in your home directory. See the local::lib documentation (https://metacpan.org/pod/local::lib) for details on enabling it in your environment. ## Installing with the CPAN shell Alternatively, if your CPAN shell is set up, you should just be able to do: % cpan Algorithm::Dependency ## Manual installation As a last resort, you can manually install it. Download the tarball, untar it, install configure prerequisites (see below), then build it: % perl Makefile.PL % make && make test Then install it: % make install On Windows platforms, you should use `dmake` or `nmake`, instead of `make`. If your perl is system-managed, you can create a local::lib in your home directory to install modules to. For details, see the local::lib documentation: https://metacpan.org/pod/local::lib The prerequisites of this distribution will also have to be installed manually. The prerequisites are listed in one of the files: `MYMETA.yml` or `MYMETA.json` generated by running the manual build process described above. ## Configure Prerequisites This distribution requires other modules to be installed before this distribution's installer can be run. They can be found under the "configure_requires" key of META.yml or the "{prereqs}{configure}{requires}" key of META.json. ## Other Prerequisites This distribution may require additional modules to be installed after running Makefile.PL. Look for prerequisites in the following phases: * to run make, PHASE = build * to use the module code itself, PHASE = runtime * to run tests, PHASE = test They can all be found in the "PHASE_requires" key of MYMETA.yml or the "{prereqs}{PHASE}{requires}" key of MYMETA.json. ## Documentation Algorithm-Dependency documentation is available as POD. You can run `perldoc` from a shell to read the documentation: % perldoc Algorithm::Dependency For more information on installing Perl modules via CPAN, please see: https://www.cpan.org/modules/INSTALL.html Algorithm-Dependency-1.112/LICENSE000644 000766 000024 00000043655 13651717723 017031 0ustar00etherstaff000000 000000 This software is copyright (c) 2003 by Adam Kennedy. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. Terms of the Perl programming language system itself a) the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version, or b) the "Artistic License" --- The GNU General Public License, Version 1, February 1989 --- This software is Copyright (c) 2003 by Adam Kennedy. This is free software, licensed under: The GNU General Public License, Version 1, February 1989 GNU GENERAL PUBLIC LICENSE Version 1, February 1989 Copyright (C) 1989 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The license agreements of most software companies try to keep users at the mercy of those companies. By contrast, our General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. The General Public License applies to the Free Software Foundation's software and to any other program whose authors commit to using it. You can use it for your programs, too. When we speak of free software, we are referring to freedom, not price. Specifically, the General Public License is designed to make sure that you have the freedom to give away or sell copies of free software, that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of a such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must tell them their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any work containing the Program or a portion of it, either verbatim or with modifications. Each licensee is addressed as "you". 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this General Public License and to the absence of any warranty; and give any other recipients of the Program a copy of this General Public License along with the Program. You may charge a fee for the physical act of transferring a copy. 2. You may modify your copy or copies of the Program or any portion of it, and copy and distribute such modifications under the terms of Paragraph 1 above, provided that you also do the following: a) cause the modified files to carry prominent notices stating that you changed the files and the date of any change; and b) cause the whole of any work that you distribute or publish, that in whole or in part contains the Program or any part thereof, either with or without modifications, to be licensed at no charge to all third parties under the terms of this General Public License (except that you may choose to grant warranty protection to some or all third parties, at your option). c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the simplest and most usual way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this General Public License. d) You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. Mere aggregation of another independent work with the Program (or its derivative) on a volume of a storage or distribution medium does not bring the other work under the scope of these terms. 3. You may copy and distribute the Program (or a portion or derivative of it, under Paragraph 2) in object code or executable form under the terms of Paragraphs 1 and 2 above provided that you also do one of the following: a) accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Paragraphs 1 and 2 above; or, b) accompany it with a written offer, valid for at least three years, to give any third party free (except for a nominal charge for the cost of distribution) a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Paragraphs 1 and 2 above; or, c) accompany it with the information you received as to where the corresponding source code may be obtained. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form alone.) Source code for a work means the preferred form of the work for making modifications to it. For an executable file, complete source code means all the source code for all modules it contains; but, as a special exception, it need not include source code for modules which are standard libraries that accompany the operating system on which the executable file runs, or for standard header files or definitions files that accompany that operating system. 4. You may not copy, modify, sublicense, distribute or transfer the Program except as expressly provided under this General Public License. Any attempt otherwise to copy, modify, sublicense, distribute or transfer the Program is void, and will automatically terminate your rights to use the Program under this License. However, parties who have received copies, or rights to use copies, from you under this General Public License will not have their licenses terminated so long as such parties remain in full compliance. 5. By copying, distributing or modifying the Program (or any work based on the Program) you indicate your acceptance of this license to do so, and all its terms and conditions. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. 7. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of the license which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the license, you may choose any version ever published by the Free Software Foundation. 8. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to humanity, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19xx name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (a program to direct compilers to make passes at assemblers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice That's all there is to it! --- The Artistic License 1.0 --- This software is Copyright (c) 2003 by Adam Kennedy. This is free software, licensed under: The Artistic License 1.0 The Artistic License Preamble The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. Definitions: - "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. - "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder. - "Copyright Holder" is whoever is named in the copyright or copyrights for the package. - "You" is you, if you're thinking about copying or distributing this Package. - "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) - "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. 1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. 2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. 3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as ftp.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. b) use the modified Package only within your corporation or organization. c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. d) make other distribution arrangements with the Copyright Holder. 4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. b) accompany the distribution with the machine-readable source of the Package with your modifications. c) accompany any non-standard executables with their corresponding Standard Version executables, giving the non-standard executables non-standard names, and clearly documenting the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. d) make other distribution arrangements with the Copyright Holder. 5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. 6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whomever generated them, and may be sold commercially, and may be aggregated with this Package. 7. C or perl subroutines supplied by you and linked into this Package shall not be considered part of this Package. 8. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. 9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. The End Algorithm-Dependency-1.112/CONTRIBUTING000644 000766 000024 00000007774 13651717723 017660 0ustar00etherstaff000000 000000 CONTRIBUTING Thank you for considering contributing to this distribution. This file contains instructions that will help you work with the source code. PLEASE NOTE that if you have any questions or difficulties, you can reach the maintainer(s) through the bug queue described later in this document (preferred), or by emailing the releaser directly. You are not required to follow any of the steps in this document to submit a patch or bug report; these are just recommendations, intended to help you (and help us help you faster). The distribution is managed with Dist::Zilla (https://metacpan.org/release/Dist-Zilla). This means than many of the usual files you might expect are not in the repository, but are generated at release time (e.g. Makefile.PL). However, you can run tests directly using the 'prove' tool: $ prove -l $ prove -lv t/some_test_file.t $ prove -lvr t/ In most cases, 'prove' is entirely sufficient for you to test any patches you have. You may need to satisfy some dependencies. The easiest way to satisfy dependencies is to install the last release -- this is available at https://metacpan.org/release/Algorithm-Dependency If you use cpanminus, you can do it without downloading the tarball first: $ cpanm --reinstall --installdeps --with-recommends Algorithm::Dependency Dist::Zilla is a very powerful authoring tool, but requires a number of author-specific plugins. If you would like to use it for contributing, install it from CPAN, then run one of the following commands, depending on your CPAN client: $ cpan `dzil authordeps --missing` or $ dzil authordeps --missing | cpanm You should then also install any additional requirements not needed by the dzil build but may be needed by tests or other development: $ cpan `dzil listdeps --author --missing` or $ dzil listdeps --author --missing | cpanm Or, you can use the 'dzil stale' command to install all requirements at once: $ cpan Dist::Zilla::App::Command::stale $ cpan `dzil stale --all` or $ cpanm Dist::Zilla::App::Command::stale $ dzil stale --all | cpanm You can also do this via cpanm directly: $ cpanm --reinstall --installdeps --with-develop --with-recommends Algorithm::Dependency Once installed, here are some dzil commands you might try: $ dzil build $ dzil test $ dzil test --release $ dzil xtest $ dzil listdeps --json $ dzil build --notgz You can learn more about Dist::Zilla at http://dzil.org/. The code for this distribution is hosted at GitHub. The repository is: https://github.com/karenetheridge/Algorithm-Dependency You can submit code changes by forking the repository, pushing your code changes to your clone, and then submitting a pull request. Please include a suitable end-user-oriented entry in the Changes file describing your change. Detailed instructions for doing that is available here: https://help.github.com/articles/creating-a-pull-request All pull requests for this distribution will be automatically tested on Linux by Travis at: https://travis-ci.com/karenetheridge/Algorithm-Dependency Results will be visible in the pull request on GitHub. Follow the appropriate links for details when tests fail. Changes will not be mergeable until all tests pass. If you have found a bug, but do not have an accompanying patch to fix it, you can submit an issue report here: https://rt.cpan.org/Public/Dist/Display.html?Name=Algorithm-Dependency or via email: bug-Algorithm-Dependency@rt.cpan.org This is a good place to send your questions about the usage of this distribution. If you send me a patch or pull request, your name and email address will be included in the documentation as a contributor (using the attribution on the commit or patch), unless you specifically request for it not to be. If you wish to be listed under a different name or address, you should submit a pull request to the .mailmap file to contain the correct mapping. This file was generated via Dist::Zilla::Plugin::GenerateFile::FromShareDir 0.014 from a template file originating in Dist-Zilla-PluginBundle-Author-ETHER-0.154. Algorithm-Dependency-1.112/Changes000600 000766 000024 00000006117 13651717723 017277 0ustar00etherstaff000000 000000 Revision history for Perl extension Algorithm-Dependency 1.112 2020-04-28 03:15:25Z - restore prerequisite version declarations from version 1.110 - update documentation to add clarity for how ordered processing works (PR#1) (thanks, Mark Murawski!) 1.111 2018-12-22 01:42:08Z - distribution tooling updates 1.110 2009-04-14 - Upgrading to Module::Install 0.83 1.109 2009-04-09 - Upgrading to Module::Install 0.82 - Adding new method ->weight_merged 1.108 2009-Feb-10 - Allow ->weight to take _STRING instead of only _IDENTIFIER 1.107 2009-Feb-08 - Adding Algorithm::Dependency::Source::Invert 1.106 2008-01-14 - Adding a slight change to 01_compile.t to prevent warnings 1.105_01 2007-12-11 - Make test scripts more 5.005-compatible - Removing the use of base.pm for 5.006-compatibility 1.104 2007-11-12 - No functional changes - Updating to Module::Install 0.68 - Updating bundled tests 1.103 2007-06-29 - No functional changes, no need to upgrade - Updating to Module::Install 0.65 1.102 2006-04-16 - No functional changes, no need to upgrade - Moving from old CVS to new SVN repository - Doing some general cleaning up - Updating to Module::Install 0.62 1.101 2005-10-10 - It appears I overtightened the naming rules. Reversed 1.100 2005-10-10 - Significant version bump to announce addition of major functionality - Added Algorithm::Dependency::Weight - Upgraded a few remaining things to Params::Util 1.04 2005-09-14 - Converted to Module::Install - Added Algorithm::Dependency::Source::HoA by request - Modernised the layout a little - Upgraded from UNIVERSAL::isa to Params::Util to support more complex uses of objects like Adapaters and Decorators. 1.03 2004-08-21 - Because some smoke testers weren't installing Test::ClassAPI's dependencies properly, add them explicitly to the Makefile.PL 1.02 2004-08-20 - Change missing_dependencies to use ->item and ->items rather than accessing the internal directly. This means custom sub-classed Sources don't have to overload ->missing_dependencies. Currently in the documentation, we tell them they don't have to. 1.01 2004-08-20 - Fixed: ignore_orphans did not work for the ::Ordered subclass - Changed to test data directory to the new standard 1.0 2004-07-19 - Updated copyright notice - Updated test suite, and made it more cross-platform friendly - No changes needed for a long time, so incrementing to version 1.0 0.6 2003-11-19 - Fixed several bugs in the POD documentation - Updated version numbers correctly this time 0.5 2003-11-12 - Due to a bug I didn't notice until I had a bad Source, the missing_dependencies method just outright didn't work. Bug fixed and tests added to catch the case in future. 0.4 2003-06-21 10:19:21 - Added the missing_dependencies method to the Source class 0.3 2003-05-11 08:13:42 - Made a stupid mistake in ->schedule_all 0.2 2003-05-11 06:54:32 - Added the ->schedule_all method 0.1 2003-04-16 21:01:52 - original version Algorithm-Dependency-1.112/MANIFEST000644 000766 000024 00000001777 13651717723 017154 0ustar00etherstaff000000 000000 # This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.014. CONTRIBUTING Changes INSTALL LICENSE MANIFEST META.json META.yml Makefile.PL README dist.ini lib/Algorithm/Dependency.pm lib/Algorithm/Dependency/Item.pm lib/Algorithm/Dependency/Ordered.pm lib/Algorithm/Dependency/Source.pm lib/Algorithm/Dependency/Source/File.pm lib/Algorithm/Dependency/Source/HoA.pm lib/Algorithm/Dependency/Source/Invert.pm lib/Algorithm/Dependency/Weight.pm t/00-report-prereqs.dd t/00-report-prereqs.t t/01_compile.t t/02_api.t t/03_basics.t t/04_complex.t t/05_ordered.t t/06_ignore_orphans.t t/07_hoa.t t/08_weight.t t/data/basics.txt t/data/circular.txt t/data/complex.txt t/data/missing.txt xt/author/00-compile.t xt/author/changes_has_content.t xt/author/kwalitee.t xt/author/minimum-version.t xt/author/mojibake.t xt/author/pod-coverage.t xt/author/pod-no404s.t xt/author/pod-spell.t xt/author/pod-syntax.t xt/author/portability.t xt/release/changes_has_content.t xt/release/cpan-changes.t xt/release/distmeta.t Algorithm-Dependency-1.112/t/000770 000766 000024 00000000000 13651717723 016247 5ustar00etherstaff000000 000000 Algorithm-Dependency-1.112/xt/000770 000766 000024 00000000000 13651717723 016437 5ustar00etherstaff000000 000000 Algorithm-Dependency-1.112/README000644 000766 000024 00000000612 13651717723 016666 0ustar00etherstaff000000 000000 This archive contains the distribution Algorithm-Dependency, version 1.112: Base class for implementing various dependency trees This software is copyright (c) 2003 by Adam Kennedy. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. This README file was generated by Dist::Zilla::Plugin::Readme v6.014. Algorithm-Dependency-1.112/META.yml000644 000766 000024 00000064175 13651717723 017275 0ustar00etherstaff000000 000000 --- abstract: 'Base class for implementing various dependency trees' author: - 'Adam Kennedy ' build_requires: ExtUtils::MakeMaker: '0' File::Spec: '0.80' File::Spec::Functions: '0' Test::ClassAPI: '0.6' Test::More: '0.47' perl: '5.006' warnings: '0' configure_requires: ExtUtils::MakeMaker: '0' perl: '5.006' dynamic_config: 0 generated_by: 'Dist::Zilla version 6.014, CPAN::Meta::Converter version 2.150010' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: '1.4' name: Algorithm-Dependency no_index: directory: - t - xt provides: Algorithm::Dependency: file: lib/Algorithm/Dependency.pm version: '1.112' Algorithm::Dependency::Item: file: lib/Algorithm/Dependency/Item.pm version: '1.112' Algorithm::Dependency::Ordered: file: lib/Algorithm/Dependency/Ordered.pm version: '1.112' Algorithm::Dependency::Source: file: lib/Algorithm/Dependency/Source.pm version: '1.112' Algorithm::Dependency::Source::File: file: lib/Algorithm/Dependency/Source/File.pm version: '1.112' Algorithm::Dependency::Source::HoA: file: lib/Algorithm/Dependency/Source/HoA.pm version: '1.112' Algorithm::Dependency::Source::Invert: file: lib/Algorithm/Dependency/Source/Invert.pm version: '1.112' Algorithm::Dependency::Weight: file: lib/Algorithm/Dependency/Weight.pm version: '1.112' requires: List::Util: '1.11' Params::Util: '0.31' perl: '5.006' strict: '0' resources: bugtracker: https://rt.cpan.org/Public/Dist/Display.html?Name=Algorithm-Dependency homepage: https://github.com/karenetheridge/Algorithm-Dependency repository: https://github.com/karenetheridge/Algorithm-Dependency.git version: '1.112' x_Dist_Zilla: perl: version: '5.031010' plugins: - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: develop type: recommends name: '@Author::ETHER/pluginbundle version' version: '6.014' - class: Dist::Zilla::Plugin::PromptIfStale config: Dist::Zilla::Plugin::PromptIfStale: check_all_plugins: 0 check_all_prereqs: 0 modules: - Dist::Zilla::PluginBundle::Author::ETHER phase: build run_under_travis: 0 skip: [] name: '@Author::ETHER/stale modules, build' version: '0.055' - class: Dist::Zilla::Plugin::FileFinder::ByName name: '@Author::ETHER/Examples' version: '6.014' - class: Dist::Zilla::Plugin::Git::GatherDir config: Dist::Zilla::Plugin::GatherDir: exclude_filename: - CONTRIBUTING - INSTALL - LICENSE - README.pod exclude_match: [] follow_symlinks: 0 include_dotfiles: 0 prefix: '' prune_directory: [] root: . Dist::Zilla::Plugin::Git::GatherDir: include_untracked: 0 name: '@Author::ETHER/Git::GatherDir' version: '2.046' - class: Dist::Zilla::Plugin::MetaYAML name: '@Author::ETHER/MetaYAML' version: '6.014' - class: Dist::Zilla::Plugin::MetaJSON name: '@Author::ETHER/MetaJSON' version: '6.014' - class: Dist::Zilla::Plugin::Readme name: '@Author::ETHER/Readme' version: '6.014' - class: Dist::Zilla::Plugin::Manifest name: '@Author::ETHER/Manifest' version: '6.014' - class: Dist::Zilla::Plugin::License name: '@Author::ETHER/License' version: '6.014' - class: Dist::Zilla::Plugin::GenerateFile::FromShareDir config: Dist::Zilla::Plugin::GenerateFile::FromShareDir: destination_filename: CONTRIBUTING dist: Dist-Zilla-PluginBundle-Author-ETHER encoding: UTF-8 has_xs: 0 location: build source_filename: CONTRIBUTING Dist::Zilla::Role::RepoFileInjector: allow_overwrite: 1 repo_root: . version: '0.009' name: '@Author::ETHER/generate CONTRIBUTING' version: '0.014' - class: Dist::Zilla::Plugin::InstallGuide config: Dist::Zilla::Role::ModuleMetadata: Module::Metadata: '1.000037' version: '0.006' name: '@Author::ETHER/InstallGuide' version: '1.200013' - class: Dist::Zilla::Plugin::Test::Compile config: Dist::Zilla::Plugin::Test::Compile: bail_out_on_fail: '1' fail_on_warning: author fake_home: 0 filename: xt/author/00-compile.t module_finder: - ':InstallModules' needs_display: 0 phase: develop script_finder: - ':PerlExecFiles' - '@Author::ETHER/Examples' skips: [] switch: [] name: '@Author::ETHER/Test::Compile' version: '2.058' - class: Dist::Zilla::Plugin::MetaTests name: '@Author::ETHER/MetaTests' version: '6.014' - class: Dist::Zilla::Plugin::Test::CPAN::Changes config: Dist::Zilla::Plugin::Test::CPAN::Changes: changelog: Changes name: '@Author::ETHER/Test::CPAN::Changes' version: '0.012' - class: Dist::Zilla::Plugin::GenerateFile::FromShareDir config: Dist::Zilla::Plugin::GenerateFile::FromShareDir: destination_filename: xt/author/changes_has_content.t dist: Dist-Zilla-PluginBundle-Author-ETHER encoding: UTF-8 location: build source_filename: changes_has_content.t Dist::Zilla::Role::RepoFileInjector: allow_overwrite: 1 repo_root: . version: '0.009' name: '@Author::ETHER/generate xt/author/changes_has_content.t' version: '0.014' - class: Dist::Zilla::Plugin::Test::ChangesHasContent name: '@Author::ETHER/Test::ChangesHasContent' version: '0.011' - class: Dist::Zilla::Plugin::Test::MinimumVersion config: Dist::Zilla::Plugin::Test::MinimumVersion: max_target_perl: '5.006' name: '@Author::ETHER/Test::MinimumVersion' version: '2.000010' - class: Dist::Zilla::Plugin::PodSyntaxTests name: '@Author::ETHER/PodSyntaxTests' version: '6.014' - class: Dist::Zilla::Plugin::PodCoverageTests name: '@Author::ETHER/PodCoverageTests' version: '6.014' - class: Dist::Zilla::Plugin::Test::PodSpelling config: Dist::Zilla::Plugin::Test::PodSpelling: directories: - examples - lib - script - t - xt spell_cmd: '' stopwords: - ARRAYs - irc - param - readonly - unselected wordlist: Pod::Wordlist name: '@Author::ETHER/Test::PodSpelling' version: '2.007005' - class: Dist::Zilla::Plugin::Test::Pod::No404s name: '@Author::ETHER/Test::Pod::No404s' version: '1.004' - class: Dist::Zilla::Plugin::Test::Kwalitee config: Dist::Zilla::Plugin::Test::Kwalitee: filename: xt/author/kwalitee.t skiptest: [] name: '@Author::ETHER/Test::Kwalitee' version: '2.12' - class: Dist::Zilla::Plugin::MojibakeTests name: '@Author::ETHER/MojibakeTests' version: '0.8' - class: Dist::Zilla::Plugin::Test::ReportPrereqs name: '@Author::ETHER/Test::ReportPrereqs' version: '0.027' - class: Dist::Zilla::Plugin::Test::Portability config: Dist::Zilla::Plugin::Test::Portability: options: '' name: '@Author::ETHER/Test::Portability' version: '2.001000' - class: Dist::Zilla::Plugin::Git::Describe name: '@Author::ETHER/Git::Describe' version: '0.007' - class: Dist::Zilla::Plugin::PodWeaver config: Dist::Zilla::Plugin::PodWeaver: config_plugins: - '@Author::ETHER' finder: - ':InstallModules' - ':ExecFiles' plugins: - class: Pod::Weaver::Plugin::EnsurePod5 name: '@Author::ETHER/EnsurePod5' version: '4.015' - class: Pod::Weaver::Plugin::H1Nester name: '@Author::ETHER/H1Nester' version: '4.015' - class: Pod::Weaver::Plugin::SingleEncoding name: '@Author::ETHER/SingleEncoding' version: '4.015' - class: Pod::Weaver::Plugin::Transformer name: '@Author::ETHER/List' version: '4.015' - class: Pod::Weaver::Plugin::Transformer name: '@Author::ETHER/Verbatim' version: '4.015' - class: Pod::Weaver::Section::Region name: '@Author::ETHER/header' version: '4.015' - class: Pod::Weaver::Section::Name name: '@Author::ETHER/Name' version: '4.015' - class: Pod::Weaver::Section::Version name: '@Author::ETHER/Version' version: '4.015' - class: Pod::Weaver::Section::Region name: '@Author::ETHER/prelude' version: '4.015' - class: Pod::Weaver::Section::Generic name: SYNOPSIS version: '4.015' - class: Pod::Weaver::Section::Generic name: DESCRIPTION version: '4.015' - class: Pod::Weaver::Section::Generic name: OVERVIEW version: '4.015' - class: Pod::Weaver::Section::Collect name: ATTRIBUTES version: '4.015' - class: Pod::Weaver::Section::Collect name: METHODS version: '4.015' - class: Pod::Weaver::Section::Collect name: FUNCTIONS version: '4.015' - class: Pod::Weaver::Section::Collect name: TYPES version: '4.015' - class: Pod::Weaver::Section::Leftovers name: '@Author::ETHER/Leftovers' version: '4.015' - class: Pod::Weaver::Section::Region name: '@Author::ETHER/postlude' version: '4.015' - class: Pod::Weaver::Section::GenerateSection name: '@Author::ETHER/generate SUPPORT' version: '1.06' - class: Pod::Weaver::Section::AllowOverride name: '@Author::ETHER/allow override SUPPORT' version: '0.05' - class: Pod::Weaver::Section::Authors name: '@Author::ETHER/Authors' version: '4.015' - class: Pod::Weaver::Section::AllowOverride name: '@Author::ETHER/allow override AUTHOR' version: '0.05' - class: Pod::Weaver::Section::Contributors name: '@Author::ETHER/Contributors' version: '0.009' - class: Pod::Weaver::Section::Legal name: '@Author::ETHER/Legal' version: '4.015' - class: Pod::Weaver::Section::Region name: '@Author::ETHER/footer' version: '4.015' name: '@Author::ETHER/PodWeaver' version: '4.008' - class: Dist::Zilla::Plugin::GithubMeta name: '@Author::ETHER/GithubMeta' version: '0.58' - class: Dist::Zilla::Plugin::AutoMetaResources name: '@Author::ETHER/AutoMetaResources' version: '1.21' - class: Dist::Zilla::Plugin::Authority name: '@Author::ETHER/Authority' version: '1.009' - class: Dist::Zilla::Plugin::MetaNoIndex name: '@Author::ETHER/MetaNoIndex' version: '6.014' - class: Dist::Zilla::Plugin::MetaProvides::Package config: Dist::Zilla::Plugin::MetaProvides::Package: finder: - ':InstallModules' finder_objects: - class: Dist::Zilla::Plugin::FinderCode name: ':InstallModules' version: '6.014' include_underscores: 0 Dist::Zilla::Role::MetaProvider::Provider: $Dist::Zilla::Role::MetaProvider::Provider::VERSION: '2.002004' inherit_missing: '0' inherit_version: '0' meta_noindex: '1' Dist::Zilla::Role::ModuleMetadata: Module::Metadata: '1.000037' version: '0.006' name: '@Author::ETHER/MetaProvides::Package' version: '2.004003' - class: Dist::Zilla::Plugin::MetaConfig name: '@Author::ETHER/MetaConfig' version: '6.014' - class: Dist::Zilla::Plugin::Keywords config: Dist::Zilla::Plugin::Keywords: keywords: [] name: '@Author::ETHER/Keywords' version: '0.007' - class: Dist::Zilla::Plugin::UseUnsafeInc config: Dist::Zilla::Plugin::UseUnsafeInc: dot_in_INC: 0 name: '@Author::ETHER/UseUnsafeInc' version: '0.001' - class: Dist::Zilla::Plugin::AutoPrereqs name: '@Author::ETHER/AutoPrereqs' version: '6.014' - class: Dist::Zilla::Plugin::Prereqs::AuthorDeps name: '@Author::ETHER/Prereqs::AuthorDeps' version: '0.006' - class: Dist::Zilla::Plugin::MinimumPerl name: '@Author::ETHER/MinimumPerl' version: '1.006' - class: Dist::Zilla::Plugin::MakeMaker config: Dist::Zilla::Role::TestRunner: default_jobs: 9 name: '@Author::ETHER/MakeMaker' version: '6.014' - class: Dist::Zilla::Plugin::Git::Contributors config: Dist::Zilla::Plugin::Git::Contributors: git_version: 2.25.0 include_authors: 0 include_releaser: 1 order_by: commits paths: [] name: '@Author::ETHER/Git::Contributors' version: '0.035' - class: Dist::Zilla::Plugin::StaticInstall config: Dist::Zilla::Plugin::StaticInstall: dry_run: 1 mode: auto name: '@Author::ETHER/StaticInstall' version: '0.012' - class: Dist::Zilla::Plugin::RunExtraTests config: Dist::Zilla::Role::TestRunner: default_jobs: 9 name: '@Author::ETHER/RunExtraTests' version: '0.029' - class: Dist::Zilla::Plugin::CheckSelfDependency config: Dist::Zilla::Plugin::CheckSelfDependency: finder: - ':InstallModules' Dist::Zilla::Role::ModuleMetadata: Module::Metadata: '1.000037' version: '0.006' name: '@Author::ETHER/CheckSelfDependency' version: '0.011' - class: Dist::Zilla::Plugin::Run::AfterBuild config: Dist::Zilla::Plugin::Run::Role::Runner: fatal_errors: 1 quiet: 1 run: - "bash -c \"test -e .ackrc && grep -q -- '--ignore-dir=.latest' .ackrc || echo '--ignore-dir=.latest' >> .ackrc; if [[ `dirname '%d'` != .build ]]; then test -e .ackrc && grep -q -- '--ignore-dir=%d' .ackrc || echo '--ignore-dir=%d' >> .ackrc; fi\"" version: '0.048' name: '@Author::ETHER/.ackrc' version: '0.048' - class: Dist::Zilla::Plugin::Run::AfterBuild config: Dist::Zilla::Plugin::Run::Role::Runner: eval: - "if ('%d' =~ /^%n-[.[:xdigit:]]+$/) { unlink '.latest'; symlink '%d', '.latest'; }" fatal_errors: 0 quiet: 1 version: '0.048' name: '@Author::ETHER/.latest' version: '0.048' - class: Dist::Zilla::Plugin::CheckStrictVersion name: '@Author::ETHER/CheckStrictVersion' version: '0.001' - class: Dist::Zilla::Plugin::CheckMetaResources name: '@Author::ETHER/CheckMetaResources' version: '0.001' - class: Dist::Zilla::Plugin::EnsureLatestPerl config: Dist::Zilla::Plugin::EnsureLatestPerl: Module::CoreList: '5.20200320' name: '@Author::ETHER/EnsureLatestPerl' version: '0.008' - class: Dist::Zilla::Plugin::PromptIfStale config: Dist::Zilla::Plugin::PromptIfStale: check_all_plugins: 1 check_all_prereqs: 1 modules: [] phase: release run_under_travis: 0 skip: [] name: '@Author::ETHER/stale modules, release' version: '0.055' - class: Dist::Zilla::Plugin::Git::Check config: Dist::Zilla::Plugin::Git::Check: untracked_files: die Dist::Zilla::Role::Git::DirtyFiles: allow_dirty: [] allow_dirty_match: [] changelog: Changes Dist::Zilla::Role::Git::Repo: git_version: 2.25.0 repo_root: . name: '@Author::ETHER/initial check' version: '2.046' - class: Dist::Zilla::Plugin::Git::CheckFor::MergeConflicts config: Dist::Zilla::Role::Git::Repo: git_version: 2.25.0 repo_root: . name: '@Author::ETHER/Git::CheckFor::MergeConflicts' version: '0.014' - class: Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch config: Dist::Zilla::Role::Git::Repo: git_version: 2.25.0 repo_root: . name: '@Author::ETHER/Git::CheckFor::CorrectBranch' version: '0.014' - class: Dist::Zilla::Plugin::Git::Remote::Check name: '@Author::ETHER/Git::Remote::Check' version: 0.1.2 - class: Dist::Zilla::Plugin::CheckPrereqsIndexed name: '@Author::ETHER/CheckPrereqsIndexed' version: '0.020' - class: Dist::Zilla::Plugin::TestRelease name: '@Author::ETHER/TestRelease' version: '6.014' - class: Dist::Zilla::Plugin::Git::Check config: Dist::Zilla::Plugin::Git::Check: untracked_files: die Dist::Zilla::Role::Git::DirtyFiles: allow_dirty: [] allow_dirty_match: [] changelog: Changes Dist::Zilla::Role::Git::Repo: git_version: 2.25.0 repo_root: . name: '@Author::ETHER/after tests' version: '2.046' - class: Dist::Zilla::Plugin::CheckIssues name: '@Author::ETHER/CheckIssues' version: '0.011' - class: Dist::Zilla::Plugin::UploadToCPAN name: '@Author::ETHER/UploadToCPAN' version: '6.014' - class: Dist::Zilla::Plugin::CopyFilesFromRelease config: Dist::Zilla::Plugin::CopyFilesFromRelease: filename: - CONTRIBUTING - INSTALL - LICENCE - LICENSE - ppport.h match: [] name: '@Author::ETHER/copy generated files' version: '0.007' - class: Dist::Zilla::Plugin::ReadmeAnyFromPod config: Dist::Zilla::Role::FileWatcher: version: '0.006' name: '@Author::ETHER/ReadmeAnyFromPod' version: '0.163250' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: develop type: recommends name: '@Author::ETHER/@Git::VersionManager/pluginbundle version' version: '6.014' - class: Dist::Zilla::Plugin::RewriteVersion::Transitional config: Dist::Zilla::Plugin::RewriteVersion: add_tarball_name: 0 finders: - ':ExecFiles' - ':InstallModules' global: 1 skip_version_provider: 0 Dist::Zilla::Plugin::RewriteVersion::Transitional: {} name: '@Author::ETHER/@Git::VersionManager/RewriteVersion::Transitional' version: '0.009' - class: Dist::Zilla::Plugin::MetaProvides::Update name: '@Author::ETHER/@Git::VersionManager/MetaProvides::Update' version: '0.007' - class: Dist::Zilla::Plugin::CopyFilesFromRelease config: Dist::Zilla::Plugin::CopyFilesFromRelease: filename: - Changes match: [] name: '@Author::ETHER/@Git::VersionManager/CopyFilesFromRelease' version: '0.007' - class: Dist::Zilla::Plugin::Git::Commit config: Dist::Zilla::Plugin::Git::Commit: add_files_in: - . commit_msg: '%N-%v%t%n%n%c' Dist::Zilla::Role::Git::DirtyFiles: allow_dirty: - CONTRIBUTING - Changes - INSTALL - LICENSE - README.pod allow_dirty_match: [] changelog: Changes Dist::Zilla::Role::Git::Repo: git_version: 2.25.0 repo_root: . Dist::Zilla::Role::Git::StringFormatter: time_zone: local name: '@Author::ETHER/@Git::VersionManager/release snapshot' version: '2.046' - class: Dist::Zilla::Plugin::Git::Tag config: Dist::Zilla::Plugin::Git::Tag: branch: ~ changelog: Changes signed: 0 tag: v1.112 tag_format: v%V tag_message: v%v%t Dist::Zilla::Role::Git::Repo: git_version: 2.25.0 repo_root: . Dist::Zilla::Role::Git::StringFormatter: time_zone: local name: '@Author::ETHER/@Git::VersionManager/Git::Tag' version: '2.046' - class: Dist::Zilla::Plugin::BumpVersionAfterRelease::Transitional config: Dist::Zilla::Plugin::BumpVersionAfterRelease: finders: - ':ExecFiles' - ':InstallModules' global: 1 munge_makefile_pl: 1 Dist::Zilla::Plugin::BumpVersionAfterRelease::Transitional: {} name: '@Author::ETHER/@Git::VersionManager/BumpVersionAfterRelease::Transitional' version: '0.009' - class: Dist::Zilla::Plugin::NextRelease name: '@Author::ETHER/@Git::VersionManager/NextRelease' version: '6.014' - class: Dist::Zilla::Plugin::Git::Commit config: Dist::Zilla::Plugin::Git::Commit: add_files_in: [] commit_msg: 'increment $VERSION after %v release' Dist::Zilla::Role::Git::DirtyFiles: allow_dirty: - Build.PL - Changes - Makefile.PL allow_dirty_match: - (?^:^lib/.*\.pm$) changelog: Changes Dist::Zilla::Role::Git::Repo: git_version: 2.25.0 repo_root: . Dist::Zilla::Role::Git::StringFormatter: time_zone: local name: '@Author::ETHER/@Git::VersionManager/post-release commit' version: '2.046' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: x_Dist_Zilla type: requires name: '@Author::ETHER/@Git::VersionManager/prereqs for @Git::VersionManager' version: '6.014' - class: Dist::Zilla::Plugin::Git::Push config: Dist::Zilla::Plugin::Git::Push: push_to: - origin remotes_must_exist: 1 Dist::Zilla::Role::Git::Repo: git_version: 2.25.0 repo_root: . name: '@Author::ETHER/Git::Push' version: '2.046' - class: Dist::Zilla::Plugin::GitHub::Update config: Dist::Zilla::Plugin::GitHub::Update: metacpan: 1 name: '@Author::ETHER/GitHub::Update' version: '0.47' - class: Dist::Zilla::Plugin::Run::AfterRelease config: Dist::Zilla::Plugin::Run::Role::Runner: fatal_errors: 0 quiet: 0 run: - REDACTED version: '0.048' name: '@Author::ETHER/install release' version: '0.048' - class: Dist::Zilla::Plugin::Run::AfterRelease config: Dist::Zilla::Plugin::Run::Role::Runner: eval: - 'print "release complete!\xa"' fatal_errors: 1 quiet: 1 version: '0.048' name: '@Author::ETHER/release complete' version: '0.048' - class: Dist::Zilla::Plugin::ConfirmRelease name: '@Author::ETHER/ConfirmRelease' version: '6.014' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: x_Dist_Zilla type: requires name: '@Author::ETHER/prereqs for @Author::ETHER' version: '6.014' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: runtime type: requires name: Prereqs version: '6.014' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: test type: requires name: TestRequires version: '6.014' - class: Dist::Zilla::Plugin::FinderCode name: ':InstallModules' version: '6.014' - class: Dist::Zilla::Plugin::FinderCode name: ':IncModules' version: '6.014' - class: Dist::Zilla::Plugin::FinderCode name: ':TestFiles' version: '6.014' - class: Dist::Zilla::Plugin::FinderCode name: ':ExtraTestFiles' version: '6.014' - class: Dist::Zilla::Plugin::FinderCode name: ':ExecFiles' version: '6.014' - class: Dist::Zilla::Plugin::FinderCode name: ':PerlExecFiles' version: '6.014' - class: Dist::Zilla::Plugin::FinderCode name: ':ShareFiles' version: '6.014' - class: Dist::Zilla::Plugin::FinderCode name: ':MainModule' version: '6.014' - class: Dist::Zilla::Plugin::FinderCode name: ':AllFiles' version: '6.014' - class: Dist::Zilla::Plugin::FinderCode name: ':NoFiles' version: '6.014' - class: Dist::Zilla::Plugin::VerifyPhases name: '@Author::ETHER/PHASE VERIFICATION' version: '0.016' zilla: class: Dist::Zilla::Dist::Builder config: is_trial: '0' version: '6.014' x_authority: cpan:ADAMK x_contributors: - 'Adam Kennedy ' - 'Karen Etheridge ' - 'Mark Murawski ' x_generated_by_perl: v5.31.10 x_serialization_backend: 'YAML::Tiny version 1.73' x_spdx_expression: 'Artistic-1.0-Perl OR GPL-1.0-or-later' x_use_unsafe_inc: 0 Algorithm-Dependency-1.112/lib/000770 000766 000024 00000000000 13651717723 016552 5ustar00etherstaff000000 000000 Algorithm-Dependency-1.112/Makefile.PL000644 000766 000024 00000002667 13651717723 017774 0ustar00etherstaff000000 000000 # This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v6.014. use strict; use warnings; use 5.006; use ExtUtils::MakeMaker; my %WriteMakefileArgs = ( "ABSTRACT" => "Base class for implementing various dependency trees", "AUTHOR" => "Adam Kennedy ", "CONFIGURE_REQUIRES" => { "ExtUtils::MakeMaker" => 0 }, "DISTNAME" => "Algorithm-Dependency", "LICENSE" => "perl", "MIN_PERL_VERSION" => "5.006", "NAME" => "Algorithm::Dependency", "PREREQ_PM" => { "List::Util" => "1.11", "Params::Util" => "0.31", "strict" => 0 }, "TEST_REQUIRES" => { "ExtUtils::MakeMaker" => 0, "File::Spec" => "0.80", "File::Spec::Functions" => 0, "Test::ClassAPI" => "0.6", "Test::More" => "0.47", "warnings" => 0 }, "VERSION" => "1.112", "test" => { "TESTS" => "t/*.t" } ); my %FallbackPrereqs = ( "ExtUtils::MakeMaker" => 0, "File::Spec" => "0.80", "File::Spec::Functions" => 0, "List::Util" => "1.11", "Params::Util" => "0.31", "Test::ClassAPI" => "0.6", "Test::More" => "0.47", "strict" => 0, "warnings" => 0 ); unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) { delete $WriteMakefileArgs{TEST_REQUIRES}; delete $WriteMakefileArgs{BUILD_REQUIRES}; $WriteMakefileArgs{PREREQ_PM} = \%FallbackPrereqs; } delete $WriteMakefileArgs{CONFIGURE_REQUIRES} unless eval { ExtUtils::MakeMaker->VERSION(6.52) }; WriteMakefile(%WriteMakefileArgs); Algorithm-Dependency-1.112/META.json000644 000766 000024 00000131223 13651717723 017432 0ustar00etherstaff000000 000000 { "abstract" : "Base class for implementing various dependency trees", "author" : [ "Adam Kennedy " ], "dynamic_config" : 0, "generated_by" : "Dist::Zilla version 6.014, CPAN::Meta::Converter version 2.150010", "license" : [ "perl_5" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : 2 }, "name" : "Algorithm-Dependency", "no_index" : { "directory" : [ "t", "xt" ] }, "prereqs" : { "configure" : { "requires" : { "ExtUtils::MakeMaker" : "0", "perl" : "5.006" } }, "develop" : { "recommends" : { "Dist::Zilla::PluginBundle::Author::ETHER" : "0.154", "Dist::Zilla::PluginBundle::Git::VersionManager" : "0.007" }, "requires" : { "Encode" : "0", "File::Spec" : "0", "IO::Handle" : "0", "IPC::Open3" : "0", "Pod::Coverage::TrustPod" : "0", "Pod::Wordlist" : "0", "Test::CPAN::Changes" : "0.19", "Test::CPAN::Meta" : "0", "Test::Kwalitee" : "1.21", "Test::MinimumVersion" : "0", "Test::Mojibake" : "0", "Test::More" : "0.96", "Test::Pod" : "1.41", "Test::Pod::Coverage" : "1.08", "Test::Pod::No404s" : "0", "Test::Portability::Files" : "0", "Test::Spelling" : "0.12", "perl" : "5.006", "warnings" : "0" } }, "runtime" : { "requires" : { "List::Util" : "1.11", "Params::Util" : "0.31", "perl" : "5.006", "strict" : "0" } }, "test" : { "recommends" : { "CPAN::Meta" : "2.120900" }, "requires" : { "ExtUtils::MakeMaker" : "0", "File::Spec" : "0.80", "File::Spec::Functions" : "0", "Test::ClassAPI" : "0.6", "Test::More" : "0.47", "perl" : "5.006", "warnings" : "0" } }, "x_Dist_Zilla" : { "requires" : { "Dist::Zilla" : "5", "Dist::Zilla::Plugin::Authority" : "1.009", "Dist::Zilla::Plugin::AutoMetaResources" : "0", "Dist::Zilla::Plugin::AutoPrereqs" : "5.038", "Dist::Zilla::Plugin::BumpVersionAfterRelease::Transitional" : "0.004", "Dist::Zilla::Plugin::CheckIssues" : "0", "Dist::Zilla::Plugin::CheckMetaResources" : "0", "Dist::Zilla::Plugin::CheckPrereqsIndexed" : "0.019", "Dist::Zilla::Plugin::CheckSelfDependency" : "0", "Dist::Zilla::Plugin::CheckStrictVersion" : "0", "Dist::Zilla::Plugin::ConfirmRelease" : "0", "Dist::Zilla::Plugin::CopyFilesFromRelease" : "0", "Dist::Zilla::Plugin::EnsureLatestPerl" : "0", "Dist::Zilla::Plugin::FileFinder::ByName" : "0", "Dist::Zilla::Plugin::GenerateFile::FromShareDir" : "0", "Dist::Zilla::Plugin::Git::Check" : "0", "Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch" : "0.004", "Dist::Zilla::Plugin::Git::CheckFor::MergeConflicts" : "0", "Dist::Zilla::Plugin::Git::Commit" : "2.020", "Dist::Zilla::Plugin::Git::Contributors" : "0.029", "Dist::Zilla::Plugin::Git::Describe" : "0.004", "Dist::Zilla::Plugin::Git::GatherDir" : "2.016", "Dist::Zilla::Plugin::Git::Push" : "0", "Dist::Zilla::Plugin::Git::Remote::Check" : "0", "Dist::Zilla::Plugin::Git::Tag" : "0", "Dist::Zilla::Plugin::GitHub::Update" : "0.40", "Dist::Zilla::Plugin::GithubMeta" : "0.54", "Dist::Zilla::Plugin::InstallGuide" : "1.200005", "Dist::Zilla::Plugin::Keywords" : "0.004", "Dist::Zilla::Plugin::License" : "5.038", "Dist::Zilla::Plugin::MakeMaker" : "0", "Dist::Zilla::Plugin::Manifest" : "0", "Dist::Zilla::Plugin::MetaConfig" : "0", "Dist::Zilla::Plugin::MetaJSON" : "0", "Dist::Zilla::Plugin::MetaNoIndex" : "0", "Dist::Zilla::Plugin::MetaProvides::Package" : "1.15000002", "Dist::Zilla::Plugin::MetaTests" : "0", "Dist::Zilla::Plugin::MetaYAML" : "0", "Dist::Zilla::Plugin::MinimumPerl" : "1.006", "Dist::Zilla::Plugin::MojibakeTests" : "0.8", "Dist::Zilla::Plugin::NextRelease" : "5.033", "Dist::Zilla::Plugin::PodCoverageTests" : "5.040", "Dist::Zilla::Plugin::PodSyntaxTests" : "5.040", "Dist::Zilla::Plugin::PodWeaver" : "4.005", "Dist::Zilla::Plugin::Prereqs" : "0", "Dist::Zilla::Plugin::Prereqs::AuthorDeps" : "0.006", "Dist::Zilla::Plugin::PromptIfStale" : "0", "Dist::Zilla::Plugin::Readme" : "0", "Dist::Zilla::Plugin::ReadmeAnyFromPod" : "0.142180", "Dist::Zilla::Plugin::RewriteVersion::Transitional" : "0.004", "Dist::Zilla::Plugin::Run::AfterBuild" : "0.041", "Dist::Zilla::Plugin::Run::AfterRelease" : "0.038", "Dist::Zilla::Plugin::RunExtraTests" : "0.024", "Dist::Zilla::Plugin::StaticInstall" : "0.005", "Dist::Zilla::Plugin::Test::CPAN::Changes" : "0.012", "Dist::Zilla::Plugin::Test::ChangesHasContent" : "0", "Dist::Zilla::Plugin::Test::Compile" : "2.039", "Dist::Zilla::Plugin::Test::Kwalitee" : "2.10", "Dist::Zilla::Plugin::Test::MinimumVersion" : "2.000010", "Dist::Zilla::Plugin::Test::Pod::No404s" : "1.003", "Dist::Zilla::Plugin::Test::PodSpelling" : "2.006003", "Dist::Zilla::Plugin::Test::Portability" : "2.000007", "Dist::Zilla::Plugin::Test::ReportPrereqs" : "0.022", "Dist::Zilla::Plugin::TestRelease" : "0", "Dist::Zilla::Plugin::UploadToCPAN" : "0", "Dist::Zilla::Plugin::UseUnsafeInc" : "0", "Dist::Zilla::PluginBundle::Author::ETHER" : "0.119", "Dist::Zilla::PluginBundle::Git::VersionManager" : "0.007", "Software::License::Perl_5" : "0" } } }, "provides" : { "Algorithm::Dependency" : { "file" : "lib/Algorithm/Dependency.pm", "version" : "1.112" }, "Algorithm::Dependency::Item" : { "file" : "lib/Algorithm/Dependency/Item.pm", "version" : "1.112" }, "Algorithm::Dependency::Ordered" : { "file" : "lib/Algorithm/Dependency/Ordered.pm", "version" : "1.112" }, "Algorithm::Dependency::Source" : { "file" : "lib/Algorithm/Dependency/Source.pm", "version" : "1.112" }, "Algorithm::Dependency::Source::File" : { "file" : "lib/Algorithm/Dependency/Source/File.pm", "version" : "1.112" }, "Algorithm::Dependency::Source::HoA" : { "file" : "lib/Algorithm/Dependency/Source/HoA.pm", "version" : "1.112" }, "Algorithm::Dependency::Source::Invert" : { "file" : "lib/Algorithm/Dependency/Source/Invert.pm", "version" : "1.112" }, "Algorithm::Dependency::Weight" : { "file" : "lib/Algorithm/Dependency/Weight.pm", "version" : "1.112" } }, "release_status" : "stable", "resources" : { "bugtracker" : { "mailto" : "bug-Algorithm-Dependency@rt.cpan.org", "web" : "https://rt.cpan.org/Public/Dist/Display.html?Name=Algorithm-Dependency" }, "homepage" : "https://github.com/karenetheridge/Algorithm-Dependency", "repository" : { "type" : "git", "url" : "https://github.com/karenetheridge/Algorithm-Dependency.git", "web" : "https://github.com/karenetheridge/Algorithm-Dependency" } }, "version" : "1.112", "x_Dist_Zilla" : { "perl" : { "version" : "5.031010" }, "plugins" : [ { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "develop", "type" : "recommends" } }, "name" : "@Author::ETHER/pluginbundle version", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::PromptIfStale", "config" : { "Dist::Zilla::Plugin::PromptIfStale" : { "check_all_plugins" : 0, "check_all_prereqs" : 0, "modules" : [ "Dist::Zilla::PluginBundle::Author::ETHER" ], "phase" : "build", "run_under_travis" : 0, "skip" : [] } }, "name" : "@Author::ETHER/stale modules, build", "version" : "0.055" }, { "class" : "Dist::Zilla::Plugin::FileFinder::ByName", "name" : "@Author::ETHER/Examples", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::Git::GatherDir", "config" : { "Dist::Zilla::Plugin::GatherDir" : { "exclude_filename" : [ "CONTRIBUTING", "INSTALL", "LICENSE", "README.pod" ], "exclude_match" : [], "follow_symlinks" : 0, "include_dotfiles" : 0, "prefix" : "", "prune_directory" : [], "root" : "." }, "Dist::Zilla::Plugin::Git::GatherDir" : { "include_untracked" : 0 } }, "name" : "@Author::ETHER/Git::GatherDir", "version" : "2.046" }, { "class" : "Dist::Zilla::Plugin::MetaYAML", "name" : "@Author::ETHER/MetaYAML", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::MetaJSON", "name" : "@Author::ETHER/MetaJSON", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::Readme", "name" : "@Author::ETHER/Readme", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::Manifest", "name" : "@Author::ETHER/Manifest", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::License", "name" : "@Author::ETHER/License", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::GenerateFile::FromShareDir", "config" : { "Dist::Zilla::Plugin::GenerateFile::FromShareDir" : { "destination_filename" : "CONTRIBUTING", "dist" : "Dist-Zilla-PluginBundle-Author-ETHER", "encoding" : "UTF-8", "has_xs" : 0, "location" : "build", "source_filename" : "CONTRIBUTING" }, "Dist::Zilla::Role::RepoFileInjector" : { "allow_overwrite" : 1, "repo_root" : ".", "version" : "0.009" } }, "name" : "@Author::ETHER/generate CONTRIBUTING", "version" : "0.014" }, { "class" : "Dist::Zilla::Plugin::InstallGuide", "config" : { "Dist::Zilla::Role::ModuleMetadata" : { "Module::Metadata" : "1.000037", "version" : "0.006" } }, "name" : "@Author::ETHER/InstallGuide", "version" : "1.200013" }, { "class" : "Dist::Zilla::Plugin::Test::Compile", "config" : { "Dist::Zilla::Plugin::Test::Compile" : { "bail_out_on_fail" : 1, "fail_on_warning" : "author", "fake_home" : 0, "filename" : "xt/author/00-compile.t", "module_finder" : [ ":InstallModules" ], "needs_display" : 0, "phase" : "develop", "script_finder" : [ ":PerlExecFiles", "@Author::ETHER/Examples" ], "skips" : [], "switch" : [] } }, "name" : "@Author::ETHER/Test::Compile", "version" : "2.058" }, { "class" : "Dist::Zilla::Plugin::MetaTests", "name" : "@Author::ETHER/MetaTests", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::Test::CPAN::Changes", "config" : { "Dist::Zilla::Plugin::Test::CPAN::Changes" : { "changelog" : "Changes" } }, "name" : "@Author::ETHER/Test::CPAN::Changes", "version" : "0.012" }, { "class" : "Dist::Zilla::Plugin::GenerateFile::FromShareDir", "config" : { "Dist::Zilla::Plugin::GenerateFile::FromShareDir" : { "destination_filename" : "xt/author/changes_has_content.t", "dist" : "Dist-Zilla-PluginBundle-Author-ETHER", "encoding" : "UTF-8", "location" : "build", "source_filename" : "changes_has_content.t" }, "Dist::Zilla::Role::RepoFileInjector" : { "allow_overwrite" : 1, "repo_root" : ".", "version" : "0.009" } }, "name" : "@Author::ETHER/generate xt/author/changes_has_content.t", "version" : "0.014" }, { "class" : "Dist::Zilla::Plugin::Test::ChangesHasContent", "name" : "@Author::ETHER/Test::ChangesHasContent", "version" : "0.011" }, { "class" : "Dist::Zilla::Plugin::Test::MinimumVersion", "config" : { "Dist::Zilla::Plugin::Test::MinimumVersion" : { "max_target_perl" : "5.006" } }, "name" : "@Author::ETHER/Test::MinimumVersion", "version" : "2.000010" }, { "class" : "Dist::Zilla::Plugin::PodSyntaxTests", "name" : "@Author::ETHER/PodSyntaxTests", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::PodCoverageTests", "name" : "@Author::ETHER/PodCoverageTests", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::Test::PodSpelling", "config" : { "Dist::Zilla::Plugin::Test::PodSpelling" : { "directories" : [ "examples", "lib", "script", "t", "xt" ], "spell_cmd" : "", "stopwords" : [ "ARRAYs", "irc", "param", "readonly", "unselected" ], "wordlist" : "Pod::Wordlist" } }, "name" : "@Author::ETHER/Test::PodSpelling", "version" : "2.007005" }, { "class" : "Dist::Zilla::Plugin::Test::Pod::No404s", "name" : "@Author::ETHER/Test::Pod::No404s", "version" : "1.004" }, { "class" : "Dist::Zilla::Plugin::Test::Kwalitee", "config" : { "Dist::Zilla::Plugin::Test::Kwalitee" : { "filename" : "xt/author/kwalitee.t", "skiptest" : [] } }, "name" : "@Author::ETHER/Test::Kwalitee", "version" : "2.12" }, { "class" : "Dist::Zilla::Plugin::MojibakeTests", "name" : "@Author::ETHER/MojibakeTests", "version" : "0.8" }, { "class" : "Dist::Zilla::Plugin::Test::ReportPrereqs", "name" : "@Author::ETHER/Test::ReportPrereqs", "version" : "0.027" }, { "class" : "Dist::Zilla::Plugin::Test::Portability", "config" : { "Dist::Zilla::Plugin::Test::Portability" : { "options" : "" } }, "name" : "@Author::ETHER/Test::Portability", "version" : "2.001000" }, { "class" : "Dist::Zilla::Plugin::Git::Describe", "name" : "@Author::ETHER/Git::Describe", "version" : "0.007" }, { "class" : "Dist::Zilla::Plugin::PodWeaver", "config" : { "Dist::Zilla::Plugin::PodWeaver" : { "config_plugins" : [ "@Author::ETHER" ], "finder" : [ ":InstallModules", ":ExecFiles" ], "plugins" : [ { "class" : "Pod::Weaver::Plugin::EnsurePod5", "name" : "@Author::ETHER/EnsurePod5", "version" : "4.015" }, { "class" : "Pod::Weaver::Plugin::H1Nester", "name" : "@Author::ETHER/H1Nester", "version" : "4.015" }, { "class" : "Pod::Weaver::Plugin::SingleEncoding", "name" : "@Author::ETHER/SingleEncoding", "version" : "4.015" }, { "class" : "Pod::Weaver::Plugin::Transformer", "name" : "@Author::ETHER/List", "version" : "4.015" }, { "class" : "Pod::Weaver::Plugin::Transformer", "name" : "@Author::ETHER/Verbatim", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Region", "name" : "@Author::ETHER/header", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Name", "name" : "@Author::ETHER/Name", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Version", "name" : "@Author::ETHER/Version", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Region", "name" : "@Author::ETHER/prelude", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "SYNOPSIS", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "DESCRIPTION", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "OVERVIEW", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "ATTRIBUTES", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "METHODS", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "FUNCTIONS", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "TYPES", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Leftovers", "name" : "@Author::ETHER/Leftovers", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Region", "name" : "@Author::ETHER/postlude", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::GenerateSection", "name" : "@Author::ETHER/generate SUPPORT", "version" : "1.06" }, { "class" : "Pod::Weaver::Section::AllowOverride", "name" : "@Author::ETHER/allow override SUPPORT", "version" : "0.05" }, { "class" : "Pod::Weaver::Section::Authors", "name" : "@Author::ETHER/Authors", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::AllowOverride", "name" : "@Author::ETHER/allow override AUTHOR", "version" : "0.05" }, { "class" : "Pod::Weaver::Section::Contributors", "name" : "@Author::ETHER/Contributors", "version" : "0.009" }, { "class" : "Pod::Weaver::Section::Legal", "name" : "@Author::ETHER/Legal", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Region", "name" : "@Author::ETHER/footer", "version" : "4.015" } ] } }, "name" : "@Author::ETHER/PodWeaver", "version" : "4.008" }, { "class" : "Dist::Zilla::Plugin::GithubMeta", "name" : "@Author::ETHER/GithubMeta", "version" : "0.58" }, { "class" : "Dist::Zilla::Plugin::AutoMetaResources", "name" : "@Author::ETHER/AutoMetaResources", "version" : "1.21" }, { "class" : "Dist::Zilla::Plugin::Authority", "name" : "@Author::ETHER/Authority", "version" : "1.009" }, { "class" : "Dist::Zilla::Plugin::MetaNoIndex", "name" : "@Author::ETHER/MetaNoIndex", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::MetaProvides::Package", "config" : { "Dist::Zilla::Plugin::MetaProvides::Package" : { "finder" : [ ":InstallModules" ], "finder_objects" : [ { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":InstallModules", "version" : "6.014" } ], "include_underscores" : 0 }, "Dist::Zilla::Role::MetaProvider::Provider" : { "$Dist::Zilla::Role::MetaProvider::Provider::VERSION" : "2.002004", "inherit_missing" : 0, "inherit_version" : 0, "meta_noindex" : 1 }, "Dist::Zilla::Role::ModuleMetadata" : { "Module::Metadata" : "1.000037", "version" : "0.006" } }, "name" : "@Author::ETHER/MetaProvides::Package", "version" : "2.004003" }, { "class" : "Dist::Zilla::Plugin::MetaConfig", "name" : "@Author::ETHER/MetaConfig", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::Keywords", "config" : { "Dist::Zilla::Plugin::Keywords" : { "keywords" : [] } }, "name" : "@Author::ETHER/Keywords", "version" : "0.007" }, { "class" : "Dist::Zilla::Plugin::UseUnsafeInc", "config" : { "Dist::Zilla::Plugin::UseUnsafeInc" : { "dot_in_INC" : 0 } }, "name" : "@Author::ETHER/UseUnsafeInc", "version" : "0.001" }, { "class" : "Dist::Zilla::Plugin::AutoPrereqs", "name" : "@Author::ETHER/AutoPrereqs", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::Prereqs::AuthorDeps", "name" : "@Author::ETHER/Prereqs::AuthorDeps", "version" : "0.006" }, { "class" : "Dist::Zilla::Plugin::MinimumPerl", "name" : "@Author::ETHER/MinimumPerl", "version" : "1.006" }, { "class" : "Dist::Zilla::Plugin::MakeMaker", "config" : { "Dist::Zilla::Role::TestRunner" : { "default_jobs" : 9 } }, "name" : "@Author::ETHER/MakeMaker", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::Git::Contributors", "config" : { "Dist::Zilla::Plugin::Git::Contributors" : { "git_version" : "2.25.0", "include_authors" : 0, "include_releaser" : 1, "order_by" : "commits", "paths" : [] } }, "name" : "@Author::ETHER/Git::Contributors", "version" : "0.035" }, { "class" : "Dist::Zilla::Plugin::StaticInstall", "config" : { "Dist::Zilla::Plugin::StaticInstall" : { "dry_run" : 1, "mode" : "auto" } }, "name" : "@Author::ETHER/StaticInstall", "version" : "0.012" }, { "class" : "Dist::Zilla::Plugin::RunExtraTests", "config" : { "Dist::Zilla::Role::TestRunner" : { "default_jobs" : 9 } }, "name" : "@Author::ETHER/RunExtraTests", "version" : "0.029" }, { "class" : "Dist::Zilla::Plugin::CheckSelfDependency", "config" : { "Dist::Zilla::Plugin::CheckSelfDependency" : { "finder" : [ ":InstallModules" ] }, "Dist::Zilla::Role::ModuleMetadata" : { "Module::Metadata" : "1.000037", "version" : "0.006" } }, "name" : "@Author::ETHER/CheckSelfDependency", "version" : "0.011" }, { "class" : "Dist::Zilla::Plugin::Run::AfterBuild", "config" : { "Dist::Zilla::Plugin::Run::Role::Runner" : { "fatal_errors" : 1, "quiet" : 1, "run" : [ "bash -c \"test -e .ackrc && grep -q -- '--ignore-dir=.latest' .ackrc || echo '--ignore-dir=.latest' >> .ackrc; if [[ `dirname '%d'` != .build ]]; then test -e .ackrc && grep -q -- '--ignore-dir=%d' .ackrc || echo '--ignore-dir=%d' >> .ackrc; fi\"" ], "version" : "0.048" } }, "name" : "@Author::ETHER/.ackrc", "version" : "0.048" }, { "class" : "Dist::Zilla::Plugin::Run::AfterBuild", "config" : { "Dist::Zilla::Plugin::Run::Role::Runner" : { "eval" : [ "if ('%d' =~ /^%n-[.[:xdigit:]]+$/) { unlink '.latest'; symlink '%d', '.latest'; }" ], "fatal_errors" : 0, "quiet" : 1, "version" : "0.048" } }, "name" : "@Author::ETHER/.latest", "version" : "0.048" }, { "class" : "Dist::Zilla::Plugin::CheckStrictVersion", "name" : "@Author::ETHER/CheckStrictVersion", "version" : "0.001" }, { "class" : "Dist::Zilla::Plugin::CheckMetaResources", "name" : "@Author::ETHER/CheckMetaResources", "version" : "0.001" }, { "class" : "Dist::Zilla::Plugin::EnsureLatestPerl", "config" : { "Dist::Zilla::Plugin::EnsureLatestPerl" : { "Module::CoreList" : "5.20200320" } }, "name" : "@Author::ETHER/EnsureLatestPerl", "version" : "0.008" }, { "class" : "Dist::Zilla::Plugin::PromptIfStale", "config" : { "Dist::Zilla::Plugin::PromptIfStale" : { "check_all_plugins" : 1, "check_all_prereqs" : 1, "modules" : [], "phase" : "release", "run_under_travis" : 0, "skip" : [] } }, "name" : "@Author::ETHER/stale modules, release", "version" : "0.055" }, { "class" : "Dist::Zilla::Plugin::Git::Check", "config" : { "Dist::Zilla::Plugin::Git::Check" : { "untracked_files" : "die" }, "Dist::Zilla::Role::Git::DirtyFiles" : { "allow_dirty" : [], "allow_dirty_match" : [], "changelog" : "Changes" }, "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.25.0", "repo_root" : "." } }, "name" : "@Author::ETHER/initial check", "version" : "2.046" }, { "class" : "Dist::Zilla::Plugin::Git::CheckFor::MergeConflicts", "config" : { "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.25.0", "repo_root" : "." } }, "name" : "@Author::ETHER/Git::CheckFor::MergeConflicts", "version" : "0.014" }, { "class" : "Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch", "config" : { "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.25.0", "repo_root" : "." } }, "name" : "@Author::ETHER/Git::CheckFor::CorrectBranch", "version" : "0.014" }, { "class" : "Dist::Zilla::Plugin::Git::Remote::Check", "name" : "@Author::ETHER/Git::Remote::Check", "version" : "0.1.2" }, { "class" : "Dist::Zilla::Plugin::CheckPrereqsIndexed", "name" : "@Author::ETHER/CheckPrereqsIndexed", "version" : "0.020" }, { "class" : "Dist::Zilla::Plugin::TestRelease", "name" : "@Author::ETHER/TestRelease", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::Git::Check", "config" : { "Dist::Zilla::Plugin::Git::Check" : { "untracked_files" : "die" }, "Dist::Zilla::Role::Git::DirtyFiles" : { "allow_dirty" : [], "allow_dirty_match" : [], "changelog" : "Changes" }, "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.25.0", "repo_root" : "." } }, "name" : "@Author::ETHER/after tests", "version" : "2.046" }, { "class" : "Dist::Zilla::Plugin::CheckIssues", "name" : "@Author::ETHER/CheckIssues", "version" : "0.011" }, { "class" : "Dist::Zilla::Plugin::UploadToCPAN", "name" : "@Author::ETHER/UploadToCPAN", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::CopyFilesFromRelease", "config" : { "Dist::Zilla::Plugin::CopyFilesFromRelease" : { "filename" : [ "CONTRIBUTING", "INSTALL", "LICENCE", "LICENSE", "ppport.h" ], "match" : [] } }, "name" : "@Author::ETHER/copy generated files", "version" : "0.007" }, { "class" : "Dist::Zilla::Plugin::ReadmeAnyFromPod", "config" : { "Dist::Zilla::Role::FileWatcher" : { "version" : "0.006" } }, "name" : "@Author::ETHER/ReadmeAnyFromPod", "version" : "0.163250" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "develop", "type" : "recommends" } }, "name" : "@Author::ETHER/@Git::VersionManager/pluginbundle version", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::RewriteVersion::Transitional", "config" : { "Dist::Zilla::Plugin::RewriteVersion" : { "add_tarball_name" : 0, "finders" : [ ":ExecFiles", ":InstallModules" ], "global" : 1, "skip_version_provider" : 0 }, "Dist::Zilla::Plugin::RewriteVersion::Transitional" : {} }, "name" : "@Author::ETHER/@Git::VersionManager/RewriteVersion::Transitional", "version" : "0.009" }, { "class" : "Dist::Zilla::Plugin::MetaProvides::Update", "name" : "@Author::ETHER/@Git::VersionManager/MetaProvides::Update", "version" : "0.007" }, { "class" : "Dist::Zilla::Plugin::CopyFilesFromRelease", "config" : { "Dist::Zilla::Plugin::CopyFilesFromRelease" : { "filename" : [ "Changes" ], "match" : [] } }, "name" : "@Author::ETHER/@Git::VersionManager/CopyFilesFromRelease", "version" : "0.007" }, { "class" : "Dist::Zilla::Plugin::Git::Commit", "config" : { "Dist::Zilla::Plugin::Git::Commit" : { "add_files_in" : [ "." ], "commit_msg" : "%N-%v%t%n%n%c" }, "Dist::Zilla::Role::Git::DirtyFiles" : { "allow_dirty" : [ "CONTRIBUTING", "Changes", "INSTALL", "LICENSE", "README.pod" ], "allow_dirty_match" : [], "changelog" : "Changes" }, "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.25.0", "repo_root" : "." }, "Dist::Zilla::Role::Git::StringFormatter" : { "time_zone" : "local" } }, "name" : "@Author::ETHER/@Git::VersionManager/release snapshot", "version" : "2.046" }, { "class" : "Dist::Zilla::Plugin::Git::Tag", "config" : { "Dist::Zilla::Plugin::Git::Tag" : { "branch" : null, "changelog" : "Changes", "signed" : 0, "tag" : "v1.112", "tag_format" : "v%V", "tag_message" : "v%v%t" }, "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.25.0", "repo_root" : "." }, "Dist::Zilla::Role::Git::StringFormatter" : { "time_zone" : "local" } }, "name" : "@Author::ETHER/@Git::VersionManager/Git::Tag", "version" : "2.046" }, { "class" : "Dist::Zilla::Plugin::BumpVersionAfterRelease::Transitional", "config" : { "Dist::Zilla::Plugin::BumpVersionAfterRelease" : { "finders" : [ ":ExecFiles", ":InstallModules" ], "global" : 1, "munge_makefile_pl" : 1 }, "Dist::Zilla::Plugin::BumpVersionAfterRelease::Transitional" : {} }, "name" : "@Author::ETHER/@Git::VersionManager/BumpVersionAfterRelease::Transitional", "version" : "0.009" }, { "class" : "Dist::Zilla::Plugin::NextRelease", "name" : "@Author::ETHER/@Git::VersionManager/NextRelease", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::Git::Commit", "config" : { "Dist::Zilla::Plugin::Git::Commit" : { "add_files_in" : [], "commit_msg" : "increment $VERSION after %v release" }, "Dist::Zilla::Role::Git::DirtyFiles" : { "allow_dirty" : [ "Build.PL", "Changes", "Makefile.PL" ], "allow_dirty_match" : [ "(?^:^lib/.*\\.pm$)" ], "changelog" : "Changes" }, "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.25.0", "repo_root" : "." }, "Dist::Zilla::Role::Git::StringFormatter" : { "time_zone" : "local" } }, "name" : "@Author::ETHER/@Git::VersionManager/post-release commit", "version" : "2.046" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "x_Dist_Zilla", "type" : "requires" } }, "name" : "@Author::ETHER/@Git::VersionManager/prereqs for @Git::VersionManager", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::Git::Push", "config" : { "Dist::Zilla::Plugin::Git::Push" : { "push_to" : [ "origin" ], "remotes_must_exist" : 1 }, "Dist::Zilla::Role::Git::Repo" : { "git_version" : "2.25.0", "repo_root" : "." } }, "name" : "@Author::ETHER/Git::Push", "version" : "2.046" }, { "class" : "Dist::Zilla::Plugin::GitHub::Update", "config" : { "Dist::Zilla::Plugin::GitHub::Update" : { "metacpan" : 1 } }, "name" : "@Author::ETHER/GitHub::Update", "version" : "0.47" }, { "class" : "Dist::Zilla::Plugin::Run::AfterRelease", "config" : { "Dist::Zilla::Plugin::Run::Role::Runner" : { "fatal_errors" : 0, "quiet" : 0, "run" : [ "REDACTED" ], "version" : "0.048" } }, "name" : "@Author::ETHER/install release", "version" : "0.048" }, { "class" : "Dist::Zilla::Plugin::Run::AfterRelease", "config" : { "Dist::Zilla::Plugin::Run::Role::Runner" : { "eval" : [ "print \"release complete!\\xa\"" ], "fatal_errors" : 1, "quiet" : 1, "version" : "0.048" } }, "name" : "@Author::ETHER/release complete", "version" : "0.048" }, { "class" : "Dist::Zilla::Plugin::ConfirmRelease", "name" : "@Author::ETHER/ConfirmRelease", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "x_Dist_Zilla", "type" : "requires" } }, "name" : "@Author::ETHER/prereqs for @Author::ETHER", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "runtime", "type" : "requires" } }, "name" : "Prereqs", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "test", "type" : "requires" } }, "name" : "TestRequires", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":InstallModules", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":IncModules", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":TestFiles", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":ExtraTestFiles", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":ExecFiles", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":PerlExecFiles", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":ShareFiles", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":MainModule", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":AllFiles", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":NoFiles", "version" : "6.014" }, { "class" : "Dist::Zilla::Plugin::VerifyPhases", "name" : "@Author::ETHER/PHASE VERIFICATION", "version" : "0.016" } ], "zilla" : { "class" : "Dist::Zilla::Dist::Builder", "config" : { "is_trial" : 0 }, "version" : "6.014" } }, "x_authority" : "cpan:ADAMK", "x_contributors" : [ "Adam Kennedy ", "Karen Etheridge ", "Mark Murawski " ], "x_generated_by_perl" : "v5.31.10", "x_serialization_backend" : "Cpanel::JSON::XS version 4.19", "x_spdx_expression" : "Artistic-1.0-Perl OR GPL-1.0-or-later", "x_use_unsafe_inc" : 0 } Algorithm-Dependency-1.112/dist.ini000600 000766 000024 00000001205 13651717723 017441 0ustar00etherstaff000000 000000 name = Algorithm-Dependency author = Adam Kennedy copyright_holder = Adam Kennedy copyright_year = 2003 license = Perl_5 [@Author::ETHER] :version = 0.119 authority = cpan:ADAMK installer = MakeMaker -remove = Test::EOL -remove = Test::NoTabs -remove = Test::CleanNamespaces ; TODO Test::PodSpelling.stopwords[0] = param Test::PodSpelling.stopwords[1] = readonly Test::PodSpelling.stopwords[2] = unselected Test::PodSpelling.stopwords[3] = ARRAYs [Prereqs] Params::Util = 0.31 List::Util = 1.11 [Prereqs / TestRequires] Test::More = 0.47 File::Spec = 0.80 Test::ClassAPI = 0.6 Algorithm-Dependency-1.112/lib/Algorithm/000770 000766 000024 00000000000 13651717723 020500 5ustar00etherstaff000000 000000 Algorithm-Dependency-1.112/lib/Algorithm/Dependency/000770 000766 000024 00000000000 13651717723 022556 5ustar00etherstaff000000 000000 Algorithm-Dependency-1.112/lib/Algorithm/Dependency.pm000640 000766 000024 00000054103 13651717723 023116 0ustar00etherstaff000000 000000 package Algorithm::Dependency; # git description: v1.111-8-g2fb772e # ABSTRACT: Base class for implementing various dependency trees #pod =pod #pod #pod =head1 SYNOPSIS #pod #pod Typical Usage: Ordering based on dependency requirements #pod #pod use Algorithm::Dependency::Ordered; #pod use Algorithm::Dependency::Source::HoA; #pod #pod my $deps = { #pod core => [ ], #pod a => [ 'core' ], #pod b => [ 'a' ] #pod this => [ ], #pod that => [ ], #pod }; #pod my $deps_source = Algorithm::Dependency::Source::HoA->new( $deps ); #pod #pod my $dep = Algorithm::Dependency::Ordered->new( #pod source => $deps_source, #pod selected => [ 'this', 'that' ], # Items we have processed elsewhere or have already satisfied #pod ) #pod or die 'Failed to set up dependency algorithm'; #pod #pod my $also = $dep->schedule_all(); #pod # Returns: ['core', 'a', 'b'] -- ie: installation-order. Whereas using base #pod # Algorithm::Dependency would return sorted ['a', 'b', 'core'] #pod #pod my $also = $dep->schedule( 'b' ); #pod # Returns: ['core', 'a', 'b'] -- installation order, including ourselves #pod #pod my $also = $dep->depends( 'b' ); #pod # Returns: ['a', 'core'] -- sorted order, not including ourselves #pod #pod Base Classes #pod #pod use Algorithm::Dependency; #pod use Algorithm::Dependency::Source::File; #pod #pod # Load the data from a simple text file #pod my $data_source = Algorithm::Dependency::Source::File->new( 'foo.txt' ); #pod #pod # Create the dependency object, and indicate the items that are already #pod # selected/installed/etc in the database #pod my $dep = Algorithm::Dependency->new( #pod source => $data_source, #pod selected => [ 'This', 'That' ] #pod ) or die 'Failed to set up dependency algorithm'; #pod #pod # For the item 'Foo', find out the other things we also have to select. #pod # This WON'T include the item we selected, 'Foo'. #pod my $also = $dep->depends( 'Foo' ); #pod print $also #pod ? "By selecting 'Foo', you are also selecting the following items: " #pod . join( ', ', @$also ) #pod : "Nothing else to select for 'Foo'"; #pod #pod # Find out the order we need to act on the items in. #pod # This WILL include the item we selected, 'Foo'. #pod my $schedule = $dep->schedule( 'Foo' ); #pod #pod =head1 DESCRIPTION #pod #pod Algorithm::Dependency is a framework for creating simple read-only #pod dependency hierarchies, where you have a set of items that rely on other #pod items in the set, and require actions on them as well. #pod #pod Despite the most visible of these being software installation systems like #pod the CPAN installer, or Debian apt-get, they are useful in other situations. #pod This module intentionally uses implementation-neutral words, to avoid #pod confusion. #pod #pod =head2 Terminology #pod #pod The term C refers to a single entity, such as a single software #pod package, in the overall set of possible entities. Internally, this is a #pod fairly simple object. See L for details. #pod #pod The term C means that a particular item, for your purposes, has already been acted up in the required way. For example, if the software package had already been installed, and didn't need to be re-installed, it would be C. The term C refers to a location that contains the master set of items. This will be very application specific, and might be a flat file, some form of database, the list of files in a folder, or generated dynamically. =head2 General Description =for stopwords versioned Algorithm::Dependency implements algorithms relating to dependency hierarchies. To use this framework, all you need is a source for the master list of all the items, and a list of those already selected. If your dependency hierarchy doesn't require the concept of items that are already selected, simply don't pass anything to the constructor for it. Please note that the class Algorithm::Dependency does NOT implement an ordering, for speed and simplicity reasons. That is, the C it provides is not in any particular order. If item 'A' depends on item 'B', it will not place B before A in the schedule. This makes it unsuitable for things like software installers, as they typically would need B to be installed before A, or the installation of A would fail. For dependency hierarchies requiring the items to be acted on in a particular order, either top down or bottom up, see L. It should be more applicable for your needs. This is the the subclass you would probably use to implement a simple ( non-versioned ) package installation system. Please note that an ordered hierarchy has additional constraints. For example, circular dependencies ARE legal in a non-ordered hierarchy, but ARE NOT legal in an ordered hierarchy. =head2 Extending A module for creating a source from a simple flat file is included. For details see L. Information on creating a source for your particular use is in L. =head1 METHODS =head2 new %args The constructor creates a new context object for the dependency algorithms to act in. It takes as argument a series of options for creating the object. =over 4 =item source => $Source The only compulsory option is the source of the dependency items. This is an object of a subclass of L. In practical terms, this means you will create the source object before creating the Algorithm::Dependency object. =item selected => [ 'A', 'B', 'C', etc... ] The C option provides a list of those items that have already been 'selected', acted upon, installed, or whatever. If another item depends on one in this list, we don't have to include it in the output of the C or C methods. =item ignore_orphans => 1 Normally, the item source is expected to be largely perfect and error free. An 'orphan' is an item name that appears as a dependency of another item, but doesn't exist, or has been deleted. By providing the C flag, orphans are simply ignored. Without the C flag, an error will be returned if an orphan is found. =back The C constructor returns a new Algorithm::Dependency object on success, or C on error. =head2 source The C method retrieves the L object for the algorithm context. =head2 selected_list The C method returns, as a list and in alphabetical order, the list of the names of the selected items. =head2 selected $name Given an item name, the C method will return true if the item is selected, false is not, or C if the item does not exist, or an error occurs. =head2 item $name The C method fetches and returns the item object, as specified by the name argument. Returns an L object on success, or C if an item does not exist for the argument provided. =head2 depends $name1, ..., $nameN Given a list of one or more item names, the C method will return a reference to an array containing a list of the names of all the OTHER items that also have to be selected to meet dependencies. That is, if item A depends on B and C then the C method would return a reference to an array with B and C. ( C<[ 'B', 'C' ]> ) If multiple item names are provided, the same applies. The list returned will not contain duplicates. The method returns a reference to an array of item names on success, a reference to an empty array if no other items are needed, or C on error. NOTE: The result of C is ordered by an internal C irrespective of the ordering provided by the dependency handler. Use L and C to use the most common ordering (process sequence) =head2 schedule $name1, ..., $nameN Given a list of one or more item names, the C method will return, as a reference to an array, the ordered list of items you should act upon in whichever order this particular dependency handler uses - see L for one that implements the most common ordering (process sequence). This would be the original names provided, plus those added to satisfy dependencies, in the preferred order of action. For the normal algorithm, where order it not important, this is alphabetical order. This makes it easier for someone watching a program operate on the items to determine how far you are through the task and makes any logs easier to read. If any of the names you provided in the arguments is already selected, it will not be included in the list. The method returns a reference to an array of item names on success, a reference to an empty array if no items need to be acted upon, or C on error. =head2 schedule_all; The C method acts the same as the C method, but returns a schedule that selected all the so-far unselected items. =head1 TO DO Add the C method, to verify the integrity of the source. Possibly add Algorithm::Dependency::Versions, to implement an ordered dependency tree with versions, like for perl modules. Currently readonly. Make the whole thing writable, so the module can be used as the core of an actual dependency application, as opposed to just being a tool. =head1 SEE ALSO L, L, L, L =head1 SUPPORT Bugs may be submitted through L (or L). =head1 AUTHOR Adam Kennedy =head1 CONTRIBUTORS =for stopwords Adam Kennedy Karen Etheridge Mark Murawski =over 4 =item * Adam Kennedy =item * Karen Etheridge =item * Mark Murawski =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2003 by Adam Kennedy. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Algorithm-Dependency-1.112/lib/Algorithm/Dependency/Source/000770 000766 000024 00000000000 13651717723 024016 5ustar00etherstaff000000 000000 Algorithm-Dependency-1.112/lib/Algorithm/Dependency/Weight.pm000600 000766 000024 00000026115 13651717723 024343 0ustar00etherstaff000000 000000 package Algorithm::Dependency::Weight; # ABSTRACT: Calculate dependency 'weights' #pod =pod #pod #pod =head1 SYNOPSIS #pod #pod # Create a source from a file #pod my $Source = Algorithm::Dependency::Source->new( 'file.txt' ); #pod #pod # Create a Weight algorithm object #pod my $alg = Algorithm::Dependency::Weight->new( source => $Source ); #pod #pod # Find the weight for a single item #pod my $weight = $alg->weight('foo'); #pod print "The weight of 'foo' is $weight\n"; #pod #pod # Or a group #pod my $hash = $alg->weight_hash('foo', 'bar', 'baz'); #pod print "The weight of 'foo', 'bar', and 'bar' are $hash->{foo}," #pod . " $hash->{bar} and $hash->{baz} respectively\n"; #pod #pod # Or all of the items #pod my $all = $alg->weight_all; #pod print "The following is a list from heaviest to lightest:\n"; #pod foreach ( sort { $all->{$b} <=> $all->{$a} } keys %$all ) { #pod print "$_: $all->{$_}\n"; #pod } #pod #pod =head1 DESCRIPTION #pod #pod In dependency systems, it can often be very useful to calculate #pod an aggregate or sum for one or all items. For example, to find #pod the "naive install weight" of a Perl distribution (where "naive" #pod means you treat each distribution equally), you would want the #pod distribution (1) + all its dependencies (n) + all B #pod dependencies (n2) recursively downwards. #pod #pod If calculated using a normal L object, the #pod result would be (in a simple systems) equal to: #pod #pod # Create your normal (non-ordered alg:dep) #pod my $dependency = Algorithm::Dependency->new( ... ); #pod #pod # Find the naive weight for an item #pod my $weight = scalar($dependency->schedule('itemname')); #pod #pod C provides a way of doing this #pod with a little more sophistication, and in a way that should work #pod reasonable well across all the L family. #pod #pod Please note that the this might be a little (or more than a little) #pod slower than it could be for the limited case of generating weights #pod for all of the items at once in a dependency system with no selected #pod items and no circular dependencies. BUT you can at least rely on #pod this class to do the job properly regardless of the particulars of #pod the situation, which is probably more important. #pod #pod =head2 METHODS #pod #pod =cut use 5.005; use strict; use List::Util (); use Algorithm::Dependency (); use Params::Util qw{_INSTANCE _STRING}; our $VERSION = '1.112'; ##################################################################### # Constructor and Accessors #pod =pod #pod #pod =head2 new @params #pod #pod The C constructor creates a new C #pod object. It takes a number of key/value pairs as parameters (although #pod at the present time only one). #pod #pod =over 4 #pod #pod =item source => $Source #pod #pod The C param is mostly the same as for L. #pod The one addition is that as a source you can provide an #pod L object, and the L #pod for that will be used. #pod #pod =back #pod #pod Returns a new C object, or C on error. #pod #pod =cut sub new { my $class = shift; my %args = @_; # Get the source object, or derive it from an existing alg-dep my $source = _INSTANCE($args{source}, 'Algorithm::Dependency') ? $args{source}->source : _INSTANCE($args{source}, 'Algorithm::Dependency::Source') or return undef; # Build the alg-dep object we use my $algdep = Algorithm::Dependency->new( source => $source, ignore_orphans => 1, ) or return undef; # Create the basic object my $self = bless { source => $source, algdep => $algdep, weight => {}, }, $class; $self; } #pod =pod #pod #pod =head2 source #pod #pod The C accessor returns the source used for the weight calculations. #pod #pod This will be either the one passed to the constructor, or the source from #pod inside the C object passed as the C param #pod (B the object itself, B source). #pod #pod =cut sub source { $_[0]->{source} } ##################################################################### # Algorithm::Dependency::Weight Methods #pod =pod #pod #pod =head2 weight $name #pod #pod The C method takes the name of a single item and calculates its #pod weight based on the configuration of the C #pod object. #pod #pod Returns the weight as a scalar (which in the naive case will be an #pod integer, but in more complex uses may be any real number), or C #pod on error. #pod #pod =cut sub weight { my $self = shift; my $id = defined(_STRING($_[0])) ? shift : return undef; $self->{weight}->{$id} or $self->{weight}->{$id} = $self->_weight($id); } sub _weight { my $self = shift; my $items = $self->{algdep}->schedule($_[0]) or return undef; scalar(@$items); } #pod =pod #pod #pod =head2 weight_merged @names #pod #pod The C method takes the name of a set of items and #pod calculates an aggregated weight for the whole set. #pod #pod Returns the weight as a scalar, or C on error. #pod #pod =cut sub weight_merged { my $self = shift; my $items = $self->{algdep}->schedule(@_) or return undef; scalar(@$items); } #pod =pod #pod #pod =head2 weight_hash @names #pod #pod The C method takes a list of item names, and calculates #pod their weights. #pod #pod Returns a reference to a C with the item names as keys and weights #pod as values, or C on error. #pod #pod =cut sub weight_hash { my $self = shift; my @names = @_; # Iterate over the list my %hash = (); foreach my $name ( @names ) { if ( $self->{weight}->{$name} ) { $hash{$name} = $self->{weight}->{$name}; next; } $hash{$name} = $self->weight($name) or return undef; } \%hash; } #pod =pod #pod #pod =head2 weight_all #pod #pod The C method provides the one-shot method for getting the #pod weights of all items at once. Please note that this does not do #pod anything different or special, but is slightly faster than iterating #pod yourself. #pod #pod Returns a reference to a C with the item names as keys and weights #pod as values, or C on error. #pod #pod =cut sub weight_all { my $self = shift; my @items = $self->source->items; defined $items[0] or return undef; $self->weight_hash( map { $_->id } @items ); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Algorithm::Dependency::Weight - Calculate dependency 'weights' =head1 VERSION version 1.112 =head1 SYNOPSIS # Create a source from a file my $Source = Algorithm::Dependency::Source->new( 'file.txt' ); # Create a Weight algorithm object my $alg = Algorithm::Dependency::Weight->new( source => $Source ); # Find the weight for a single item my $weight = $alg->weight('foo'); print "The weight of 'foo' is $weight\n"; # Or a group my $hash = $alg->weight_hash('foo', 'bar', 'baz'); print "The weight of 'foo', 'bar', and 'bar' are $hash->{foo}," . " $hash->{bar} and $hash->{baz} respectively\n"; # Or all of the items my $all = $alg->weight_all; print "The following is a list from heaviest to lightest:\n"; foreach ( sort { $all->{$b} <=> $all->{$a} } keys %$all ) { print "$_: $all->{$_}\n"; } =head1 DESCRIPTION In dependency systems, it can often be very useful to calculate an aggregate or sum for one or all items. For example, to find the "naive install weight" of a Perl distribution (where "naive" means you treat each distribution equally), you would want the distribution (1) + all its dependencies (n) + all B dependencies (n2) recursively downwards. If calculated using a normal L object, the result would be (in a simple systems) equal to: # Create your normal (non-ordered alg:dep) my $dependency = Algorithm::Dependency->new( ... ); # Find the naive weight for an item my $weight = scalar($dependency->schedule('itemname')); C provides a way of doing this with a little more sophistication, and in a way that should work reasonable well across all the L family. Please note that the this might be a little (or more than a little) slower than it could be for the limited case of generating weights for all of the items at once in a dependency system with no selected items and no circular dependencies. BUT you can at least rely on this class to do the job properly regardless of the particulars of the situation, which is probably more important. =head2 METHODS =head2 new @params The C constructor creates a new C object. It takes a number of key/value pairs as parameters (although at the present time only one). =over 4 =item source => $Source The C param is mostly the same as for L. The one addition is that as a source you can provide an L object, and the L for that will be used. =back Returns a new C object, or C on error. =head2 source The C accessor returns the source used for the weight calculations. This will be either the one passed to the constructor, or the source from inside the C object passed as the C param (B the object itself, B source). =head2 weight $name The C method takes the name of a single item and calculates its weight based on the configuration of the C object. Returns the weight as a scalar (which in the naive case will be an integer, but in more complex uses may be any real number), or C on error. =head2 weight_merged @names The C method takes the name of a set of items and calculates an aggregated weight for the whole set. Returns the weight as a scalar, or C on error. =head2 weight_hash @names The C method takes a list of item names, and calculates their weights. Returns a reference to a C with the item names as keys and weights as values, or C on error. =head2 weight_all The C method provides the one-shot method for getting the weights of all items at once. Please note that this does not do anything different or special, but is slightly faster than iterating yourself. Returns a reference to a C with the item names as keys and weights as values, or C on error. =head1 TO DO - Add support for non-naive weights via either custom code or method name =head1 SEE ALSO L, L =head1 SUPPORT Bugs may be submitted through L (or L). =head1 AUTHOR Adam Kennedy =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2003 by Adam Kennedy. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Algorithm-Dependency-1.112/lib/Algorithm/Dependency/Ordered.pm000600 000766 000024 00000007357 13651717723 024507 0ustar00etherstaff000000 000000 package Algorithm::Dependency::Ordered; # ABSTRACT: Implements an ordered dependency hierarchy #pod =pod #pod #pod =head1 DESCRIPTION #pod #pod Algorithm::Dependency::Ordered implements the most common variety of #pod L, the one in which the dependencies of an item must #pod be acted upon before the item itself can be acted upon. #pod #pod In use and semantics, this should be used in exactly the same way as for the #pod main parent class. Please note that the output of the C method is #pod NOT changed, as the order of the depends is not assumed to be important. #pod Only the output of the C method is modified to ensure the correct #pod order. #pod #pod For API details, see L. #pod #pod =cut use 5.005; use strict; use Algorithm::Dependency (); our $VERSION = '1.112'; our @ISA = 'Algorithm::Dependency'; sub schedule { my $self = shift; my $source = $self->{source}; my @items = @_ or return undef; return undef if grep { ! $source->item($_) } @items; # The actual items to select will be the same as for the unordered # version, so we can simplify the algorithm greatly by using the # normal unordered ->schedule method to get the starting list. my $rv = $self->SUPER::schedule( @items ); my @queue = $rv ? @$rv : return undef; # Get a working copy of the selected index my %selected = %{ $self->{selected} }; # If at any time we check every item in the stack without finding # a suitable candidate for addition to the schedule, we have found # a circular reference error. We need to create a marker to track this. my $error_marker = ''; # Begin the processing loop my @schedule = (); while ( my $id = shift @queue ) { # Have we checked every item in the stack? return undef if $id eq $error_marker; # Are there any un-met dependencies my $Item = $self->{source}->item($id) or return undef; my @missing = grep { ! $selected{$_} } $Item->depends; # Remove orphans if we are ignoring them if ( $self->{ignore_orphans} ) { @missing = grep { $self->{source}->item($_) } @missing; } if ( @missing ) { # Set the error marker if not already $error_marker = $id unless $error_marker; # Add the id back to the end of the queue push @queue, $id; next; } # All dependencies have been met. Add the item to the schedule and # to the selected index, and clear the error marker. push @schedule, $id; $selected{$id} = 1; $error_marker = ''; } # All items have been added \@schedule; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Algorithm::Dependency::Ordered - Implements an ordered dependency hierarchy =head1 VERSION version 1.112 =head1 DESCRIPTION Algorithm::Dependency::Ordered implements the most common variety of L, the one in which the dependencies of an item must be acted upon before the item itself can be acted upon. In use and semantics, this should be used in exactly the same way as for the main parent class. Please note that the output of the C method is NOT changed, as the order of the depends is not assumed to be important. Only the output of the C method is modified to ensure the correct order. For API details, see L. =head1 SEE ALSO L =head1 SUPPORT Bugs may be submitted through L (or L). =head1 AUTHOR Adam Kennedy =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2003 by Adam Kennedy. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Algorithm-Dependency-1.112/lib/Algorithm/Dependency/Item.pm000600 000766 000024 00000005667 13651717723 024023 0ustar00etherstaff000000 000000 package Algorithm::Dependency::Item; # ABSTRACT: Implements an item in a dependency hierarchy. #pod =pod #pod #pod =head1 DESCRIPTION #pod #pod The Algorithm::Dependency::Item class implements a single item within the #pod dependency hierarchy. It's quite simple, usually created from within a source, #pod and not typically created directly. This is provided for those implementing #pod their own source. ( See L for details ). #pod #pod =head1 METHODS #pod #pod =cut use 5.005; use strict; use Algorithm::Dependency (); our $VERSION = '1.112'; ##################################################################### # Constructor #pod =pod #pod #pod =head2 new $id, @depends #pod #pod The C constructor takes as its first argument the id ( name ) of the #pod item, and any further arguments are assumed to be the ids of other items that #pod this one depends on. #pod #pod Returns a new C on success, or C #pod on error. #pod #pod =cut sub new { my $class = shift; my $id = (defined $_[0] and ! ref $_[0] and $_[0] ne '') ? shift : return undef; bless { id => $id, depends => [ @_ ] }, $class; } #pod =pod #pod #pod =head2 id #pod #pod The C method returns the id of the item. #pod #pod =cut sub id { $_[0]->{id} } #pod =pod #pod #pod =head2 depends #pod #pod The C method returns, as a list, the names of the other items that #pod this item depends on. #pod #pod =cut sub depends { @{$_[0]->{depends}} } 1; __END__ =pod =encoding UTF-8 =head1 NAME Algorithm::Dependency::Item - Implements an item in a dependency hierarchy. =head1 VERSION version 1.112 =head1 DESCRIPTION The Algorithm::Dependency::Item class implements a single item within the dependency hierarchy. It's quite simple, usually created from within a source, and not typically created directly. This is provided for those implementing their own source. ( See L for details ). =head1 METHODS =head2 new $id, @depends The C constructor takes as its first argument the id ( name ) of the item, and any further arguments are assumed to be the ids of other items that this one depends on. Returns a new C on success, or C on error. =head2 id The C method returns the id of the item. =head2 depends The C method returns, as a list, the names of the other items that this item depends on. =head1 SEE ALSO L =head1 SUPPORT Bugs may be submitted through L (or L). =head1 AUTHOR Adam Kennedy =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2003 by Adam Kennedy. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Algorithm-Dependency-1.112/lib/Algorithm/Dependency/Source.pm000600 000766 000024 00000021652 13651717723 024355 0ustar00etherstaff000000 000000 package Algorithm::Dependency::Source; # ABSTRACT: Implements a source of hierarchy items #pod =pod #pod #pod =head1 DESCRIPTION #pod #pod The Algorithm::Dependency::Source class provides an abstract parent class for #pod implementing sources for the hierarchy data the algorithm will use. For an #pod example of an implementation of this, see #pod L, which is bundled with the main #pod L package. #pod #pod =head1 METHODS #pod #pod =cut use 5.005; use strict; use Algorithm::Dependency (); use Params::Util qw{_SET}; our $VERSION = '1.112'; ##################################################################### # Constructor #pod =pod #pod #pod =head2 new @arguments #pod #pod Although you cannot directly use the C constructor for #pod C, it will work the same in all subclasses. #pod #pod The constructor takes zero or more subclass specific arguments to define the #pod location of the source of the items, and returns a new object. Although it #pod may check that the arguments you passed are valid, the source will usually #pod NOT actually load the items from the source, instead deferring the loading #pod until you need to use the items. #pod #pod Returns a new object on success, or C on error. #pod #pod =cut sub new { my $class = shift; # This can't be created directly, it must be through # a SUPER::new call if ( $class eq __PACKAGE__ ) { die "Cannot directly instantiate Algorithm::Dependency::Source." . " You must use a subclass"; } # Create the basic object my $self = bless { # Has the source been loaded loaded => 0, # Indexes items_hash => undef, items_array => undef, }, $class; $self; } #pod =pod #pod #pod =head2 load #pod #pod The C method is the public method used to actually load the items from #pod their storage location into the the source object. The method will #pod automatically called, as needed, in most circumstances. You would generally #pod only want to use C manually if you think there may be some uncertainty #pod that the source will load correctly, and want to check it will work. #pod #pod Returns true if the items are loaded successfully, or C on error. #pod #pod =cut sub load { my $self = shift; # If this is a reload, clean up in preperation if ( $self->{loaded} ) { $self->{loaded} = 0; $self->{items_hash} = undef; $self->{items_array} = undef; } # Pass through to the real loader my $items = $self->_load_item_list; return $items unless $items; unless ( _SET($items, 'Algorithm::Dependency::Item') ) { die( ref($self) . "::_load_item_list did not return an Algorithm::Dependency::Item set" ); } # Add the items foreach my $item ( @$items ) { # Have we added this one already? my $id = $item->id; if ( $self->{items_hash}->{ $id } ) { # Duplicate entry return undef; } # Add it push @{ $self->{items_array} }, $item; $self->{items_hash}->{$id} = $item; } $self->{loaded} = 1; } #pod =pod #pod #pod =head2 item $name #pod #pod The C method fetches and returns the item object specified by the #pod name argument. #pod #pod Returns an L object on success, or C if #pod the named item does not exist in the source. #pod #pod =cut sub item { my $self = shift; my $id = (defined $_[0] and ! ref $_[0] and $_[0] ne '') ? shift : return undef; $self->{loaded} or $self->load or return undef; # Return the item (or undef) $self->{items_hash}->{$id}; } #pod =pod #pod #pod =head2 items #pod #pod The C method returns, as a list of objects, all of the items #pod contained in the source. The item objects will be returned in the same order #pod as that in the storage location. #pod #pod Returns a list of L objects on success, or #pod C on error. #pod #pod =cut sub items { my $self = shift; $self->{loaded} or $self->load or return undef; @{ $self->{items_array} }; } #pod =pod #pod #pod =head2 missing_dependencies #pod #pod By default, we are lenient with missing dependencies if the item is never #pod used. For systems where having a missing dependency can be very bad, the #pod C method checks all Items to make sure their #pod dependencies exist. #pod #pod If there are any missing dependencies, returns a reference to an array of #pod their ids. If there are no missing dependencies, returns 0. Returns #pod C on error. #pod #pod =cut sub missing_dependencies { my $self = shift; $self->{loaded} or $self->load or return undef; # Merged the depends of all the items, and see if # any are missing. my %missing = map { $_ => 1 } grep { ! $self->item($_) } map { $_->depends } $self->items; %missing ? [ sort keys %missing ] : 0; } ##################################################################### # Catch unimplemented methods in subclasses sub _load_item_list { die "Class $_[0] failed to define the method _load_item_list"; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Algorithm::Dependency::Source - Implements a source of hierarchy items =head1 VERSION version 1.112 =head1 DESCRIPTION The Algorithm::Dependency::Source class provides an abstract parent class for implementing sources for the hierarchy data the algorithm will use. For an example of an implementation of this, see L, which is bundled with the main L package. =head1 METHODS =head2 new @arguments Although you cannot directly use the C constructor for C, it will work the same in all subclasses. The constructor takes zero or more subclass specific arguments to define the location of the source of the items, and returns a new object. Although it may check that the arguments you passed are valid, the source will usually NOT actually load the items from the source, instead deferring the loading until you need to use the items. Returns a new object on success, or C on error. =head2 load The C method is the public method used to actually load the items from their storage location into the the source object. The method will automatically called, as needed, in most circumstances. You would generally only want to use C manually if you think there may be some uncertainty that the source will load correctly, and want to check it will work. Returns true if the items are loaded successfully, or C on error. =head2 item $name The C method fetches and returns the item object specified by the name argument. Returns an L object on success, or C if the named item does not exist in the source. =head2 items The C method returns, as a list of objects, all of the items contained in the source. The item objects will be returned in the same order as that in the storage location. Returns a list of L objects on success, or C on error. =head2 missing_dependencies By default, we are lenient with missing dependencies if the item is never used. For systems where having a missing dependency can be very bad, the C method checks all Items to make sure their dependencies exist. If there are any missing dependencies, returns a reference to an array of their ids. If there are no missing dependencies, returns 0. Returns C on error. =head1 EXTENDING C itself is a fairly thin module, and it is intended that you will probably need to extend it to be able to extract item data from whatever location you have stored them. This is usually a fairly simple two step process. =over 4 =item Overload the C method. Assuming your subclass takes some form or argument on creation, you will need to overload the C method to accept the arguments, validate them, and store them in the source object. =item Define the method C<_load_item_list>. Leaving our parent's C method to take care of conflict, errors, and whatever, the C<_load_item_list> method is used to simply create a list of L objects from wherever you store the item, and return them as a list. =back Having completed these two things, your subclass should be completed. For an example of the code, have a look at the source for the simple subclass L. =head1 SEE ALSO L, L =head1 SUPPORT Bugs may be submitted through L (or L). =head1 AUTHOR Adam Kennedy =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2003 by Adam Kennedy. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Algorithm-Dependency-1.112/lib/Algorithm/Dependency/Source/HoA.pm000600 000766 000024 00000007013 13651717723 025017 0ustar00etherstaff000000 000000 package Algorithm::Dependency::Source::HoA; # ABSTRACT: Source for a HASH of ARRAYs #pod =pod #pod #pod =head1 SYNOPSIS #pod #pod # The basic data structure #pod my $deps = { #pod foo => [ 'bar', 'baz' ], #pod bar => [], #pod baz => [ 'bar' ], #pod }; #pod #pod # Create the source from it #pod my $Source = Algorithm::Dependency::Source::HoA->new( $deps ); #pod #pod =head1 DESCRIPTION #pod #pod C implements a #pod L where the items names are provided #pod in the most simple form, a reference to a C of C references. #pod #pod =head1 METHODS #pod #pod This documents the methods differing from the ordinary #pod L methods. #pod #pod =cut use 5.005; use strict; use Algorithm::Dependency::Source (); use Params::Util qw{_HASH _ARRAY0}; our $VERSION = '1.112'; our @ISA = 'Algorithm::Dependency::Source'; ##################################################################### # Constructor #pod =pod #pod #pod =head2 new $filename #pod #pod When constructing a new C object, an #pod argument should be provided of a reference to a HASH of ARRAY references, #pod containing the names of other HASH elements. #pod #pod Returns the object, or C if the structure is not correct. #pod #pod =cut sub new { my $class = shift; my $hash = _HASH(shift) or return undef; foreach my $deps ( values %$hash ) { _ARRAY0($deps) or return undef; } # Get the basic source object my $self = $class->SUPER::new() or return undef; # Add our arguments $self->{hash} = $hash; $self; } ##################################################################### # Private Methods sub _load_item_list { my $self = shift; # Build the item objects from the data my $hash = $self->{hash}; my @items = map { Algorithm::Dependency::Item->new( $_, @{$hash->{$_}} ) or return undef; } keys %$hash; \@items; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Algorithm::Dependency::Source::HoA - Source for a HASH of ARRAYs =head1 VERSION version 1.112 =head1 SYNOPSIS # The basic data structure my $deps = { foo => [ 'bar', 'baz' ], bar => [], baz => [ 'bar' ], }; # Create the source from it my $Source = Algorithm::Dependency::Source::HoA->new( $deps ); =head1 DESCRIPTION C implements a L where the items names are provided in the most simple form, a reference to a C of C references. =head1 METHODS This documents the methods differing from the ordinary L methods. =head2 new $filename When constructing a new C object, an argument should be provided of a reference to a HASH of ARRAY references, containing the names of other HASH elements. Returns the object, or C if the structure is not correct. =head1 SEE ALSO L, L =head1 SUPPORT Bugs may be submitted through L (or L). =head1 AUTHOR Adam Kennedy =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2003 by Adam Kennedy. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Algorithm-Dependency-1.112/lib/Algorithm/Dependency/Source/File.pm000600 000766 000024 00000013006 13651717723 025226 0ustar00etherstaff000000 000000 package Algorithm::Dependency::Source::File; # ABSTRACT: File source for dependency hierarchies #pod =pod #pod #pod =head1 DESCRIPTION #pod #pod Algorithm::Dependency::Source::File implements a #pod L where the items are stored in a flat #pod file or a relatively simple format. #pod #pod =head2 File Format #pod #pod The file should be an ordinary text file, consisting of a series of lines, #pod with each line completely containing the information for a single item. #pod Blank lines, or lines beginning with the hash character '#' will be #pod ignored as comments. #pod #pod For a single item line, only word characters will be used. A 'word character' #pod consists of all letters and numbers, and the underscore '_' character. #pod Anything that is not a word character will be assumed to be a separator. #pod #pod The first word will be used as the name or id of the item, and any further #pod words in the line will be used as other items that this one depends on. For #pod example, all of the following are legal. #pod #pod # A single item with no dependencies #pod Foo #pod #pod # Another item that depends on the first one #pod Bar Foo #pod #pod # Depending on multiple others #pod Bin Foo Bar #pod #pod # We can use different separators #pod One:Two|Three-Four+Five=Six Seven #pod #pod # We can also use multiple non-word characters as separators #pod This&*&^*&File: is& & & :::REALLY()Neat #pod #pod From the examples above, it should be easy to create your own files. #pod #pod =head1 METHODS #pod #pod This documents the methods differing from the ordinary #pod L methods. #pod #pod =cut use 5.005; use strict; use Algorithm::Dependency::Source (); our $VERSION = '1.112'; our @ISA = 'Algorithm::Dependency::Source'; ##################################################################### # Constructor #pod =pod #pod #pod =head2 new $filename #pod #pod When constructing a new Algorithm::Dependency::Source::File object, an #pod argument should be provided of the name of the file to use. The constructor #pod will check that the file exists, and is readable, returning C #pod otherwise. #pod #pod =cut sub new { my $class = shift; my $filename = shift or return undef; return undef unless -r $filename; # Get the basic source object my $self = $class->SUPER::new() or return undef; # Add our arguments $self->{filename} = $filename; $self; } ##################################################################### # Private Methods sub _load_item_list { my $self = shift; # Load the contents of the file local $/ = undef; open( FILE, $self->{filename} ) or return undef; defined(my $source = ) or return undef; close( FILE ) or return undef; # Split, trim, clean and remove comments my @content = grep { ! /^\s*(?:\#|$)/ } split /\s*[\015\012][\s\015\012]*/, $source; # Parse and build the item list my @Items = (); foreach my $line ( @content ) { # Split the line by non-word characters my @sections = grep { length $_ } split /\W+/, $line; return undef unless scalar @sections; # Create the new item my $Item = Algorithm::Dependency::Item->new( @sections ) or return undef; push @Items, $Item; } \@Items; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Algorithm::Dependency::Source::File - File source for dependency hierarchies =head1 VERSION version 1.112 =head1 DESCRIPTION Algorithm::Dependency::Source::File implements a L where the items are stored in a flat file or a relatively simple format. =head2 File Format The file should be an ordinary text file, consisting of a series of lines, with each line completely containing the information for a single item. Blank lines, or lines beginning with the hash character '#' will be ignored as comments. For a single item line, only word characters will be used. A 'word character' consists of all letters and numbers, and the underscore '_' character. Anything that is not a word character will be assumed to be a separator. The first word will be used as the name or id of the item, and any further words in the line will be used as other items that this one depends on. For example, all of the following are legal. # A single item with no dependencies Foo # Another item that depends on the first one Bar Foo # Depending on multiple others Bin Foo Bar # We can use different separators One:Two|Three-Four+Five=Six Seven # We can also use multiple non-word characters as separators This&*&^*&File: is& & & :::REALLY()Neat From the examples above, it should be easy to create your own files. =head1 METHODS This documents the methods differing from the ordinary L methods. =head2 new $filename When constructing a new Algorithm::Dependency::Source::File object, an argument should be provided of the name of the file to use. The constructor will check that the file exists, and is readable, returning C otherwise. =head1 SEE ALSO L =head1 SUPPORT Bugs may be submitted through L (or L). =head1 AUTHOR Adam Kennedy =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2003 by Adam Kennedy. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Algorithm-Dependency-1.112/lib/Algorithm/Dependency/Source/Invert.pm000600 000766 000024 00000003703 13651717723 025621 0ustar00etherstaff000000 000000 package Algorithm::Dependency::Source::Invert; # ABSTRACT: Logically invert a source #pod =pod #pod #pod =head1 SYNOPSIS #pod #pod my $inverted = Algorithm::Dependency::Source::Invert->new( $source ); #pod #pod =head1 DESCRIPTION #pod #pod This class creates a source from another source, but with all dependencies #pod reversed. #pod #pod =cut use 5.005; use strict; use Params::Util '_INSTANCE'; use Algorithm::Dependency::Source::HoA (); our $VERSION = '1.112'; our @ISA = 'Algorithm::Dependency::Source::HoA'; ##################################################################### # Constructor sub new { my $class = shift; my $source = _INSTANCE(shift, 'Algorithm::Dependency::Source') or return undef; # Derive a HoA from the original source my @items = $source->items; my %hoa = map { $_->id => [ ] } @items; foreach my $item ( @items ) { my $id = $item->id; my @deps = $item->depends; foreach my $dep ( @deps ) { push @{ $hoa{$dep} }, $id; } } # Hand off to the parent class $class->SUPER::new( \%hoa ); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Algorithm::Dependency::Source::Invert - Logically invert a source =head1 VERSION version 1.112 =head1 SYNOPSIS my $inverted = Algorithm::Dependency::Source::Invert->new( $source ); =head1 DESCRIPTION This class creates a source from another source, but with all dependencies reversed. =head1 SEE ALSO L, L =head1 SUPPORT Bugs may be submitted through L (or L). =head1 AUTHOR Adam Kennedy =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2003 by Adam Kennedy. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Algorithm-Dependency-1.112/xt/author/000770 000766 000024 00000000000 13651717723 017741 5ustar00etherstaff000000 000000 Algorithm-Dependency-1.112/xt/release/000770 000766 000024 00000000000 13651717723 020057 5ustar00etherstaff000000 000000 Algorithm-Dependency-1.112/xt/release/changes_has_content.t000644 000766 000024 00000002101 13651717723 024236 0ustar00etherstaff000000 000000 use Test::More tests => 2; note 'Checking Changes'; my $changes_file = 'Changes'; my $newver = '1.112'; my $trial_token = '-TRIAL'; my $encoding = 'UTF-8'; SKIP: { ok(-e $changes_file, "$changes_file file exists") or skip 'Changes is missing', 1; ok(_get_changes($newver), "$changes_file has content for $newver"); } done_testing; sub _get_changes { my $newver = shift; # parse changelog to find commit message open(my $fh, '<', $changes_file) or die "cannot open $changes_file: $!"; my $changelog = join('', <$fh>); if ($encoding) { require Encode; $changelog = Encode::decode($encoding, $changelog, Encode::FB_CROAK()); } close $fh; my @content = grep { /^$newver(?:$trial_token)?(?:\s+|$)/ ... /^\S/ } # from newver to un-indented split /\n/, $changelog; shift @content; # drop the version line # drop unindented last line and trailing blank lines pop @content while ( @content && $content[-1] =~ /^(?:\S|\s*$)/ ); # return number of non-blank lines return scalar @content; } Algorithm-Dependency-1.112/xt/release/distmeta.t000644 000766 000024 00000000172 13651717723 022061 0ustar00etherstaff000000 000000 #!perl # This file was automatically generated by Dist::Zilla::Plugin::MetaTests. use Test::CPAN::Meta; meta_yaml_ok(); Algorithm-Dependency-1.112/xt/release/cpan-changes.t000644 000766 000024 00000000344 13651717723 022577 0ustar00etherstaff000000 000000 use strict; use warnings; # this test was generated with Dist::Zilla::Plugin::Test::CPAN::Changes 0.012 use Test::More 0.96 tests => 1; use Test::CPAN::Changes; subtest 'changes_ok' => sub { changes_file_ok('Changes'); }; Algorithm-Dependency-1.112/xt/author/mojibake.t000644 000766 000024 00000000151 13651717723 021707 0ustar00etherstaff000000 000000 #!perl use strict; use warnings qw(all); use Test::More; use Test::Mojibake; all_files_encoding_ok(); Algorithm-Dependency-1.112/xt/author/kwalitee.t000644 000766 000024 00000000275 13651717723 021742 0ustar00etherstaff000000 000000 # this test was generated with Dist::Zilla::Plugin::Test::Kwalitee 2.12 use strict; use warnings; use Test::More 0.88; use Test::Kwalitee 1.21 'kwalitee_ok'; kwalitee_ok(); done_testing; Algorithm-Dependency-1.112/xt/author/changes_has_content.t000644 000766 000024 00000001044 13651717723 024125 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; plan skip_all => 'xt/release/changes_has_content.t is missing' if not -e 'xt/release/changes_has_content.t'; # skip for master branch, only for travis if (($ENV{TRAVIS_PULL_REQUEST} || '') eq 'false') { chomp(my $branch_name = ($ENV{TRAVIS_BRANCH} || `git rev-parse --abbrev-ref HEAD`)); $TODO = 'Changes need not have content for this release yet if this is only the '.$1.' branch' if ($branch_name || '') =~ /^(master|devel)$/; } do './xt/release/changes_has_content.t'; die $@ if $@; Algorithm-Dependency-1.112/xt/author/minimum-version.t000644 000766 000024 00000000152 13651717723 023265 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; use Test::MinimumVersion; all_minimum_version_ok( qq{5.006} ); Algorithm-Dependency-1.112/xt/author/00-compile.t000644 000766 000024 00000003206 13651717723 021777 0ustar00etherstaff000000 000000 use 5.006; use strict; use warnings; # this test was generated with Dist::Zilla::Plugin::Test::Compile 2.058 use Test::More 0.94; plan tests => 9; my @module_files = ( 'Algorithm/Dependency.pm', 'Algorithm/Dependency/Item.pm', 'Algorithm/Dependency/Ordered.pm', 'Algorithm/Dependency/Source.pm', 'Algorithm/Dependency/Source/File.pm', 'Algorithm/Dependency/Source/HoA.pm', 'Algorithm/Dependency/Source/Invert.pm', 'Algorithm/Dependency/Weight.pm' ); # no fake home requested my @switches = ( -d 'blib' ? '-Mblib' : '-Ilib', ); use File::Spec; use IPC::Open3; use IO::Handle; open my $stdin, '<', File::Spec->devnull or die "can't open devnull: $!"; my @warnings; for my $lib (@module_files) { # see L my $stderr = IO::Handle->new; diag('Running: ', join(', ', map { my $str = $_; $str =~ s/'/\\'/g; q{'} . $str . q{'} } $^X, @switches, '-e', "require q[$lib]")) if $ENV{PERL_COMPILE_TEST_DEBUG}; my $pid = open3($stdin, '>&STDERR', $stderr, $^X, @switches, '-e', "require q[$lib]"); binmode $stderr, ':crlf' if $^O eq 'MSWin32'; my @_warnings = <$stderr>; waitpid($pid, 0); is($?, 0, "$lib loaded ok"); shift @_warnings if @_warnings and $_warnings[0] =~ /^Using .*\bblib/ and not eval { +require blib; blib->VERSION('1.01') }; if (@_warnings) { warn @_warnings; push @warnings, @_warnings; } } is(scalar(@warnings), 0, 'no warnings found') or diag 'got warnings: ', explain(\@warnings); BAIL_OUT("Compilation problems") if !Test::More->builder->is_passing; Algorithm-Dependency-1.112/xt/author/pod-syntax.t000644 000766 000024 00000000252 13651717723 022236 0ustar00etherstaff000000 000000 #!perl # This file was automatically generated by Dist::Zilla::Plugin::PodSyntaxTests. use strict; use warnings; use Test::More; use Test::Pod 1.41; all_pod_files_ok(); Algorithm-Dependency-1.112/xt/author/portability.t000644 000766 000024 00000000267 13651717723 022500 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; eval 'use Test::Portability::Files'; plan skip_all => 'Test::Portability::Files required for testing portability' if $@; run_tests(); Algorithm-Dependency-1.112/xt/author/pod-spell.t000644 000766 000024 00000000640 13651717723 022030 0ustar00etherstaff000000 000000 use strict; use warnings; use Test::More; # generated by Dist::Zilla::Plugin::Test::PodSpelling 2.007005 use Test::Spelling 0.12; use Pod::Wordlist; add_stopwords(); all_pod_files_spelling_ok( qw( examples lib script t xt ) ); __DATA__ ARRAYs Adam Algorithm Dependency Etheridge File HoA Invert Item Karen Kennedy Mark Murawski Ordered Source Weight adam adamk ether irc lib markm param readonly unselected Algorithm-Dependency-1.112/xt/author/pod-no404s.t000644 000766 000024 00000000527 13651717723 021744 0ustar00etherstaff000000 000000 #!perl use strict; use warnings; use Test::More; foreach my $env_skip ( qw( SKIP_POD_NO404S AUTOMATED_TESTING ) ){ plan skip_all => "\$ENV{$env_skip} is set, skipping" if $ENV{$env_skip}; } eval "use Test::Pod::No404s"; if ( $@ ) { plan skip_all => 'Test::Pod::No404s required for testing POD'; } else { all_pod_files_ok(); } Algorithm-Dependency-1.112/xt/author/pod-coverage.t000644 000766 000024 00000000334 13651717723 022504 0ustar00etherstaff000000 000000 #!perl # This file was automatically generated by Dist::Zilla::Plugin::PodCoverageTests. use Test::Pod::Coverage 1.08; use Pod::Coverage::TrustPod; all_pod_coverage_ok({ coverage_class => 'Pod::Coverage::TrustPod' }); Algorithm-Dependency-1.112/t/07_hoa.t000600 000766 000024 00000012340 13651717723 017504 0ustar00etherstaff000000 000000 # Tests for Algorithm::Dependency::HoA # Pretty much just copied from the 03_basics.t tests use strict; BEGIN { $| = 1; $^W = 1; } use Test::More tests => 108; use Algorithm::Dependency (); use Algorithm::Dependency::Source::HoA (); my $data = { A => [], B => [ 'C' ], C => [], D => [ 'E', 'F::G' ], E => [], 'F::G' => [], }; # Load the data/basics.txt file in as a source file, and test it rigorously. my $Source = Algorithm::Dependency::Source::HoA->new( $data ); ok( $Source, "Source is true" ); ok( ref $Source, "Source is a reference" ); isa_ok( $Source, 'Algorithm::Dependency::Source::HoA' ); isa_ok( $Source, 'Algorithm::Dependency::Source' ); ok( exists $Source->{loaded}, "Source has a loaded value" ); ok( ! $Source->{loaded}, "Source isn't loaded" ); ok( eval {$Source->load;}, "Source ->load returns true" ); ok( $Source->{loaded}, "Source appears to be loaded" ); isa_ok( $Source->item('A'), 'Algorithm::Dependency::Item' ); isa_ok( $Source->item('B'), 'Algorithm::Dependency::Item' ); isa_ok( $Source->item('D'), 'Algorithm::Dependency::Item' ); ok( ! defined $Source->item('BAD'), "->item for bad value properly returns undef" ); ok( $Source->item('A')->id eq 'A', "Item ->id appears to work ok" ); ok( scalar $Source->item('A')->depends == 0, "Item ->depends for 0 depends returns ok" ); ok( scalar $Source->item('B')->depends == 1, "Item ->depends for 1 depends returns ok" ); ok( scalar $Source->item('D')->depends == 2, "Item ->depends for 2 depends returns ok" ); my @items = $Source->items; ok( scalar @items == 6, "Source ->items returns a list" ); isa_ok( $items[0], 'Algorithm::Dependency::Item' ); isa_ok( $items[1], 'Algorithm::Dependency::Item' ); isa_ok( $items[3], 'Algorithm::Dependency::Item' ); # Try to create a basic unordered dependency my $Dep = Algorithm::Dependency->new( source => $Source ); ok( $Dep, "Algorithm::Dependency->new returns true" ); ok( ref $Dep, "Algorithm::Dependency->new returns reference" ); isa_ok( $Dep, 'Algorithm::Dependency'); ok( $Dep->source, "Dependency->source returns true" ); ok( $Dep->source eq $Source, "Dependency->source returns the original source" ); ok( $Dep->item('A'), "Dependency->item returns true" ); ok( $Dep->item('A') eq $Source->item('A'), "Dependency->item returns the same as Source->item" ); my @tmp; ok( scalar( @tmp = $Dep->selected_list ) == 0, "Dependency->selected_list returns empty list" ); ok( ! $Dep->selected('Foo'), "Dependency->selected returns false on bad input" ); ok( ! $Dep->selected('A'), "Dependency->selected returns false when not selected" ); ok( ! defined $Dep->depends('Foo'), "Dependency->depends fails correctly on bad input" ); foreach my $data ( [ ['A'], [], ['A'] ], [ ['B'], ['C'], ['B','C'] ], [ ['C'], [], ['C'] ], [ ['D'], ['E','F::G'], [qw{D E}, 'F::G'] ], [ ['E'], [], ['E'] ], [ ['F::G'], [], ['F::G'] ], [ ['A','B'], ['C'], [qw{A B C}] ], [ ['B','D'], [qw{C E}, 'F::G'], [qw{B C D E}, 'F::G'] ] ) { my $args = join( ', ', map { "'$_'" } @{ $data->[0] } ); my $rv = $Dep->depends( @{ $data->[0] } ); ok( $rv, "Dependency->depends($args) returns something" ); is_deeply( $rv, $data->[1], "Dependency->depends($args) returns expected values" ); $rv = $Dep->schedule( @{ $data->[0] } ); ok( $rv, "Dependency->schedule($args) returns something" ); is_deeply( $rv, $data->[2], "Dependency->schedule($args) returns expected values" ); } # Create with one selected $Dep = Algorithm::Dependency->new( source => $Source, selected => [ 'F::G' ] ); ok( $Dep, "Algorithm::Dependency->new returns true" ); ok( ref $Dep, "Algorithm::Dependency->new returns reference" ); isa_ok( $Dep, 'Algorithm::Dependency'); ok( $Dep->source, "Dependency->source returns true" ); ok( $Dep->source eq $Source, "Dependency->source returns the original source" ); ok( $Dep->item('A'), "Dependency->item returns true" ); ok( $Dep->item('A') eq $Source->item('A'), "Dependency->item returns the same as Source->item" ); ok( scalar( @tmp = $Dep->selected_list ) == 1, "Dependency->selected_list returns empty list" ); ok( ! $Dep->selected('Foo'), "Dependency->selected returns false when wrong" ); ok( ! $Dep->selected('A'), "Dependency->selected returns false when expected" ); ok( $Dep->selected('F::G'), "Dependency->selected return true" ); ok( ! defined $Dep->depends('Foo'), "Dependency->depends fails correctly on bad input" ); foreach my $data ( [ ['A'], [], ['A'] ], [ ['B'], ['C'], [qw{B C}] ], [ ['C'], [], ['C'] ], [ ['D'], ['E'], [qw{D E}] ], [ ['E'], [], ['E'] ], [ ['F::G'], [], [] ], [ ['A','B'], ['C'], [qw{A B C}] ], [ ['B','D'], [qw{C E}], [qw{B C D E}] ] ) { my $args = join( ', ', map { "'$_'" } @{ $data->[0] } ); my $rv = $Dep->depends( @{ $data->[0] } ); ok( $rv, "Dependency->depends($args) returns something" ); is_deeply( $rv, $data->[1], "Dependency->depends($args) returns expected values" ); $rv = $Dep->schedule( @{ $data->[0] } ); ok( $rv, "Dependency->schedule($args) returns something" ); is_deeply( $rv, $data->[2], "Dependency->schedule($args) returns expected values" ); } # Does missing dependencies return defined but false for a source we # know doesn't have any missing dependencies is( $Source->missing_dependencies, 0, "->missing_dependencies returns as expected when nothing missing" ); 1; Algorithm-Dependency-1.112/t/08_weight.t000600 000766 000024 00000006167 13651717723 020237 0ustar00etherstaff000000 000000 # Creating and using dependency trees use strict; BEGIN { $| = 1; $^W = 1; } use Test::More tests => 55; use File::Spec::Functions ':ALL'; use Algorithm::Dependency::Weight; use Algorithm::Dependency::Source::File; # Where is the test data located my $TESTDATA = catdir( 't', 'data' ); ok( -d $TESTDATA, 'Found test data directory' ); # Load the data/basics.txt file in as a source file, and test it rigorously. my $file = File::Spec->catfile( $TESTDATA, 'basics.txt' ); my $Source = Algorithm::Dependency::Source::File->new( $file ); isa_ok( $Source, 'Algorithm::Dependency::Source::File' ); isa_ok( $Source, 'Algorithm::Dependency::Source' ); my @items = $Source->items; is( scalar(@items), 6, "Source ->items returns a list" ); is( scalar($Source->items), 6, "Source ->items returns a list" ); # Create a Weight object my $algorithm = Algorithm::Dependency::Weight->new( source => $Source ); isa_ok( $algorithm, 'Algorithm::Dependency::Weight' ); isa_ok( $algorithm->source, 'Algorithm::Dependency::Source' ); my $basic = { A => 1, B => 2, C => 1, D => 3, E => 1, F => 1, }; foreach my $item ( sort keys %$basic ) { is( $algorithm->weight($item), $basic->{$item}, "Got weight for '$item'" ); } is_deeply( $algorithm->weight_all, $basic, 'Got weight for all' ); delete $basic->{B}; delete $basic->{D}; is_deeply( $algorithm->weight_hash(qw{A C E F}), $basic, 'basic: Got weight for selected' ); # Larger scale processing $file = File::Spec->catfile( $TESTDATA, 'complex.txt' ); $Source = Algorithm::Dependency::Source::File->new( $file ); isa_ok( $Source, 'Algorithm::Dependency::Source::File' ); isa_ok( $Source, 'Algorithm::Dependency::Source' ); @items = $Source->items; is( scalar(@items), 20, "Source ->items returns a list" ); is( scalar($Source->items), 20, "Source ->items returns a list" ); $algorithm = Algorithm::Dependency::Weight->new( source => $Source ); isa_ok( $algorithm, 'Algorithm::Dependency::Weight' ); isa_ok( $algorithm->source, 'Algorithm::Dependency::Source' ); my $complex = { A => 1, B => 2, C => 1, D => 3, E => 2, F => 1, G => 4, H => 3, I => 2, J => 1, K => 3, L => 2, M => 1, N => 1, O => 2, P => 2, Q => 3, R => 3, S => 6, T => 11, }; foreach my $item ( sort keys %$complex ) { is( $algorithm->weight($item), $complex->{$item}, "complex: Got weight for '$item'", ); } # Test weightings in circulars $file = File::Spec->catfile( $TESTDATA, 'circular.txt' ); $Source = Algorithm::Dependency::Source::File->new( $file ); isa_ok( $Source, 'Algorithm::Dependency::Source::File' ); isa_ok( $Source, 'Algorithm::Dependency::Source' ); @items = $Source->items; is( scalar(@items), 8, "Source ->items returns a list" ); is( scalar($Source->items), 8, "Source ->items returns a list" ); $algorithm = Algorithm::Dependency::Weight->new( source => $Source ); isa_ok( $algorithm, 'Algorithm::Dependency::Weight' ); isa_ok( $algorithm->source, 'Algorithm::Dependency::Source' ); my $circular = { A => 7, B => 6, C => 5, D => 5, E => 6, F => 2, G => 1, H => 1, }; foreach my $item ( sort keys %$circular ) { is( $algorithm->weight($item), $circular->{$item}, "circular: Got weight for '$item'" ); } Algorithm-Dependency-1.112/t/05_ordered.t000600 000766 000024 00000013272 13651717723 020364 0ustar00etherstaff000000 000000 # Ordered dependency trees use strict; BEGIN { $| = 1; $^W = 1; } use Test::More tests => 209; use File::Spec::Functions ':ALL'; use Algorithm::Dependency::Ordered; use Algorithm::Dependency::Source::File; # Where is the test data located my $TESTDATA = catdir( 't', 'data' ); ok( -d $TESTDATA, 'Found test data directory' ); # Load the source files my $basic = File::Spec->catfile( $TESTDATA, 'basics.txt' ); my $BSource = Algorithm::Dependency::Source::File->new( $basic ); ok( $BSource, "Basic source created" ); ok( eval {$BSource->load;}, "Basic source loads" ); my $complex = File::Spec->catfile( $TESTDATA, 'complex.txt' ); my $CSource = Algorithm::Dependency::Source::File->new( $complex ); ok( $CSource, "Complex source created" ); ok( eval {$CSource->load;}, "Complex source loads" ); # Test the creation of a basic ordered dependency tree my $BDep = Algorithm::Dependency::Ordered->new( source => $BSource, selected => ['B'] ); ok( $BDep, "Algorithm::Dependency::Ordered->new returns true" ); ok( ref $BDep, "Algorithm::Dependency::Ordered->new returns reference" ); isa_ok( $BDep, 'Algorithm::Dependency::Ordered'); isa_ok( $BDep, 'Algorithm::Dependency'); ok( $BDep->source, "Dependency->source returns true" ); ok( $BDep->source eq $BSource, "Dependency->source returns the original source" ); ok( $BDep->item('A'), "Dependency->item returns true" ); ok( $BDep->item('A') eq $BSource->item('A'), "Dependency->item returns the same as Basic->item" ); my @tmp; ok( scalar( @tmp = $BDep->selected_list ) == 1, "Dependency->selected_list returns empty list" ); ok( $tmp[0] eq 'B', "Dependency->selected_list returns as expected" ); ok( ! $BDep->selected('Foo'), "Dependency->selected returns false on bad input" ); ok( ! $BDep->selected('A'), "Dependency->selected returns false when not selected" ); ok( $BDep->selected('B'), "Dependency->selected returns true when selected" ); ok( ! defined $BDep->depends('Foo'), "Dependency->depends fails correctly on bad input" ); # Check the results of it's depends and schedule methods $BDep = Algorithm::Dependency::Ordered->new( source => $BSource ); foreach my $data ( [ ['A'], [], ['A'] ], [ ['B'], ['C'], [qw{C B}] ], [ ['C'], [], ['C'] ], [ ['D'], [qw{E F}], [qw{E F D}] ], [ ['E'], [], ['E'] ], [ ['F'], [], ['F'] ] ) { my $args = join( ', ', map { "'$_'" } @{ $data->[0] } ); my $rv = $BDep->depends( @{ $data->[0] } ); ok( $rv, "Dependency->depends($args) returns something" ); is_deeply( $rv, $data->[1], "Dependency->depends($args) returns expected values" ); $rv = $BDep->schedule( @{ $data->[0] } ); ok( $rv, "Dependency->schedule($args) returns something" ); is_deeply( $rv, $data->[2], "Dependency->schedule($args) returns expected values" ); } # Now do the ordered dependency on the complex data set my $CDep = Algorithm::Dependency::Ordered->new( source => $CSource ); ok( $CDep, "Algorithm::Dependency::Ordered->new returns true" ); ok( ref $CDep, "Algorithm::Dependency::Ordered->new returns reference" ); isa_ok( $CDep, 'Algorithm::Dependency::Ordered'); # Test each of the dependencies foreach my $data ( [ ['A'], [], ['A'] ], [ ['B'], ['C'], [qw{C B}] ], [ ['C'], [], ['C'] ], [ ['D'], [qw{E F}], [qw{F E D}] ], [ ['E'], ['F'], [qw{F E}] ], [ ['F'], [], ['F'] ], [ ['G'], [qw{H I J}], [qw{J I H G}] ], [ ['H'], [qw{I J}], [qw{J I H}] ], [ ['I'], ['J'], [qw{J I}] ], [ ['J'], [], ['J'] ], [ ['K'], [qw{L M}], [qw{M L K}] ], [ ['L'], ['M'], [qw{M L}] ], [ ['M'], [], ['M'] ], [ ['N'], [], ['N'] ], [ ['O'], ['N'], [qw{N O}] ], [ ['P'], ['N'], [qw{N P}] ], [ ['Q'], [qw{N O}], [qw{N O Q}] ], [ ['R'], [qw{N P}], [qw{N P R}] ], [ ['S'], [qw{N O P Q R}], [qw{N O P Q R S}] ], [ ['T'], [qw{A D E F K L M N P R}], [qw{A F M N P R E L D K T}] ] ) { my $args = join( ', ', map { "'$_'" } @{ $data->[0] } ); my $rv = $CDep->depends( @{ $data->[0] } ); ok( $rv, "Dependency->depends($args) returns something" ); is_deeply( $rv, $data->[1], "Dependency->depends($args) returns expected values" ); $rv = $CDep->schedule( @{ $data->[0] } ); ok( $rv, "Dependency->schedule($args) returns something" ); is_deeply( $rv, $data->[2], "Dependency->schedule($args) returns expected values" ); } # Now do the ordered dependency on the complex data set $CDep = Algorithm::Dependency::Ordered->new( source => $CSource, selected => [qw{F H J N R P}] ); ok( $CDep, "Algorithm::Dependency::Ordered->new returns true" ); ok( ref $CDep, "Algorithm::Dependency::Ordered->new returns reference" ); isa_ok( $CDep, 'Algorithm::Dependency::Ordered'); # Test each of the dependencies foreach my $data ( [ ['A'], [], ['A'] ], [ ['B'], ['C'], [qw{C B}] ], [ ['C'], [], ['C'] ], [ ['D'], ['E'], [qw{E D}] ], [ ['E'], [], ['E'] ], [ ['F'], [], [] ], [ ['G'], ['I'], [qw{G I}] ], [ ['H'], ['I'], ['I'] ], [ ['I'], [], ['I'] ], [ ['J'], [], [] ], [ ['K'], [qw{L M}], [qw{M L K}] ], [ ['L'], ['M'], [qw{M L}] ], [ ['M'], [], ['M'] ], [ ['N'], [], [] ], [ ['O'], [], ['O'] ], [ ['P'], [], [] ], [ ['Q'], ['O'], [qw{O Q}] ], [ ['R'], [], [] ], [ ['S'], [qw{O Q}], [qw{O Q S}] ], [ ['T'], [qw{A D E K L M}], [qw{A E M D L K T}] ] ) { my $args = join( ', ', map { "'$_'" } @{ $data->[0] } ); my $rv = $CDep->depends( @{ $data->[0] } ); ok( $rv, "Dependency->depends($args) returns something" ); is_deeply( $rv, $data->[1], "Dependency->depends($args) returns expected values" ); $rv = $CDep->schedule( @{ $data->[0] } ); ok( $rv, "Dependency->schedule($args) returns something" ); is_deeply( $rv, $data->[2], "Dependency->schedule($args) returns expected values" ); } 1; Algorithm-Dependency-1.112/t/06_ignore_orphans.t000600 000766 000024 00000002641 13651717723 021754 0ustar00etherstaff000000 000000 # Check that errors are correctly ignored when the 'ignore_orphans' option # is turned on. use strict; BEGIN { $| = 1; $^W = 1; } use Test::More tests => 11; use File::Spec::Functions ':ALL'; use Algorithm::Dependency; use Algorithm::Dependency::Ordered; use Algorithm::Dependency::Source::File; # Where is the test data located my $TESTDATA = catdir( 't', 'data' ); ok( -d $TESTDATA, 'Found test data directory' ); # Load the source file my $basic = File::Spec->catfile( $TESTDATA, 'missing.txt' ); my $Source = Algorithm::Dependency::Source::File->new( $basic ); isa_ok( $Source, 'Algorithm::Dependency::Source::File' ); # Can we see the missing dependency in the source file is_deeply( $Source->missing_dependencies, [ 'C', 'E' ], 'The source file has missing dependencies as expected' ); # Test normal and ordered types foreach my $class ( 'Algorithm::Dependency', 'Algorithm::Dependency::Ordered' ) { my $Normal = $class->new( source => $Source, ); isa_ok( $Normal, $class ); # When we try to get a schedule this should fail is( $Normal->schedule('B'), undef, '->schedule with ignore_orphans off failed as expected' ); # Create the ignoring instance my $Ignore = $class->new( source => $Source, ignore_orphans => 1, ); isa_ok( $Ignore, $class ); # This should not fail when getting a schedule is_deeply( $Ignore->schedule('B'), [ 'B' ], '->schedule with ignore_orphans on succeeds' ); } 1; Algorithm-Dependency-1.112/t/04_complex.t000600 000766 000024 00000007220 13651717723 020402 0ustar00etherstaff000000 000000 # More complex dependency trees use strict; BEGIN { $| = 1; $^W = 1; } use Test::More tests => 170; use File::Spec::Functions ':ALL'; use Algorithm::Dependency; use Algorithm::Dependency::Source::File; # Where is the test data located my $TESTDATA = catdir( 't', 'data' ); ok( -d $TESTDATA, 'Found test data directory' ); # Load the data/complex.txt file in as a source file my $file = File::Spec->catfile( $TESTDATA, 'complex.txt' ); my $Source = Algorithm::Dependency::Source::File->new( $file ); ok( $Source, "Complex source created" ); ok( eval {$Source->load;}, "Complex source loads" ); # Try it's unordere dependency with nothing selected my $Dep = Algorithm::Dependency->new( source => $Source ); ok( $Dep, "Algorithm::Dependency->new returns true" ); ok( ref $Dep, "Algorithm::Dependency->new returns reference" ); isa_ok( $Dep, 'Algorithm::Dependency'); # Test each of the dependencies foreach my $data ( [ ['A'], [], ['A'] ], [ ['B'], ['C'], [qw{B C}] ], [ ['C'], [], ['C'] ], [ ['D'], [qw{E F}], [qw{D E F}] ], [ ['E'], ['F'], [qw{E F}] ], [ ['F'], [], ['F'] ], [ ['G'], [qw{H I J}], [qw{G H I J}] ], [ ['H'], [qw{I J}], [qw{H I J}] ], [ ['I'], ['J'], [qw{I J}] ], [ ['J'], [], ['J'] ], [ ['K'], [qw{L M}], [qw{K L M}] ], [ ['L'], ['M'], [qw{L M}] ], [ ['M'], [], ['M'] ], [ ['N'], [], ['N'] ], [ ['O'], ['N'], [qw{N O}] ], [ ['P'], ['N'], [qw{N P}] ], [ ['Q'], [qw{N O}], [qw{N O Q}] ], [ ['R'], [qw{N P}], [qw{N P R}] ], [ ['S'], [qw{N O P Q R}], [qw{N O P Q R S}] ], [ ['T'], [qw{A D E F K L M N P R}], [qw{A D E F K L M N P R T}] ] ) { my $args = join( ', ', map { "'$_'" } @{ $data->[0] } ); my $rv = $Dep->depends( @{ $data->[0] } ); ok( $rv, "Dependency->depends($args) returns something" ); is_deeply( $rv, $data->[1], "Dependency->depends($args) returns expected values" ); $rv = $Dep->schedule( @{ $data->[0] } ); ok( $rv, "Dependency->schedule($args) returns something" ); is_deeply( $rv, $data->[2], "Dependency->schedule($args) returns expected values" ); } # Try an unordered dependency with half a dozen random things selected $Dep = Algorithm::Dependency->new( source => $Source, selected => [qw{F H J N R P}] ); ok( $Dep, "Algorithm::Dependency->new returns true" ); ok( ref $Dep, "Algorithm::Dependency->new returns reference" ); isa_ok( $Dep, 'Algorithm::Dependency'); # Test each of the dependencies foreach my $data ( [ ['A'], [], ['A'] ], [ ['B'], ['C'], [qw{B C}] ], [ ['C'], [], ['C'] ], [ ['D'], ['E'], [qw{D E}] ], [ ['E'], [], ['E'] ], [ ['F'], [], [] ], [ ['G'], ['I'], [qw{G I}] ], [ ['H'], ['I'], ['I'] ], [ ['I'], [], ['I'] ], [ ['J'], [], [] ], [ ['K'], [qw{L M}], [qw{K L M}] ], [ ['L'], ['M'], [qw{L M}] ], [ ['M'], [], ['M'] ], [ ['N'], [], [] ], [ ['O'], [], ['O'] ], [ ['P'], [], [] ], [ ['Q'], ['O'], [qw{O Q}] ], [ ['R'], [], [] ], [ ['S'], [qw{O Q}], [qw{O Q S}] ], [ ['T'], [qw{A D E K L M}], [qw{A D E K L M T}] ] ) { my $args = join( ', ', map { "'$_'" } @{ $data->[0] } ); my $rv = $Dep->depends( @{ $data->[0] } ); ok( $rv, "Dependency->depends($args) returns something" ); is_deeply( $rv, $data->[1], "Dependency->depends($args) returns expected values" ); $rv = $Dep->schedule( @{ $data->[0] } ); ok( $rv, "Dependency->schedule($args) returns something" ); is_deeply( $rv, $data->[2], "Dependency->schedule($args) returns expected values" ); } # Do a quick check of the missing_dependencies methods is( $Source->missing_dependencies, 0, "->missing_dependencies returns as expected" ); 1; Algorithm-Dependency-1.112/t/00-report-prereqs.t000644 000766 000024 00000013565 13651717723 021660 0ustar00etherstaff000000 000000 #!perl use strict; use warnings; # This test was generated by Dist::Zilla::Plugin::Test::ReportPrereqs 0.027 use Test::More tests => 1; use ExtUtils::MakeMaker; use File::Spec; # from $version::LAX my $lax_version_re = qr/(?: undef | (?: (?:[0-9]+) (?: \. | (?:\.[0-9]+) (?:_[0-9]+)? )? | (?:\.[0-9]+) (?:_[0-9]+)? ) | (?: v (?:[0-9]+) (?: (?:\.[0-9]+)+ (?:_[0-9]+)? )? | (?:[0-9]+)? (?:\.[0-9]+){2,} (?:_[0-9]+)? ) )/x; # hide optional CPAN::Meta modules from prereq scanner # and check if they are available my $cpan_meta = "CPAN::Meta"; my $cpan_meta_pre = "CPAN::Meta::Prereqs"; my $HAS_CPAN_META = eval "require $cpan_meta; $cpan_meta->VERSION('2.120900')" && eval "require $cpan_meta_pre"; ## no critic # Verify requirements? my $DO_VERIFY_PREREQS = 1; sub _max { my $max = shift; $max = ( $_ > $max ) ? $_ : $max for @_; return $max; } sub _merge_prereqs { my ($collector, $prereqs) = @_; # CPAN::Meta::Prereqs object if (ref $collector eq $cpan_meta_pre) { return $collector->with_merged_prereqs( CPAN::Meta::Prereqs->new( $prereqs ) ); } # Raw hashrefs for my $phase ( keys %$prereqs ) { for my $type ( keys %{ $prereqs->{$phase} } ) { for my $module ( keys %{ $prereqs->{$phase}{$type} } ) { $collector->{$phase}{$type}{$module} = $prereqs->{$phase}{$type}{$module}; } } } return $collector; } my @include = qw( Encode File::Temp JSON::PP Module::Runtime Pod::Coverage Sub::Name YAML autodie ); my @exclude = qw( ); # Add static prereqs to the included modules list my $static_prereqs = do './t/00-report-prereqs.dd'; # Merge all prereqs (either with ::Prereqs or a hashref) my $full_prereqs = _merge_prereqs( ( $HAS_CPAN_META ? $cpan_meta_pre->new : {} ), $static_prereqs ); # Add dynamic prereqs to the included modules list (if we can) my ($source) = grep { -f } 'MYMETA.json', 'MYMETA.yml'; my $cpan_meta_error; if ( $source && $HAS_CPAN_META && (my $meta = eval { CPAN::Meta->load_file($source) } ) ) { $full_prereqs = _merge_prereqs($full_prereqs, $meta->prereqs); } else { $cpan_meta_error = $@; # capture error from CPAN::Meta->load_file($source) $source = 'static metadata'; } my @full_reports; my @dep_errors; my $req_hash = $HAS_CPAN_META ? $full_prereqs->as_string_hash : $full_prereqs; # Add static includes into a fake section for my $mod (@include) { $req_hash->{other}{modules}{$mod} = 0; } for my $phase ( qw(configure build test runtime develop other) ) { next unless $req_hash->{$phase}; next if ($phase eq 'develop' and not $ENV{AUTHOR_TESTING}); for my $type ( qw(requires recommends suggests conflicts modules) ) { next unless $req_hash->{$phase}{$type}; my $title = ucfirst($phase).' '.ucfirst($type); my @reports = [qw/Module Want Have/]; for my $mod ( sort keys %{ $req_hash->{$phase}{$type} } ) { next if $mod eq 'perl'; next if grep { $_ eq $mod } @exclude; my $file = $mod; $file =~ s{::}{/}g; $file .= ".pm"; my ($prefix) = grep { -e File::Spec->catfile($_, $file) } @INC; my $want = $req_hash->{$phase}{$type}{$mod}; $want = "undef" unless defined $want; $want = "any" if !$want && $want == 0; my $req_string = $want eq 'any' ? 'any version required' : "version '$want' required"; if ($prefix) { my $have = MM->parse_version( File::Spec->catfile($prefix, $file) ); $have = "undef" unless defined $have; push @reports, [$mod, $want, $have]; if ( $DO_VERIFY_PREREQS && $HAS_CPAN_META && $type eq 'requires' ) { if ( $have !~ /\A$lax_version_re\z/ ) { push @dep_errors, "$mod version '$have' cannot be parsed ($req_string)"; } elsif ( ! $full_prereqs->requirements_for( $phase, $type )->accepts_module( $mod => $have ) ) { push @dep_errors, "$mod version '$have' is not in required range '$want'"; } } } else { push @reports, [$mod, $want, "missing"]; if ( $DO_VERIFY_PREREQS && $type eq 'requires' ) { push @dep_errors, "$mod is not installed ($req_string)"; } } } if ( @reports ) { push @full_reports, "=== $title ===\n\n"; my $ml = _max( map { length $_->[0] } @reports ); my $wl = _max( map { length $_->[1] } @reports ); my $hl = _max( map { length $_->[2] } @reports ); if ($type eq 'modules') { splice @reports, 1, 0, ["-" x $ml, "", "-" x $hl]; push @full_reports, map { sprintf(" %*s %*s\n", -$ml, $_->[0], $hl, $_->[2]) } @reports; } else { splice @reports, 1, 0, ["-" x $ml, "-" x $wl, "-" x $hl]; push @full_reports, map { sprintf(" %*s %*s %*s\n", -$ml, $_->[0], $wl, $_->[1], $hl, $_->[2]) } @reports; } push @full_reports, "\n"; } } } if ( @full_reports ) { diag "\nVersions for all modules listed in $source (including optional ones):\n\n", @full_reports; } if ( $cpan_meta_error || @dep_errors ) { diag "\n*** WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING ***\n"; } if ( $cpan_meta_error ) { my ($orig_source) = grep { -f } 'MYMETA.json', 'MYMETA.yml'; diag "\nCPAN::Meta->load_file('$orig_source') failed with: $cpan_meta_error\n"; } if ( @dep_errors ) { diag join("\n", "\nThe following REQUIRED prerequisites were not satisfied:\n", @dep_errors, "\n" ); } pass; # vim: ts=4 sts=4 sw=4 et: Algorithm-Dependency-1.112/t/03_basics.t000600 000766 000024 00000014120 13651717723 020173 0ustar00etherstaff000000 000000 # Creating and using dependency trees use strict; BEGIN { $| = 1; $^W = 1; } use Test::More tests => 118; use File::Spec::Functions ':ALL'; use Algorithm::Dependency; use Algorithm::Dependency::Source::File; # Where is the test data located my $TESTDATA = catdir( 't', 'data' ); ok( -d $TESTDATA, 'Found test data directory' ); # Load the data/basics.txt file in as a source file, and test it rigorously. my $file = File::Spec->catfile( $TESTDATA, 'basics.txt' ); my $Source = Algorithm::Dependency::Source::File->new( $file ); ok( $Source, "Source is true" ); ok( ref $Source, "Source is a reference" ); isa_ok( $Source, 'Algorithm::Dependency::Source::File' ); isa_ok( $Source, 'Algorithm::Dependency::Source' ); ok( exists $Source->{loaded}, "Source has a loaded value" ); ok( ! $Source->{loaded}, "Source isn't loaded" ); ok( eval {$Source->load;}, "Source ->load returns true" ); ok( $Source->{loaded}, "Source appears to be loaded" ); isa_ok( $Source->item('A'), 'Algorithm::Dependency::Item' ); isa_ok( $Source->item('B'), 'Algorithm::Dependency::Item' ); isa_ok( $Source->item('D'), 'Algorithm::Dependency::Item' ); ok( ! defined $Source->item('BAD'), "->item for bad value properly returns undef" ); ok( $Source->item('A')->id eq 'A', "Item ->id appears to work ok" ); ok( scalar $Source->item('A')->depends == 0, "Item ->depends for 0 depends returns ok" ); ok( scalar $Source->item('B')->depends == 1, "Item ->depends for 1 depends returns ok" ); ok( scalar $Source->item('D')->depends == 2, "Item ->depends for 2 depends returns ok" ); my @items = $Source->items; ok( scalar @items == 6, "Source ->items returns a list" ); isa_ok( $items[0], 'Algorithm::Dependency::Item' ); isa_ok( $items[1], 'Algorithm::Dependency::Item' ); isa_ok( $items[3], 'Algorithm::Dependency::Item' ); ok( ($items[0]->id eq 'A' and $items[1]->id eq 'B' and $items[3]->id eq 'D'), "Source ->items returns in original database order" ); ok( $items[0] eq $Source->item('A'), "Hash and list refer to the same object" ); # Try to create a basic unordered dependency my $Dep = Algorithm::Dependency->new( source => $Source ); ok( $Dep, "Algorithm::Dependency->new returns true" ); ok( ref $Dep, "Algorithm::Dependency->new returns reference" ); isa_ok( $Dep, 'Algorithm::Dependency'); ok( $Dep->source, "Dependency->source returns true" ); ok( $Dep->source eq $Source, "Dependency->source returns the original source" ); ok( $Dep->item('A'), "Dependency->item returns true" ); ok( $Dep->item('A') eq $Source->item('A'), "Dependency->item returns the same as Source->item" ); my @tmp; ok( scalar( @tmp = $Dep->selected_list ) == 0, "Dependency->selected_list returns empty list" ); ok( ! $Dep->selected('Foo'), "Dependency->selected returns false on bad input" ); ok( ! $Dep->selected('A'), "Dependency->selected returns false when not selected" ); ok( ! defined $Dep->depends('Foo'), "Dependency->depends fails correctly on bad input" ); foreach my $data ( [ ['A'], [], ['A'] ], [ ['B'], ['C'], ['B','C'] ], [ ['C'], [], ['C'] ], [ ['D'], ['E','F'], [qw{D E F}] ], [ ['E'], [], ['E'] ], [ ['F'], [], ['F'] ], [ ['A','B'], ['C'], [qw{A B C}] ], [ ['B','D'], [qw{C E F}], [qw{B C D E F}] ] ) { my $args = join( ', ', map { "'$_'" } @{ $data->[0] } ); my $rv = $Dep->depends( @{ $data->[0] } ); ok( $rv, "Dependency->depends($args) returns something" ); is_deeply( $rv, $data->[1], "Dependency->depends($args) returns expected values" ); $rv = $Dep->schedule( @{ $data->[0] } ); ok( $rv, "Dependency->schedule($args) returns something" ); is_deeply( $rv, $data->[2], "Dependency->schedule($args) returns expected values" ); } # Try a bad creation ok( ! defined Algorithm::Dependency->new(), "Dependency->new fails correctly" ); # Create with one selected $Dep = Algorithm::Dependency->new( source => $Source, selected => [ 'F' ] ); ok( $Dep, "Algorithm::Dependency->new returns true" ); ok( ref $Dep, "Algorithm::Dependency->new returns reference" ); isa_ok( $Dep, 'Algorithm::Dependency'); ok( $Dep->source, "Dependency->source returns true" ); ok( $Dep->source eq $Source, "Dependency->source returns the original source" ); ok( $Dep->item('A'), "Dependency->item returns true" ); ok( $Dep->item('A') eq $Source->item('A'), "Dependency->item returns the same as Source->item" ); ok( scalar( @tmp = $Dep->selected_list ) == 1, "Dependency->selected_list returns empty list" ); ok( ! $Dep->selected('Foo'), "Dependency->selected returns false when wrong" ); ok( ! $Dep->selected('A'), "Dependency->selected returns false when expected" ); ok( $Dep->selected('F'), "Dependency->selected return true" ); ok( ! defined $Dep->depends('Foo'), "Dependency->depends fails correctly on bad input" ); foreach my $data ( [ ['A'], [], ['A'] ], [ ['B'], ['C'], [qw{B C}] ], [ ['C'], [], ['C'] ], [ ['D'], ['E'], [qw{D E}] ], [ ['E'], [], ['E'] ], [ ['F'], [], [] ], [ ['A','B'], ['C'], [qw{A B C}] ], [ ['B','D'], [qw{C E}], [qw{B C D E}] ] ) { my $args = join( ', ', map { "'$_'" } @{ $data->[0] } ); my $rv = $Dep->depends( @{ $data->[0] } ); ok( $rv, "Dependency->depends($args) returns something" ); is_deeply( $rv, $data->[1], "Dependency->depends($args) returns expected values" ); $rv = $Dep->schedule( @{ $data->[0] } ); ok( $rv, "Dependency->schedule($args) returns something" ); is_deeply( $rv, $data->[2], "Dependency->schedule($args) returns expected values" ); } # Does missing dependencies return defined but false for a source we # know doesn't have any missing dependencies is( $Source->missing_dependencies, 0, "->missing_dependencies returns as expected when nothing missing" ); # Load the source we know has missing dependencies $file = File::Spec->catfile( $TESTDATA, 'missing.txt' ); my $Missing = Algorithm::Dependency::Source::File->new( $file ); ok( $Missing, "Missing is true" ); ok( ref $Missing, "Missing is a reference" ); isa_ok( $Missing, 'Algorithm::Dependency::Source::File' ); isa_ok( $Missing, 'Algorithm::Dependency::Source' ); ok( eval {$Missing->load;}, "Missing ->load returns true" ); is_deeply( $Missing->missing_dependencies, [ 'C', 'E' ], "->missing_dependencies returns as expected when something missing" ); Algorithm-Dependency-1.112/t/00-report-prereqs.dd000644 000766 000024 00000022271 13651717723 021776 0ustar00etherstaff000000 000000 do { my $x = { 'configure' => { 'requires' => { 'ExtUtils::MakeMaker' => '0', 'perl' => '5.006' } }, 'develop' => { 'recommends' => { 'Dist::Zilla::PluginBundle::Author::ETHER' => '0.154', 'Dist::Zilla::PluginBundle::Git::VersionManager' => '0.007' }, 'requires' => { 'Encode' => '0', 'File::Spec' => '0', 'IO::Handle' => '0', 'IPC::Open3' => '0', 'Pod::Coverage::TrustPod' => '0', 'Pod::Wordlist' => '0', 'Test::CPAN::Changes' => '0.19', 'Test::CPAN::Meta' => '0', 'Test::Kwalitee' => '1.21', 'Test::MinimumVersion' => '0', 'Test::Mojibake' => '0', 'Test::More' => '0.96', 'Test::Pod' => '1.41', 'Test::Pod::Coverage' => '1.08', 'Test::Pod::No404s' => '0', 'Test::Portability::Files' => '0', 'Test::Spelling' => '0.12', 'perl' => '5.006', 'warnings' => '0' } }, 'runtime' => { 'requires' => { 'List::Util' => '1.11', 'Params::Util' => '0.31', 'perl' => '5.006', 'strict' => '0' } }, 'test' => { 'recommends' => { 'CPAN::Meta' => '2.120900' }, 'requires' => { 'ExtUtils::MakeMaker' => '0', 'File::Spec' => '0.80', 'File::Spec::Functions' => '0', 'Test::ClassAPI' => '0.6', 'Test::More' => '0.47', 'perl' => '5.006', 'warnings' => '0' } }, 'x_Dist_Zilla' => { 'requires' => { 'Dist::Zilla' => '5', 'Dist::Zilla::Plugin::Authority' => '1.009', 'Dist::Zilla::Plugin::AutoMetaResources' => '0', 'Dist::Zilla::Plugin::AutoPrereqs' => '5.038', 'Dist::Zilla::Plugin::BumpVersionAfterRelease::Transitional' => '0.004', 'Dist::Zilla::Plugin::CheckIssues' => '0', 'Dist::Zilla::Plugin::CheckMetaResources' => '0', 'Dist::Zilla::Plugin::CheckPrereqsIndexed' => '0.019', 'Dist::Zilla::Plugin::CheckSelfDependency' => '0', 'Dist::Zilla::Plugin::CheckStrictVersion' => '0', 'Dist::Zilla::Plugin::ConfirmRelease' => '0', 'Dist::Zilla::Plugin::CopyFilesFromRelease' => '0', 'Dist::Zilla::Plugin::EnsureLatestPerl' => '0', 'Dist::Zilla::Plugin::FileFinder::ByName' => '0', 'Dist::Zilla::Plugin::GenerateFile::FromShareDir' => '0', 'Dist::Zilla::Plugin::Git::Check' => '0', 'Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch' => '0.004', 'Dist::Zilla::Plugin::Git::CheckFor::MergeConflicts' => '0', 'Dist::Zilla::Plugin::Git::Commit' => '2.020', 'Dist::Zilla::Plugin::Git::Contributors' => '0.029', 'Dist::Zilla::Plugin::Git::Describe' => '0.004', 'Dist::Zilla::Plugin::Git::GatherDir' => '2.016', 'Dist::Zilla::Plugin::Git::Push' => '0', 'Dist::Zilla::Plugin::Git::Remote::Check' => '0', 'Dist::Zilla::Plugin::Git::Tag' => '0', 'Dist::Zilla::Plugin::GitHub::Update' => '0.40', 'Dist::Zilla::Plugin::GithubMeta' => '0.54', 'Dist::Zilla::Plugin::InstallGuide' => '1.200005', 'Dist::Zilla::Plugin::Keywords' => '0.004', 'Dist::Zilla::Plugin::License' => '5.038', 'Dist::Zilla::Plugin::MakeMaker' => '0', 'Dist::Zilla::Plugin::Manifest' => '0', 'Dist::Zilla::Plugin::MetaConfig' => '0', 'Dist::Zilla::Plugin::MetaJSON' => '0', 'Dist::Zilla::Plugin::MetaNoIndex' => '0', 'Dist::Zilla::Plugin::MetaProvides::Package' => '1.15000002', 'Dist::Zilla::Plugin::MetaTests' => '0', 'Dist::Zilla::Plugin::MetaYAML' => '0', 'Dist::Zilla::Plugin::MinimumPerl' => '1.006', 'Dist::Zilla::Plugin::MojibakeTests' => '0.8', 'Dist::Zilla::Plugin::NextRelease' => '5.033', 'Dist::Zilla::Plugin::PodCoverageTests' => '5.040', 'Dist::Zilla::Plugin::PodSyntaxTests' => '5.040', 'Dist::Zilla::Plugin::PodWeaver' => '4.005', 'Dist::Zilla::Plugin::Prereqs' => '0', 'Dist::Zilla::Plugin::Prereqs::AuthorDeps' => '0.006', 'Dist::Zilla::Plugin::PromptIfStale' => '0', 'Dist::Zilla::Plugin::Readme' => '0', 'Dist::Zilla::Plugin::ReadmeAnyFromPod' => '0.142180', 'Dist::Zilla::Plugin::RewriteVersion::Transitional' => '0.004', 'Dist::Zilla::Plugin::Run::AfterBuild' => '0.041', 'Dist::Zilla::Plugin::Run::AfterRelease' => '0.038', 'Dist::Zilla::Plugin::RunExtraTests' => '0.024', 'Dist::Zilla::Plugin::StaticInstall' => '0.005', 'Dist::Zilla::Plugin::Test::CPAN::Changes' => '0.012', 'Dist::Zilla::Plugin::Test::ChangesHasContent' => '0', 'Dist::Zilla::Plugin::Test::Compile' => '2.039', 'Dist::Zilla::Plugin::Test::Kwalitee' => '2.10', 'Dist::Zilla::Plugin::Test::MinimumVersion' => '2.000010', 'Dist::Zilla::Plugin::Test::Pod::No404s' => '1.003', 'Dist::Zilla::Plugin::Test::PodSpelling' => '2.006003', 'Dist::Zilla::Plugin::Test::Portability' => '2.000007', 'Dist::Zilla::Plugin::Test::ReportPrereqs' => '0.022', 'Dist::Zilla::Plugin::TestRelease' => '0', 'Dist::Zilla::Plugin::UploadToCPAN' => '0', 'Dist::Zilla::Plugin::UseUnsafeInc' => '0', 'Dist::Zilla::PluginBundle::Author::ETHER' => '0.119', 'Dist::Zilla::PluginBundle::Git::VersionManager' => '0.007', 'Software::License::Perl_5' => '0' } } }; $x; }Algorithm-Dependency-1.112/t/02_api.t000600 000766 000024 00000002277 13651717723 017511 0ustar00etherstaff000000 000000 # API Testing for Algorithm::Dependency use strict; BEGIN { $| = 1; $^W = 1; } # Load the API we will be testing use Test::More 'tests' => 39; use Test::ClassAPI; use Algorithm::Dependency (); use Algorithm::Dependency::Ordered (); use Algorithm::Dependency::Source::File (); use Algorithm::Dependency::Source::HoA (); # Execute the tests Test::ClassAPI->execute('complete'); exit(0); # Now, define the API for the classes __DATA__ Algorithm::Dependency=class Algorithm::Dependency::Item=abstract Algorithm::Dependency::Ordered=class Algorithm::Dependency::Source=abstract Algorithm::Dependency::Source::File=class Algorithm::Dependency::Source::HoA=class [Algorithm::Dependency] new=method source=method selected_list=method selected=method item=method depends=method schedule=method schedule_all=method [Algorithm::Dependency::Item] new=method id=method depends=method [Algorithm::Dependency::Ordered] Algorithm::Dependency=isa [Algorithm::Dependency::Source] new=method load=method item=method items=method missing_dependencies=method [Algorithm::Dependency::Source::File] Algorithm::Dependency::Source=isa [Algorithm::Dependency::Source::HoA] Algorithm::Dependency::Source=isa Algorithm-Dependency-1.112/t/data/000770 000766 000024 00000000000 13651717723 017160 5ustar00etherstaff000000 000000 Algorithm-Dependency-1.112/t/01_compile.t000600 000766 000024 00000003414 13651717723 020361 0ustar00etherstaff000000 000000 # Basic load and method existance tests for Algorithm::Dependency use strict; BEGIN { $| = 1; $^W = 1; } use Test::More tests => 16; # Check their perl version ok( $] > 5.005, 'Perl version is new enough' ); # Load the main modules use_ok( 'Algorithm::Dependency' ); use_ok( 'Algorithm::Dependency::Ordered' ); use_ok( 'Algorithm::Dependency::Weight' ); use_ok( 'Algorithm::Dependency::Source::File' ); use_ok( 'Algorithm::Dependency::Source::HoA' ); # Check for version lock is( $Algorithm::Dependency::VERSION, $Algorithm::Dependency::Ordered::VERSION, '$VERSION matches for ::Ordered' ); is( $Algorithm::Dependency::VERSION, $Algorithm::Dependency::Weight::VERSION, '$VERSION matches for ::Weight' ); is( $Algorithm::Dependency::VERSION, $Algorithm::Dependency::Source::VERSION, '$VERSION matches for ::Source' ); is( $Algorithm::Dependency::VERSION, $Algorithm::Dependency::Source::File::VERSION, '$VERSION matches for ::Source::File' ); is( $Algorithm::Dependency::VERSION, $Algorithm::Dependency::Source::HoA::VERSION, '$VERSION matches for ::Source::HoA' ); # Do it again to avoid warnings is( $Algorithm::Dependency::VERSION, $Algorithm::Dependency::Ordered::VERSION, '$VERSION matches for ::Ordered' ); is( $Algorithm::Dependency::VERSION, $Algorithm::Dependency::Weight::VERSION, '$VERSION matches for ::Weight' ); is( $Algorithm::Dependency::VERSION, $Algorithm::Dependency::Source::VERSION, '$VERSION matches for ::Source' ); is( $Algorithm::Dependency::VERSION, $Algorithm::Dependency::Source::File::VERSION, '$VERSION matches for ::Source::File' ); is( $Algorithm::Dependency::VERSION, $Algorithm::Dependency::Source::HoA::VERSION, '$VERSION matches for ::Source::HoA' ); Algorithm-Dependency-1.112/t/data/complex.txt000600 000766 000024 00000000313 13651717723 021360 0ustar00etherstaff000000 000000 # This file is to be loaded by Algorithm::Dependency::Source::File, and # contains some complex dependency information A B C C D E F E F F G H H I I J J K L M L M M N O N P N Q O N R P S R Q T M R D K AAlgorithm-Dependency-1.112/t/data/basics.txt000600 000766 000024 00000000170 13651717723 021156 0ustar00etherstaff000000 000000 # This file is to be loaded by Algorithm::Dependency::Source::File, and # contains some basic stuff. A B C C D E F E F Algorithm-Dependency-1.112/t/data/missing.txt000600 000766 000024 00000000240 13651717723 021361 0ustar00etherstaff000000 000000 # This file is to be loaded by Algorithm::Dependency::Source::File, and # contains some basic stuff, with the items C and E specifically missing A B C D E F F Algorithm-Dependency-1.112/t/data/circular.txt000600 000766 000024 00000000040 13651717723 021512 0ustar00etherstaff000000 000000 A B B C C D F D C G E D F H G H