Path-IsDev-1.001002/0000755000175000017500000000000012373560357012340 5ustar kentkentPath-IsDev-1.001002/LICENSE0000644000175000017500000004376512373560357013364 0ustar kentkentThis software is copyright (c) 2014 by Kent Fredric . 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) 2014 by Kent Fredric . 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) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/Changes0000644000175000017500000001716112373560357013641 0ustar kentkentRelease history for Path-IsDev 1.001002 2014-08-16T04:40:51Z [00 Trivial] - CPANDAY! - no code changes - tests augmented - whitespace reduced [Dependencies::Stats] - Dependencies changed since 1.001001, see misc/*.deps* for details - configure: ↓1 - develop: +1 (suggests: ↑2) - test: +1 -3 (recommends: ↑1 -1) [Metadata] - move to kentnl org [Misc] - Improve source side POD to reduce build side whitespace. [Tests] - update Test::ReportPrereqs 1.001001 2014-07-12T18:23:30Z [00 Trivial] - Misc packaging cleanups. [Dependencies::Stats] - Dependencies changed since 1.001000, see misc/*.deps* for details - configure: (recommends: ↑1) - develop: +3 -3 (suggests: +2 -1) - test: (recommends: ↑2) 1.001000 2014-03-01T13:22:00Z [00 Majorish] - Tooling switched to ExtUtils::MakeMaker [Bug fixes] - Needed newer Path::Tiny for ->realpath [Dependencies::Aggregate] - 5.008 - 48 → 43 - 5.010 - 31 → 32 - 5.019 - 17 → 16 [Dependencies::Stats] - Dependencies changed since 1.000002, see misc/*.deps* for details - build: -1 - configure: +1 -1 (recommends: +1) - develop: +7 ↑1 -9 - runtime: +1 ↑2 - test: +4 ↓1 (recommends: +4) 1.000002 2013-11-22T03:28:04Z [Bug Fixes] - Attempt to avoid failures on some Win32's where methods other than File::HomeDir->my_home don't work at all. [Dependencies::Stats] - Dependencies changed since 1.000001, see misc/*.deps* for details - develop: ↑1 [Maintenance] - Split Changes into Changes.{deps,deps.all,deps.dev} for easier reading for maintainers. 1.000001 2013-11-21T11:49:20Z [Dependencies::Stats] - Dependencies changed since 1.000000, see misc/*.deps* for details - build: ↑1 - configure: ↑1 - develop: +42 ↑1 - test: ↑1 -3 [Documentation] - README.mkdn → MetaCPAN - Encoding → UTF-8 [Maintenance] - Increase deps on Module::Build and Test::More - Removes a few deps no longer needed. [Packaging] - Use new fallback code in MB [Tests] - Replace Test::Compile with Test::Compile::PerFile 1.000000 2013-10-18T09:55:20Z [00 Supermajor Changes - Breaking Everything] - This release comes with many significant changes that are likely to break any closely built dependencies. - External export interface contains no visible changes, but underyling plumbing is under heavy construction. [01 Role Refactory] - Any existing code that relied on previous roles or base classes will be BROKEN by this release. - Roles again reimplemented and split to be more horizonal instead of vertically integrated. - This means all Heuristics need to provide a ->matches() or ->excludes() method now, and manually call their composite roles, and manually set $result_object->result(1) where relevant. [02 Base class removal] - Base classes that we're deprecated in 0.6.0 are gone now. [03 Version Schema Change] - Version scheme is now Y.nnnnnn . If this is a problem for you, this means you're a downstream who doesn't normalise versions yet. Please learn to normalise, perl upstream break your assumptions. - Versions will retain semantic difference, just there more "perl internals" friendly. [04 New Heuristic Match Types] - Now a Matcher that matches on full paths [05 New Negative Heuristics] - ::HomeDir - Excludes all the paths returned by File::HomeDir - ::PerlINC - Excludes all the paths in Config.pm [06 Updated Heuristic Sets] - ::Basic now includes ::HomeDir and ::PerlINC exclusions [07 Internals] - Requirement for matches to debug themselves greatly reduced. - Matches now only need to report context feedback via the result object - The result object intelligently executes relevant debugging intel [Dependencies] - Now depends on File::HomeDir - Perl 5.6 is now minimum ( was 5.10 ) - Test::More increased. [Dependencies::Stats] - Dependencies changed since 0.6.0, see misc/*.deps* for details - develop: ↑2 - runtime: +1 ↓1 - test: ↑1 0.6.0 2013-10-05T17:56:06Z [00 Major Changes - Role Apocalypse] - All internals that could be rewritten to invoke roles instead of inheritance, have been done so. - Base classes for existing things still exist, and should still work, however, they're on borrowed time. [Dependencies] - Now requires Role::Tiny - No longer requires parent [Dependencies::Stats] - Dependencies changed since 0.5.0, see misc/*.deps* for details - runtime: +2 -1 0.5.0 2013-10-05T15:00:12Z [00 Major Changes - Result Object] - Internals now re-written slightly to pass around a result object that communicates state. - Everywhere $path was previously used, $result_object->path is now used instead. - $result_object->path guaranteed to exist and be a ref of some kind. - $result_object->path automatically upgraded to Path::Tiny if provided as a string - ->matches() and ->excludes() can now record results of heuristics by invoking $result_object->add_reason() - Path::IsDev::Object->_matches($path) now exists and returns a Result Object for $path - Dumping result object will give you as much info as turning debugging on would 0.4.0 2013-09-27T17:48:00Z [00 Major Changes - Negative Heuristics] - Now has a system to indicate negative heuristics, to mark given directories as "not dev", which cause other postive heuristics to be ignored. - One basic negative heuristic added, 'IsDev::IgnoreFile' - Basic Negative heuristic comes standard with the basic set. [Dependencies::Stats] - Dependencies changed since 0.3.3, see misc/*.deps* for details - develop: +1 -1 (recommends: -1, suggests: +1 -1) 0.3.3 2013-09-26T07:09:14Z [Bugfix] - Use a Non-Win32-failing compile test [Dependencies] - Now requires File::Spec for testing. [Dependencies::Stats] - Dependencies changed since 0.3.2, see misc/*.deps* for details - test: +1 0.3.2 2013-09-18T17:45:37Z [Bugfix] - Require a version 0.010 of Class::Tiny that doesn't exhibit the "used only once" warning [Dependencies::Stats] - Dependencies changed since 0.3.1, see misc/*.deps* for details - runtime: ↑1 0.3.1 2013-09-18T02:21:11Z [Bugfix] - Require a Class::Tiny 0.005 for lazy attrs [Dependencies::Stats] - Dependencies changed since 0.3.0, see misc/*.deps* for details - runtime: ↑1 0.3.0 2013-09-16T08:27:21Z [!Major] - Now uses Class::Tiny instead of Moo internally. - New Heuristic VCS::Git and is part of the Basic set. ( Because I found a few projects where I didn't have any toolkit specific files, but I wanted to find the root anyway, and I assumed my own code would just work, but it wouldn't ... ) [Dependencies] - Added Class::Tiny - Removed Moo and File::Find - Increased Module::Build to 0.4007 [Dependencies::Stats] - Dependencies changed since 0.2.3, see misc/*.deps* for details - build: ↑1 - configure: ↑1 - develop: +1 (suggests: ↑1) - runtime: +1 -1 - test: +2 -1 0.2.3 2013-07-14T03:02:16Z [Bugs] - Need Moo 1.000008 for `builder => sub {}` [Dependencies::Stats] - Dependencies changed since 0.2.2, see misc/*.deps* for details - runtime: ↑1 [Tests] - Better coverage of `::Object` 0.2.2 2013-07-07T15:53:07Z [Bugs] - Suppress redefine warning caused by localising a sub before sourcing the module that provides it. 0.2.1 2013-07-07T15:27:19Z [Internals] - Debug messages now include some indicator suggesting which unique object they're comming from. - invoking `BUILD` with debugging on prints basic introspected data. 0.2.0 2013-07-07T13:52:33Z [00 Major Changes] - Guts of exporter refactored to a Moo class. [Dependencies] - now depends on Moo [Dependencies::Stats] - Dependencies changed since 0.1.1, see misc/*.deps* for details - runtime: +1 0.1.1 2013-07-06T15:36:30Z [Internals] - debug() now appends \n automatically. 0.1.0 2013-07-06T12:49:36Z - First version. Path-IsDev-1.001002/lib/0000755000175000017500000000000012373560357013106 5ustar kentkentPath-IsDev-1.001002/lib/Path/0000755000175000017500000000000012373560357014002 5ustar kentkentPath-IsDev-1.001002/lib/Path/IsDev.pm0000644000175000017500000002427112373560357015360 0ustar kentkentuse 5.008; # utf8 use strict; use warnings; use utf8; package Path::IsDev; our $VERSION = '1.001002'; # ABSTRACT: Determine if a given Path resembles a development source tree our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY use Sub::Exporter -setup => { exports => [ is_dev => \&_build_is_dev, ], }; our $ENV_KEY_DEBUG = 'PATH_ISDEV_DEBUG'; our $DEBUG = ( exists $ENV{$ENV_KEY_DEBUG} ? $ENV{$ENV_KEY_DEBUG} : undef ); sub debug { return unless $DEBUG; return *STDERR->printf( qq{[Path::IsDev] %s\n}, shift ); } sub _build_is_dev { my ( undef, undef, $arg ) = @_; my $isdev_object; return sub { my ($path) = @_; $isdev_object ||= do { require Path::IsDev::Object; Path::IsDev::Object->new( %{ $arg || {} } ); }; return $isdev_object->matches($path); }; } *is_dev = _build_is_dev( 'Path::IsDev', 'is_dev', {} ); 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev - Determine if a given Path resembles a development source tree =head1 VERSION version 1.001002 =head1 SYNOPSIS use Path::IsDev qw(is_dev); if( is_dev('/some/path') ) { ... } else { ... } =head1 DESCRIPTION This module is more or less a bunch of heuristics for determining if a given path is a development tree root of some kind. This has many useful applications, notably ones that require behaviours for "installed" modules to be different to those that are still "in development" =head1 FUNCTIONS =head2 debug Debug callback. To enable debugging: export PATH_ISDEV_DEBUG=1 =head2 C Using an C'ed C: if( is_dev( $path ) ) { } Though the actual heuristics used will be based on how C was called. Additionally, you can call Path::IsDev::is_dev without Cing anything, and it will behave exactly the same as if you'd imported it using use Path::IsDev qw( is_dev ); That is, no C specification is applicable, so you'll only get the "default". =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev", "interface":"exporter" } =end MetaPOD::JSON =head1 UNDERSTANDING AND DEBUGGING THIS MODULE Understanding how this module works, is critical to understand where you can use it, and the consequences of using it. This module operates on a very simplistic level, and its easy for false-positives to occur. There are two types of Heuristics, Postive/Confirming Heuristics, and Negative/Disconfirming Heuristics. Positive Heuristics and Negative Heuristics are based solely on the presence of specific marker files in a directory, or special marker directories. For instance, the files C, C, and C are all B markers, because their presence often indicates a "root" of a development tree. And for instance, the directories C, C and C<.git/> are also B markers, because these structures are common in C development trees, and uncommon in install trees. However, these markers sometimes go wrong, for instance, consider you have a C or C install in C<$HOME> $HOME/ $HOME/lib/ $HOME/perl5/perls/perl-5.19.3/lib/site_perl/ Etc. Under normal circumstances, neither C<$HOME> nor those 3 paths are considered C. However, all it takes to cause a false positive, is for somebody to install a C or C directory, or a marker file in one of the above directories for C to return true. This may not be a problem, at least, until you use C which combines C with recursive up-level traversal. $HOME/ $HOME/lib/ $HOME/perl5/perls/perl-5.19.3/lib/site_perl/ find_dev('$HOME/perl5/perls/perl-5.19.3/lib/site_perl/') # returns false, because it is not inside a dev directory mkdir $HOME/t find_dev('$HOME/perl5/perls/perl-5.19.3/lib/site_perl/') # returns $HOME, because $HOME/t exists. And it is this kind of problem that usually catches people off guard. PATH_ISDEV_DEBUG=1 \ perl -Ilib -MPath::FindDev=find_dev \ -E "say find_dev(q{/home/kent/perl5/perlbrew/perls/perl-5.19.3/lib/site_perl})" ... [Path::IsDev=0] + ::Tool::Dzil => 0 : dist.ini does not exist [Path::IsDev=0] + ::Tool::MakeMaker => 0 : Makefile.PL does not exist [Path::IsDev=0] + ::Tool::ModuleBuild => 0 : Build.PL does not exist [Path::IsDev=0] + ::META => 0 : META.json does not exist [Path::IsDev=0] + ::META => 1 : META.yml exists [Path::IsDev=0] + ::META => 1 : /home/kent/perl5/META.yml is a file [Path::IsDev=0] + ::META matched path /home/kent/perl5 /home/kent/perl5 Whoops!. [Path::IsDev=0] + ::META => 1 : META.yml exists [Path::IsDev=0] + ::META => 1 : /home/kent/perl5/META.yml is a file No wonder! rm /home/kent/perl5/META.yml PATH_ISDEV_DEBUG=1 \ perl -Ilib -MPath::FindDev=find_dev \ -E "say find_dev(q{/home/kent/perl5/perlbrew/perls/perl-5.19.3/lib/site_perl})" ... [Path::IsDev=0] Matching /home/kent/perl5 ... [Path::IsDev=0] + ::TestDir => 0 : xt does not exist [Path::IsDev=0] + ::TestDir => 1 : t exists [Path::IsDev=0] + ::TestDir => 1 : /home/kent/perl5/t is a dir [Path::IsDev=0] + ::TestDir matched path /home/kent/perl5 /home/kent/perl5 Double whoops! [Path::IsDev=0] + ::TestDir => 1 : t exists [Path::IsDev=0] + ::TestDir => 1 : /home/kent/perl5/t is a dir And you could keep doing that until you rule out all the bad heuristics in your tree. Or, you could use a negative heuristic. touch /home/kent/perl5/.path_isdev_ignore PATH_ISDEV_DEBUG=1 \ perl -Ilib -MPath::FindDev=find_dev \ -E "say find_dev(q{/home/kent/perl5/perlbrew/perls/perl-5.19.3/lib/site_perl})" ... [Path::IsDev=0] Matching /home/kent/perl5 [Path::IsDev=0] - ::IsDev::IgnoreFile => 1 : .path_isdev_ignore exists [Path::IsDev=0] - ::IsDev::IgnoreFile => 1 : /home/kent/perl5/.path_isdev_ignore is a file [Path::IsDev=0] - ::IsDev::IgnoreFile excludes path /home/kent/perl5 [Path::IsDev=0] no match found ... [Path::IsDev=0] Matching / ... [Path::IsDev=0] no match found Success! [Path::IsDev=0] - ::IsDev::IgnoreFile => 1 : .path_isdev_ignore exists [Path::IsDev=0] - ::IsDev::IgnoreFile => 1 : /home/kent/perl5/.path_isdev_ignore is a file =head1 HEURISTICS =head2 Negative Heuristics bundled with this distribution Just remember, a B Heuristic B =over 4 =item * L<< C|Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile >> - C<.path_isdev_ignore> =back =head2 Positive Heuristics bundled with this distribution =over 4 =item * L<< C|Path::IsDev::Heuristic::Changelog >> - Files matching C, C, and similar, case insensitive, extensions optional. =item * L<< C|Path::IsDev::Heuristic::DevDirMarker >> - explicit C<.devdir> file to indicate a project root. =item * L<< C|Path::IsDev::Heuristic::META >> - C/C =item * L<< C|Path::IsDev::Heuristic::MYMETA >> - C/C =item * L<< C|Path::IsDev::Heuristic::Makefile >> - Any C format documented supported by GNU Make =item * L<< C|Path::IsDev::Heuristic::TestDir >> - A directory called either C or C =item * L<< C|Path::IsDev::Heuristic::Tool::DZil >> - A C file =item * L<< C|Path::IsDev::Heuristic::Tool::MakeMaker >> - A C file =item * L<< C|Path::IsDev::Heuristic::Tool::ModuleBuild >> - A C file =item * L<< C|Path::IsDev::Heuristic::VCS::Git >> - A C<.git> directory =back =head1 HEURISTIC SETS =head2 Heuristic Sets Bundled with this distribution =over 4 =item * L<< C|Path::IsDev::HeuristicSet::Basic >> - The basic heuristic set that contains most, if not all heuristics. =back =head1 ADVANCED USAGE =head2 Custom Sets C has a system of "sets" of Heuristics, in order to allow for pluggable and flexible heuristic types. Though, for the vast majority of cases, this is not required. use Path::IsDev is_dev => { set => 'Basic' }; use Path::IsDev is_dev => { set => 'SomeOtherSet' , -as => 'is_dev_other' }; =head2 Overriding the default set If for whatever reason the C set is insufficient, or if it false positives on your system for some reason, the "default" set can be overridden. export PATH_ISDEV_DEFAULT_SET="SomeOtherSet" ... use Path::IsDev qw( is_dev ); is_dev('/some/path') # uses SomeOtherSet Though this will only take priority in the event the set is not specified during C If this poses a security concern for the user, then this security hole can be eliminated by declaring the set you want in code: export PATH_ISDEV_DEFAULT_SET="SomeOtherSet" ... use Path::IsDev is_dev => { set => 'Basic' }; is_dev('/some/path') # uses Basic, regardless of ENV =head1 SECURITY Its conceivable, than an evil user could construct an evil set, containing arbitrary and vulnerable code, and possibly stash that evil set in a poorly secured privileged users @INC And if they managed to achieve that, if they could poison the privileged users %ENV, they could trick the privileged user into executing arbitrary code. Though granted, if you can do either of those 2 things, you're probably security vulnerable anyway, and granted, if you could do either of those 2 things you could do much more evil things by the following: export PERL5OPT="-MEvil::Module" So with that in understanding, saying this modules default utility is "insecure" is mostly a bogus argument. And to that effect, this module does nothing to "lock down" that mechanism, and this module encourages you to B force a set, unless you B to, and strongly suggests that forcing a set for the purpose of security will achieve no real improvement in security, while simultaneously reducing utility. =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/lib/Path/IsDev/0000755000175000017500000000000012373560357015014 5ustar kentkentPath-IsDev-1.001002/lib/Path/IsDev/Object.pm0000644000175000017500000001301212373560357016555 0ustar kentkentuse 5.008; # utf8 use strict; use warnings; use utf8; package Path::IsDev::Object; our $VERSION = '1.001002'; # ABSTRACT: Object Oriented guts for IsDev export our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY our $ENV_KEY_DEBUG = 'PATH_ISDEV_DEBUG'; our $DEBUG = ( exists $ENV{$ENV_KEY_DEBUG} ? $ENV{$ENV_KEY_DEBUG} : undef ); our $ENV_KEY_DEFAULT = 'PATH_ISDEV_DEFAULT_SET'; our $DEFAULT = ( exists $ENV{$ENV_KEY_DEFAULT} ? $ENV{$ENV_KEY_DEFAULT} : 'Basic' ); use Class::Tiny 0.010 { set => sub { $DEFAULT }, set_prefix => sub { 'Path::IsDev::HeuristicSet' }, set_module => sub { require Module::Runtime; return Module::Runtime::compose_module_name( $_[0]->set_prefix => $_[0]->set ); }, loaded_set_module => sub { require Module::Runtime; return Module::Runtime::use_module( $_[0]->set_module ); }, }; my $instances = {}; my $instance_id = 0; sub _carp { require Carp; goto &Carp::carp; } sub _instance_id { my ($self) = @_; require Scalar::Util; my $addr = Scalar::Util::refaddr($self); return $instances->{$addr} if exists $instances->{$addr}; $instances->{$addr} = sprintf '%x', $instance_id++; return $instances->{$addr}; } sub _debug { my ( $self, $message ) = @_; return unless $DEBUG; my $id = $self->_instance_id; return *STDERR->printf( qq{[Path::IsDev=%s] %s\n}, $id, $message ); } sub _with_debug { my ( $self, $code ) = @_; require Path::IsDev; ## no critic (ProhibitNoWarnings) no warnings 'redefine'; local *Path::IsDev::debug = sub { $self->_debug(@_); }; return $code->(); } sub BUILD { my ($self) = @_; return $self unless $DEBUG; $self->_debug('{'); $self->_debug( ' set => ' . $self->set ); $self->_debug( ' set_prefix => ' . $self->set_prefix ); $self->_debug( ' set_module => ' . $self->set_module ); $self->_debug( ' loaded_set_module => ' . $self->loaded_set_module ); $self->_debug('}'); return $self; } sub _matches { my ( $self, $path ) = @_; require Path::IsDev::Result; my $result_object = Path::IsDev::Result->new( path => $path ); my $result; $self->_with_debug( sub { $self->_debug( 'Matching ' . $result_object->path ); $result = $self->loaded_set_module->matches($result_object); }, ); if ( !!$result != !!$result_object->result ) { _carp(q[Result and Result Object missmatch]); } return $result_object; } sub matches { my ( $self, $path ) = @_; my $result_object = $self->_matches($path); if ( not $result_object->result ) { $self->_debug('no match found'); return; } return $result_object->result; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev::Object - Object Oriented guts for IsDev export =head1 VERSION version 1.001002 =head1 SYNOPSIS use Path::IsDev::Object; my $dev = Path::IsDev::Object->new(); my $dev = Path::IsDev::Object->new( set => 'MySet' ); if ( $dev->matches($path) ){ print "$path is dev"; } =head1 DESCRIPTION Exporting functions is handy for end users, but quickly becomes a huge headache when you're trying to chain them. e.g: If you're writing an exporter yourself, and you want to wrap responses from an exported symbol, while passing through user configuration => Huge headache. So the exporter based interface is there for people who don't need anything fancy, while the Object based interface is there for people with more complex requirements. =head1 METHODS =head2 C Determine if a given path satisfies the C if( $o->matches($path) ){ print "We have a match!"; } =head1 ATTRIBUTES =head2 C The name of the C to use. Default is C, or the value of C<$ENV{PATH_ISDEV_DEFAULT_SET}> =head2 C The C prefix to use to expand C to a module name. Default is C =head2 C The fully qualified module name. Composed by joining C and C =head2 C An accessor which returns a module name after loading it. =head1 PRIVATE METHODS =head2 C<_instance_id> An opportunistic sequence number for help with debug messages. Note: This is not guaranteed to be unique per instance, only guaranteed to be constant within the life of the object. Based on C, and giving out new ids when new C's are seen. =head2 C<_debug> The debugger callback. export PATH_ISDEV_DEBUG=1 to get debug info. =head2 C<_with_debug> Wrap calls to Path::IsDev::debug to have a prefix with an object identifier. $ob->_with_debug(sub{ # Path::Tiny::debug now localised. }); =head2 C C is an implementation detail of C. This module hooks C to give a self report of the object to C<*STDERR> after C<< ->new >> when under C<$DEBUG> =head2 C<_matches> my $result = $o->matches( $path ); $result here will be a constructed C. Note this method may be handy for debugging, but you should still call C for all real code. =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev::Object", "interface":"class", "inherits":"Class::Tiny::Object" } =end MetaPOD::JSON =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/lib/Path/IsDev/Heuristic/0000755000175000017500000000000012373560357016753 5ustar kentkentPath-IsDev-1.001002/lib/Path/IsDev/Heuristic/TestDir.pm0000644000175000017500000000303012373560357020663 0ustar kentkentuse 5.008; # utf8 use strict; use warnings; use utf8; package Path::IsDev::Heuristic::TestDir; our $VERSION = '1.001002'; # ABSTRACT: Determine if a path contains a t/ or xt/ directory our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY use Role::Tiny::With qw( with ); with 'Path::IsDev::Role::Heuristic', 'Path::IsDev::Role::Matcher::Child::Exists::Any::Dir'; sub dirs { return qw( xt t ); } sub matches { my ( $self, $result_object ) = @_; if ( $self->child_exists_any_dir( $result_object, $self->dirs ) ) { $result_object->result(1); return 1; } return; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev::Heuristic::TestDir - Determine if a path contains a t/ or xt/ directory =head1 VERSION version 1.001002 =head1 METHODS =head2 C Directories relevant to this heuristic: t/ xt/ =head2 C if ( $heuristic->matches( $result_object ) ) { # one of the directories in ->dirs exists } =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev::Heuristic::TestDir", "interface":"single_class", "does":[ "Path::IsDev::Role::Heuristic", "Path::IsDev::Role::Matcher::Child::Exists::Any::Dir" ] } =end MetaPOD::JSON =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/lib/Path/IsDev/Heuristic/DevDirMarker.pm0000644000175000017500000000376412373560357021642 0ustar kentkentuse 5.008; # utf8 use strict; use warnings; use utf8; package Path::IsDev::Heuristic::DevDirMarker; our $VERSION = '1.001002'; # ABSTRACT: Determine if a path contains a .devdir file our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY use Role::Tiny::With qw( with ); with 'Path::IsDev::Role::Heuristic', 'Path::IsDev::Role::Matcher::Child::Exists::Any::File'; sub files { return qw( .devdir ); } sub matches { my ( $self, $result_object ) = @_; if ( $self->child_exists_any_file( $result_object, $self->files ) ) { $result_object->result(1); return 1; } return; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev::Heuristic::DevDirMarker - Determine if a path contains a .devdir file =head1 VERSION version 1.001002 =head1 DESCRIPTION This Heuristic is a workaround that is likely viable in the event none of the other Heuristics work. All this heuristic checks for is the presence of a special file called C<.devdir>, which is intended as an explicit notation that "This directory is a project root". An example case where you might need such a Heuristic, is the scenario where you're not working with a Perl C dist, but are instead working on a project in a different language, where Perl is simply there for build/test purposes. =head1 METHODS =head2 C Matches files named: .devdir =head2 C Matches if any of the files in C exist as children of the C =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev::Heuristic::DevDirMarker", "interface":"single_class", "does":[ "Path::IsDev::Role::Heuristic", "Path::IsDev::Role::Matcher::Child::Exists::Any::File" ] } =end MetaPOD::JSON =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/lib/Path/IsDev/Heuristic/Changelog.pm0000644000175000017500000000372512373560357021207 0ustar kentkentuse 5.008; # utf8 use strict; use warnings; use utf8; package Path::IsDev::Heuristic::Changelog; our $VERSION = '1.001002'; # ABSTRACT: Determine if a path contains a Changelog (or similar) our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY use Role::Tiny::With qw( with ); with 'Path::IsDev::Role::Heuristic', 'Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp::File'; sub basename_regexp { ## no critic (RegularExpressions::RequireLineBoundaryMatching) return qr/\AChange(s|log)(|[.][^.\s]+)\z/isx; } sub matches { my ( $self, $result_object ) = @_; if ( $self->child_basename_matchregexp_file( $result_object, $self->basename_regexp ) ) { $result_object->result(1); return 1; } return; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev::Heuristic::Changelog - Determine if a path contains a Changelog (or similar) =head1 VERSION version 1.001002 =head1 DESCRIPTION This heuristic matches any case variation of C or C, including any files of that name with a suffix. e.g.: Changes CHANGES Changes.mkdn etc. =head1 METHODS =head2 C Indicators for this heuristic is the existence of a file such as: Changes (i) Changes.anyext (i) Changelog (i) Changelog.anyext (i) =head2 C Returns a match if any child of C exists matching the regexp C =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev::Heuristic::Changelog", "interface":"single_class", "does":[ "Path::IsDev::Role::Heuristic", "Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp::File" ] } =end MetaPOD::JSON =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/lib/Path/IsDev/Heuristic/MYMETA.pm0000644000175000017500000000355412373560357020314 0ustar kentkentuse 5.008; # utf8 use strict; use warnings; use utf8; package Path::IsDev::Heuristic::MYMETA; our $VERSION = '1.001002'; # ABSTRACT: Determine if a path contains MYMETA.(json|yml) our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY use Role::Tiny::With qw( with ); with 'Path::IsDev::Role::Heuristic', 'Path::IsDev::Role::Matcher::Child::Exists::Any::File'; sub files { return qw( MYMETA.json MYMETA.yml ); } sub matches { my ( $self, $result_object ) = @_; if ( $self->child_exists_any_file( $result_object, $self->files ) ) { $result_object->result(1); return 1; } return; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev::Heuristic::MYMETA - Determine if a path contains MYMETA.(json|yml) =head1 VERSION version 1.001002 =head1 DESCRIPTION This heuristic is intended as a guarantee that B kind of top level marker will be present in a distribution, as all the main tool-chains emit this file during C. Granted, this heuristic is expected to be B needed, as in order to create such a file, you first need a C/C to generate it. =head1 METHODS =head2 C Files relevant to this heuristic MYMETA.json MYMETA.yml =head2 C Matches if any of the files in C exist as children of the C =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev::Heuristic::MYMETA", "interface":"single_class", "does":[ "Path::IsDev::Role::Heuristic", "Path::IsDev::Role::Matcher::Child::Exists::Any::File" ] } =end MetaPOD::JSON =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/lib/Path/IsDev/Heuristic/VCS/0000755000175000017500000000000012373560357017406 5ustar kentkentPath-IsDev-1.001002/lib/Path/IsDev/Heuristic/VCS/Git.pm0000644000175000017500000000275712373560357020502 0ustar kentkentuse 5.008; # utf8 use strict; use warnings; use utf8; package Path::IsDev::Heuristic::VCS::Git; our $VERSION = '1.001002'; # ABSTRACT: Determine if a path contains a .git repository our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY use Role::Tiny::With qw( with ); with 'Path::IsDev::Role::Heuristic', 'Path::IsDev::Role::Matcher::Child::Exists::Any::Dir'; sub dirs { return qw( .git ) } sub matches { my ( $self, $result_object ) = @_; if ( $self->child_exists_any_dir( $result_object, $self->dirs ) ) { $result_object->result(1); return 1; } return; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev::Heuristic::VCS::Git - Determine if a path contains a .git repository =head1 VERSION version 1.001002 =head1 METHODS =head2 C Directories relevant to this heuristic: .git =head2 C Return a match if any children of C exist called C<.git> and are directories =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev::Heuristic::VCS::Git", "interface":"single_class", "does":[ "Path::IsDev::Role::Heuristic", "Path::IsDev::Role::Matcher::Child::Exists::Any::Dir" ] } =end MetaPOD::JSON =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/lib/Path/IsDev/Heuristic/Tool/0000755000175000017500000000000012373560357017670 5ustar kentkentPath-IsDev-1.001002/lib/Path/IsDev/Heuristic/Tool/Dzil.pm0000644000175000017500000000276612373560357021143 0ustar kentkentuse 5.008; # utf8 use strict; use warnings; use utf8; package Path::IsDev::Heuristic::Tool::Dzil; our $VERSION = '1.001002'; # ABSTRACT: Determine if a path is a Dist::Zilla Source tree our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY use Role::Tiny::With qw( with ); with 'Path::IsDev::Role::Heuristic', 'Path::IsDev::Role::Matcher::Child::Exists::Any::File'; sub files { return qw( dist.ini ) } sub matches { my ( $self, $result_object ) = @_; if ( $self->child_exists_any_file( $result_object, $self->files ) ) { $result_object->result(1); return 1; } return; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev::Heuristic::Tool::Dzil - Determine if a path is a Dist::Zilla Source tree =head1 VERSION version 1.001002 =head1 METHODS =head2 C Files relevant to this heuristic: dist.ini =head2 C Matches if any of the files in C exist as children of the C =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev::Heuristic::Tool::Dzil", "interface":"single_class", "does":[ "Path::IsDev::Role::Heuristic", "Path::IsDev::Role::Matcher::Child::Exists::Any::File" ] } =end MetaPOD::JSON =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/lib/Path/IsDev/Heuristic/Tool/MakeMaker.pm0000644000175000017500000000306512373560357022067 0ustar kentkentuse 5.008; # utf8 use strict; use warnings; use utf8; package Path::IsDev::Heuristic::Tool::MakeMaker; our $VERSION = '1.001002'; # ABSTRACT: Determine if a path is an ExtUtils::MakeMaker Tooled source directory our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY use Role::Tiny::With qw( with ); with 'Path::IsDev::Role::Heuristic', 'Path::IsDev::Role::Matcher::Child::Exists::Any::File'; sub files { return qw( Makefile.PL ) } sub matches { my ( $self, $result_object ) = @_; if ( $self->child_exists_any_file( $result_object, $self->files ) ) { $result_object->result(1); return 1; } return; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev::Heuristic::Tool::MakeMaker - Determine if a path is an ExtUtils::MakeMaker Tooled source directory =head1 VERSION version 1.001002 =head1 METHODS =head2 C Files relevant to this heuristic: Makefile.PL =head2 C Matches if any of the files in C exist as children of the C =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev::Heuristic::Tool::MakeMaker", "interface":"single_class", "does":[ "Path::IsDev::Role::Heuristic", "Path::IsDev::Role::Matcher::Child::Exists::Any::File" ] } =end MetaPOD::JSON =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/lib/Path/IsDev/Heuristic/Tool/ModuleBuild.pm0000644000175000017500000000302012373560357022426 0ustar kentkentuse 5.008; # utf8 use strict; use warnings; use utf8; package Path::IsDev::Heuristic::Tool::ModuleBuild; our $VERSION = '1.001002'; # ABSTRACT: Determine if a path is a Module::Build Source tree our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY use Role::Tiny::With qw( with ); with 'Path::IsDev::Role::Heuristic', 'Path::IsDev::Role::Matcher::Child::Exists::Any::File'; sub files { return qw( Build.PL ) } sub matches { my ( $self, $result_object ) = @_; if ( $self->child_exists_any_file( $result_object, $self->files ) ) { $result_object->result(1); return 1; } return; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev::Heuristic::Tool::ModuleBuild - Determine if a path is a Module::Build Source tree =head1 VERSION version 1.001002 =head1 METHODS =head2 C Files relevant to this heuristic: Build.PL =head2 C Matches if any of the files in C exist as children of the C =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev::Heuristic::Tool::ModuleBuild", "interface":"single_class", "does":[ "Path::IsDev::Role::Heuristic", "Path::IsDev::Role::Matcher::Child::Exists::Any::File" ] } =end MetaPOD::JSON =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/lib/Path/IsDev/Heuristic/META.pm0000644000175000017500000000277012373560357020045 0ustar kentkentuse 5.008; # utf8 use strict; use warnings; use utf8; package Path::IsDev::Heuristic::META; our $VERSION = '1.001002'; # ABSTRACT: Determine if a path contains META.(json|yml) our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY use Role::Tiny::With qw( with ); with 'Path::IsDev::Role::Heuristic', 'Path::IsDev::Role::Matcher::Child::Exists::Any::File'; sub files { return qw( META.json META.yml ); } sub matches { my ( $self, $result_object ) = @_; if ( $self->child_exists_any_file( $result_object, $self->files ) ) { $result_object->result(1); return 1; } return; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev::Heuristic::META - Determine if a path contains META.(json|yml) =head1 VERSION version 1.001002 =head1 METHODS =head2 C files relevant to this heuristic: META.json META.yml =head2 C Matches if any of the files in C exist as children of the C =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev::Heuristic::META", "interface":"single_class", "does":[ "Path::IsDev::Role::Heuristic", "Path::IsDev::Role::Matcher::Child::Exists::Any::File" ] } =end MetaPOD::JSON =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/lib/Path/IsDev/Heuristic/Makefile.pm0000644000175000017500000000302512373560357021026 0ustar kentkentuse 5.008; # utf8 use strict; use warnings; use utf8; package Path::IsDev::Heuristic::Makefile; our $VERSION = '1.001002'; # ABSTRACT: Determine if a path contains a Makefile our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY use Role::Tiny::With qw( with ); with 'Path::IsDev::Role::Heuristic', 'Path::IsDev::Role::Matcher::Child::Exists::Any::File'; sub files { return qw( GNUmakefile makefile Makefile ); } sub matches { my ( $self, $result_object ) = @_; if ( $self->child_exists_any_file( $result_object, $self->files ) ) { $result_object->result(1); return 1; } return; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev::Heuristic::Makefile - Determine if a path contains a Makefile =head1 VERSION version 1.001002 =head1 METHODS =head2 C Files relevant to this heuristic: GNUmakefile makefile Makefile =head2 C Matches if any of the files in C exist as children of the C =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev::Heuristic::Makefile", "interface":"single_class", "does":[ "Path::IsDev::Role::Heuristic", "Path::IsDev::Role::Matcher::Child::Exists::Any::File" ] } =end MetaPOD::JSON =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/lib/Path/IsDev/HeuristicSet/0000755000175000017500000000000012373560357017427 5ustar kentkentPath-IsDev-1.001002/lib/Path/IsDev/HeuristicSet/Basic.pm0000644000175000017500000000434312373560357021012 0ustar kentkentuse 5.008; use strict; use warnings; use utf8; package Path::IsDev::HeuristicSet::Basic; our $VERSION = '1.001002'; # ABSTRACT: Basic IsDev set of Heuristics our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY use Role::Tiny::With qw( with ); with 'Path::IsDev::Role::HeuristicSet::Simple'; sub negative_heuristics { return qw( IsDev::IgnoreFile HomeDir PerlINC ); } sub heuristics { return qw( Tool::Dzil Tool::MakeMaker Tool::ModuleBuild META Changelog TestDir DevDirMarker MYMETA Makefile VCS::Git ); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev::HeuristicSet::Basic - Basic IsDev set of Heuristics =head1 VERSION version 1.001002 =head1 METHODS =head2 C Excluding heuristics in this set are =over 4 =item 1. L<< C|Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile >> =item 2. L<< C|Path::IsDev::NegativeHeuristic::HomeDir >> =item 3. L<< C|Path::IsDev::NegativeHeuristic::PerlINC >> =back =head2 C Heuristics included in this set: =over 4 =item 1. L<< C|Path::IsDev::Heuristic::Tool::Dzil >> =item 2. L<< C|Path::IsDev::Heuristic::Tool::MakeMaker >> =item 3. L<< C|Path::IsDev::Heuristic::Tool::ModuleBuild >> =item 4. L<< C|Path::IsDev::Heuristic::META >> =item 5. L<< C|Path::IsDev::Heuristic::Changelog >> =item 6. L<< C|Path::IsDev::Heuristic::TestDir >> =item 7. L<< C|Path::IsDev::Heuristic::DevDirMarker >> =item 8. L<< C|Path::IsDev::Heuristic::MYMETA >> =item 9. L<< C|Path::IsDev::Heuristic::Makefile >> =item 10. L<< C|Path::IsDev::Heuristic::VCS::Git >> =back =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev::HeuristicSet::Basic", "interface":"single_class", "does":"Path::IsDev::Role::HeuristicSet::Simple" } =end MetaPOD::JSON =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/lib/Path/IsDev/Result.pm0000644000175000017500000000752612373560357016642 0ustar kentkentuse 5.008; use strict; use warnings; use utf8; package Path::IsDev::Result; our $VERSION = '1.001002'; # ABSTRACT: Result container our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY use Class::Tiny 'path', 'result', { reasons => sub { [] }, }; sub _path { require Path::Tiny; goto &Path::Tiny::path } sub _croak { require Carp; goto &Carp::croak } ## no critic (Subroutines::ProhibitCallsToUnexportedSubs) sub _debug { require Path::IsDev; shift; goto &Path::IsDev::debug } sub BUILD { my ( $self, ) = @_; if ( not $self->path ) { return _croak(q[ is a mandatory parameter]); } if ( not ref $self->path ) { $self->path( _path( $self->path ) ); } if ( not -e $self->path ) { return _croak(q[ parameter must exist for heuristics to be performed]); } $self->path( $self->path->absolute ); return $self; } sub add_reason { my ( $self, $heuristic_name, $heuristic_result, $summary, $context ) = @_; my $name = $heuristic_name; if ( $name->can('name') ) { $name = $name->name; } $self->_debug("$name => $heuristic_result : $summary "); # $self->_debug( " > " . $_) for _pp($context); my ($heuristic_type); if ( $heuristic_name->can(q[heuristic_type]) ) { $heuristic_type = $heuristic_name->heuristic_type; } my $reason = { heuristic => $heuristic_name, result => $heuristic_result, ( defined $heuristic_type ? ( type => $heuristic_type ) : () ), %{ $context || {} }, }; push @{ $self->reasons }, $reason; return $self; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev::Result - Result container =head1 VERSION version 1.001002 =head1 SYNOPSIS use Path::IsDev::Result; my $result = Path::IsDev::Result->new( path => '/some/path/that/exists' ): if ( $heuristcset->matches( $result ) ) { print Dumper($result); } =head1 DESCRIPTION This is a reasonably new internal component for Path::IsDev. Its purpose is to communicate state between internal things, and give some sort of introspectable context for why things happened in various places without resorting to spamming debug everywhere. Now instead of turning on debug, as long as you can get a result, you can inspect and dump that result at the point you need it. =head1 METHODS =head2 C =head2 C Call this method from a heuristic to record checking of the heuristic and the relevant meta-data. $result->add_reason( $heuristic, $matchvalue, $reason_summary, \%contextinfo ); For example: sub Foo::matches { my ( $self , $result_object ) = @_; if ( $result_object->path->child('bar')->exists ) { $result_object->add_reason( $self, 1, "child 'bar' exists" , { child => 'bar', 'exists?' => 1, child_path => $result_object->path->child('bar') }); $result_object->result(1); return 1; } return; } Note that here, C<$matchvalue> should be the result of the relevant matching logic, not the global impact. For instance, C compositions should still add reasons of C<< $matchvalue == 1 >>, but they should not set C<< $result_object->result(1) >>. ( In fact, setting C is the job of the individual heuristic, not the matches that are folded into it ) =head1 ATTRIBUTES =head2 C =head2 C =head2 C =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev::Result", "interface":"class", "inherits":"Class::Tiny::Object" } =end MetaPOD::JSON =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/lib/Path/IsDev/Role/0000755000175000017500000000000012373560357015715 5ustar kentkentPath-IsDev-1.001002/lib/Path/IsDev/Role/Heuristic.pm0000644000175000017500000000436512373560357020222 0ustar kentkentuse 5.008; # utf8 use strict; use warnings; use utf8; package Path::IsDev::Role::Heuristic; our $VERSION = '1.001002'; # ABSTRACT: Base role for Heuristic things. our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY sub _blessed { require Scalar::Util; goto &Scalar::Util::blessed } use Role::Tiny qw( requires ); sub name { my $name = shift; $name = _blessed($name) if _blessed($name); $name =~ s/\APath::IsDev::Heuristic:/+ :/msx; return $name; } sub heuristic_type { return 'positive heuristic'; } requires 'matches'; 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev::Role::Heuristic - Base role for Heuristic things. =head1 VERSION version 1.001002 =head1 ROLE REQUIRES =head2 C Implementing classes must provide this method. return : 1 / undef 1 -> this path is a development directory as far as this heuristic is concerned undef -> this path is not a development directory as far as this heuristic is concerned args : ( $class , $result_object ) $class -> method will be invoked on packages, not objects $result_object -> will be a Path::IsDev::Result Additionally, consuming classes B set C<< $result_object->result( 1 ) >> prior to returning true. Composing roles B also invoke C<< $result_object->add_reason( $self, $result_value, $descriptive_reason_for_result, \%contextinfo ) >>. See L<< C for details|Path::IsDev::Result >> =head1 METHODS =head2 C Returns the name to use in debugging. By default, this is derived from the classes name with the C prefix removed: Path::IsDev::Heuristic::Tool::Dzil->name() → "+ ::Tool::Dzil" =head2 C Returns a description of the general heuristic type positive heuristic =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev::Role::Heuristic", "interface":"role" } =end MetaPOD::JSON =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/lib/Path/IsDev/Role/NegativeHeuristic.pm0000644000175000017500000000450412373560357021700 0ustar kentkentuse 5.008; # utf8 use strict; use warnings; use utf8; package Path::IsDev::Role::NegativeHeuristic; our $VERSION = '1.001002'; # ABSTRACT: Base role for Negative Heuristic things. our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY sub _blessed { require Scalar::Util; goto &Scalar::Util::blessed } use Role::Tiny qw( requires ); sub name { my $name = shift; $name = _blessed($name) if _blessed($name); $name =~ s/\APath::IsDev::NegativeHeuristic:/- :/msx; return $name; } sub heuristic_type { return 'negative heuristic'; } requires 'excludes'; 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev::Role::NegativeHeuristic - Base role for Negative Heuristic things. =head1 VERSION version 1.001002 =head1 ROLE REQUIRES =head2 C Implementing classes must provide this method. return : 1 / undef 1 -> this path is not a development directory as far as this heuristic is concerned undef -> this path is a development directory as far as this heuristic is concerned args : ( $class , $result_object ) $class -> method will be invoked on packages, not objects $result_object -> will be a Path::IsDev::Result Additionally, consuming classes B set C<< $result_object->result( undef ) >> prior to returning true. Composing roles B also invoke C<< $result_object->add_reason( $self, $result_value, $descriptive_reason_for_result, \%contextinfo ) >>. See L<< C for details|Path::IsDev::Result >> =head1 METHODS =head2 C Returns the name to use in debugging. By default, this is derived from the classes name with the C prefix removed: Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile->name() → "- ::IsDev::IgnoreFile" =head2 C Returns a description of the general heuristic type negative heuristic =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev::Role::NegativeHeuristic", "interface":"role" } =end MetaPOD::JSON =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/lib/Path/IsDev/Role/Matcher/0000755000175000017500000000000012373560357017300 5ustar kentkentPath-IsDev-1.001002/lib/Path/IsDev/Role/Matcher/Child/0000755000175000017500000000000012373560357020323 5ustar kentkentPath-IsDev-1.001002/lib/Path/IsDev/Role/Matcher/Child/BaseName/0000755000175000017500000000000012373560357021776 5ustar kentkentPath-IsDev-1.001002/lib/Path/IsDev/Role/Matcher/Child/BaseName/MatchRegexp/0000755000175000017500000000000012373560357024205 5ustar kentkentPath-IsDev-1.001002/lib/Path/IsDev/Role/Matcher/Child/BaseName/MatchRegexp/File.pm0000644000175000017500000000506412373560357025427 0ustar kentkentuse 5.008; # utf8 use strict; use warnings; use utf8; package Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp::File; our $VERSION = '1.001002'; # ABSTRACT: Match if any children have basename's that match a regexp and are files our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY use Role::Tiny qw( with ); with 'Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp'; sub _this_child_isfile { my ( $self, $result_object, $child ) = @_; my $ctx = { 'child' => "$child", tests => [], }; my $tests = $ctx->{tests}; ## no critic (ValuesAndExpressions::ProhibitFiletest_f) if ( -f $child ) { push @{$tests}, { 'child_isfile?' => 1 }; $result_object->add_reason( $self, 1, "$child is a file", $ctx ); return 1; } push @{$tests}, { 'child_isfile?' => 0 }; $result_object->add_reason( $self, 0, "$child is not a file", $ctx ); return; } sub child_basename_matchregexp_file { my ( $self, $result_object, $regexp ) = @_; for my $child ( $result_object->path->children ) { return 1 if $self->_this_child_matchregexp( $result_object, $child, $regexp ) and $self->_this_child_isfile( $result_object, $child ); } return; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp::File - Match if any children have basename's that match a regexp and are files =head1 VERSION version 1.001002 =head1 METHODS =head2 C $class->child_basename_matchregexp_file( $result_object, $regexp ); Given a regexp C<$regexp>, match if any of C<< $result_object->path->children >> match the given regexp, on the condition that those that match are also files. if ( $self->child_basename_matchregexp_file( $result_object, qr/^Change(.*)$/i ) ) { # result_object->path() contains at least one child that is a file and matches the regexp } =head1 PRIVATE METHODS =head2 C<_this_child_isfile> if ( $class->_this_child_isfile( $result_object, $child_path ) ) { ... } =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp::File", "interface":"role", "does":"Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp" } =end MetaPOD::JSON =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/lib/Path/IsDev/Role/Matcher/Child/BaseName/MatchRegexp.pm0000644000175000017500000000457312373560357024554 0ustar kentkentuse 5.008; # utf8 use strict; use warnings; use utf8; package Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp; our $VERSION = '1.001002'; # ABSTRACT: Match when a path has a child file matching an expression our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY use Role::Tiny; sub _this_child_matchregexp { my ( $self, $result_object, $child, $regexp ) = @_; my $ctx = { 'child' => "$child", 'child_basename' => $child->basename, expression => $regexp, tests => [], }; my $tests = $ctx->{tests}; if ( $child->basename =~ $regexp ) { push @{$tests}, { 'child_basename_matches_expression?' => 1 }; $result_object->add_reason( $self, 1, $child->basename . " matches $regexp", $ctx ); return 1; } push @{$tests}, { 'child_basename_matches_expression?' => 0 }; $result_object->add_reason( $self, 0, $child->basename . " does not match $regexp", $ctx ); return; } sub child_basename_matchregexp { my ( $self, $result_object, $regexp ) = @_; for my $child ( $result_object->path->children ) { return 1 if $self->_this_child_matchregexp( $result_object, $child, $regexp ); } return; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp - Match when a path has a child file matching an expression =head1 VERSION version 1.001002 =head1 METHODS =head2 C $class->child_basename_matchregexp( $result_object, $regexp ); Given a regexp C<$regexp>, match if any of C<< $result_object->path->children >> match the given regexp. if ( $self->child_basename_matchregexp( $result_object, qr/^Change(.*)$/i ) ) { # result_object->path() contains at least one child that matches the regexp } =head1 PRIVATE METHODS =head2 C<_this_child_matchregexp> if ( $class->_this_child_matchregexp( $result_object, $child_path, $regexp ) ) { ... } =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp", "interface":"role" } =end MetaPOD::JSON =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/lib/Path/IsDev/Role/Matcher/Child/Exists/0000755000175000017500000000000012373560357021602 5ustar kentkentPath-IsDev-1.001002/lib/Path/IsDev/Role/Matcher/Child/Exists/Any/0000755000175000017500000000000012373560357022331 5ustar kentkentPath-IsDev-1.001002/lib/Path/IsDev/Role/Matcher/Child/Exists/Any/File.pm0000644000175000017500000000451112373560357023547 0ustar kentkentuse 5.008; # utf8 use strict; use warnings; use utf8; package Path::IsDev::Role::Matcher::Child::Exists::Any::File; our $VERSION = '1.001002'; # ABSTRACT: Match if a path contains one of any of a list of files our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY use Role::Tiny qw( with ); with 'Path::IsDev::Role::Matcher::Child::Exists::Any'; sub child_exists_file { my ( $self, $result_object, $child ) = @_; my $child_path = $result_object->path->child($child); my $ctx = { 'child_name' => $child, child_path => "$child_path", tests => [] }; my $tests = $ctx->{tests}; # For now, yes, files, not things usable as files ## no critic (ValuesAndExpressions::ProhibitFiletest_f) if ( -f $child_path ) { push @{$tests}, { 'child_path_isfile?' => 1 }; $result_object->add_reason( $self, 1, "$child_path is a file", $ctx ); return 1; } push @{$tests}, { 'child_path_isfile?' => 1 }; $result_object->add_reason( $self, 0, "$child_path is not a file", $ctx ); return; } sub child_exists_any_file { my ( $self, $result_object, @children ) = @_; for my $child (@children) { return 1 if $self->child_exists( $result_object, $child ) and $self->child_exists_file( $result_object, $child ); } return; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev::Role::Matcher::Child::Exists::Any::File - Match if a path contains one of any of a list of files =head1 VERSION version 1.001002 =head1 METHODS =head2 C $class->child_exists_file( $result_object, $childname ); Return match if C<$childname> exists as a file child of C<< $result_object->path >> =head2 C $class->child_exists_any_file( $result_object, @childnames ); Return match if any of C<@childnames> exist under C<< $result_object->path >> and are files. =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev::Role::Matcher::Child::Exists::Any::File", "interface":"role", "does":"Path::IsDev::Role::Matcher::Child::Exists::Any" } =end MetaPOD::JSON =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/lib/Path/IsDev/Role/Matcher/Child/Exists/Any/Dir.pm0000644000175000017500000000434512373560357023413 0ustar kentkentuse 5.008; # utf8 use strict; use warnings; use utf8; package Path::IsDev::Role::Matcher::Child::Exists::Any::Dir; our $VERSION = '1.001002'; # ABSTRACT: Match if a path contains one of any of a list of directories our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY use Role::Tiny qw( with ); with 'Path::IsDev::Role::Matcher::Child::Exists::Any'; sub child_exists_dir { my ( $self, $result_object, $child ) = @_; my $child_path = $result_object->path->child($child); my $ctx = { 'child_name' => $child, child_path => "$child_path", tests => [] }; my $tests = $ctx->{tests}; if ( -d $child_path ) { push @{$tests}, { 'child_path_isdir?' => 1 }; $result_object->add_reason( $self, 1, "$child_path is a dir", $ctx ); return 1; } push @{$tests}, { 'child_path_isdir?' => 0 }; $result_object->add_reason( $self, 0, "$child_path is not a dir", $ctx ); return; } sub child_exists_any_dir { my ( $self, $result_object, @children ) = @_; for my $child (@children) { return 1 if $self->child_exists( $result_object, $child ) and $self->child_exists_dir( $result_object, $child ); } return; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev::Role::Matcher::Child::Exists::Any::Dir - Match if a path contains one of any of a list of directories =head1 VERSION version 1.001002 =head1 METHODS =head2 C $class->child_exists_dir( $result_object, $childname ); Return match if C<$childname> exists as a directory child of C<< $result_object->path >>. =head2 C $class->child_exists_any_dir( $result_object, @childnames ); Return match if any of C<@childnames> exist under C<< $result_object->path >> and are directories. =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev::Role::Matcher::Child::Exists::Any::Dir", "interface":"role", "does":"Path::IsDev::Role::Matcher::Child::Exists::Any" } =end MetaPOD::JSON =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/lib/Path/IsDev/Role/Matcher/Child/Exists/Any.pm0000644000175000017500000000364512373560357022677 0ustar kentkentuse 5.008; # utf8 use strict; use warnings; use utf8; package Path::IsDev::Role::Matcher::Child::Exists::Any; our $VERSION = '1.001002'; # ABSTRACT: Match if any of a list of children exists our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY use Role::Tiny; sub child_exists { my ( $self, $result_object, $child ) = @_; my $child_path = $result_object->path->child($child); my $ctx = { 'child_name' => $child, child_path => "$child_path", tests => [] }; my $tests = $ctx->{tests}; if ( -e $child_path ) { push @{$tests}, { 'child_path_exists?' => 1 }; $result_object->add_reason( $self, 1, "$child exists", $ctx ); return 1; } push @{$tests}, { 'child_path_exists?' => 0 }; $result_object->add_reason( $self, 0, "$child does not exist", $ctx ); return; } sub child_exists_any { my ( $self, $result_object, @children ) = @_; for my $child (@children) { return 1 if $self->child_exists( $result_object, $child ); } return; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev::Role::Matcher::Child::Exists::Any - Match if any of a list of children exists =head1 VERSION version 1.001002 =head1 METHODS =head2 C $class->child_exists( $result_object, $path ); Return match if C<$path> exists as a child of C<< $result_object->path >> =head2 C $class->child_exists_any( $result_object, @childnames ); Return match if any of C<@childnames> exist under C<< $result_object->path >>. =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev::Role::Matcher::Child::Exists::Any", "interface":"role" } =end MetaPOD::JSON =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/lib/Path/IsDev/Role/Matcher/FullPath/0000755000175000017500000000000012373560357021017 5ustar kentkentPath-IsDev-1.001002/lib/Path/IsDev/Role/Matcher/FullPath/Is/0000755000175000017500000000000012373560357021372 5ustar kentkentPath-IsDev-1.001002/lib/Path/IsDev/Role/Matcher/FullPath/Is/Any.pm0000644000175000017500000000546112373560357022465 0ustar kentkentuse 5.008; # utf8 use strict; use warnings; use utf8; package Path::IsDev::Role::Matcher::FullPath::Is::Any; our $VERSION = '1.001002'; # ABSTRACT: Match if the current directory is the same directory from a list of absolute paths. our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY sub _path { require Path::Tiny; Path::Tiny->VERSION('0.004'); goto &Path::Tiny::path; } use Role::Tiny; sub _fullpath_is { my ( $self, $result_object, $this, $comparator ) = @_; my $context = {}; $context->{tests} = []; $context->{test_path} = "$comparator"; my $path = _path($comparator); if ( not $path->exists ) { push @{ $context->{tests} }, { 'test_path_exists?' => 0 }; $result_object->add_reason( $self, 0, "comparative path $comparator does not exist", $context ); return; } push @{ $context->{tests} }, { 'test_path_exists?' => 1 }; my $realpath = $path->realpath; $context->{source_realpath} = "$this"; $context->{test_realpath} = "$realpath"; if ( not $realpath eq $this ) { push @{ $context->{tests} }, { 'test_realpath_eq_source_realpath?' => 0 }; $result_object->add_reason( $self, 0, "$this ne $realpath", $context ); return; } push @{ $context->{tests} }, { 'test_realpath_eq_source_realpath?' => 1 }; $result_object->add_reason( $self, 1, "$this eq $realpath", $context ); return 1; } sub fullpath_is_any { my ( $self, $result_object, @dirnames ) = @_; my $current = $result_object->path->realpath; for my $dirname (@dirnames) { return 1 if $self->_fullpath_is( $result_object, $current, $dirname ); } return; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev::Role::Matcher::FullPath::Is::Any - Match if the current directory is the same directory from a list of absolute paths. =head1 VERSION version 1.001002 =head1 METHODS =head2 C Note, this is usually invoked on directories anyway. if ( $self->fullpath_is_any( $result_object, '/usr/', '/usr/bin/foo' )) { } Matches if any of the provided paths C's correspond to C<< $result_object->path->realpath >> =head1 PRIVATE METHODS =head2 C<_fullpath_is> $class->_fullpath_is( $result_object, $source_path, $comparison_path ); Does not match if C<$comparison_path> does not exist. Otherwise, compare C<$source_path> vs C<< $comparison_path->realpath >>, and return if they match. =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev::Role::Matcher::FullPath::Is::Any", "interface":"role" } =end MetaPOD::JSON =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/lib/Path/IsDev/Role/HeuristicSet.pm0000644000175000017500000000440112373560357020665 0ustar kentkentuse 5.008; # utf8; use strict; use warnings; use utf8; package Path::IsDev::Role::HeuristicSet; our $VERSION = '1.001002'; # ABSTRACT: Role for sets of Heuristics. our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY sub _use_module { require Module::Runtime; goto &Module::Runtime::use_module } sub _com_mn { require Module::Runtime; goto &Module::Runtime::compose_module_name; } ## no critic (Subroutines::ProhibitCallsToUnexportedSubs) sub _debug { require Path::IsDev; goto &Path::IsDev::debug } use Role::Tiny qw( requires ); requires 'modules'; sub _expand_heuristic { my ( undef, $hn ) = @_; return _com_mn( 'Path::IsDev::Heuristic', $hn ); } sub _expand_negative_heuristic { my ( undef, $hn ) = @_; return _com_mn( 'Path::IsDev::NegativeHeuristic', $hn ); } sub _load_module { my ( undef, $module ) = @_; return _use_module($module); } sub matches { my ( $self, $result_object ) = @_; TESTS: for my $module ( $self->modules ) { $self->_load_module($module); if ( $module->can('excludes') ) { if ( $module->excludes($result_object) ) { _debug( $module->name . q[ excludes path ] . $result_object->path ); return; } next TESTS; } next unless $module->matches($result_object); my $name = $module->name; _debug( $name . q[ matched path ] . $result_object->path ); return 1; } return; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev::Role::HeuristicSet - Role for sets of Heuristics. =head1 VERSION version 1.001002 =head1 ROLE REQUIRES =head2 C Please provide a method that returns a list of modules that comprise heuristics. =head1 METHODS =head2 C Determine if the C contains a match. if( $hs->matches( $result_object ) ) { # one of hs->modules() matched $result_object->path } =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev::Role::HeuristicSet", "interface":"role" } =end MetaPOD::JSON =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/lib/Path/IsDev/Role/HeuristicSet/0000755000175000017500000000000012373560357020330 5ustar kentkentPath-IsDev-1.001002/lib/Path/IsDev/Role/HeuristicSet/Simple.pm0000644000175000017500000000357012373560357022124 0ustar kentkentuse 5.008; # utf8 use strict; use warnings; use utf8; package Path::IsDev::Role::HeuristicSet::Simple; our $VERSION = '1.001002'; # ABSTRACT: Simple excludes/includes set our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY use Role::Tiny qw( with requires ); with 'Path::IsDev::Role::HeuristicSet'; requires 'heuristics', 'negative_heuristics'; sub modules { my ($self) = @_; my @out; for my $heur ( $self->negative_heuristics ) { push @out, $self->_expand_negative_heuristic($heur); } for my $heur ( $self->heuristics ) { push @out, $self->_expand_heuristic($heur); } return @out; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev::Role::HeuristicSet::Simple - Simple excludes/includes set =head1 VERSION version 1.001002 =head1 ROLE REQUIRES =head2 C Consuming classes must provide this method, and return a list of shorthand Heuristics. sub heuristics { return qw( MYMETA ) } =head2 C Consuming classes must provide this method, and return a list of shorthand Negative Heuristics. sub negative_heuristics { return qw( IsDev::IgnoreFile ) } =head1 METHODS =head2 C Returns the list of fully qualified module names that comprise this heuristic. expands results from C<< ->heuristics >> and C<< ->negative_heuristics >>, with negative ones preceding positive. =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev::Role::HeuristicSet::Simple", "interface":"role", "does":"Path::IsDev::Role::HeuristicSet" } =end MetaPOD::JSON =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/lib/Path/IsDev/NegativeHeuristic/0000755000175000017500000000000012373560357020436 5ustar kentkentPath-IsDev-1.001002/lib/Path/IsDev/NegativeHeuristic/IsDev/0000755000175000017500000000000012373560357021450 5ustar kentkentPath-IsDev-1.001002/lib/Path/IsDev/NegativeHeuristic/IsDev/IgnoreFile.pm0000644000175000017500000000374712373560357024044 0ustar kentkentuse 5.008; # utf8 use strict; use warnings; use utf8; package Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile; our $VERSION = '1.001002'; # ABSTRACT: An explicit exclusion file heuristic our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY use Role::Tiny::With qw( with ); with 'Path::IsDev::Role::NegativeHeuristic', 'Path::IsDev::Role::Matcher::Child::Exists::Any::File'; sub excludes_files { return ('.path_isdev_ignore'); } sub excludes { my ( $self, $result_object ) = @_; if ( $self->child_exists_any_file( $result_object, $self->excludes_files ) ) { return 1; } return; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile - An explicit exclusion file heuristic =head1 VERSION version 1.001002 =head1 SYNOPSIS In a C<::HeuristicSet>: sub negative_heuristics { return 'IsDev::IgnoreFile' } Then on your file system: touch .path_isdev_ignore Then the given location will no longer be a possible candidate for being deemed a C root directory. However: =over 4 =item * Its parents can still be deemed C directories =item * Its children can still be deemed C directories =back =head1 METHODS =head2 C Files valid for triggering this heuristic: .path_isdev_ignore =head2 C Returns an exclusion if any of C exists, and are files. =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile", "interface":"single_class", "does":[ "Path::IsDev::Role::NegativeHeuristic", "Path::IsDev::Role::Matcher::Child::Exists::Any::File" ] } =end MetaPOD::JSON =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/lib/Path/IsDev/NegativeHeuristic/PerlINC.pm0000644000175000017500000000367312373560357022241 0ustar kentkentuse 5.008; # utf8 use strict; use warnings; use utf8; package Path::IsDev::NegativeHeuristic::PerlINC; our $VERSION = '1.001002'; # ABSTRACT: White-list paths in Config.pm as being non-development roots. our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY ## no critic (RequireArgUnpacking, ProhibitSubroutinePrototypes) sub _uniq (@) { my %seen = (); return grep { not $seen{$_}++ } @_; } use Role::Tiny::With qw( with ); use Config; with 'Path::IsDev::Role::NegativeHeuristic', 'Path::IsDev::Role::Matcher::FullPath::Is::Any'; sub paths { my @sources; push @sources, $Config{archlibexp}, $Config{privlibexp}, $Config{sitelibexp}, $Config{vendorlibexp}; return _uniq grep { defined and length } @sources; } sub excludes { my ( $self, $result_object ) = @_; return unless $self->fullpath_is_any( $result_object, $self->paths ); return 1; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev::NegativeHeuristic::PerlINC - White-list paths in Config.pm as being non-development roots. =head1 VERSION version 1.001002 =head1 METHODS =head2 C Returns a unique list comprised of all the C<*exp> library paths from L<< C|Config >> uniq grep { defined and length } $Config{archlibexp}, $Config{privlibexp}, $Config{sitelibexp}, $Config{vendorlibexp}; =head2 C Excludes a path if its full path is any of C =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev::NegativeHeuristic::PerlINC", "interface":"single_class", "does": [ "Path::IsDev::Role::NegativeHeuristic", "Path::IsDev::Role::Matcher::FullPath::Is::Any" ] } =end MetaPOD::JSON =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/lib/Path/IsDev/NegativeHeuristic/HomeDir.pm0000644000175000017500000000426012373560357022325 0ustar kentkentuse 5.008; # utf8 use strict; use warnings; use utf8; package Path::IsDev::NegativeHeuristic::HomeDir; our $VERSION = '1.001002'; # ABSTRACT: User home directories are not development roots our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY ## no critic (RequireArgUnpacking, ProhibitSubroutinePrototypes) sub _uniq (@) { my %seen = (); return grep { not $seen{$_}++ } @_; } use Role::Tiny::With qw( with ); with 'Path::IsDev::Role::NegativeHeuristic', 'Path::IsDev::Role::Matcher::FullPath::Is::Any'; sub paths { my @sources; require File::HomeDir; push @sources, File::HomeDir->my_home; for my $method (qw( my_home my_desktop my_music my_pictures my_videos my_data )) { if ( $File::HomeDir::IMPLEMENTED_BY->can($method) ) { push @sources, File::HomeDir->$method(); } } return _uniq grep { defined and length } @sources; } sub excludes { my ( $self, $result_object ) = @_; return unless $self->fullpath_is_any( $result_object, $self->paths ); return 1; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev::NegativeHeuristic::HomeDir - User home directories are not development roots =head1 VERSION version 1.001002 =head1 METHODS =head2 C Excludes any values returned by L<< C|File::HomeDir >> uniq grep { defined and length } File::HomeDir->my_home, File::HomeDir->my_desktop, File::HomeDir->my_music, File::HomeDir->my_pictures, File::HomeDir->my_videos, File::HomeDir->my_data; =head2 C Excludes any path that matches a C of a L<< C path|File::HomeDir >> =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev::NegativeHeuristic::HomeDir", "interface":"single_class", "does": [ "Path::IsDev::Role::NegativeHeuristic", "Path::IsDev::Role::Matcher::FullPath::Is::Any" ] } =end MetaPOD::JSON =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . 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 Path-IsDev-1.001002/Makefile.PL0000644000175000017500000000353212373560357014315 0ustar kentkent # This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v5.020. use strict; use warnings; use 5.008; use ExtUtils::MakeMaker ; my %WriteMakefileArgs = ( "ABSTRACT" => "Determine if a given Path resembles a development source tree", "AUTHOR" => "Kent Fredric ", "CONFIGURE_REQUIRES" => { "ExtUtils::MakeMaker" => 0 }, "DISTNAME" => "Path-IsDev", "EXE_FILES" => [], "LICENSE" => "perl", "NAME" => "Path::IsDev", "PREREQ_PM" => { "Carp" => 0, "Class::Tiny" => "0.010", "File::HomeDir" => 0, "Module::Runtime" => 0, "Path::Tiny" => "0.004", "Role::Tiny" => 0, "Role::Tiny::With" => 0, "Scalar::Util" => 0, "Sub::Exporter" => 0, "strict" => 0, "utf8" => 0, "warnings" => 0 }, "TEST_REQUIRES" => { "ExtUtils::MakeMaker" => 0, "File::Spec" => 0, "File::Temp" => 0, "FindBin" => 0, "Test::Fatal" => 0, "Test::More" => "0.89" }, "VERSION" => "1.001002", "test" => { "TESTS" => "t/*.t t/00-compile/*.t t/Path-IsDev-Object/*.t t/Path-IsDev/is_dev/*.t" } ); my %FallbackPrereqs = ( "Carp" => 0, "Class::Tiny" => "0.010", "ExtUtils::MakeMaker" => 0, "File::HomeDir" => 0, "File::Spec" => 0, "File::Temp" => 0, "FindBin" => 0, "Module::Runtime" => 0, "Path::Tiny" => "0.004", "Role::Tiny" => 0, "Role::Tiny::With" => 0, "Scalar::Util" => 0, "Sub::Exporter" => 0, "Test::Fatal" => 0, "Test::More" => "0.89", "strict" => 0, "utf8" => 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); Path-IsDev-1.001002/xt/0000755000175000017500000000000012373560357012773 5ustar kentkentPath-IsDev-1.001002/xt/release/0000755000175000017500000000000012373560357014413 5ustar kentkentPath-IsDev-1.001002/xt/release/pod-coverage.t0000644000175000017500000000033412373560357017153 0ustar kentkent#!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' }); Path-IsDev-1.001002/xt/release/cpan-changes.t0000644000175000017500000000026312373560357017130 0ustar kentkent#!perl use strict; use warnings; use Test::More 0.96 tests => 2; use_ok('Test::CPAN::Changes'); subtest 'changes_ok' => sub { changes_file_ok('Changes'); }; done_testing(); Path-IsDev-1.001002/xt/release/pod-syntax.t0000644000175000017500000000022012373560357016700 0ustar kentkent#!perl # This file was automatically generated by Dist::Zilla::Plugin::PodSyntaxTests. use Test::More; use Test::Pod 1.41; all_pod_files_ok(); Path-IsDev-1.001002/xt/release/distmeta.t0000644000175000017500000000017212373560357016412 0ustar kentkent#!perl # This file was automatically generated by Dist::Zilla::Plugin::MetaTests. use Test::CPAN::Meta; meta_yaml_ok(); Path-IsDev-1.001002/xt/release/minimum-version.t0000644000175000017500000000027012373560357017735 0ustar kentkent#!perl use Test::More; eval "use Test::MinimumVersion"; plan skip_all => "Test::MinimumVersion required for testing minimum versions" if $@; all_minimum_version_from_metayml_ok(); Path-IsDev-1.001002/xt/release/kwalitee.t0000644000175000017500000000016612373560357016410 0ustar kentkent# this test was generated with Dist::Zilla::Plugin::Test::Kwalitee 2.07 use strict; use warnings; use Test::Kwalitee; Path-IsDev-1.001002/xt/release/eol.t0000644000175000017500000000024012373560357015353 0ustar kentkentuse strict; use warnings; use Test::More; eval 'use Test::EOL'; plan skip_all => 'Test::EOL required' if $@; all_perl_files_ok({ trailing_whitespace => 1 }); Path-IsDev-1.001002/xt/author/0000755000175000017500000000000012373560357014275 5ustar kentkentPath-IsDev-1.001002/xt/author/critic.t0000644000175000017500000000043512373560357015741 0ustar kentkent#!perl use strict; use warnings; use Test::More; use English qw(-no_match_vars); eval "use Test::Perl::Critic"; plan skip_all => 'Test::Perl::Critic required to criticise code' if $@; Test::Perl::Critic->import( -profile => "perlcritic.rc" ) if -e "perlcritic.rc"; all_critic_ok(); Path-IsDev-1.001002/dist.ini.meta0000644000175000017500000000157412373560357014740 0ustar kentkent; Generated by Dist::Zilla::Plugin::Author::KENTNL::DistINI version 1.7.4 at Sat Jul 6 04:44:50 2013 name = Path-IsDev author = Kent Fredric license = Perl_5 copyright_holder = Kent Fredric ; Uncomment this to bootstrap via self ; [Bootstrap::lib] [@Author::KENTNL] :version = 2.016 git_versions = 1 normal_form = numify mantissa = 6 toolkit = eumm toolkit_hardness = soft bumpversions = 1 copyfiles = LICENSE srcreadme = mkdn ; version_major = 0 ; version_minor = 1 ; the following data denotes when this minor was minted ; version_rel_year = 2013 ; version_rel_month = 7 ; version_rel_day = 6 ; version_rel_hour = 4 ; version_rel_time_zone = Pacific/Auckland twitter_hash_tags = #perl #cpan ; auto_prereqs_skip = File::Find [Prereqs] Path-IsDev-1.001002/t/0000755000175000017500000000000012373560357012603 5ustar kentkentPath-IsDev-1.001002/t/00-report-prereqs.dd0000644000175000017500000001442612373560357016332 0ustar kentkentdo { my $x = { 'configure' => { 'recommends' => { 'ExtUtils::MakeMaker' => '6.98' }, 'requires' => { 'ExtUtils::MakeMaker' => '0' } }, 'develop' => { 'requires' => { 'Dist::Zilla::Plugin::Authority' => '1.006', 'Dist::Zilla::Plugin::AutoPrereqs' => '0', 'Dist::Zilla::Plugin::BumpVersionAfterRelease' => '0', 'Dist::Zilla::Plugin::ConfirmRelease' => '0', 'Dist::Zilla::Plugin::CopyFilesFromBuild' => '0', 'Dist::Zilla::Plugin::EOLTests' => '0', 'Dist::Zilla::Plugin::Git::Check' => '0', 'Dist::Zilla::Plugin::Git::Commit' => '0', 'Dist::Zilla::Plugin::Git::CommitBuild' => '0', 'Dist::Zilla::Plugin::Git::Contributors' => '0.006', 'Dist::Zilla::Plugin::Git::GatherDir' => '0', 'Dist::Zilla::Plugin::Git::NextRelease' => '0', 'Dist::Zilla::Plugin::Git::Tag' => '0', 'Dist::Zilla::Plugin::GithubMeta' => '0', 'Dist::Zilla::Plugin::License' => '0', 'Dist::Zilla::Plugin::MakeMaker' => '0', 'Dist::Zilla::Plugin::Manifest' => '0', 'Dist::Zilla::Plugin::ManifestSkip' => '0', 'Dist::Zilla::Plugin::MetaConfig' => '0', 'Dist::Zilla::Plugin::MetaData::BuiltWith' => '0', 'Dist::Zilla::Plugin::MetaJSON' => '0', 'Dist::Zilla::Plugin::MetaProvides::Package' => '1.14000001', 'Dist::Zilla::Plugin::MetaTests' => '0', 'Dist::Zilla::Plugin::MetaYAML' => '0', 'Dist::Zilla::Plugin::MinimumPerl' => '0', 'Dist::Zilla::Plugin::PodCoverageTests' => '0', 'Dist::Zilla::Plugin::PodSyntaxTests' => '0', 'Dist::Zilla::Plugin::PodWeaver' => '0', 'Dist::Zilla::Plugin::Prereqs' => '0', 'Dist::Zilla::Plugin::Prereqs::Recommend::MatchInstalled' => '0', 'Dist::Zilla::Plugin::ReadmeAnyFromPod' => '0', 'Dist::Zilla::Plugin::ReadmeFromPod' => '0', 'Dist::Zilla::Plugin::RewriteVersion::Sanitized' => '0', 'Dist::Zilla::Plugin::RunExtraTests' => '0', 'Dist::Zilla::Plugin::Test::CPAN::Changes' => '0', 'Dist::Zilla::Plugin::Test::Compile::PerFile' => '0', 'Dist::Zilla::Plugin::Test::Kwalitee' => '0', 'Dist::Zilla::Plugin::Test::MinimumVersion' => '0', 'Dist::Zilla::Plugin::Test::Perl::Critic' => '0', 'Dist::Zilla::Plugin::Test::ReportPrereqs' => '0', 'Dist::Zilla::Plugin::TestRelease' => '0', 'Dist::Zilla::Plugin::Twitter' => '0', 'Dist::Zilla::Plugin::UploadToCPAN' => '0', 'Pod::Coverage::TrustPod' => '0', 'Test::CPAN::Changes' => '0.19', 'Test::CPAN::Meta' => '0', 'Test::Kwalitee' => '1.12', 'Test::Pod' => '1.41', 'Test::Pod::Coverage' => '1.08' }, 'suggests' => { 'Dist::Zilla::App::Command::bakeini' => '0.001001', 'Dist::Zilla::PluginBundle::Author::KENTNL' => '2.017002' } }, 'runtime' => { 'requires' => { 'Carp' => '0', 'Class::Tiny' => '0.010', 'File::HomeDir' => '0', 'Module::Runtime' => '0', 'Path::Tiny' => '0.004', 'Role::Tiny' => '0', 'Role::Tiny::With' => '0', 'Scalar::Util' => '0', 'Sub::Exporter' => '0', 'perl' => '5.008', 'strict' => '0', 'utf8' => '0', 'warnings' => '0' } }, 'test' => { 'recommends' => { 'CPAN::Meta' => '2.120900', 'ExtUtils::MakeMaker' => '6.98', 'Test::More' => '1.001003' }, 'requires' => { 'ExtUtils::MakeMaker' => '0', 'File::Spec' => '0', 'File::Temp' => '0', 'FindBin' => '0', 'Test::Fatal' => '0', 'Test::More' => '0.89' } } }; $x; }Path-IsDev-1.001002/t/Path-IsDev/0000755000175000017500000000000012373560357014507 5ustar kentkentPath-IsDev-1.001002/t/Path-IsDev/is_dev/0000755000175000017500000000000012373560357015760 5ustar kentkentPath-IsDev-1.001002/t/Path-IsDev/is_dev/MYMETA.t0000644000175000017500000000120312373560357017135 0ustar kentkentuse strict; use warnings; use Test::More; use Path::Tiny qw(path); use Test::Fatal qw( exception ); use FindBin; sub nofatal { my ( $message, $sub ) = @_; my $e = exception { $sub->() }; return is( $e, undef, $message ); } my $corpus_dir = path($FindBin::Bin)->parent->parent->parent->child('corpus')->child('MYMETA'); nofatal 'Can require without exception' => sub { require Path::IsDev; }; nofatal 'Can import without exception' => sub { Path::IsDev->import(qw(is_dev)); }; my $path; nofatal 'Can call without exception' => sub { $path = is_dev($corpus_dir); }; isnt( $path, undef, 'path is a dev dir' ); done_testing; Path-IsDev-1.001002/t/Path-IsDev/is_dev/DZil.t0000644000175000017500000000120112373560357017001 0ustar kentkentuse strict; use warnings; use Test::More; use Path::Tiny qw(path); use Test::Fatal qw( exception ); use FindBin; sub nofatal { my ( $message, $sub ) = @_; my $e = exception { $sub->() }; return is( $e, undef, $message ); } my $corpus_dir = path($FindBin::Bin)->parent->parent->parent->child('corpus')->child('DZil'); nofatal 'Can require without exception' => sub { require Path::IsDev; }; nofatal 'Can import without exception' => sub { Path::IsDev->import(qw(is_dev)); }; my $path; nofatal 'Can call without exception' => sub { $path = is_dev($corpus_dir); }; isnt( $path, undef, 'path is a dev dir' ); done_testing; Path-IsDev-1.001002/t/Path-IsDev/is_dev/MakeMaker.t0000644000175000017500000000120612373560357020001 0ustar kentkentuse strict; use warnings; use Test::More; use Path::Tiny qw(path); use Test::Fatal qw( exception ); use FindBin; sub nofatal { my ( $message, $sub ) = @_; my $e = exception { $sub->() }; return is( $e, undef, $message ); } my $corpus_dir = path($FindBin::Bin)->parent->parent->parent->child('corpus')->child('MakeMaker'); nofatal 'Can require without exception' => sub { require Path::IsDev; }; nofatal 'Can import without exception' => sub { Path::IsDev->import(qw(is_dev)); }; my $path; nofatal 'Can call without exception' => sub { $path = is_dev($corpus_dir); }; isnt( $path, undef, 'path is a dev dir' ); done_testing; Path-IsDev-1.001002/t/Path-IsDev/is_dev/TestDir.t0000644000175000017500000000120412373560357017520 0ustar kentkentuse strict; use warnings; use Test::More; use Path::Tiny qw(path); use Test::Fatal qw( exception ); use FindBin; sub nofatal { my ( $message, $sub ) = @_; my $e = exception { $sub->() }; return is( $e, undef, $message ); } my $corpus_dir = path($FindBin::Bin)->parent->parent->parent->child('corpus')->child('TestDir'); nofatal 'Can require without exception' => sub { require Path::IsDev; }; nofatal 'Can import without exception' => sub { Path::IsDev->import(qw(is_dev)); }; my $path; nofatal 'Can call without exception' => sub { $path = is_dev($corpus_dir); }; isnt( $path, undef, 'path is a dev dir' ); done_testing; Path-IsDev-1.001002/t/Path-IsDev/is_dev/Changelog.t0000644000175000017500000000120612373560357020033 0ustar kentkentuse strict; use warnings; use Test::More; use Path::Tiny qw(path); use Test::Fatal qw( exception ); use FindBin; sub nofatal { my ( $message, $sub ) = @_; my $e = exception { $sub->() }; return is( $e, undef, $message ); } my $corpus_dir = path($FindBin::Bin)->parent->parent->parent->child('corpus')->child('Changelog'); nofatal 'Can require without exception' => sub { require Path::IsDev; }; nofatal 'Can import without exception' => sub { Path::IsDev->import(qw(is_dev)); }; my $path; nofatal 'Can call without exception' => sub { $path = is_dev($corpus_dir); }; isnt( $path, undef, 'path is a dev dir' ); done_testing; Path-IsDev-1.001002/t/Path-IsDev/is_dev/DevDir.t0000644000175000017500000000120312373560357017316 0ustar kentkentuse strict; use warnings; use Test::More; use Path::Tiny qw(path); use Test::Fatal qw( exception ); use FindBin; sub nofatal { my ( $message, $sub ) = @_; my $e = exception { $sub->() }; return is( $e, undef, $message ); } my $corpus_dir = path($FindBin::Bin)->parent->parent->parent->child('corpus')->child('DevDir'); nofatal 'Can require without exception' => sub { require Path::IsDev; }; nofatal 'Can import without exception' => sub { Path::IsDev->import(qw(is_dev)); }; my $path; nofatal 'Can call without exception' => sub { $path = is_dev($corpus_dir); }; isnt( $path, undef, 'path is a dev dir' ); done_testing; Path-IsDev-1.001002/t/Path-IsDev/is_dev/suite.t.tpl0000644000175000017500000000120612373560357020073 0ustar kentkentuse strict; use warnings; use Test::More; use Path::Tiny qw(path); use Test::Fatal qw( exception ); use FindBin; sub nofatal { my ( $message, $sub ) = @_; my $e = exception { $sub->() }; return is( $e, undef, $message ); } my $corpus_dir = path($FindBin::Bin)->parent->parent->parent->child('corpus')->child('Changelog'); nofatal 'Can require without exception' => sub { require Path::IsDev; }; nofatal 'Can import without exception' => sub { Path::IsDev->import(qw(is_dev)); }; my $path; nofatal 'Can call without exception' => sub { $path = is_dev($corpus_dir); }; isnt( $path, undef, 'path is a dev dir' ); done_testing; Path-IsDev-1.001002/t/Path-IsDev/is_dev/META.t0000644000175000017500000000120112373560357016665 0ustar kentkentuse strict; use warnings; use Test::More; use Path::Tiny qw(path); use Test::Fatal qw( exception ); use FindBin; sub nofatal { my ( $message, $sub ) = @_; my $e = exception { $sub->() }; return is( $e, undef, $message ); } my $corpus_dir = path($FindBin::Bin)->parent->parent->parent->child('corpus')->child('META'); nofatal 'Can require without exception' => sub { require Path::IsDev; }; nofatal 'Can import without exception' => sub { Path::IsDev->import(qw(is_dev)); }; my $path; nofatal 'Can call without exception' => sub { $path = is_dev($corpus_dir); }; isnt( $path, undef, 'path is a dev dir' ); done_testing; Path-IsDev-1.001002/t/Path-IsDev/is_dev/ModuleBuild.t0000644000175000017500000000121012373560357020344 0ustar kentkentuse strict; use warnings; use Test::More; use Path::Tiny qw(path); use Test::Fatal qw( exception ); use FindBin; sub nofatal { my ( $message, $sub ) = @_; my $e = exception { $sub->() }; return is( $e, undef, $message ); } my $corpus_dir = path($FindBin::Bin)->parent->parent->parent->child('corpus')->child('ModuleBuild'); nofatal 'Can require without exception' => sub { require Path::IsDev; }; nofatal 'Can import without exception' => sub { Path::IsDev->import(qw(is_dev)); }; my $path; nofatal 'Can call without exception' => sub { $path = is_dev($corpus_dir); }; isnt( $path, undef, 'path is a dev dir' ); done_testing; Path-IsDev-1.001002/t/Path-IsDev-Object/0000755000175000017500000000000012373560357015713 5ustar kentkentPath-IsDev-1.001002/t/Path-IsDev-Object/_matches.t0000644000175000017500000000600712373560357017666 0ustar kentkentuse strict; use warnings; use Test::More; use Path::Tiny qw(path); use Test::Fatal qw( exception ); use FindBin; sub nofatal { my ( $message, $sub ) = @_; my $e = exception { $sub->() }; return is( $e, undef, "no exceptions: $message" ); } my $corpus_dir = path($FindBin::Bin)->parent->parent->child('corpus')->child('Changelog'); subtest 'corpus/Changelog' => sub { return unless nofatal 'require Path::IsDev::Object' => sub { require Path::IsDev::Object; }; my $instance; return unless nofatal 'instance = Path::IsDev::Object->new()' => sub { $instance = Path::IsDev::Object->new(); }; return unless nofatal 'instance->set()' => sub { is( $instance->set(), 'Basic', 'instance->set() == Basic' ); }; return unless nofatal 'instance->set_prefix()' => sub { is( $instance->set_prefix, 'Path::IsDev::HeuristicSet', 'instance->set_prefix() == Path::IsDev::HeuristicSet' ); }; return unless nofatal 'instance->set_module()' => sub { is( $instance->set_module, 'Path::IsDev::HeuristicSet::Basic', 'instance->set_module() == Path::IsDev::HeuristicSet::Basic' ); }; return unless nofatal 'instance->loaded_set_module()' => sub { is( $instance->set_module, 'Path::IsDev::HeuristicSet::Basic', 'instance->loaded_set_module() == Path::IsDev::HeuristicSet::Basic' ); }; return unless nofatal 'instance->_matches($path_isdev_source)' => sub { my $computed_root = path($FindBin::Bin)->parent->parent; my $result = $instance->_matches($computed_root); ok( defined $result->result, 'instance->_matches($path_isdev_source)->result is defined' ); subtest "result_object" => sub { return unless nofatal 'result->path' => sub { my $path = $result->path; ok( defined $path, '->path is defined' ); ok( ref $path, '->path is a ref' ); }; return unless nofatal 'result->result' => sub { my $result = $result->result; ok( defined $result, '->result is defined' ); }; return unless nofatal 'result->reasons' => sub { my $reasons = $result->reasons; ok( defined $reasons, '->reasons is defined' ); ok( ref $reasons, '->reasons is a ref' ); is( ref $reasons, 'ARRAY', '->reasons is ARRAY' ); }; }; }; return unless nofatal 'instance->matches($corpus_Changes_dir)' => sub { my $result = $instance->matches($corpus_dir); ok( defined $result, 'instance->matches($corpus_Changes_dir) is defined' ); }; return unless nofatal 'instance->matches($corpus_Changes_dir/../)' => sub { my $result = $instance->matches( $corpus_dir->parent ); ok( !defined $result, 'instance->matches($corpus_Changes_dir/../) is not defined' ); }; return unless nofatal 'instance->_instance_id' => sub { my $result = $instance->_instance_id; ok( defined $result, 'instance->_instance_id is defined' ); }; return unless nofatal 'instance->_debug(testing)' => sub { my $result = $instance->_debug('testing'); pass("_debug(testing) OK "); }; }; done_testing; Path-IsDev-1.001002/t/Path-IsDev-Object/basic.t0000644000175000017500000000477612373560357017177 0ustar kentkentuse strict; use warnings; use Test::More; use Path::Tiny qw(path); use Test::Fatal qw( exception ); use FindBin; sub nofatal { my ( $message, $sub ) = @_; my $e = exception { $sub->() }; return is( $e, undef, "no exceptions: $message" ); } my $corpus_dir = path($FindBin::Bin)->parent->parent->child('corpus')->child('Changelog'); subtest 'corpus/Changelog' => sub { return unless nofatal 'require Path::IsDev::Object' => sub { require Path::IsDev::Object; }; my $instance; return unless nofatal 'instance = Path::IsDev::Object->new()' => sub { $instance = Path::IsDev::Object->new(); }; return unless nofatal 'instance->set()' => sub { is( $instance->set(), 'Basic', 'instance->set() == Basic' ); }; return unless nofatal 'instance->set_prefix()' => sub { is( $instance->set_prefix, 'Path::IsDev::HeuristicSet', 'instance->set_prefix() == Path::IsDev::HeuristicSet' ); }; return unless nofatal 'instance->set_module()' => sub { is( $instance->set_module, 'Path::IsDev::HeuristicSet::Basic', 'instance->set_module() == Path::IsDev::HeuristicSet::Basic' ); }; return unless nofatal 'instance->loaded_set_module()' => sub { is( $instance->set_module, 'Path::IsDev::HeuristicSet::Basic', 'instance->loaded_set_module() == Path::IsDev::HeuristicSet::Basic' ); }; return unless nofatal 'instance->matches($path_isdev_source)' => sub { my $computed_root = path($FindBin::Bin)->parent->parent; diag( '$path_isdev_source = ' . $computed_root ); my $result = $instance->matches($computed_root); ok( defined $result, 'instance->matches($path_isdev_source) is defined' ); }; return unless nofatal 'instance->matches($corpus_Changes_dir)' => sub { diag( '$corpus_Changes_dir = ' . $corpus_dir ); my $result = $instance->matches($corpus_dir); ok( defined $result, 'instance->matches($corpus_Changes_dir) is defined' ); }; return unless nofatal 'instance->matches($corpus_Changes_dir/../)' => sub { diag( '$corpus_Changes_dir/../ = ' . $corpus_dir->parent ); my $result = $instance->matches( $corpus_dir->parent ); ok( !defined $result, 'instance->matches($corpus_Changes_dir/../) is not defined' ); }; return unless nofatal 'instance->_instance_id' => sub { my $result = $instance->_instance_id; ok( defined $result, 'instance->_instance_id is defined' ); }; return unless nofatal 'instance->_debug(testing)' => sub { my $result = $instance->_debug('testing'); pass("_debug(testing) OK "); }; }; done_testing; Path-IsDev-1.001002/t/00-compile/0000755000175000017500000000000012373560357014450 5ustar kentkentPath-IsDev-1.001002/t/00-compile/lib_Path_IsDev_Role_Matcher_Child_Exists_Any_File_pm.t0000644000175000017500000000055112373560357027002 0ustar kentkentuse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( @Author::KENTNL/Test::Compile::PerFile ) version 0.002002 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Role/Matcher/Child/Exists/Any/File.pm"); Path-IsDev-1.001002/t/00-compile/lib_Path_IsDev_Heuristic_Changelog_pm.t0000644000175000017500000000051312373560357024132 0ustar kentkentuse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( @Author::KENTNL/Test::Compile::PerFile ) version 0.002002 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Heuristic/Changelog.pm"); Path-IsDev-1.001002/t/00-compile/lib_Path_IsDev_Heuristic_TestDir_pm.t0000644000175000017500000000050712373560357023624 0ustar kentkentuse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( @Author::KENTNL/Test::Compile::PerFile ) version 0.002002 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Heuristic/TestDir.pm"); Path-IsDev-1.001002/t/00-compile/lib_Path_IsDev_Role_Matcher_Child_BaseName_MatchRegexp_pm.t0000644000175000017500000000056312373560357027722 0ustar kentkentuse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( @Author::KENTNL/Test::Compile::PerFile ) version 0.002002 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Role/Matcher/Child/BaseName/MatchRegexp.pm"); Path-IsDev-1.001002/t/00-compile/lib_Path_IsDev_Result_pm.t0000644000175000017500000000046112373560357021504 0ustar kentkentuse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( @Author::KENTNL/Test::Compile::PerFile ) version 0.002002 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Result.pm"); Path-IsDev-1.001002/t/00-compile/lib_Path_IsDev_Object_pm.t0000644000175000017500000000046112373560357021434 0ustar kentkentuse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( @Author::KENTNL/Test::Compile::PerFile ) version 0.002002 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Object.pm"); Path-IsDev-1.001002/t/00-compile/lib_Path_IsDev_Heuristic_Tool_ModuleBuild_pm.t0000644000175000017500000000053112373560357025445 0ustar kentkentuse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( @Author::KENTNL/Test::Compile::PerFile ) version 0.002002 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Heuristic/Tool/ModuleBuild.pm"); Path-IsDev-1.001002/t/00-compile/lib_Path_IsDev_Role_HeuristicSet_pm.t0000644000175000017500000000050712373560357023623 0ustar kentkentuse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( @Author::KENTNL/Test::Compile::PerFile ) version 0.002002 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Role/HeuristicSet.pm"); Path-IsDev-1.001002/t/00-compile/lib_Path_IsDev_NegativeHeuristic_PerlINC_pm.t0000644000175000017500000000052712373560357025167 0ustar kentkentuse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( @Author::KENTNL/Test::Compile::PerFile ) version 0.002002 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/NegativeHeuristic/PerlINC.pm"); Path-IsDev-1.001002/t/00-compile/lib_Path_IsDev_Heuristic_Tool_MakeMaker_pm.t0000644000175000017500000000052512373560357025100 0ustar kentkentuse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( @Author::KENTNL/Test::Compile::PerFile ) version 0.002002 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Heuristic/Tool/MakeMaker.pm"); Path-IsDev-1.001002/t/00-compile/lib_Path_IsDev_Heuristic_Tool_Dzil_pm.t0000644000175000017500000000051312373560357024142 0ustar kentkentuse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( @Author::KENTNL/Test::Compile::PerFile ) version 0.002002 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Heuristic/Tool/Dzil.pm"); Path-IsDev-1.001002/t/00-compile/lib_Path_IsDev_NegativeHeuristic_HomeDir_pm.t0000644000175000017500000000052712373560357025262 0ustar kentkentuse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( @Author::KENTNL/Test::Compile::PerFile ) version 0.002002 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/NegativeHeuristic/HomeDir.pm"); Path-IsDev-1.001002/t/00-compile/lib_Path_IsDev_Heuristic_DevDirMarker_pm.t0000644000175000017500000000052112373560357024561 0ustar kentkentuse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( @Author::KENTNL/Test::Compile::PerFile ) version 0.002002 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Heuristic/DevDirMarker.pm"); Path-IsDev-1.001002/t/00-compile/lib_Path_IsDev_pm.t0000644000175000017500000000044312373560357020146 0ustar kentkentuse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( @Author::KENTNL/Test::Compile::PerFile ) version 0.002002 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev.pm"); Path-IsDev-1.001002/t/00-compile/lib_Path_IsDev_Role_NegativeHeuristic_pm.t0000644000175000017500000000052112373560357024626 0ustar kentkentuse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( @Author::KENTNL/Test::Compile::PerFile ) version 0.002002 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Role/NegativeHeuristic.pm"); Path-IsDev-1.001002/t/00-compile/lib_Path_IsDev_Role_Matcher_Child_Exists_Any_pm.t0000644000175000017500000000053712373560357026047 0ustar kentkentuse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( @Author::KENTNL/Test::Compile::PerFile ) version 0.002002 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Role/Matcher/Child/Exists/Any.pm"); Path-IsDev-1.001002/t/00-compile/lib_Path_IsDev_Heuristic_META_pm.t0000644000175000017500000000050112373560357022766 0ustar kentkentuse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( @Author::KENTNL/Test::Compile::PerFile ) version 0.002002 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Heuristic/META.pm"); Path-IsDev-1.001002/t/00-compile/lib_Path_IsDev_Role_Matcher_Child_BaseName_MatchRegexp_File_pm.t0000644000175000017500000000057512373560357030664 0ustar kentkentuse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( @Author::KENTNL/Test::Compile::PerFile ) version 0.002002 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Role/Matcher/Child/BaseName/MatchRegexp/File.pm"); Path-IsDev-1.001002/t/00-compile/lib_Path_IsDev_HeuristicSet_Basic_pm.t0000644000175000017500000000051112373560357023736 0ustar kentkentuse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( @Author::KENTNL/Test::Compile::PerFile ) version 0.002002 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/HeuristicSet/Basic.pm"); Path-IsDev-1.001002/t/00-compile/lib_Path_IsDev_Heuristic_VCS_Git_pm.t0000644000175000017500000000050712373560357023504 0ustar kentkentuse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( @Author::KENTNL/Test::Compile::PerFile ) version 0.002002 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Heuristic/VCS/Git.pm"); Path-IsDev-1.001002/t/00-compile/lib_Path_IsDev_Role_Matcher_FullPath_Is_Any_pm.t0000644000175000017500000000053512373560357025635 0ustar kentkentuse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( @Author::KENTNL/Test::Compile::PerFile ) version 0.002002 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Role/Matcher/FullPath/Is/Any.pm"); Path-IsDev-1.001002/t/00-compile/lib_Path_IsDev_Role_Heuristic_pm.t0000644000175000017500000000050112373560357023141 0ustar kentkentuse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( @Author::KENTNL/Test::Compile::PerFile ) version 0.002002 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Role/Heuristic.pm"); Path-IsDev-1.001002/t/00-compile/lib_Path_IsDev_Role_HeuristicSet_Simple_pm.t0000644000175000017500000000052512373560357025134 0ustar kentkentuse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( @Author::KENTNL/Test::Compile::PerFile ) version 0.002002 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Role/HeuristicSet/Simple.pm"); Path-IsDev-1.001002/t/00-compile/lib_Path_IsDev_NegativeHeuristic_IsDev_IgnoreFile_pm.t0000644000175000017500000000055112373560357027045 0ustar kentkentuse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( @Author::KENTNL/Test::Compile::PerFile ) version 0.002002 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/NegativeHeuristic/IsDev/IgnoreFile.pm"); Path-IsDev-1.001002/t/00-compile/lib_Path_IsDev_Role_Matcher_Child_Exists_Any_Dir_pm.t0000644000175000017500000000054712373560357026646 0ustar kentkentuse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( @Author::KENTNL/Test::Compile::PerFile ) version 0.002002 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Role/Matcher/Child/Exists/Any/Dir.pm"); Path-IsDev-1.001002/t/00-compile/lib_Path_IsDev_Heuristic_Makefile_pm.t0000644000175000017500000000051112373560357023756 0ustar kentkentuse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( @Author::KENTNL/Test::Compile::PerFile ) version 0.002002 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Heuristic/Makefile.pm"); Path-IsDev-1.001002/t/00-compile/lib_Path_IsDev_Heuristic_MYMETA_pm.t0000644000175000017500000000050512373560357023240 0ustar kentkentuse strict; use warnings; # This test was generated for # using by Dist::Zilla::Plugin::Test::Compile::PerFile ( @Author::KENTNL/Test::Compile::PerFile ) version 0.002002 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Heuristic/MYMETA.pm"); Path-IsDev-1.001002/t/00-report-prereqs.t0000644000175000017500000001231412373560357016200 0ustar kentkent#!perl use strict; use warnings; # This test was generated by Dist::Zilla::Plugin::Test::ReportPrereqs 0.019 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( ); 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'; if ( $source && $HAS_CPAN_META ) { if ( my $meta = eval { CPAN::Meta->load_file($source) } ) { $full_prereqs = _merge_prereqs($full_prereqs, $meta->prereqs); } } else { $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 ); 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 ( @dep_errors ) { diag join("\n", "\n*** WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING ***\n", "The following REQUIRED prerequisites were not satisfied:\n", @dep_errors, "\n" ); } pass; # vim: ts=4 sts=4 sw=4 et: Path-IsDev-1.001002/t/basic.t0000644000175000017500000000047412373560357014056 0ustar kentkent use strict; use warnings; use Test::More; use File::Temp qw( tempdir ); use FindBin; use Path::IsDev is_dev => { set => 'Basic' }; my $dir = tempdir(); ok( !is_dev($dir), 'empty dirs should not be dev dirs' ); ok( is_dev("$FindBin::Bin/../"), 'dirname(dirname(__FILE__)) is dev' ); done_testing; Path-IsDev-1.001002/maint/0000755000175000017500000000000012373560357013450 5ustar kentkentPath-IsDev-1.001002/maint/perlcritic.rc.gen.pl0000744000175000017500000000330512373560357017322 0ustar kentkent#!/usr/bin/env perl # FILENAME: bundle_to_ini.pl # CREATED: 02/06/14 01:48:56 by Kent Fredric (kentnl) # ABSTRACT: Write an INI file from a bundle use 5.008; # utf8 use strict; use warnings; use utf8; our $VERSION = 0.001; use Carp qw( croak carp ); use Perl::Critic::ProfileCompiler::Util qw( create_bundle ); use Path::Tiny qw(path); ## no critic (ErrorHandling::RequireUseOfExceptions) my $bundle = create_bundle('Example::Author::KENTNL'); $bundle->configure; my @stopwords = ( qw[behaviours pluggable accessor accessors introspectable], # Spelling qw[basename Config IsDev Makefile devdir Changelog], # Unquotable abstract terms ); for my $var ( sort @stopwords ) { $bundle->add_or_append_policy_field( 'Documentation::PodSpelling' => ( 'stop_words' => $var ) ); } #$bundle->add_or_append_policy_field( # 'Subroutines::ProhibitCallsToUndeclaredSubs' => ( 'exempt_subs' => 'String::Formatter::str_rf' ), ); # #$bundle->remove_policy('ErrorHandling::RequireCarping'); #$bundle->remove_policy('NamingConventions::Capitalization'); my $inf = $bundle->actionlist->get_inflated; my $config = $inf->apply_config; { my $rcfile = path('./perlcritic.rc')->openw_utf8; $rcfile->print( $config->as_ini, "\n" ); close $rcfile or croak 'Something fubared closing perlcritic.rc'; } my $deps = $inf->own_deps; { my $target = path('./misc'); $target->mkpath if not $target->is_dir; my $depsfile = $target->child('perlcritic.deps')->openw_utf8; for my $key ( sort keys %{$deps} ) { $depsfile->printf( "%s~%s\n", $key, $deps->{$key} ); *STDERR->printf( "%s => %s\n", $key, $deps->{$key} ); } close $depsfile or carp 'Something fubared closing perlcritic.deps'; } Path-IsDev-1.001002/misc/0000755000175000017500000000000012373560357013273 5ustar kentkentPath-IsDev-1.001002/misc/Changes.deps.all0000644000175000017500000001561312373560357016275 0ustar kentkentThis file contains ALL changes in dependencies in both REQUIRED / OPTIONAL dependencies for all phases (configure/build/runtime/test/develop) 1.001002 [Added / develop requires] - Dist::Zilla::Plugin::Git::Contributors 0.006 [Added / test requires] - File::Spec [Changed / configure requires] - ExtUtils::MakeMaker 6.30 → 0 [Changed / develop suggests] - Dist::Zilla::App::Command::bakeini 0.001000 → 0.001001 - Dist::Zilla::PluginBundle::Author::KENTNL 2.016001 → 2.017002 [Changed / test recommends] - CPAN::Meta 0 → 2.120900 [Removed / test recommends] - CPAN::Meta::Requirements 2.120900 [Removed / test requires] - File::Spec::Functions - List::Util - version 1.001001 2014-07-12T18:23:30Z [Added / develop requires] - Dist::Zilla::Plugin::BumpVersionAfterRelease - Dist::Zilla::Plugin::CopyFilesFromBuild - Dist::Zilla::Plugin::RewriteVersion::Sanitized [Added / develop suggests] - Dist::Zilla::App::Command::bakeini 0.001000 - Dist::Zilla::PluginBundle::Author::KENTNL 2.016001 [Changed / configure recommends] - ExtUtils::MakeMaker 6.90 → 6.98 [Changed / test recommends] - ExtUtils::MakeMaker 6.90 → 6.98 - Test::More 1.001002 → 1.001003 [Removed / develop requires] - Dist::Zilla::Plugin::Git::NextVersion::Sanitized - Dist::Zilla::Plugin::PkgVersion - Dist::Zilla::PluginBundle::Author::KENTNL 2.012000 [Removed / develop suggests] - Dist::Zilla::PluginBundle::Author::KENTNL::Lite v1.3.0 1.001000 2014-03-01T13:22:00Z [Added / configure recommends] - ExtUtils::MakeMaker 6.90 [Added / configure requires] - ExtUtils::MakeMaker 6.30 [Added / develop requires] - Dist::Zilla::Plugin::Git::NextRelease - Dist::Zilla::Plugin::Git::NextVersion::Sanitized - Dist::Zilla::Plugin::MakeMaker - Dist::Zilla::Plugin::MinimumPerl - Dist::Zilla::Plugin::Prereqs::Recommend::MatchInstalled - Dist::Zilla::Plugin::RunExtraTests - Dist::Zilla::Plugin::Test::ReportPrereqs [Added / runtime requires] - utf8 [Added / test recommends] - CPAN::Meta - CPAN::Meta::Requirements 2.120900 - ExtUtils::MakeMaker 6.90 - Test::More 1.001002 [Added / test requires] - ExtUtils::MakeMaker - File::Spec::Functions - List::Util - version [Changed / develop requires] - Dist::Zilla::PluginBundle::Author::KENTNL 2.004000 → 2.012000 [Changed / runtime requires] - Path::Tiny 0 → 0.004 - perl 5.006 → 5.008 [Changed / test requires] - Test::More 1.001002 → 0.89 [Removed / build requires] - Module::Build 0.4202 [Removed / configure requires] - Module::Build 0.4202 [Removed / develop requires] - Dist::Zilla::Plugin::Author::KENTNL::MinimumPerl - Dist::Zilla::Plugin::CheckExtraTests - Dist::Zilla::Plugin::Git::NextVersion - Dist::Zilla::Plugin::ModuleBuild - Dist::Zilla::Plugin::NextRelease - Dist::Zilla::Plugin::Prereqs::MatchInstalled - Dist::Zilla::Plugin::PruneCruft - Dist::Zilla::Plugin::ReportVersions::Tiny - version 0.9901 1.000002 2013-11-22T03:28:04Z [Changed / develop requires] - Dist::Zilla::PluginBundle::Author::KENTNL 2.002001 → 2.004000 1.000001 2013-11-21T11:49:20Z [Added / develop requires] - Dist::Zilla::Plugin::Author::KENTNL::MinimumPerl - Dist::Zilla::Plugin::Authority 1.006 - Dist::Zilla::Plugin::AutoPrereqs - Dist::Zilla::Plugin::CheckExtraTests - Dist::Zilla::Plugin::ConfirmRelease - Dist::Zilla::Plugin::EOLTests - Dist::Zilla::Plugin::Git::Check - Dist::Zilla::Plugin::Git::Commit - Dist::Zilla::Plugin::Git::CommitBuild - Dist::Zilla::Plugin::Git::GatherDir - Dist::Zilla::Plugin::Git::NextVersion - Dist::Zilla::Plugin::Git::Tag - Dist::Zilla::Plugin::GithubMeta - Dist::Zilla::Plugin::License - Dist::Zilla::Plugin::Manifest - Dist::Zilla::Plugin::ManifestSkip - Dist::Zilla::Plugin::MetaConfig - Dist::Zilla::Plugin::MetaData::BuiltWith - Dist::Zilla::Plugin::MetaJSON - Dist::Zilla::Plugin::MetaProvides::Package 1.14000001 - Dist::Zilla::Plugin::MetaTests - Dist::Zilla::Plugin::MetaYAML - Dist::Zilla::Plugin::ModuleBuild - Dist::Zilla::Plugin::NextRelease - Dist::Zilla::Plugin::PkgVersion - Dist::Zilla::Plugin::PodCoverageTests - Dist::Zilla::Plugin::PodSyntaxTests - Dist::Zilla::Plugin::PodWeaver - Dist::Zilla::Plugin::Prereqs - Dist::Zilla::Plugin::Prereqs::MatchInstalled - Dist::Zilla::Plugin::PruneCruft - Dist::Zilla::Plugin::ReadmeAnyFromPod - Dist::Zilla::Plugin::ReadmeFromPod - Dist::Zilla::Plugin::ReportVersions::Tiny - Dist::Zilla::Plugin::Test::CPAN::Changes - Dist::Zilla::Plugin::Test::Compile::PerFile - Dist::Zilla::Plugin::Test::Kwalitee - Dist::Zilla::Plugin::Test::MinimumVersion - Dist::Zilla::Plugin::Test::Perl::Critic - Dist::Zilla::Plugin::TestRelease - Dist::Zilla::Plugin::Twitter - Dist::Zilla::Plugin::UploadToCPAN [Changed / build requires] - Module::Build 0.4007 → 0.4202 [Changed / configure requires] - Module::Build 0.4007 → 0.4202 [Changed / develop requires] - Dist::Zilla::PluginBundle::Author::KENTNL 2.000000 → 2.002001 [Changed / test requires] - Test::More 0.99 → 1.001002 [Removed / test requires] - File::Spec - IO::Handle - IPC::Open3 1.000000 2013-10-18T09:55:20Z [Added / runtime requires] - File::HomeDir [Changed / develop requires] - Dist::Zilla::PluginBundle::Author::KENTNL v1.9.0 → 2.000000 - Test::Kwalitee 1.08 → 1.12 [Changed / runtime requires] - perl v5.10.0 → 5.006 [Changed / test requires] - Test::More 0.98 → 0.99 0.6.0 2013-10-05T17:56:06Z [Added / runtime requires] - Role::Tiny - Role::Tiny::With [Removed / runtime requires] - parent 0.5.0 2013-10-05T15:00:12Z 0.4.0 2013-09-27T17:48:00Z [Added / develop requires] - Dist::Zilla::PluginBundle::Author::KENTNL v1.9.0 [Added / develop suggests] - Dist::Zilla::PluginBundle::Author::KENTNL::Lite v1.3.0 [Removed / develop recommends] - Dist::Zilla::PluginBundle::Author::KENTNL::Lite v1.3.0 [Removed / develop requires] - Dist::Zilla::PluginBundle::Author::KENTNL::Lite [Removed / develop suggests] - Dist::Zilla::PluginBundle::Author::KENTNL v1.8.3 0.3.3 2013-09-26T07:09:14Z [Added / test requires] - File::Spec 0.3.2 2013-09-18T17:45:37Z [Changed / runtime requires] - Class::Tiny 0.005 → 0.010 0.3.1 2013-09-18T02:21:11Z [Changed / runtime requires] - Class::Tiny 0 → 0.005 0.3.0 2013-09-16T08:27:21Z [Added / develop requires] - Test::Kwalitee 1.08 [Added / runtime requires] - Class::Tiny [Added / test requires] - IO::Handle - IPC::Open3 [Changed / build requires] - Module::Build 0.4005 → 0.4007 [Changed / configure requires] - Module::Build 0.4005 → 0.4007 [Changed / develop suggests] - Dist::Zilla::PluginBundle::Author::KENTNL v1.7.4 → v1.8.3 [Removed / runtime requires] - Moo 1.000008 [Removed / test requires] - File::Find 0.2.3 2013-07-14T03:02:16Z [Changed / runtime requires] - Moo 0 → 1.000008 0.2.2 2013-07-07T15:53:07Z 0.2.1 2013-07-07T15:27:19Z 0.2.0 2013-07-07T13:52:33Z [Added / runtime requires] - Moo 0.1.1 2013-07-06T15:36:30Z Path-IsDev-1.001002/misc/Changes.deps0000644000175000017500000000445712373560357015532 0ustar kentkentThis file contains changes in REQUIRED dependencies for standard CPAN phases (configure/build/runtime/test) 1.001002 [Added / test requires] - File::Spec [Changed / configure requires] - ExtUtils::MakeMaker 6.30 → 0 [Removed / test requires] - File::Spec::Functions - List::Util - version 1.001001 2014-07-12T18:23:30Z 1.001000 2014-03-01T13:22:00Z [Added / configure requires] - ExtUtils::MakeMaker 6.30 [Added / runtime requires] - utf8 [Added / test requires] - ExtUtils::MakeMaker - File::Spec::Functions - List::Util - version [Changed / runtime requires] - Path::Tiny 0 → 0.004 - perl 5.006 → 5.008 [Changed / test requires] - Test::More 1.001002 → 0.89 [Removed / build requires] - Module::Build 0.4202 [Removed / configure requires] - Module::Build 0.4202 1.000002 2013-11-22T03:28:04Z 1.000001 2013-11-21T11:49:20Z [Changed / build requires] - Module::Build 0.4007 → 0.4202 [Changed / configure requires] - Module::Build 0.4007 → 0.4202 [Changed / test requires] - Test::More 0.99 → 1.001002 [Removed / test requires] - File::Spec - IO::Handle - IPC::Open3 1.000000 2013-10-18T09:55:20Z [Added / runtime requires] - File::HomeDir [Changed / runtime requires] - perl v5.10.0 → 5.006 [Changed / test requires] - Test::More 0.98 → 0.99 0.6.0 2013-10-05T17:56:06Z [Added / runtime requires] - Role::Tiny - Role::Tiny::With [Removed / runtime requires] - parent 0.5.0 2013-10-05T15:00:12Z 0.4.0 2013-09-27T17:48:00Z 0.3.3 2013-09-26T07:09:14Z [Added / test requires] - File::Spec 0.3.2 2013-09-18T17:45:37Z [Changed / runtime requires] - Class::Tiny 0.005 → 0.010 0.3.1 2013-09-18T02:21:11Z [Changed / runtime requires] - Class::Tiny 0 → 0.005 0.3.0 2013-09-16T08:27:21Z [Added / runtime requires] - Class::Tiny [Added / test requires] - IO::Handle - IPC::Open3 [Changed / build requires] - Module::Build 0.4005 → 0.4007 [Changed / configure requires] - Module::Build 0.4005 → 0.4007 [Removed / runtime requires] - Moo 1.000008 [Removed / test requires] - File::Find 0.2.3 2013-07-14T03:02:16Z [Changed / runtime requires] - Moo 0 → 1.000008 0.2.2 2013-07-07T15:53:07Z 0.2.1 2013-07-07T15:27:19Z 0.2.0 2013-07-07T13:52:33Z [Added / runtime requires] - Moo 0.1.1 2013-07-06T15:36:30Z Path-IsDev-1.001002/misc/Changes.deps.dev0000644000175000017500000001122212373560357016273 0ustar kentkentThis file contains changes to DEVELOPMENT dependencies only ( both REQUIRED and OPTIONAL ) 1.001002 [Added / develop requires] - Dist::Zilla::Plugin::Git::Contributors 0.006 [Changed / develop suggests] - Dist::Zilla::App::Command::bakeini 0.001000 → 0.001001 - Dist::Zilla::PluginBundle::Author::KENTNL 2.016001 → 2.017002 1.001001 2014-07-12T18:23:30Z [Added / develop requires] - Dist::Zilla::Plugin::BumpVersionAfterRelease - Dist::Zilla::Plugin::CopyFilesFromBuild - Dist::Zilla::Plugin::RewriteVersion::Sanitized [Added / develop suggests] - Dist::Zilla::App::Command::bakeini 0.001000 - Dist::Zilla::PluginBundle::Author::KENTNL 2.016001 [Removed / develop requires] - Dist::Zilla::Plugin::Git::NextVersion::Sanitized - Dist::Zilla::Plugin::PkgVersion - Dist::Zilla::PluginBundle::Author::KENTNL 2.012000 [Removed / develop suggests] - Dist::Zilla::PluginBundle::Author::KENTNL::Lite v1.3.0 1.001000 2014-03-01T13:22:00Z [Added / develop requires] - Dist::Zilla::Plugin::Git::NextRelease - Dist::Zilla::Plugin::Git::NextVersion::Sanitized - Dist::Zilla::Plugin::MakeMaker - Dist::Zilla::Plugin::MinimumPerl - Dist::Zilla::Plugin::Prereqs::Recommend::MatchInstalled - Dist::Zilla::Plugin::RunExtraTests - Dist::Zilla::Plugin::Test::ReportPrereqs [Changed / develop requires] - Dist::Zilla::PluginBundle::Author::KENTNL 2.004000 → 2.012000 [Removed / develop requires] - Dist::Zilla::Plugin::Author::KENTNL::MinimumPerl - Dist::Zilla::Plugin::CheckExtraTests - Dist::Zilla::Plugin::Git::NextVersion - Dist::Zilla::Plugin::ModuleBuild - Dist::Zilla::Plugin::NextRelease - Dist::Zilla::Plugin::Prereqs::MatchInstalled - Dist::Zilla::Plugin::PruneCruft - Dist::Zilla::Plugin::ReportVersions::Tiny - version 0.9901 1.000002 2013-11-22T03:28:04Z [Changed / develop requires] - Dist::Zilla::PluginBundle::Author::KENTNL 2.002001 → 2.004000 1.000001 2013-11-21T11:49:20Z [Added / develop requires] - Dist::Zilla::Plugin::Author::KENTNL::MinimumPerl - Dist::Zilla::Plugin::Authority 1.006 - Dist::Zilla::Plugin::AutoPrereqs - Dist::Zilla::Plugin::CheckExtraTests - Dist::Zilla::Plugin::ConfirmRelease - Dist::Zilla::Plugin::EOLTests - Dist::Zilla::Plugin::Git::Check - Dist::Zilla::Plugin::Git::Commit - Dist::Zilla::Plugin::Git::CommitBuild - Dist::Zilla::Plugin::Git::GatherDir - Dist::Zilla::Plugin::Git::NextVersion - Dist::Zilla::Plugin::Git::Tag - Dist::Zilla::Plugin::GithubMeta - Dist::Zilla::Plugin::License - Dist::Zilla::Plugin::Manifest - Dist::Zilla::Plugin::ManifestSkip - Dist::Zilla::Plugin::MetaConfig - Dist::Zilla::Plugin::MetaData::BuiltWith - Dist::Zilla::Plugin::MetaJSON - Dist::Zilla::Plugin::MetaProvides::Package 1.14000001 - Dist::Zilla::Plugin::MetaTests - Dist::Zilla::Plugin::MetaYAML - Dist::Zilla::Plugin::ModuleBuild - Dist::Zilla::Plugin::NextRelease - Dist::Zilla::Plugin::PkgVersion - Dist::Zilla::Plugin::PodCoverageTests - Dist::Zilla::Plugin::PodSyntaxTests - Dist::Zilla::Plugin::PodWeaver - Dist::Zilla::Plugin::Prereqs - Dist::Zilla::Plugin::Prereqs::MatchInstalled - Dist::Zilla::Plugin::PruneCruft - Dist::Zilla::Plugin::ReadmeAnyFromPod - Dist::Zilla::Plugin::ReadmeFromPod - Dist::Zilla::Plugin::ReportVersions::Tiny - Dist::Zilla::Plugin::Test::CPAN::Changes - Dist::Zilla::Plugin::Test::Compile::PerFile - Dist::Zilla::Plugin::Test::Kwalitee - Dist::Zilla::Plugin::Test::MinimumVersion - Dist::Zilla::Plugin::Test::Perl::Critic - Dist::Zilla::Plugin::TestRelease - Dist::Zilla::Plugin::Twitter - Dist::Zilla::Plugin::UploadToCPAN [Changed / develop requires] - Dist::Zilla::PluginBundle::Author::KENTNL 2.000000 → 2.002001 1.000000 2013-10-18T09:55:20Z [Changed / develop requires] - Dist::Zilla::PluginBundle::Author::KENTNL v1.9.0 → 2.000000 - Test::Kwalitee 1.08 → 1.12 0.6.0 2013-10-05T17:56:06Z 0.5.0 2013-10-05T15:00:12Z 0.4.0 2013-09-27T17:48:00Z [Added / develop requires] - Dist::Zilla::PluginBundle::Author::KENTNL v1.9.0 [Added / develop suggests] - Dist::Zilla::PluginBundle::Author::KENTNL::Lite v1.3.0 [Removed / develop recommends] - Dist::Zilla::PluginBundle::Author::KENTNL::Lite v1.3.0 [Removed / develop requires] - Dist::Zilla::PluginBundle::Author::KENTNL::Lite [Removed / develop suggests] - Dist::Zilla::PluginBundle::Author::KENTNL v1.8.3 0.3.3 2013-09-26T07:09:14Z 0.3.2 2013-09-18T17:45:37Z 0.3.1 2013-09-18T02:21:11Z 0.3.0 2013-09-16T08:27:21Z [Added / develop requires] - Test::Kwalitee 1.08 [Changed / develop suggests] - Dist::Zilla::PluginBundle::Author::KENTNL v1.7.4 → v1.8.3 0.2.3 2013-07-14T03:02:16Z 0.2.2 2013-07-07T15:53:07Z 0.2.1 2013-07-07T15:27:19Z 0.2.0 2013-07-07T13:52:33Z 0.1.1 2013-07-06T15:36:30Z Path-IsDev-1.001002/misc/Changes.deps.opt0000644000175000017500000000212312373560357016317 0ustar kentkentThis file contains changes in OPTIONAL dependencies for standard CPAN phases (configure/build/runtime/test) 1.001002 [Changed / test recommends] - CPAN::Meta 0 → 2.120900 [Removed / test recommends] - CPAN::Meta::Requirements 2.120900 1.001001 2014-07-12T18:23:30Z [Changed / configure recommends] - ExtUtils::MakeMaker 6.90 → 6.98 [Changed / test recommends] - ExtUtils::MakeMaker 6.90 → 6.98 - Test::More 1.001002 → 1.001003 1.001000 2014-03-01T13:22:00Z [Added / configure recommends] - ExtUtils::MakeMaker 6.90 [Added / test recommends] - CPAN::Meta - CPAN::Meta::Requirements 2.120900 - ExtUtils::MakeMaker 6.90 - Test::More 1.001002 1.000002 2013-11-22T03:28:04Z 1.000001 2013-11-21T11:49:20Z 1.000000 2013-10-18T09:55:20Z 0.6.0 2013-10-05T17:56:06Z 0.5.0 2013-10-05T15:00:12Z 0.4.0 2013-09-27T17:48:00Z 0.3.3 2013-09-26T07:09:14Z 0.3.2 2013-09-18T17:45:37Z 0.3.1 2013-09-18T02:21:11Z 0.3.0 2013-09-16T08:27:21Z 0.2.3 2013-07-14T03:02:16Z 0.2.2 2013-07-07T15:53:07Z 0.2.1 2013-07-07T15:27:19Z 0.2.0 2013-07-07T13:52:33Z 0.1.1 2013-07-06T15:36:30Z Path-IsDev-1.001002/misc/perlcritic.deps0000644000175000017500000000137112373560357016312 0ustar kentkentPerl::Critic::Policy::Documentation::PodSpelling~0 Perl::Critic::Policy::Lax::RequireExplicitPackage::ExceptForPragmata~0 Perl::Critic::Policy::Variables::ProhibitUnusedVarsStricter~0 Perl::Critic::ProfileCompiler::Bundle::Bangs~0 Perl::Critic::ProfileCompiler::Bundle::Compatibility~0 Perl::Critic::ProfileCompiler::Bundle::Core~0 Perl::Critic::ProfileCompiler::Bundle::Deprecated~0 Perl::Critic::ProfileCompiler::Bundle::Itch~0 Perl::Critic::ProfileCompiler::Bundle::Lax~0 Perl::Critic::ProfileCompiler::Bundle::Moose~0 Perl::Critic::ProfileCompiler::Bundle::More~0 Perl::Critic::ProfileCompiler::Bundle::Pulp~0 Perl::Critic::ProfileCompiler::Bundle::StricterSubs~0 Perl::Critic::ProfileCompiler::Bundle::Swift~0 Perl::Critic::ProfileCompiler::Bundle::Tics~0 Path-IsDev-1.001002/.travis.yml0000644000175000017500000000300312373560357014445 0ustar kentkentlanguage: perl matrix: allow_failures: - perl: "5.8" - env: STERILIZE_ENV=0 RELEASE_TESTING=1 AUTHOR_TESTING=1 - env: STERILIZE_ENV=0 DEVELOPER_DEPS=1 include: - perl: "5.8" env: STERILIZE_ENV=0 - perl: "5.10" env: STERILIZE_ENV=0 - perl: "5.12" env: STERILIZE_ENV=0 - perl: "5.14" env: STERILIZE_ENV=0 - perl: "5.16" env: STERILIZE_ENV=0 - perl: "5.20" env: STERILIZE_ENV=0 - perl: "5.21" env: STERILIZE_ENV=0 - perl: "5.8" env: STERILIZE_ENV=1 - perl: "5.10" env: STERILIZE_ENV=1 - perl: "5.20" env: STERILIZE_ENV=1 - perl: "5.21" env: STERILIZE_ENV=1 - perl: "5.21" env: STERILIZE_ENV=0 DEVELOPER_DEPS=1 - perl: "5.21" env: STERILIZE_ENV=0 RELEASE_TESTING=1 AUTHOR_TESTING=1 - perl: "5.21" env: STERILIZE_ENV=0 COVERAGE_TESTING=1 before_install: - perlbrew list - time git clone --depth 10 https://github.com/kentfredric/travis-scripts.git maint-travis-ci - time git -C ./maint-travis-ci reset --hard master - time perl ./maint-travis-ci/branch_reset.pl - time perl ./maint-travis-ci/sterilize_env.pl install: - time perl ./maint-travis-ci/install_deps_early.pl - time perl ./maint-travis-ci/install_deps.pl before_script: - time perl ./maint-travis-ci/before_script.pl script: - time perl ./maint-travis-ci/script.pl after_failure: - perl ./maint-travis-ci/report_fail_ctx.pl branches: only: - "master" - "build/master" - "releases" Path-IsDev-1.001002/README0000644000175000017500000002203412373560357013221 0ustar kentkentNAME Path::IsDev - Determine if a given Path resembles a development source tree VERSION version 1.001002 SYNOPSIS use Path::IsDev qw(is_dev); if( is_dev('/some/path') ) { ... } else { ... } DESCRIPTION This module is more or less a bunch of heuristics for determining if a given path is a development tree root of some kind. This has many useful applications, notably ones that require behaviours for "installed" modules to be different to those that are still "in development" FUNCTIONS debug Debug callback. To enable debugging: export PATH_ISDEV_DEBUG=1 "is_dev" Using an "import"'ed "is_dev": if( is_dev( $path ) ) { } Though the actual heuristics used will be based on how "import" was called. Additionally, you can call Path::IsDev::is_dev without "import"ing anything, and it will behave exactly the same as if you'd imported it using use Path::IsDev qw( is_dev ); That is, no "set" specification is applicable, so you'll only get the "default". UNDERSTANDING AND DEBUGGING THIS MODULE Understanding how this module works, is critical to understand where you can use it, and the consequences of using it. This module operates on a very simplistic level, and its easy for false-positives to occur. There are two types of Heuristics, Postive/Confirming Heuristics, and Negative/Disconfirming Heuristics. Positive Heuristics and Negative Heuristics are based solely on the presence of specific marker files in a directory, or special marker directories. For instance, the files "META.yml", "Makefile.PL", and "Build.PL" are all Positive Heuristic markers, because their presence often indicates a "root" of a development tree. And for instance, the directories "t/", "xt/" and ".git/" are also Positive Heuristic markers, because these structures are common in "perl" development trees, and uncommon in install trees. However, these markers sometimes go wrong, for instance, consider you have a "local::lib" or "perlbrew" install in $HOME $HOME/ $HOME/lib/ $HOME/perl5/perls/perl-5.19.3/lib/site_perl/ Etc. Under normal circumstances, neither $HOME nor those 3 paths are considered "dev". However, all it takes to cause a false positive, is for somebody to install a "t" or "xt" directory, or a marker file in one of the above directories for "path_isdev($dir)" to return true. This may not be a problem, at least, until you use "Path::FindDev" which combines "Path::IsDev" with recursive up-level traversal. $HOME/ $HOME/lib/ $HOME/perl5/perls/perl-5.19.3/lib/site_perl/ find_dev('$HOME/perl5/perls/perl-5.19.3/lib/site_perl/') # returns false, because it is not inside a dev directory mkdir $HOME/t find_dev('$HOME/perl5/perls/perl-5.19.3/lib/site_perl/') # returns $HOME, because $HOME/t exists. And it is this kind of problem that usually catches people off guard. PATH_ISDEV_DEBUG=1 \ perl -Ilib -MPath::FindDev=find_dev \ -E "say find_dev(q{/home/kent/perl5/perlbrew/perls/perl-5.19.3/lib/site_perl})" ... [Path::IsDev=0] + ::Tool::Dzil => 0 : dist.ini does not exist [Path::IsDev=0] + ::Tool::MakeMaker => 0 : Makefile.PL does not exist [Path::IsDev=0] + ::Tool::ModuleBuild => 0 : Build.PL does not exist [Path::IsDev=0] + ::META => 0 : META.json does not exist [Path::IsDev=0] + ::META => 1 : META.yml exists [Path::IsDev=0] + ::META => 1 : /home/kent/perl5/META.yml is a file [Path::IsDev=0] + ::META matched path /home/kent/perl5 /home/kent/perl5 Whoops!. [Path::IsDev=0] + ::META => 1 : META.yml exists [Path::IsDev=0] + ::META => 1 : /home/kent/perl5/META.yml is a file No wonder! rm /home/kent/perl5/META.yml PATH_ISDEV_DEBUG=1 \ perl -Ilib -MPath::FindDev=find_dev \ -E "say find_dev(q{/home/kent/perl5/perlbrew/perls/perl-5.19.3/lib/site_perl})" ... [Path::IsDev=0] Matching /home/kent/perl5 ... [Path::IsDev=0] + ::TestDir => 0 : xt does not exist [Path::IsDev=0] + ::TestDir => 1 : t exists [Path::IsDev=0] + ::TestDir => 1 : /home/kent/perl5/t is a dir [Path::IsDev=0] + ::TestDir matched path /home/kent/perl5 /home/kent/perl5 Double whoops! [Path::IsDev=0] + ::TestDir => 1 : t exists [Path::IsDev=0] + ::TestDir => 1 : /home/kent/perl5/t is a dir And you could keep doing that until you rule out all the bad heuristics in your tree. Or, you could use a negative heuristic. touch /home/kent/perl5/.path_isdev_ignore PATH_ISDEV_DEBUG=1 \ perl -Ilib -MPath::FindDev=find_dev \ -E "say find_dev(q{/home/kent/perl5/perlbrew/perls/perl-5.19.3/lib/site_perl})" ... [Path::IsDev=0] Matching /home/kent/perl5 [Path::IsDev=0] - ::IsDev::IgnoreFile => 1 : .path_isdev_ignore exists [Path::IsDev=0] - ::IsDev::IgnoreFile => 1 : /home/kent/perl5/.path_isdev_ignore is a file [Path::IsDev=0] - ::IsDev::IgnoreFile excludes path /home/kent/perl5 [Path::IsDev=0] no match found ... [Path::IsDev=0] Matching / ... [Path::IsDev=0] no match found Success! [Path::IsDev=0] - ::IsDev::IgnoreFile => 1 : .path_isdev_ignore exists [Path::IsDev=0] - ::IsDev::IgnoreFile => 1 : /home/kent/perl5/.path_isdev_ignore is a file HEURISTICS Negative Heuristics bundled with this distribution Just remember, a Negative Heuristic excludes the path it is associated with * "IsDev::IgnoreFile" - ".path_isdev_ignore" Positive Heuristics bundled with this distribution * "Changelog" - Files matching "Changes", "Changelog", and similar, case insensitive, extensions optional. * "DevDirMarker" - explicit ".devdir" file to indicate a project root. * "META" - "META.yml"/"META.json" * "MYMETA" - "MYMETA.yml"/"MYMETA.json" * "Makefile" - Any "Makefile" format documented supported by GNU Make * "TestDir" - A directory called either "t/" or "xt/" * "Tool::DZil" - A "dist.ini" file * "Tool::MakeMaker" - A "Makefile.PL" file * "Tool::ModuleBuild" - A "Build.PL" file * "VCS::Git" - A ".git" directory HEURISTIC SETS Heuristic Sets Bundled with this distribution * "Basic" - The basic heuristic set that contains most, if not all heuristics. ADVANCED USAGE Custom Sets "Path::IsDev" has a system of "sets" of Heuristics, in order to allow for pluggable and flexible heuristic types. Though, for the vast majority of cases, this is not required. use Path::IsDev is_dev => { set => 'Basic' }; use Path::IsDev is_dev => { set => 'SomeOtherSet' , -as => 'is_dev_other' }; Overriding the default set If for whatever reason the "Basic" set is insufficient, or if it false positives on your system for some reason, the "default" set can be overridden. export PATH_ISDEV_DEFAULT_SET="SomeOtherSet" ... use Path::IsDev qw( is_dev ); is_dev('/some/path') # uses SomeOtherSet Though this will only take priority in the event the set is not specified during "import" If this poses a security concern for the user, then this security hole can be eliminated by declaring the set you want in code: export PATH_ISDEV_DEFAULT_SET="SomeOtherSet" ... use Path::IsDev is_dev => { set => 'Basic' }; is_dev('/some/path') # uses Basic, regardless of ENV SECURITY Its conceivable, than an evil user could construct an evil set, containing arbitrary and vulnerable code, and possibly stash that evil set in a poorly secured privileged users @INC And if they managed to achieve that, if they could poison the privileged users %ENV, they could trick the privileged user into executing arbitrary code. Though granted, if you can do either of those 2 things, you're probably security vulnerable anyway, and granted, if you could do either of those 2 things you could do much more evil things by the following: export PERL5OPT="-MEvil::Module" So with that in understanding, saying this modules default utility is "insecure" is mostly a bogus argument. And to that effect, this module does nothing to "lock down" that mechanism, and this module encourages you to NOT force a set, unless you NEED to, and strongly suggests that forcing a set for the purpose of security will achieve no real improvement in security, while simultaneously reducing utility. AUTHOR Kent Fredric COPYRIGHT AND LICENSE This software is copyright (c) 2014 by Kent Fredric . This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. Path-IsDev-1.001002/.gitignore0000644000175000017500000000002512373560357014325 0ustar kentkent.build /Path-IsDev-* Path-IsDev-1.001002/layout/0000755000175000017500000000000012373560357013655 5ustar kentkentPath-IsDev-1.001002/layout/self_structure.png0000644000175000017500000042417612373560357017452 0ustar kentkentPNG  IHDR%G`(EIDATxXSWDZv`U@Y$l"l("G֭ZDmQp S(Zd(K{M$ QJQ5}x9W  O3ިղk``aᏛP)aY9mQuWD C;-z >ÞӉ:Gt FӺ*Io||I,m&#SVGG0A0{t+&c} }O5Z=F D sբ5"7@hathr>Ljt(tB&dR!h#s wL]t6 @cъ%J.hF*$14,l$q^ٿdd11`hKoޅ2y6r fڑʧKj)Qqņxl;on;9sxtbC4}r"EvM cLo֍34o\N)ǀ!L)L?H/z  mLj%0G'ܸOAᚓMo|_#JF`ESa`O$0ك]=o}w?N,_#(%:KTV*"1Ȓe3V\:j9mj.Z\YeyO Bv4`9Ģ8@_KCn~7YOQ~֚kn}֛&@)K'$>B[R l;$JgC>D90^(\^Eȡ>?+{?+IaswӞ{iZg6NIXn7/o޾9P^]O6ܜQi_ 5|=6<;"Oocاc\i4>GH UOW:@,w_uWetB>**mŀlZwM[2ELϹnJ̨]X}tKLSMW2ɷsEؓG$ɡ(svV]˷dC8[|UU'$Lq:~ r!譭 >.d'=\k)bd^d% c;↋ 9MwYO#$dddL7*a7ӦLHzƄg˙HGjS|gXwFqzrcٞE!e^l]|Iqr)[z'}#S9.)T5%V^<6kMI&+q#9EsLEi4~ih=6ZZN碿)̦P3}dm(*T*wFsR1tOH!^ Onmx0T>y$:&ëxަ{ ́4(6i{2 nB-նeQiy'̏%c} ֟ fclxߑX?íV=Dw*{r@9(?bnYO`RlC۰h RݚIq«&ZӱA§Yxy@f#=M%4N+n8KÀs*]߅_h%<(`+Tÿr <"s7ë* ЗUC(c®?HIۮ#^27xh~bc7)NW:7/'F4u9˩NWMh{}?;;Ǔ-gW$SPwm{<AIvT?ZM-r[d28; N̘bv(EǝFRsl^zmTmM,Usہe/5r|V)7ADŽQݞ,ۀ/AZ^^a[}g9DwtD;z>DqZR) .??᳍ έ~%5;JbRqx+ EUWl _^}oZ+-1jv" 5ס0 2^w`dl[|lxib#S?I9:>trb-T4ह!o@uj1F{贗^-sUJQ˕fR* F$Uӏ3Jcf6u*a6#%(+o*zIWځ̪lnFGgV]9ʷ7{ Zth1Gdž6tJHtL)QRx9xQitl-ooPDz -wWle.}G/ّ3̙ݣ$Y99ŷ5<hx4<up<DXf''ukC5|XZ^l>Zif7X!bUeg+F|g0y|z$avZ;:bzr˂g9w]f;uD+-iew>r13sJms"Noxo2DrQk~#"R R1JJ|3FDՈEgq<UFc[lt om|r7€C@{ :n@"; Mբ*A*DDŽNx׌Bƫmbopw/}#!UKةJ_.x^~'G|+g\ߕl]48Gݽ 7YH_oyXM w_$ڽ$)hU@tf4v= /|F޺59NbSI)4EE YTl3Z 괕p.($ԗG &$df>l4RdM`eG9-VVדfz,,IxQ EAᷜk`1 7!6 :=%6yx_\`[y٭_0f|w/8n`F>Yy[ʪ"#,t ,?O?ذߟ6wWwV/KuiΙDH`WΩύwv =]"E>?X?S늑7$5.aIehXќw @nj'C]t#8"{\=?VSzi(AҍS9&b.߰p 1 rkf>J߁kRx*8K0X36>s};y#{:XS7)0dT˲utW 'y-ֵmD? l/YۺquH2" .K J.ot r{I~iNC?,o^3lvjY{Z`lJUo{hG%zLUUCj[yݛQQ[m| N= o=F5f9+>w! c0 y!$v=JjG<{2`77 o o}{ * 8=mKi8ɪ]Ӊ j,SbEhN 1p76`ҤNcMhDfe3c8:D}.|s7@o7@otzz_6Tu;7M0{2̆n9ےnjp٭mu;Rmb=26o,RvH==j5j+B+gqK_ k"ELqYWʊ{`L¯u7dŶB@շ5#1 js̜6}%znxHP[S~)׍G7nVO9_SHɮF1FLnzTgvgLDh>jϡ?%+;(Tpx"r܌o--#s{3&|$য়~O;]׭UqkM0,I(;^8.Xˀì [ZPw3$߿oEE7*=U9M-'U+tݽ]Z(Ϝ 4c{&:ﱳ*)plΚA/+2 _GzVKn[kb j}clILA=L ,&4>γMU]3 e%$6YASh+]?WR4 K/!P9nT(z;e4 jf}E5M=)f QLs SmdT'+J(6_4n]5ƑT 9JT5Ie";jiMYq0Wv*n`]?_TqTwޕ;F 5Uے`>ݧ`'kOGZٹnOJ OKi{UgGִ3Yeqs̢XFp G$78NHcnA#尮ôKk[;3kN?NqpWNćVG)˔jm8fKzG?jEk+ز:N8R˵ץ?C2cl6apGs Wxb+o״%ZtM2좉YPa ⭼`s_egm, \a1%ky;MyCFWI-Sܭɭ} onP~ 殾5w fƂࣷ8 @7~5=}[k-;:k;>lV$U<8e'O/^u1 5SNoشd' #Hw #(avFZVEUfz`-9olG jWeN)CMrGOv [DR;l]CL . ն|[ɋZ ~ nyWvaU6>&LvQL-ѐ⨷6{sDսs2Z&mYR5#d N}!' :8x誳$FT\55 |%)8|-\75n7u9=wm6N Ξg,꺅G+ύmメl<%n%9"u8]0wݹ 1'\ Ci3ôت"JR1T0{y²'F"+ģ,Y|G fg./9ȈN[ViNI̥ΨFPCl8i\XϽ؅TcmՅT\r|,ZhLFjYH 7=EJ\c/͟AB1ApWުe,9VA#`70dK\ '!Aa}!y> NRNKF7#|#6[n Jf^i9޽w1RBE"+q bc/,˄'>@?~jvބ@ˣMϽmB?lyo H- GW@o!Gr SL;c S4/Nޕy .(_>:q&i j1Zx9A9 /27y-J:>],.PRw|tm*מOݞ=|b6 1J\Ogc9p !#N ƻ }[ 7 )&\|J)75g ,I댯\RXY3v#8ʒBυr;jJv~MjhR؇F)%Y,ea (x PSA'-jTD :ae*,,{?6〨a~zV3-#D܈e!ߒ!:Fz=Bfy=DHhCD̸!#hO%7EX.)BĤ,q:B :h5^yXuK@oVia!M̔wAb!"W&i.oz+H/U{b^qUl!{7Fۣ%B&S1ZD?q 0"D,C]#DG)BjOMcrhuHOwgܟ̎k!ч+VL{cVȘ++ w_vl=]\,w9̅qޟ(Vuևy k8":pp֣k휒 ϧKG+Lcݭ)B_1WDlf]pľCrTOQwflS{ԵK)˶eeDNS^1![=pJOpzZԴ!G?,1hInꍆ )nW`W.ȼ&7! f"61["Bv><3*xXJ1%Lco(2s_`j1aŷ{ē}. d*?H񖱞K>\ {M5o$7#!9_,ް(LDߞaZ`ȐՅ|as+6NqƅGn:{(ùȘUcmdC{qнč\G:PeReG&s8}wyCSXǓƏ>\>uņQFz%.,Bz-")!D"=ƫ[$RRX *BnKevKXU.7c!h6-#D@oEuRԅuӽ1BSUq]Bݨ2RǬ] WQ9k+3vz&^\&Fo|*'r/$3j#L!gِ"U[X#)cKs&Y?u]W]Vwf vfHO=u5u=bBHS|)\y`"Zǣ߂䌯_L.kkQՏ#f11"،1z:;K-vU ύP+zFص+yn\ȟ@F[?\ۧӸ8]KkND%)<8 6} i­=('yoFL꭯zIMR!dC!mT2f"7wիwO=hR#fxZ-'߈ Wub.:Eod[~5:T7o{Zeh1y`I_^DSێzFR=5[H{SwyX<p&[-Jq fwcJSs:X/5*1c:D0)ZA:^+N^iVd:j2[|с$1 h6\Ma&+˰l&2߱mB捐#OEj&%æOSdSyI#1{#hBKȄg̤]>{s7^OEq6t4c'bSמ873hWz)o<J{Ȋrtώu+4yQ8+tjcMVPcJįtfQ--Qq9eJAZ[䣫o2K$|zuKL1}zEwoX: ٣ Əg|/bY"&x)Kvkn5Pm^{{îZ]CrOnj)/!R?9U5cZTLtm2_\[-rPzGva8` M 2ÜΔRQ٭P>㼭tgu|{=4aOmM}lmq|v-,fߜQsN!/)Zy4^灐sh#|zPIStdE⿿ z2B3ɓѥb!OR'S'!e& {HCH?ߤOV?.z)B/9+P!sG 4Bv.r#H O[ro<7"^C7Z&BZՌ|PR^Zz, k2z1YDbJ!9nPٵG[`/fʑ3ɶ&3 hh–y;U4zTZ9XEI$dKJ8o组N1_ޝ(mqܷkS*ťɠϞVb """RP@=۸P 2" """"jZiMzaT0luȀҒByGRUfx:7#wyZ. :7<78IA$U׌7TIS^[Y]?e5\AA>::vWگ]g-KVcsh{˚F7dge\&6Lm ~.3S\-0/0a 99v DDDDDmYP'LIޡqb= 7ڶge0U.1;4i먩9H`Pv씸їq:^_vHSXߔtƕ|T mû|ٷ=6J*" """W^ MKwX6E4oYc+a7s^+{/˜5zf t4ܽC[V%LO:|7'/F.ڳf'=ur1o (#d$_9oC;#>ZtyiJOkq!8HGE,T9*O^(_ Q@|쎓!QymD4,ِX5p+? P__R}e*3F7VW+-8~ 7 zZN.>G|t7 2.%>˾+B`w=PA;SSqNm Qn Q+Pxq4u.&V b ""wJU?%QaY|`s8 _AAV* hB Gvxnw7_cԘluYz/w9a+qFS" """zjrz(:%h3?&I̺wKG h/Xc<:+W8MP34w!1o Dyi%~tv7c֥&Ҥ1ٻ8?l3],ȵ2]ʑN"1D RA!J!\0n$G$DD<]O߾3k-oQFУ'D3yԺ "wS2ڬz/uk=n,0zQ1u'ݢ5i:oQP[S}/"Fb`6h̖ t8!zoAmDԇ1fOឣ%^ """\AVS1(: VhG5 t9 }硽^_j -8.1 """5 ކIJzI E Ve&31*dc1b ] 51 """5n̉:kuƒpJ X݀f J"ٸX5(/\];ÈgwHbbADDDR<sT1MU,z\C a:Z2nlAO~is,x+P"DDD~-8b4/}1f*rTuU@ZH:!>5>8V!t.-^>BY*1 ""Xcj1R(B@R!(?2ս?{T^~lSbu"2N8EYLJs C0 x۰Ȝ0>:щ+[N돹qQq,Gթ>)!@;8Aa/{}]и"ŁD/nj2tp1 ""aRH_, uNy~]W7k2HZw[0i,N;Zv=q7¦]UMh׼~ǘt3Zx9#|&zUz8}zzovߩ}XA-tn[ sfQZ%⟼u??~1CbADDULa'[N<\h e̓6]Yz_bd1EydŵK,Ǯw>JY=I◚*:=Abjo1hk|Q!k֔bQo˨M;;;Rw-Zlc2a{:}tL۾na϶Znrpaێg*G:j`ױC~}ߒ{E* 1Vtɾ(hbY1LC <eF s6y>J_eJ Qzqeq9ko޽C۪ڒͩ!Ym**"R)-B:lk˦ZQ ijK9!E403wH]kՖv1z&}B!2 hIW~א' ʻ0{7Y]e0*!4Tk9>=bB ޔwbplWK}k $.{AMP&&0RlTaۮ,kz.vzoUu=1!РS[y͞_J&P4R p c aU] .?]3d|UIc3D*9o BeBC:fx- p4n\_]N{j07HBG`$H* B]b3fuHTCF;AZr . B"H247@5 `1ockH!лA_Bat#=&\."Lqv1U.,k u YO Rr c䗅e+J({aWPc-e rHLe Ip[Tj*Hrȧ;suNnͼ<ۅטh-Hãm_PD=l'%.3)`֪_WL(L=L3>(,v<_C66bBU6դc0 . {"a̠k0v3q3A=9{šPJ~p1 ,@Zn3ɫ12S,Z n茞Mc. b6o0}Eg ̼`לf;I{oA v'`Ƃ<f-ee~{G@)J0 Bl>?]yUlYV{M1~3k+KvՙA FbDO|$y|}Ll=񆕢U]h6EaOvvbgZ/JMYrclfClɡП`[Di: xs4 y~i[CiѲe!_HHM`mpc=go!S,aGQiߟNx&4Zon:YÁx)RNC}9 2l02,$/i=I2{5WՄB!4Xz}B+Uh4 7 bew.7^ˠohN`6SYo:}ѭmV*-KS-77ҭ4b^\wo!1;޸l'r9JAbԕ#nϧkXY $x gk,d32f>r5@nM\3-zgiV|جcQel2O(:x)b} x^t=k-O1ҳ{ƨBtV1vV!лW}V+(^;{dU z0Geao$8Tn?ias:TVi]ynIYR96VMXy;]T;"#GmzVP&kEc wPR[1=[!kUOB}Pc0-> &:ћg3 wo xb`tT~j+ B!6[ʈ v1{[-(5>fLO_QsG+y 0?mlH?{ {1!k]$پqxg{L) yWBS }Fs#A0ա' ym,` )|?Og>:䭫wE5cB o[l$`<6s<} Pl;8<&@Qt#|: ]Ur;>7C."e0@!R SWBXTP;FW7 "|V8t!DЛZ7 B_hMI;]ܮ>m^{ N3 v,jTzPvhPs9;#}t.z3p$q@u>لG.ӝyf?;uC PsEЛM]X_x!<=y>ז1H;gYa{Q (ޓׂB_^2+^n5?/DұݐJھuGo0c&\~ m`$7-$&Qk C;!C97 t [L%Hi:g9tc)+8{"| cb6-NЀ򯝋 Ygl$טݱ#?@X?>H2?GX95K݌du?D=Cb%x 8>f _U_휇B{\Y޵ۺ,BSӅr[lHHlKr)/Irm]E][." Eb7!654.4ʹbw}&g>>I989R;W/KjB"TJuӍiG?%cE^Sa֭3?,^6>f9ȃmm)$%)̱sc1+=Ԣ1K )B!vnV%"RRZ窻~A؃dR]f=׏z;N GET OUctBk_?PQK_ R;ΫΗQRAj >sR=Lc-2 wcU aGh d7o-J}j;܊!!8f 0?9I!nM^[AP:g5$No 7Bo}W:%w|bރ'X;" 4]*:!0,!u' N1FcLu@58cmJx e"7BeYz3FWn>|$ ~. mwZ&%M$ -w fh7"@HGnڃti.)qUB+9 |yPi@.!%ʿz௉P&f=bb;E5TKD7ZWNuL&CWsB$oLxqMy >%+ ?u3A""lZ2;=YW!AeKHj/Nlu@0`Xc%Q 2_}G@ƍteqNs.skeD@ F^)|YeC?EJ၌}dZ ƒv7{)Q@aEx ~ݒVԎ'-I᫜('& .'Kj*c UHǭ >%索'pJXc=vAHq j\9Y0@!578Ѷc c}-E?1Juˍ9b+eD~vD5 7 ⸢]ζ2 y) PKSDE̾ ͪKa38ٻu +7 - J3-EDOBXYYf/hGZtm>P(p^͕95NVj , 8ͮUxw kpțގ:h4Vg$fFlGZu{ KK")|U3\ث'd\,yᗯtק ^pJUsQnr7[d.C(jr?7}v wّk=TiR#W`ڣ[& +JjEQp-Y_E8xV_ Byaߏnhh4rⲰ"^ީMSC}6=.b]3T>Q2>w"93!"RMc0u1}QU%'ސy|dB Q-LٛN4LޑY&K9:e) ݽOՎ[q !l]ۘE6y0pw)i⛦j2ꢿԴh |sM`x ̖ߨj(ߐO8[J1ʙ&v [n(iێ5ҢqvVϷYxo 6?{"L4 Zk.hC٠oGD{f![Y#aB<%hfz-NUa&Cذ%.0NQo\3j+B*np?+húi`.fuz赧nʽDQg)NKU}ӅҪYT^rEmw./ɓQ9غ.C=cj(I)kyW[\]rβZ ?LVexe#r)N M_`0+; ʿ|\qk(ܦT4 JU.'.1X,% Pޥe7P~9R.a0PUr5ԋ(:u!LP/ Bq/lM2}9g԰ԟmi3kuZ02l#??p+J3ѵ!X6i2;CFgƖқ[Փ*gCQ[Mm>OT*NlfhǠ,!<>@=cnC?zLJ`kHHgWT=n^ݹy0h|Bv=.5AmG6zv64+Ex!1@Oݓ%".oWlp;:A>{3DLx!͸kK?id`5Gn_HuwCe><3Tae Go p+A`M)I R%!ƀ5S5!Vof,+ UQ ILc&w89P ;A@禖r! izrqq:=9#ɻ0ld͜$lq7'd HvfiE+BjU?0;\o|RUYB(!aB E(HCG2 BuܐX粁qΜ,ޙE]a|ʆ;05RLDa=@EMW!dE2M@4DUB " P@R@AE@`z{rma9o\Ff~מ{3}8ePȍN."s=)04I~^oOO Ɣ'L 97W2Ϯ294Pk!).3Bo^KkhL /R=/,fvXDEz!:Pe7h[`sn6\`-avElowϡ KjM~}2ɴ#%8Ռ5? K=CQA,K.ڒR]P?4 B7! Eh  CUCM#жj Wsx >l·`0eWh;~U/DN7!aC?l@x0N96JR#;] SONy B!fؘȰAzVLӂZ@ix1-m_ׅ]1CntO9x\+hjjİ`E11 B!4lZPeĨ B92.0z*:Б=LUE6 B!4lJ8?\`?vsC J0W Z 9Gmzc zB°ݡ DEr$Z (}ƍr(}@*kq{@jƮ +!Bh `kP*/+]d9"2Q "䞠t0wb͟vZػ8SMee65Wh4( X J " I(WX K$*(("*"*\ h ,c55j 0+.+3yt+(l`' RK)sug>EPAd/MXEHl$iȣ.tH} GӲq߉l_osNeY>V 40fk 7t4ۆ R w<$tYq q.Aϡn<ߡ9ADDD,lV3~Xw cmN{#{ ;oZ3^}'=밙 j սq0NhcS%7!_qQFQYI-(o 9WmSqDDDѣtqCڭcw#wޛXngNN~} "9^{=#^=4yӹ>|"5+/oh1p{o9f=0ޔ`N~n9ȫLW[̾>eGQsB1o D8שnD up=XӘKXL,zkMʋf!)RW;oz6~$ fh\qz0BGX \4|~Jɯk=aA޸x%K.X$X<$#){TW-$Ċ=A_X==JE b ""6(72v3Tf.)J&7Y^ߔ$q^lI$~ یYĸ?ڬy㌗͢6VR}u3r$/S=}3MYdo;mpuMtlny.;.ao2o7i;l;ftjdncF,2xjLޯQOr@N9h@ˏ*gyz!n3gԁV٣X;xr DDDJg-s6 viM[ZήŲFR!*41C< Uu$Mg<|ܺO,W4&YXFxTT7H=#6زAj22sB c80 g M?& P|{JXjGZ|4D}M'90yX QzX@:4?g8} CcOjlǬ@@J *mh憪W "8PӃvG*7 D*qVSʒPP&{]>+lj_}qx~;j=yacU] UiФ m #ІZ*Zș69bϡ.9-%(bc7 \Fn5*GW҅6î*7;0jys*niN <7; xtikRqChQA@ VeTEZZתm -kE (*vL$\D c8y% 9{~ C(#y]o߯袭P17Tw4濉6f:;(*Xp;ޕ_j|:)ߓ@ox%n_'6{==Z9zitjR씀BS>p\QF6w_)k.Zg,*SoET#ikireI=O^s2i2ߐ\Aֻ6WRqgĔ_r= M^[ĨeSMk[V9]jD_Ufn5 >n%j.epY8enEty0r]Xrw}gUT_+SXE\u7[үHp3uxIBs2]\T|f{;տbh^4.^>R^2zuFmHHce-+J t#6oj@Aʿ ]Cfu Acިa8n*a S-P"w755Ԩ_Ygj$#~^TC*}2᯦&ޗE4iC/ eO_ TqG")hΐd,{zkkޘcIZ}>{]>買Uz#-ya'!0eGnH.W@<$FfP.+IK+ۛ)n%׫I|򩚍2nm0^*ZPSf-5[Ovg0zri^jwaz#'9NYՖ5.z@ Ta >ѳ_8pRxP*L)]eD ߲$Gbo(+ 6[&zhqTelL$R_0g_&X[yE=R8 i9.!Z"7P荏mX7R: $3-Co@=0lF*tÊIhKdKǦ^{rJN`b;Ke @nrhX+_Pz *}@;AS>=[Kfy/'.'Q@F\-)K_76xjC,/ Qi/j?)T[wOٺR ;n(RY*e#4IwQd#>Nl@o@%5 do[`ơ/!Ф,DJ[{tvE$(99<Bo2ʬ_3vk[E`S#Vgoa% g?P#@)i|nEV>FeLQ'"Hڸ{:IWMCd!VV.mظ=@mvF߂qk (ރ _K䟎Ri9*Ө=bl`9 (+mc?Ә:Ck[Z܁-2i :E'Es0ʚp``<32w5qNjB%J #%D62-d%l1kkm.H.e\hK)rgږ6&mshZvu. ;]YU]aOk7.T05rryޠsKI (rh'ω57  44FgL6\5o3:zz% }#GO q†&uݾ|&n=k&5DzJ'CK]W0yXp5Z*csKY!?[ii =,Nm{ K7) XaW:sU~e(pC͏ o3.KD6@UKcU86d(ځ3$hy԰ 2l")tL=!#RV" p^6V,lҰiÆ5h{gu6"6j @ѡ M.XѳQꀰQp''qŨeßܼhM C58@,lⰡj Z?5Z?O%75m1tjpIG-.l\`FהSĎEr)IUyj􎣾 p*?ƫg0lmӰ?N?#vVK[7U7Py- o6Yaޔ|XǪAYζUgfO .ikyCq0ccUY'-8/ ']X̅8o1ArdJ. "ADԛ3?!"dHI. ʹB I;.D7^"C\)1?&$ISW{~xbapW5~8o8j+'=($L褅/ SGȖO~g\P[Dy_ l:%)WNj,+}YpkҺ\ު1koq "b`THQF ~{e|=OH,ӆģ1Vq "b`Tp? *Jnq]_vVѫ6VۼI~lv^HxS0wv 5г3CV_kha7^(ޠ!!^ CmYsX-! ˚aÐ9$EB)Q93l6Ng{vنn?R?}?u]?Pono_jӑZ5ծ1ߥ},bDXG WR85^a:vkksǶ_()({4z@6U]iQC]&ܵaV_~5/f{4x /ܵt<j1Ò󑎧hnHZq/&=DB@48@;؀%ݩ Gzk3wBDȐ+ƽ*-|JW@XlEd|ikSt >Wj\*ٝA48@ lUV :+X /+c>C;i [࿢w,_Ss@Ⱥn;*B.nRG5PhvO(+$ l6ĩ/u4=Ї~&}W%*0VLhE% 2ۤMe“[_CΤ.hDxf`vzV޹|8}Uz@\AE2C7 7]==r0nQQG4bדgPo@loK(Ooe?4_[4O*FvU>Luգf*Dohpz@UX})¡Q-Fj:&9  .@->; X}񛄈nx77nW4kPo@+A؀*ˊt2Vuz|֡\ /+qI4DКG؀>TbaӜuU>GUv.Dm:P9}!J,!6AF%zLS6nOLp*-x\m:W?;v+WmoRrJ G;j\42&Y~'!I!R,{I9o{{>$қǵ:63S|ʲB_͏붭p cb@o CF8BAD7=1X=$yjg뿷} MӁ iJR5ط$bADe<8Ar:u%&yapR,ScC0(uUЍAExXq[ ""lө}|'G%yAF}d"d48`AD=9AJX/mH/#ϣ}'"Dā WRx8Q%.1CgPX3 C& 컡]uADz;8A+ZcOd~nSPc,p3|a0= tN\W ""Dā WH+ {bE)$j`ā2$N!Dz$@:26HrXפmiw C&480a48 "otlp3& 5fY4=:#K;>Pф#Xo6}N=zx_X l]/,*cq`5OQqV-"f7fdM]f e48 "l);XtjХܰY|^'S4,~mX3|Q0/ "Dā 7-ȿrbiˇ?wHUހg7"~gXo "CwxU-DŁ _nFo~Й LS\}F 69'jXA^;Z 6 7[zNw_~^[g|]\O?V2y1yqc ˁ=쬆,\bq蒩v)5ڛq3lGYR(P78;!s}O3b "lv#){/iElQ ie4!-n[v4oK۴yIrbt嚫rܟq!dciqJMAٍbb\ Q9fV2}֦3~a/7#Ƹ]չB "bAD@lll\<*W]^::څ{ vg=ilҸ_%KG2_VQ*8i[I3%PO_;eݑ53779g7Ǎwۼi⎊s8&Ƴ=@z?먦jX/eɕ킈Xo$Nz6  U"t4bjPsS B(ute 5d46Q6|8w;diw'if7oo|yf&V}'(6ca3Ҥ{X~nr ױ5 ʢt,emo!lxư4i-@w$U^_yw*?'*3A BK+'x,3^9UxLr |H؎rAfx{?3vGYZ:~݌b >KǵGZstݿ~Dl7w=F HoDA}_ۇw:r_Ш`!~X"#wݿ8TGg7/9d?JhSq|"/d:ЉodWR cïA"^?.=YBЦYV~ F;A.7KGynCݱݽUdTtvΛ[8l]K\))&AWñr6΁&2XY6HF'PM!xhptE`lIĨ!eGB+~} Xd߱!CEraW\}OoE-6!Mjz9q4H7|12bp;ӌT-[ʈa3g9嚯)?7ɪ橧7^w_61`pK@o>ǰ` bQ@ `*lK7agvh 8p0H0 >}u H Ŀ|h [H]5Ʉ 4 ?kl`H  5r+Pz䪰 ZCK($A_3Ғiް]eh 6|z? .XY~RԒ=6#Om <7>2cݙ+դ&FG_ f#?ElM k$&([BcwKy-hlrHAnDaw]eS`R/o >)iiKE5{ٮLE"h ]CX1{tB[.BP+-߹ĘYmhߙ;X)4>|܇\e}Y7]j؁E= ^`8ao7IFZ`hLGjV[[xfF cr>}Cˊ0_hQ\y|7h Nߥ<6WQxfA% dA4k'|Vuxë#}GHVm2| B8 V!CH7dz"Xw * ]PōUY=ȎT@P%?&9 JDz CЄ vulwEd'3=a?hpطB =z KX,dWAnm[ާ!?oLo#>J$|$gN;-<hݱܜ9b*/Fb{)EOɾ1J}߼t3SW3sˬ8k^fw%K~7# -ڇ'2Rn!Ő5Doua]]TݐG%~/.C-ZtdZ9>?VLYҡ=:+3 )7IoA h4Mugg!0Z? )gEv48\t0GA`wT*&mӘm΁e(q;ZAx zQBGmuTDvѨm,ncߎ}u%tҁ;c?1oFoi5 -הip;%풱/Qp|LR;0Ft_.R ^Li!B7=nfW0*XZfE}uAR`d(ApZ0cQ?XF ]-Uh P^tAEa4J†]4a8M<Y(C4/`Bs0CZ@04|PCO^|7bQY_uzwu| ,4uz}e*,f4;=-01K#гFo*_m}T!J<0wx=nA Zu'-՗eM,sN]Q 8|ĸ۩-#H9J-f=+ utrrGGꮢ>Lz+^rlЎC*l4Ls*_r˅3 "S'}!.nyvUYQi97^`) 8 @ؘ}|`h4&Ic_:ajԳ`P H=rI` S1{q.JE A$b[ Î={\JkGY-x ZuO\])*[QʼDo$5,&#,2p"? &Sך敗:a~¡U~AMSLE>b! >E~+_SqI*M98Ӷ:+B&^zHþqv9zCK$o;w?A lO oiHx3 "1:%`(jz48 0}of0M`A!8Ȍk'a%,:;_=3=/mV  kAUk=;q1bJڛeƬ;ݳ#N$/~Z03/e2ѳcK~'=]=ٷ{Vw 7ul܀1^ +)M: /VcXdxfd6-h(?HiI®ǂ/3.M3 AHg)@yq (AR?0vA3`^Ga2F;NVo}c> e^cXc<:8;;;dud5&j@(jbDEc,c{È,`A15`C `WPiTDET,(@P *r7y(y~s}q{#m-*!YxjCĚfdfΣP<3? A*2b 1lU;1D=~ Z6ktr/4?W0^d = 4;7."]k`oi9 _WOte"B8C~#S TaQ Te# :v7yɄtc%* NF$ DPE/p6<R,9y)?Zy`ҢVl"+xOزUm > b_Q br6|DL֛a !.J9CZ96z@ER#z$Vlv*dmLA(G's<+MgRp9g~F,iu ?p37˫|x?ѿYPR.%=}F A PL(08 Ek((Cۮ](}}]e2J3u(2,VLplSB"肟mf=Τ~,tnۢ|pl]-ݶFv93xéJUQ[DcՒA-ȎY 6+G "x*SEkzq4xR|ީH ZjPNGNq ٛGw;g˂\5j~tQP GCY+Y~K'aDF1-w*d[LX 'p9*2Y' 9JU-sJx0S>,7AЕa,1lV*Ή_Cшc:SzԺtꐢ5L1+r48 |u`<SdcIL0}k07܆ѹct9rQ:nH V,nEDoP i(dzե)}ͥ," >M#wopJ[ .pblTJƒ[m'<xK}rQ>3n^Aݽ@8{)7ɴ{|/sHdҢQg3BLsi\, ?Cz$^֓x9g} Atop' A_P6<# / IBY-'QmE\hGQ _-2Й0`z8~"4{QNs{MՎ)0cW 'sLWDFk!&3cʹj9f! P= qQL%V˂ A v+1lP ^$`{RX Bp#(EAhN ʄɑqK^Mc U!mͦ>s8o}gkfdiN+cH#ť@\䮟)gm$ @"ꧬ&ƣ2Iq1EDoP6=f߆d! Ҥ;(AuQ@RhpʐAE8eV*V߿|%&O6Bl̓Ĝ3u:Yj{X9d&sf7+4ll 3Ջ5XNzYFy| 6v{Xs0+@/ơ^1:!zD~1EC;~ hҍ"%C7DFA,H`Onu%p9/,H[o=<^hGC[{k~W[PO_S=ظ1;e ͡=xGQy;bѩ%NgQ\A AS=3bNNIOFS*Sm*R; !z*PYI0g3U qL =SPUMCA7~xpN~˓+ﰔǦ2.XxJƳoNN Ct ;8w~y"|o6|!W̧EԝkJʷ뎝rOXV{wx&Xt,Dby|9T*JZc-  ,O&Az %/5ɰAި ~AűZ# ̽l- ]JnGCw&kCheQ)|z3_nx u:Ͱ'z%*rֆ!6*pXeېQz}lGGM^ή-dikz:?^>X}ex| {gglpVRV&šd?#S<\j8U[&O(Fmr*oΥS*3Az 2l/a!4lߜ[wޔgܳF+qE u] ZϴD7 \}>"EqMQ8ΌmLk&%؃%lH>tEF5>һ}$l;N0!Bup/nR|jh\~mL%WPqa{?ɳٚ<>5Hoh{tEP˕0@)tIjA~_ 40 / ȰAM±̜{/cHo8^#ꧪKt0u_]~1$nyN{o4B-<fn3P?6%\xT{ѓmpΜeq8aֻ6mǚ^)V6-䧉U1/՞1F>M Ve DJ$kLVfh/|/aw?c?|NL4ae+\4%77բ[P`,0۽-2Az a(#!+kpGgυ Ԝ4_.>;`S(#$~!sXꚙ /%v+/ ewFQIJCyL@+NhvxG,><2ZBv|=?Zؐݧ_fn[C_uvY^m^wG=}rA}u?鳼YUכ{ Ĉ{7-jN^ A w'@Qaqԙ@;+L2-IM3#P#%#BA <0Q@ CP\@CqED<@ٙ& v?}~8 :.~1A7H ̷) A͈!сsH+"DU;IFtqu0A2W0uޘN>M(q-Xodzg/$Yim: M.\?T I]-rND7 22OV܇  nw7bZ.R "j@`w%`*eNkI@"clj,?3uo`-%GȢ (? "zFoؠF;>Z$;iH;JIjי_8U&Nz r HZCrN8nbg('erO@O$Ea?Y "$B=&P\.mmڿ-H 2f%slb`a,&F, @b}x"X#iKYP 1Q{gJO@x7K5+CF6(+MfvXoSw̓ kV%pTku1;M<[Xal_7e@UE]غ]d*qHhXӈ*ƻŹ bAdTimX6}JK~,vW|?[*)ZdjkVNPl/;V9 EJu\p.- 8&x"DFt`'V~W; Ryabm:!#Zp[6u!!dqsz?dh|uܬR=NP "DF ldD#a>K%PL_7K# iIOdش) %i3B?8:}bnx+t(bU AzHƍ lCE2voA`CciXY~˷G }2բɪ5%˧ù(jՕ|+:<;\4套0yq^ bA$B lCo9@p||=<'u}h8q+KtK6B/ W|h昵 BA^N7;DB.P"6Bt "D6 Q gFyD>WbtR>8(xR 8@lU b/sP{`<&%:2:9Sa^Bx=oiJ<;4 "D2pY6=:kݜf:ݪekVrrsZμ-kk2o/e[,M7ujJH@1 B  V(>8;-psW6Asy݁آJrNOI g #ae Ԛ2$0Io ^έYf`-˦5vޘp5M[Ex47- ^W @}9@ʮ!!D@6qWE-"Wk&Q`sc fo`b3z*lN3 5§{pZ*qrJ}6BHox l8P0r33m$Ǯ&9\Ee߄DIsO7onj0vC^!5yiʆBzC l|2Y  lPu3q jewh.ԗ6,{4RDuPYP=$CA 꽐PcI?NgamlXAC!D 9g .Pr4yWL7]8J+QӲDA(-I{1`OߑPs&r;cy$Sh6յ׺Ĝ86=}YFٰbSc 6RfZn Ը(> 5S04*\t1Np5 lH_UNBg80Opn:tcvƒYg\qT`Ch>fnvY4~:?t$ <Oy^Ӂ1s& (ܿ&)F3UW,^sGʜ&9#*z&Ko8/Ԙx7;og0OYSw~TJUDU3~q",qC_et_O]M_ fK\W7hD`+ lԸ*7 0 Hn%29#gH*l,(Vef$e13z*jlŭAJ&{{oϻ,!m؆%D"<C[fwJEw$~nLDو;67mxFIQ"$ц/I,edT"HYJѪny\w>Kt{{r0BmIJKc$=VIm_RI-:h;t}EM^|DwM ˿Ά 1l Z1kkf0ǍY?%J -^k=67}TPor'iV8'8Ff{9JfA֢7vs FBcQ(k3<8]ưze~ ixuх̗-oI4Pi!a\=ZuAkǜޕz}@SBVZ$ixg2̤:uֹ]uR 7Io6/A'>$IFx3Xc+Rjxj H}}B 5T7 !ZW`O=9:..o曑`$#?HVؔsKN>eo@o5 -|C_Mk+PC᤽}$=\VRTjډןju QX^9[YVRM`FiorF)yudTݓ9QN6LSqmyh^7Q O>;GOO;[^~֎aMz ȰADZ; P[8י2gi(Gn !SOj+zyVȅ CxX>U$xBz#. s. lq 5Ty?c 9#F䤆_<9cջE';?lsi:hJ\2z[BQu35G`EzgԈm+OF QWNX:oT'17mت|*#6*/dwk2B_55ٟPQOUs7E縢n攕{xWPabQu7OUeqCp X= \E{>8޳LUeoS&dSZV OysO.}c /glhasM rWJ2࡭hojq\K I\sU(p;^4g^|!b_DO*-$﹃("t-bW #[z̳8Fޗ1SmE\yg%/-&WC3՟$ INp:@7#9솴k?)c蜿OZi~زdM|S+|z!*[zՏzשwI'GTRf㝬jw QhN!(7>#hwWL-+nr"j6K;{hfǶb:n Y<-/?R1,Ť7yx E aGVL -M!9JP P71C1Ja׉Qg`bL 2W P0_}Z@;Nb;>OVB~H?9k|_PKi+r#}(ycڿqL׳˲8(:}+@LUV~`Y'/" 8A4ac.6@T|#oVSH~Μ{(,O^oD}`OQo ViQzz~8 B1BZڃQ񫓫\9LkW[ә=4Gj({ǡ> Ѻ)`^> (7lXa hP{x%=c[xZaƼB;2T- ٕLPܻħۖ 9Lf"SI_ԏd8Y(xC,XEB*:6" Xv7ǎ3J*T5aAzV 7aY2l0j+ ՖҡC.pd&U̙vlŷȯ{힯"*_Z8) Q1 I_eo4F[=1D6Хq`(CO *M.ꠝ$ !6`%pX86_{wNjjk;2eOˇpGA"էI;da..D$vIZ e[%#4*= fNǒ~fUA 2l9՚r)¶,uLȗZ # tcAeNF3E#`_OX6ZIDdLK}d;hnm[P!&=/>/ ZAL%91Dfd̔}(]6`"$ATXaV_u ;G1grtG%a\ǠsZ}w?Ƒ"1 (c?z:/pGCl8A3( JRޖg]=wB5;XZ6 MlLt,(/ՑZXޑ ͡emNdzkϤ>Y7>5l  kHQcv[nX9B l^n]<_;iJj#o>r.l&5cZJV <8%VkGR`"&(Sp/܎7Fw}%:-/E#Diҹʂ\1x[l}ȓ  Aܥfqp6"34 tͰ/ЭG~F|*; $>:x[E_14 >Ҹxqk|CDm1ʕLOѿi"w: A4$c ꨖS2(M'wb~ƶk8hbۖG1? 5osw@O16Zčc@ZJB fhE84dB?`)Rd Z9N4qx9^94l!ۢǰU"ߐ8N7YaH aT߼`Z#ǂxJ}qh v|Νm,Y Aa ~9fpspY oqC푈"c1=6FL $?7 %0E#d}!9 <ܕyi d e@#s.Q{ A /5l e(u՚ / %4#X[q_5 XLgZYo}vwT@g *d1 2-bkP b퐣 9{\kUUCMe˺EhR̨h+%UB-ۈ%vVRJ4H"%"Xd4u~{r=oLf{μ}7( B@S=?vtsԍ=Õ~f͜^5KgZ0B O6Q$`5’{8%!҉M&c0 4l9!DycB:sXo9JOW!SRUl12S1ĭv{z8L5e O9wIHq#V?d&W6l*Æq=4:> 1:}r:sv(gA+YO eG-gm':4d QiCZVBTJ B SIoʅ\xVxwZ1c=-eqʨ~OnƽRg{xY?؟VuV`1x'Akb:n  C{ɰ!\#>O\=<vQr:Mgg~&&R,@ ՚'J|^bj}4KV&dM^ttl_"!! B8(Y8Oh䫭ظ`Iy]f~{8Qk|RY``=_x'xʆF1Glr17ŒJ!! BG\x?"Dόo|9qQc˦`q7RSƅZ$RrLq oj)Xevmqp2l%#԰Nb!!D6|BQe286%-ǁ8DVsoӆ3xzYr3>ߋ.BipߦwOާ!ԣBzC6B~XtBlX_R*4i{ܔ 5`}aĤ҅gObd;S}#2uz3#]faށ3F !dB85lŦv/Ӽ F,F8sȸ"c94ُy6Ugg_b0 WnRq_}/yy/~wsǾBkmDy./KRP$X/BȰ!{PtqnĀ&Ir0pq7-У[1G3K"k3m%S8uc/ݤrq#2l!5r>^^S(cCՅܣ6i zĴjefDGj!Q};̲[Ƽ8rwq/pw9ؕxkޱ4#DGzCT2Bu?;dS0SYRs36&-\MH߶% j}Zk7ǜ#w?MTu,a97Ɇm<7j ޓJ0 .ұCmPo\mB-#:ݽwyͅX󫸰JBzCWT'66OwR~WI\qmO{/휻_k@l|  vϗlTi3JO.#6`ЖݣfM3hSf]sX@TΙ  v8^=GEO U;-5#a7~Ǻw8|̘)nGǾMx!ҷGNVr(K !7DUd𗎼B;+1;SmSpx8L ZOqT,CB@0Fuhjc'6zDɽԓk{zgp/Àz#uL@dJJίuyV!?Ca]]\ܹעt_v{?ۛ9?Z?>3q>tk+ 5ic}\[H&)zl4&m7ֲ!Ufؘ2Bfo}1brHq,qq݁O|YV aǑuJk+pQMتˁ ohڮ}tw섡#5eSm9f] û]_??>1ܫA6ly iDf^xu Dե,RsDǰ#Ӫy1x65'W#"⩯BTa)F i5Bac ;ӻE?f,_2v9؉oϰ 79Ne BNw1!"6&~6П%ļm5@RNنVUqUQDWAE Lɨ֬ejZ˧Ԥ2WX+Uԙk{rLlmٴUt]3s;"ힳq4_ !D(ذt!N*8&?X}L !=+2l!9z}SM% tu,9/{s)+IXB~pV,\yfi\[q}U+7Hְ(aCR~☟'obբd:{G)C*T;.Ar^s{hni*Pz,S0!78>+aacjB0i9n3oE~3\c+RY$vM9 3=ns{n˩;Jc;P%k?YoBHoi`Y !D4X8TgPsEmp$;s)vҼ>%*|n"blкB`b(Æ" P}ը?aPq`"L&%ٛSE(H`e.1gD`BHo™<|Lʰ!*rRby<σUR3,6xO|hp8W͊Lr(X# XI(~eN">TW-Æ"l^O{k,`; I5 9&64،: r(~ pxK]{&<Ȱ!Ub็Hbȷm\b#f@>pϵ%,yv6,~4qq8/R !ÆBDζzF$5^Ɇ=kJ ` =Yb!BCj /ȽPDf|eW !!dBS)֞)'\X>k|ZP+yt,pʪJ]r,~7]ldb?߶~k@{b0I382Up9T4v3!7 B8am lU%?/zcm!9+6]L( ?Z 0:U5R0r^AaB4\\vQ`?+k`+ F/X7mGce†(&uDFDK X y&<0ý2!  aB+ȨIWH8h2skLH`z q{!"4C  b!Wat o Fiso }o@*  p+ugrK|WD;E1wDFsGaOa`rZ RdLJbIIWPo$4lBHܸ7̍ =JײdkgBR Tk/Xh ]Dd8=+أoe㦾vPl ͙"mwR~j. ƷghykC6 ctMלm;tЋzRÅNo:~g1bvl1!c>ψ7C_yi{ͺ~ņ3M+Z 皌3Oz%]CW^=}`N! j]9.a_\ޓ|49r>-zLӰA!:xECrRjDiCrH!9 ;ԈQ,mck)5fsӕ FVGrv(;YSf1cRӼ&%~v3PNtMCJ3 %;'[5uVmW.~GP7zn~,7Ǘ *:7;-g]Kioyqn))b[%>eU- B]v椗K aBJ@(Xx#ӯeaQ(Ҫϔ'=/M9rWE@[yBP $i`]2 2&*Y7ԂeڡDDQ캰]i``4[ZewշGnMg] /QLﶪqjl:J  C ׇK4uo2n B"05G_Z2_g{L0<1JQS^_eE(tg̞{fAr FoXίK6i(SSig4r }@\.P(J=qafYI>\6K L69ރHNi 1_qgteQ @lc".@H7S?u-*$ 9j7'|%J?\ʇxM>l}u5u}l$kEʹ:hj [vMԚ^]VmJ^rZxX.JٷƧm  /#Xa>xHPt+_ %9w8*79GZB(cBjBP ?~rSg.OZxo^f yoc5SwQEqc tب+$Ё|\?o?uFSrŦG\ޓ-]N )%o(O:hpi4Kæ;)2{[Zw%W ACl~ZNtjGEFЉ|ܝ+cyޡ9U ݕ"[x c*7osq,cBP(׿*ҍ~0t[lZT᪎HxpeH OKNaN:f$ "2@GEd#0FFmM I YlթGv(`N5TKȼm1ݯ@TaOl3hnxF:Ƥr giܕ\M<4}>7me#fAzv> kBa}6?*WdKﳒ 1몥po(JPzȻ)~ϵ258L&["FbI=9@CaOYGRAȽ.:1Ʋm+룱aUA>F6~p;B( v<(zH( 8 _~uF)X,'R)wHHaG+Cah'm#=w~ZWp~ͦW1iK.=?>Ob]w)Vg=nٍYw9DHq)fc8oRz:WYSnzRK8$x`vZZH*~JTYQW*Wol1;0BsmCz/ (0)ϞUJ[&zNf(x+FN89@gcХ~%(U5]$?=u:FFz:X KF % R*"Xe)1^&鄾Ho@ɦ O|xrp.p|,URoc.tZyPDb}ōz_KlWbW!/ -V=SMZ,#_o:O +aD35`+,LDG;#+xJE,!?͜g sx7৒!׾yJ=$}z$V.󥮧j:W +hBgbaEV)6WM"G[mz/\{rw+1vޥnFؕۏ+?8h?`|#Ȼ0t;i~1#D;h9&@W Nۜ<灕v!6pb+UѥpFPnZ#o/2ic:ݽ}kQ7>3/$~P!5>m}fkn]P(ȎenF=g\`lǨj Jk\/w8_܄jjkz]>Z1^{jbK|Q!ܭN@ƽWyw `kNPمq1l?fM_E%Q@[#=Ȼì@V-u GyJZ;˧Z1T\dN%x9LKY'\ v1`Ҕ}mNdQAPEpFRvri]v9 =˻=򐉎(RVPV$W)Aȅ%N_@ E`EK^c9>MBHޠ4:h|9ڴlebFNIZ^y/l FJ &.ub,?xs27PWfθSe7fȏoǚw)ODtKϧPhv\Y9` }5f1 @[s,qp[`{W=nE82MV<ĥΒ$v"մϮ e>\(} }~~ ّNV  PrNEcm,Cb/%Y GaG3^2+LPtIHX:b֞5OUP?BiTȜ)qHv2̵uS:Օ0@[쎣6Ig@$q?7ZS$ߋP8AHY$Cks]2Ϭ_ÛNQ gm>=JzcMB(tv:GP hXiZ.(]mcaTDCmHU<sP8j( KBPhqQx}ݨtOX:KyОO]LᢰL#bo&:~T3(Iq:'*koIr ]Ǧ-gji #$BM<P(ğ>V/eS [e `IzNAM-U|kkB#m8{qe6m!9 V^E_en{Xy}vvǮ3c`\bU q):\ B0QQtfl,?-ym%UӸx/o喻?RW ic1pcYK2wjdߍб?!+ng^`T(+ߵ6uͶX̐AFu9Ӊu^Q?UVk2fA z3;e l,e.yy )qPJQ5OfZ96u*/2>ϤF-wB[#~}F rȿ_P#?6*<21=p ΡFo<j\d Y>NZ%X 9 E_ⶲ8zo@?e6+kFˌ*n6OcQt<λ=S+A5_+­YJe,H̻uմ5 uE(϶bo1xUA= mZa˻A`Dew)BϺM(0+ ^\|{q nZfKҮ`KU GP~0Hu'"PP&JCCDo5VL鬍\OjЂ fϦxϟHWfq}F) o7nn/{[8ԋwt'U} Aem?lX^\=AHx#xih9@ A`I"-e`䠤$CsS2 -8z P8V$ǭWz\8y@N u+Ǟ~p"]i,( HJ1h˞74ޔ zC^=D{pӚ=nW  ѧ*q^:1'pp>k9r9{',|4[̭Ģu qC(JՎ n) A ֙=Fk6 (Qp<߽q{%Fg*UӾyߪ*$?E&㩬 sYC4s{3r/M4OA T2 KbcFuW 5^^p*N‰Jkh} W:ܹu]U+t"q3::Q{E1nF$U$AqOF@XP zC ]Bg.5͂JVqTþbePz}k]~w%:@ED _ &^( xxvD]"vo/5!M @*H*tK 3{Q.JV4T]'OU31C*LB$V-aEo%#,PQ# 2vlӤ':YmiO߫~kJqbްZ;s#yomѨAA6mZO:p&|oUTZr*̱s{,9~V ZZZ4j)-KonVFQWH3eJMƉPu˲]W˦ m[pd8;6[(+r4 gY>}$s ڶFe^;%ї~m%SnS|/H>C7GDusuasO U|{wCwv e/i;w}t7qDY:o<:q-Ǧ|2|W@+!71fyy[.yL];!fblG  n3Us/R]% kQjpB? U€&fo5-q~¦}Lx87vHTVoz'$97ݮhqƜAO ^ n`]e<)ܻuoֳO>Y'J_)چ~\'F?ѷ}F큺OՌQaLR2B1{p=X 5{ܺ~E :EZJUĬeJ?!;=gz1`Nbbp5vgdZ]m;9?盿kβYݷ{[:W\Vd%~բq˖p[ԣ;ummݮo_>Ꝇϓ(VjݰBxZo۷3Rǥ/ɹ5~xSs?@iC zCuQ\t-]N,,a틧n>hl:Ijj8!9- 7t,<g|Ӷ\494D&^g<\<;M. `vqdx|uff Buq\ dy}Y2[;mHC[K64T99Mԝs3ʩYk\忰v Cr3|!A`uك+ACB];LPRjI1=S c HʶŴS%4?⍜uQd8_kQS 7w5y8eLѢ24 ACIH9C2sD% K B,A-UFX!ƒR[kMBM5dITc}s=9Jǒ{Mj>ScjO%Ò}F-K{ao\rwǖSa^l D1{9L;GwmmAgzDKҌ}N\t#TI[8MDľR!@!;B:e=B;F i k8xA{l[a=p37E]iy|GkU3pBput\qEYbn)>(C!|uF1LpcƌVƬ菿ھhK-8US)qF$o~x&20Zأ8қBGnP!x9w+r#u\Q4Bod+6n7B0DmA|Zt dcc8*yn\E|"elvsb:vn/df77kR3ha \1lc{\9#3@<;rah IZ?D_iqs'ٲd=lCGMam,=}_s?%vȹx|CQb [bևPJp0cZ*ʹ! ծ0o^ oVr%mJ4VC7g)W{—kI97)Vz;8,bĐrӥQ^9aq<ֿ|5+V|ƥ>{<.MKX F7"0k 7-EDݼI4'+w!Mq2ŷVR|CQ0MP{<٭nο}_sןY1pک;GGYy0!Ƽ)}wTV^+6kr~A2N jws঑ lײIq!-tj=8 G߷\ux=ON`FpcCxgs.ZU۷ [0TCO5-41 "ˢjc=+.Grd4"o!JjjީAF)[ִ9Vx'k+ZՊ:IG|#O2YI5A11a?Yԁss9Ywf\3fr1iE My.}^ͺk:Etro LxNx1m\48C郂ifj R NH4%gO|i|Lh-7.s-Å틳 eƹuU~~ޮjԮ0d,n+թ[σ\=_DXc;UTn׫Y߼~WNWt_Bw|~nNR[kUcm#gt7#(+-;^cgX7hʐv2Pe'zyR̥k|mL{|O{7Æ0~VTHΐ}?u!vϻmP!pKEX\ea Fyz~n\j\S4 ldLX2/5Ʉ,qD޲@k=E:pi q |CJĢT.)ܿ5)_xR֩sɲڜ^t2[U[֖Vݔ)MSY,tivRTHE1C)̖i M2Da$B)5flk> y} /Py7NW$;?h|jK)1-kK2MZZ1-q 7.MBQ8*.{=ā;Qgqd8"0BBϥ&+@Y0=uرx3Txz\8\}2yȻN,zX6Ko17X&>w|B"0}oΝ4BJl~ԔS^Po;7ZO?6Ա5Y|M3 AxmMM{45'Ux!o!kTKN6BZ 9/*zB=|6K*Vl}pvF?@OR܍ 1m]]lߨJjFs`&y3BBٴ#q{ɸ!,{%k`710#gke5sVئYXG /``kP!,0Nڊ=-%5 <mi=׿먧߼;}&: ^4"0O|oMK>/P!L˜VA >Q-d=[ $ Niv[gRk,jn+(*_vd8rdeP!Quם4^~5D$Lވt (YJdˊB~g)ذ m[ˆd`#dz!o!U*"A5H)H9x(-'fng0B3"7O.)ZdĪ$MWe釺7a[؃ nBDaa^qjn^N0 ߁E_w}:4{!23ueČP!+]q2W!:UsBY=gř I=+Q| ő ἶbW7!~r)^mX,#;VD"_xii&,xoXB"JWY~@KrKn87Re& {pӘ~r른<C`ya[_ D먮X?qY#{|^B"*mQxg!qT]n0M Bg'#9Fݻ{Hf3h匮,:b˪니&\1s4.FB?r^#Ũ^9qPuÆm2F6"31x˶X֊v+Q:HZ lGֲtUֹr-+ʺ"B!%Jjc&D$-%C u-W]j;3 hQk`-hTM v8yj>;`DAP#wأ0|(`5ODM/Lmm!^Gҫs1f 0>=lWm8MݜwKHoQf  A _ \{ d[ Ho_<1(D lQYx J"?[y@B&rPmp!]|5koVkpVy|80y(:p k=V.Gw {?C]xL4zEҗb }OBz %~x~fvDeȽŤOY;' Q +},i!7B++!x&Z1U|R Q &kuͶyaSsjk'w, :}@3y`P/( CCqw⑭6̰B_a[!/Sl'ֲ9u5AJpYƛ=(Ufd> NE>Up#6Y>3mOIAge0(M9#k@S{Y\VJy^nzZ42:z_  M7쇦K(>| bݽd CTY:>!Arp_;nʙ= Qb9􇤝Q:&R0ߤFwYr0\8pbv.*D2!rJ~DT$iVٜ3Q͓;?#A~u3u8.]&7mê6BC kS% .px0p#2,SEV_z (O:&Dy#lڃjTIe*ne+_ݽ ffJi7ft&pEjet+L߯P0F@aP" Uo.F8 }xXT&_D6$Ve!=9Ip0՛.N/f2FGUV%%nl96Zho]1 e/tUUTu -햿7гuY2n 5TjwhV ;/Sd4Y_}7:4>SU3Frs|-&M¥'WѪ65j4WŽ[4w]\zZf3$vKKL^<3Ab y%-VFLCy@G?G |BQ)zH5Աީ7f zZmkd#2)NX}7'L"XѪ +9QIGvs++?p阶 vf!S} bnnV9>m~a{v\})q^괝wGvϹw)kHN-с쫲u+SShvٶ_s[t+-{O/KƒA\ҪKnk)ek1G]TEAOtc !8׹fhC THE-+Li:áD9ЕFNZz#6lchۢiwO_QS^^klGI5.oZQ'Sd4|zcш9|o`" 3b,i[8Wye&&?z_\ij+0QMx'fckE6q,:./pW6GF^_wMqԆ[k5;xr)/8Q\$&]^eM4k?Ћ{g)%kisMO/g]܄^ZlSy{vm#&WzovEcזz8*<; }I/2)¯˿+/d Bz #8k9D[7{* VY5Yhg-zGuW0Hod1qF_Pkj7z712j޶όO, =;8|nUzM2Ǫ!Lƕs IʓwvnAl۷_EG;[kLvKVod;Ӓ9Gξ)AftcҁU|vDe9Ga#7Ǝ87QkL;Ezc;WjM84x͍7n㩸^AMDg +k嗍 u4~DZ]|Xp/7 *-tWTMzU L Faou.F1@D088J"?DܙBwD~АQ.qt/7,!PhΐMp |~{q> wk^'$'v*eE<㜝col7荂TYFؚ."߈|E,{ubBnFTܓ:ۗo Jn >6]J!:μ!a0NQX8'wt܍WYw,5Oٻ3z1qi$$]VOjjIȮZ5DM"<8*_}dE]45 64Sxv;^/ؾ _ X# N6AD8io`SJZG'] WH]ކ)t[O2pa h@}r^(gC"CzD0>!18QMfDADET׭.*e4C(᣹qޛ)3Qasj/LT.JHpCGs=%9nQKn'i;;S=h:2XpF}qsq56 mvFϏk AQqu?&\WJi8^* s+`'vRfgxG1<30ĕsUz 8%~GA?_ )A3!ŬǍ)7 *0Ϟ au]4Zp۔nQdC. m(.p%g(<&h*}y@&2e% MWp~Q IA[NHoA| ̙=c꺟.vAE0e Yx\4G{.p .pZݸ=-@Gg`(W05PYlb>&Xv-Q.4Q dYĿ#AQif$@{g3{و͕(@ύL"I$!$*AW@]8[CR TUr#IUFsw ! 2QqC%fge|'DLg̃(>JM43S3kむAt .ㆈKܰ%@A%ܐc4"(# "s4/ӢУ,ݏPݯo=6*nh:uc|LA!6{_[qXmag?טdx{ٷ <vd kiIWaern̗Xa[T/dJh(vPU!]lcz΋W+IfrJkń>hJbQ@) 3@a|2Fc:4ᅓaI&x !GPՁf3evTN5Zh|&`naNP !tbpw=h͆9#5Z0(o }R3aS0@IJaSr"p H|ɸ1լd 57/`Zo*=8if[k, ~>Iq_8AA!zU7\mCڪJf̛+m6lp~tDzj?!lJx{5Xa!ȳ(HBߦ\mn\d\|b*Y~Rnf"v]Kf֙:|]qےݠe2vYUKPb`/2*QƛO0y"?>QS%!M 7e B!mtY4 _hGoz2xMCi[u-n64^,34_IN N`)X(Uw^=B.xLA!ZQNclr4|~OqMxUg OzkF2ܺR8E3mkJM˜<$k\jDz~UZ*T !ݍLKz%YY`nLd1)'7ߗi[[` vpӦ|Tp{Sy Ǹ<+C?TfܹvMSR5c&OEMm~zBYYnmp6rzw`Zr8uc[6S㜚S3OS9hocaM-8wd?622naH/;<3{Yvq~Up#pyb޸k԰q/G<6W^7@ 0G}o=S?WUo$zB QVƇLxYROnYu!:@2^Wʼn\ܖ(2'k53=E4St߿;Qu3"<S \v nY]WCrG9(_>ecS#Xx+P1 4'k),Y[|öC{'EF ߯wzvs83#(M f ӏ팾?*B$Tx;t4&b(7.Y_̻أEV7d}ڶ| U?>//?/:;؛^l32psԮԛiX9/R-:0ɄzBq BtiÍ=YIU'^8"ii#3ەsjam_Mҫ L۷K۵2~ȉm L6nc ͨ' r7k̸۔CKCǶmabfԬ嘽%*sֻ_ _wS%@r5wTqoư̹סmKVO|Tŝ ۊ Bޙռ{{8HIR)SdlȔy e:ȘdLh J#Qjn{oU{s:2>g=dwwD4+e񝀨?$d Ý u}"^>iTqנ1p[o=K-كEF OPص\;_W ۡ>X۷rraV]'#Cһ#맮 wæ"/8jf> A1]<5# V .a 3iU(EU7|=4V6^]tCRM;'Dhx*7Q~ M`A7 ; }#4Sl۲K$eid,IGJL#e+gB.&rTd۪ *jB[љ\/;ch?(Z}"C %%NE tki[u;gͼL4J'G-,ئb9m:û|nT1ãlJkVn#76Pbطw96ٺ =W|IG|@g 4JG `J G1uv['r]TfS> A!3(k/s){l\kQ짎ݜбjV!VfjS,\x{kY hnSfud %O 8W ̽F MN,fśK6~n14VEڀ O)[Y9'aGK"ώJj%"~aH44'YWWce)6r<.?JA;3n 0ߝH?9]څHMoKÀgA:LZbtiI= ; r A  j}n+7 ZmF_μ߹{gӼ~M@~QVw vA7/ax7խC9# Lڇo(ͩNƛN񹺡wF]&ohǕ4 Kwӏi+^_s<*ϲI#:Zٓ)%JmX`QyŖzkt4ӂj rSQ[ e5ǝq99N~|x|楪v/.03D3pQ[(*w4ic{(J6<'A"iS=fwdI9HNvgT^ݕj-ˠɑ)pVʪ*]JPgqV'P"iw!yØPqK:<+4].@¥074@K>Hof5\ zøF!sOe?>zotMї.Y-+oXw8llDH"f.ㅰވٞ&ZUbh_>9сUޙ& ,UAyb E= 3(KqR,˩jD r/v;^z/mE>\{8UWJvXmi76}} Dmܩ0YRE Aug Hx6ƫF/s7fA^zFe&VvuƖ_ÜmSnٻ?.\ye kh]ޑH{@5lzu{G5{G-*lREc8cDu A!ynt|^DG1=E@fFK!VjcC "|Bn7?\!U ο6EUD.\lU|"|KVU}LKk ~۳ErQ* 8=Kyp*$Klw4AV DE@uZ޻lZJ\q5@<#Jԝ HoAm]z@ibV #=Qo1d~QP$X\nš. Unտ_NZe&zwlLt-I2DoNajj}Ef2s{yܪ?<'/TԺ^}4nv:Ur%xX55ٕ6%ɪ? _s5VI 爯r"ܭ3VCe jN[tvmd8hܤKbs JmIHc4F(Jiŗ{ HqGOo:bGWνY*9a^^ۙoOw5l.7wloa'P}Fݑ.aYgɍ"wk6; 4 ! !LRPORAQ rx*<ڠ$($34Yi\ 5@*[]5z!MA#sA|R;Lo[4Y-k')w^=a4letr#pC@N r@" 9A5LHBxADCfyٱsA] Bl5T/9غP\>?F]xxo\ )"8r3O $D_e(۷hUOύ-򞤮tnA hlzқwe}+rh  KN(ۊJDp@}X) h8 ـxI/V GmH%`H® 69| ـN'.?~LqAtCD}K9A  #olTpap;4 YK^Go^%=ss>8U+Č-0k jm1 AH(H V[t :>(Lb_ SLr| K0:/ڄqXc#/ HoA44.> ;?y I9bb=f_KG63i3q+$e)joz3a_~ixЂ\HUAD#:&rp;38}8(;n7[gHiyp}> C>@^uMI:ROKETn97qN}F[5USI>eD[7tbiKn.ύm*USQݨ>ZtL]:i>v/yC;N[sMNQ[$Wcވ:xn8̿{q̝;\u`Ǩ ܜZƹbcZ7Dz ɉ_wRpn%OY=B\,Lnѹ!g*-s2F7 gN0OM.Y:d!ڸ!$8T a:Z, T#hf b *&" ǡm}~`X{?UU&hK(9 RTXg<>x d!{q[sCgr>kH֧ؽ`m?-:sѰ~:mctlom7ocn3|g|~h3+>̹N=lY[==96)о{ՠK{mϾ{7HcuVːψ)Շ<'*ڿױ×sGueBzȌ2v:߹˜o>AՁFm]Mb \7a(Z0^#ۃ# jEEXg<N"DDD悚!b%^DZÝ[UҜҡe!STp@2o?8Q_cU[_[OLʐ94VXo w%2-D36q1:Y Ԋz.>{\4wt ^3Bz,2UbW'-v)/]}Y+ x+J+RS ūv;4H7#2`"lʶVBfbL3P:oa\aCh rŭ߾o,.+Mx uXUYfrWayY:8 Q_om#a[WnyΝ'ýGYylוn6L9~;(W]xCfdIu5BzS7hbUGȌ~8Eù%\9 oeE<%n6ae۫"DDD-#~aӒ"p v2%]({رPhk'EZ.JHӽE{4A ""2Rbj27;L:Tu o?ftC˱ts nEg"DDDFca}fyt|U WyaxkDq.&!}e^tઇAh)o(Eۺ׈6fXux(2" )*&mf4ʏPz"DDDF< +ʋ {ߩ3k"՞ׯ '"C9r1@G* e3縐1!D7Z%N<>?yp[nNeXj5 j&tP 5XB}]-GD4ëmB%xMQˡCM#8 pqb>͹G36 FYpGVºٸ/Rw>Ug ""]k?y*H -5xoEZP"`Ƃ xo 2}ey4&UU ""vEdnxQpbj੽BT[s/WbQiI<=Vm~-:Ƭ{ ""jV&ϝL_[p3)9-a\Q<=f`03oD\$چ[İnU(bcخQ~`? XM=530ْ"%&2%K2H(kd,HuDQ6)E[o;a{<9޷s{9.jL qiӻl~|U\Ě#*}݁ CckB&H䀳p#~0$'+mn[ۢ_:"Gv AA߂(,]#9fQƹ8їNSM$fh[,D!u!z#j;sn:|#hOd^%qG]Gͭ& =6MLeGrӟ  cvR=X)YXHMFbﮦ\<P ͰF͈pߺZ%;;=g .X4`TMa#{\Wp 琔_m:'  < )w.bTc$G,)wga"lWg UuLyF[ ZO!TBRJu\s þH.6%L4)tB`M@;% ~jV) d⁍ /,}c?Q^ ݱLtg{Sh|=0܊ s 7 B#*D;S܆jj'mZ.'F-?@Qvx{#>L`UvrIoAHFfբt,e1iz%a U`O$4D+F&Ơ8]X'A jŤ4g $l't 6xFa.1⃁ZU*s  㢟;Q'U4) ^|jfBѹWsr#7O q> X&f7%&"mw#x~]wnmLe>ͤݿŲ*hH~vo[4ԭlQOw4sj&3ZNv]9fhgoA?sz>2-DϿo cgV]݄*RR]&({):r}+ +jIz  A#GWidZi^݈[7u!}`fgO tTUP#_~ sb!N]/اO!5%I BZy/?q5 ,fSw%n^6kJէvzʊ(~~hJ{#:o74-eEЬ_:)0C6?7  `8@6^|u)uď΋P`^N>U _D(|\bl$oΌ%N*X׫p/6_|2lNy%~=wi9+Y7zڙǩg|L+ݽ/ĹL8R!ߣfvaKr)?4=59>N-8D]w1. S8o,_6SmIhZ: n=r&%{,lń1m^7Qh0hli25Wv,j+TL QPi+)>~)n1+OT5#4?dغ{% Jzx9\VsѮ;L_2qsd%5p0#g k1  )0q.^\9_C/t*3BVdl[$4\߱|мE`rHoBu@q}Hzԯzc_+LX y)4OHx/<빕\+ޡ_}jAaA֕.f~ΰ w {r`AѰ ){Rtgbx Tr70v<2ba\_%8PI(ZڤJ9Ķި+_k_0mܶHCZm`joeUْlBNGҙ+:Y[SZ/.oc*0 uӏSLȟ(`u`f8y2s?L}RXIXpZ}e`R14/^͚d:v+h0fm=o ܈9./a٣mϟfDV}ZvGٮso_ZܾA~9nI9a9dE3;c]}ljVRZa:2uߕ')+%Z{3)3f͙LGbkʸ*SJO0ɞ/s7_ؚe膬8Q|n֨^u4 Yf^CS6cԜ2π !! p b}'qOpw0+ϚQ,oɆm(=Ф7g[`@cAP81xX]`_v 7vȻ="ެu|YkΪ΄$b1~c N QS }/܀erۜ:_zpsDzC!h,pv̞QDV~Wny#( H4=P B䤭frwxgذLun-㹰 "Rζ9vM^z򁯖c3Ap`I^+!B4 ^'wT@VLLFJ.;!~]K+5~3Sj9r??<νd_S aI0jh~Fu+VFW yR}mKJCzC!hʉW`*SNyDO!Ok欌avߎm!k avLdꑼLמţ" oE;aB(fg.NooR/ mom vyj%'z^o-a3$x8Dw֝E?OFYj;я_0u ^l1Hk !!B4` ,uF##P~VrZ~;-g9yvwbP2e}d$Ƅr \#dJgIBzC!h @``*p̵3!N8h @YX:}$+* (ܿj- j)tt))<`W J<MMǘ3ui*r\qoMU*B!\>ݹ%uU,SBrPa<y1|^BFp 'ؚOy߿cKcZ,MX6n^HMHM+#J!7B^W,fڶ@@ G<mblXoY/kj'fcw+@=BK8]Qz/Mfn 9!!B)؇qsDS}st%9sD(>V`f J_2 ?77b?J1.D%LϫᏵ'{ԦyXB|:W"i,w/ '..>!!B1quuum}JHsP]t0h^?EIrʴq3P9zK=h^$:Bג2ydOSe)+XFLeB!U Ԉӆu%FMPRӊLQ^s'lRQ}ԃ܏˓9O۽}Gyѥ uNR1fwqKyëx˵ڴjӵm=>շ{ޯe{/(cOVz=;-֫m0tԾFpyhz?~l7++(8q[D᝺KḰ9mz`9://+]} ;8qJחߴx@EgZ߾LMcɃvX;(4jKYg)͎oWroK_]} !7BG ĒI}v JUx@~0cͤqi}Vዃ. @* ;:o߳óOS=cg' t<=($(s'IiK=#dE:tv7e]L.[5=˧z 5[rChJ p`f iJ-K5DC{0^Ŵ^ѡB!ģ,R {_/}٩<'inҳj4DKA tqq+oKW Q"qa+J~o`F1jd"lɠe뾼%Q \BHo! nNcm A܉| aj!Z n.)`)1}ל m[ >l)Ҿw#'%WTf d'!6}N!&NB B!ģT؇1g}BƵE,C.)naFࢦljmVۺ`MBCHŀ^wf$;`HqEw"A3-vCHo! '2Y2c_1ФI} "P }cg ~0te&~ΏtwI8'dgFx )뼿8uӀoyB!Dgf]l;藝Y(—OA^Rt--fm4 ,Gvޢ?0V Od" QHrŶ F,hEجC?{Wkg׭h&[h/>OaBHo!mV2go_17̤ 7h kq.lj1oK[DGZ+bMsGL;_ e3vd@ ?'>*§;>BzC!h0?Cc?ߔ^XN%%܍Y;MFa˛3 ',/< !!B=ܲ:.~}|} &pҖ)2Da~{eߠ%o&"ƊߞU !!B!pWJ .bԁMcE`ih!i*9Tfw`r 9]3l$[%BHo!m ZyrnBKr, xyȫ`.=^xg ]:}BzC!hɀh#{dsacSJ^ZPWKg{[q,BFI\W0B!Z;40P=QA4s+/l\<5%k)hd1րh^ހgc[ӜQHgAT3ye!!BFY]` J~ch+܉aھ!sahVa¨nw Tp>="\שo]\mg_0%`ĵICy);c[]\_socރww_a=װWBtC8FzCzsyJS)V~X|7T{@7 3xd"q*v|v1hnOr۹ㄦ54u 8Ȉ5 %lRh.G,&Z2Az  :]W" UwC`%۹ML|wC6- 7H3?M;*],P@.Ɩ & liG0!'=ʱx0/*zH 1mrhQyAP\ ctA*Cu~ AAtc)Dvr,vIUS{?Na.u`4=Hn#ad2z~Aݡ{ Q@.)}Se OvI &7 .)qa9F׉(Dx!zѶڽfm6sU2G~V8!l4{XyoǘA.Az  6=Nj8z4c:c%wC6dn7&};SYV K&x,̶B3rMԢ2FiLt[9'vm֦aƹ&.ϣrIoAD<$Yؠ 20whG 5ʷsk+Ct}킡wo;{05zYilYj.C^g} -:o;|>σM|5}+ KsUzlM>Ǘ;^r^  gʢ Hxx$!0M@"КIneV1,_D.{Kghw5Qe:nl8^Q1P?!!<% )(vZ` Nfm-Qp4ѐD?*,iWOz  2p6cmgO[<_C4koEO)Vmave̮!AAbezHrĆCQ\itcj4&;,^"!=/V9n(+.[zg SLSjF7=.fcPXIz_gs87gPZAQ^JR~<͈Cⴟt{}ۦo~ SmMsWcPqCXGn>9H5\C:]UnAo FuEP[cG (o' T1Z 3VT,7h_ExYZ!QEis|H+S~43M"gFo(3wgrO;X̙02 MCQNjPT<$g ]p6dғNDn=NƾRCƏjt:~T/6羽£ /o3yv~ΉU۶Mu]Kr5r3ŔnOȒMLI   u94F"VzѹJ}- h/ 3D'*))ǿ8y`>f ĭtE+0)8@-G7NXoDQ4̘jx&/r|g6m3I) .g@oT4<y>3 .1툎rB';'WҎ;ѴrЃ[rB^oU7jsκ\kAoTO՚>Q[SJ4AÁt􊬛'n(3?MO`ZmW#H< O[זY' D 9a4~@o,Vߒq:K63X4*HqIxYQt@xNQA3S~/$T=k8!KTmnq7" j+׌emw0bW!=PmCچ8.b6Xot=yw\_0"YB~~*52rNXh Ap;.hE1qz˱`8'AAD`A[H wZA9 Ѳ~Ÿk0!:eax=FgaϗZHuu 5By ~!Bx3p<HʱH>bz'r9kRI)z]uFIBjn\Qޫ2X_/6 H(XXp͌ %aK p}'8ľ]4H_ wcGb= AADӗ8VrU+9^aE`.C޽T]a_[Vjnkݴ{>KJdQ< ,`)0 xS A" JAߞHrD8gg~}& S1W _v Zy1wc-;΋d~H"_`:ߺbcۺRUލNB[*|d AnsPZ#;jt%ByDDDf]r %&4.jZCt+3G$yZ,Ӟ F*gP+MLPoŞb\{+5&KBb G3Yo;wѲ- _KFQltG%ԕmUܧZ.ԧԵ*|\Px8q{ {*X]eDDD$q^VL`фx7L!ROaU;Im1uQKՔ^6<28#V[^/73[e8M| S$ΦA}gQWƠ8.wn*.5K  aCƹ$= S7iqH@F~f`:ؽ@[ uK?Ncv /ؖh[rquaܽ 7L)\T7ߡuzܬD ^¾L{pf.V] u~&^ij=eӟȫS eAA^DDDD 녯?Tv;irOƻL)B2Q.*[r7p6)g9|lnq:`ADDD7qO~ w T*gJ~=_o6!vPv.fLk ТE"ǧO}[ l^zJ\ܪ»>3nĆɰ&hC+9/NvrQFi1YICsxA7<NZˁ41Yl ͪeS=~;zMT^vxV0  ""vy%ڇ[Rx]mA!_CD3'Q}X_+Փhp,Y MXo `Gftq,=s"ec#?}gvC(9p IBZjAW e3Bz߸c?rR.UW-{N}@!]8t^4\[5'D7sB쁂AaiI^}hZ9q =Y9aO%B+eџ[LuqnʬfmhnaήCi ]:i@0 (Ғ2!+vBC4Ed,BEDh *LS{<7]D#z6?^>!"""dvΎ9VbE+-Y<\tgex9ćNLXSq$D7DDDd *|HWa. :"(/s6hr#QpmvW_=&!"""Rw5cN6Xlޙ eV~9)fSY,y\,۝}o&!"""pvB9>r)`QmV rM2ٛWt_}UEh|D&Q`3tt.K\x:s6rW#WV6p'~6Јb""""EсSW;>@t2~Qa ЇEʼ gQr@ ̩z.I dlno>.be8{MDyCDDDSg[㵐[s*j(kJ %}+~5#}ܧa<%'X莚 MDyCDDDF.rLOX-^@hvf#1sTEHky ^(oNrG ^j""""2J"G\Iq<3q1VykkGk,QYל8x< f`AVW?uLDyCDDDFgӀ:RgKNhf`/;| *&e齤׆x+uϴ1ƗI=LDyCDDDF!."< ' [?M?9ueTQc6g]ݞIlJ #ђxQ9`5`ז55neѻ7ɲ Ozi*Pp1 X0 ג *]6ʇ+8|Wg޶DWN$u pi0*{yUv򆈈!M5]mQLemoOSGEHpYA u ҎCxD7ƍ }| |l >_[fb8>g9<dzvñ,NKTKQB.rrmKhöYh ;X-]D[mIe4qiۣ?s͌?>|!DGȻbC>hAPjCoͩ?y<3|٪GxteX\{}ϫiH@i`W 6lta&U<g˷vqbPoPoB!C~*9zj*cRfkDGfvBl(W=S D7sÞflҮmzzy{- ,fͳMeg۰cxi12--2W8@nߣQg)8}d>},>|U!b]U6t-d0;?xbNzPoB!D)/)0|s@,C*EɃaȬvm [}g̗ZAcsyN3<ݘ3ю#fPoB!DAwF>; sCC5ST3!A>h~vFHT8|y Gv 7/p.6ƒPoB!D[A-?w"7>{H7vt@\L<(XUugK:`PJKyI ыD ǚv}( BvpQ(HOzn3ӣ%ulj?VkX@$ќv0tUIQA~Mr<,QY^" B2WRv5\QQڜ{GGbD7Eyɱ;kߠ470VV d}!<ЩA.塸SBA!p :ʑ_ώh˃{wp̏IVEXd fY'%.n`סոffp,)U,Po@&B!:pa ]#7aWvh|h*1tIb- ëiெ] ZHVc.~AQoB(p:.DE5.&&Ey0ȵ/[%d<6!h7`rXӐs-ߐJU$;x<[Av>]2#KH Mm=GAV/!4؀ fwhd!60vwQjZ'_p|6ع wFEO46 lXxWh?U*!3Ѡ < 1]!M͔+ʈZ=W[# $BbdAUr`rZlԆ QwSez` BEwʛ]Ƹm?V4+~66ܪ <@RC+UʓfR海; 8?pvRB!MlģwmqGpE9;]1=PkgZ`ηٵ>E6,YY"ysLxzNnvglG2r=^ HX[-t%Aʓ;1Y>g[ıҊZ c[ݬrQGE$lSAY0UW}{z&w޲oT$A"iYBYS}3$R|B;p?ЂRJԘVkNIQ1E{jڕ"* QR҆T^܋8׈2yqs·~M>>{V'ЌᖗBU"pD),N}j:& eգ3KkPފZC1fZm)xU#zQk۽ޠKc:c.:/ hpr*or.WnzгewVŷ h -@Vd{WGmnjn1,;]]Lˉhz:ĨĞ, *j8#hg ։ZyI=E)4>pW$N-)F47/W*>%[j_j)s z^Q@o@ |gnbęՓb]zFzT<ؤc7QaL晨R u$G]ܷ +'I[;uS:$|d3rN0: yK)X26p{a'O0Hky-6@X1ȘGc0;xް6ػXW 86m 3&.ImMJzad1sJhlv<[Z%i5o{Z|ԁȡ8 R%n{fCQ7_F>ƞK62Uz',"|+iȫ"@s)濍^H+҆E (|0E9Y; YYsw<&+Țͭ.e:@AkI ដJRr6=g̞o:6>/? 0v4JFXORVv'hYWs|h 뮴Vo<ܤKad_S7Gt_wtev7>8 qqV#(|<€A'P2HP;,!V܄/&‘`G↷ti/|_G);Oz]#z9 Jba?4j%쫓S"3J}So/|u=4>p@D͕j⶙M & *%392w&0jA-wˑk0Qh@ HJ s\f \n_ɇ ,@G|޴eVe=_N{o;;u&FZ&ƭ54s;u};|ΖO}u߲ܥmc[KQ8g:[*Tӆw8UOcFug“BruZ7n;:dz|Gk}6:˃R|z'7)ͭ^xţ[ѥ+O8{W!-S0@Or]2ߏ E-'3&4ɞN cMss4H\Zr~% T5L>>/Vz`N `f%m?r'a}(P_܇`f0ځ̲Nؙʥ[K9}dä ^BRK_iev_Ԩ`7eO%܏9mA* *-Wl3o7GJP6=g0ޏ\ ~2ռVե8oQ4^e7lJXG׮\9ƧrʉhTLFWetCfBY8F\U\pJu ^]Fz"lSq$[UO},ԍ_x(Q|x;zW mS](evA)9$'ȣ.W/kyEwID @ >x!:B"s {3+=]\@xA沊0UN@A7 &sMʮ?AxVr6tN#ਉaauv(e S"7Ϟꒄ"J.Y<)/Iht6>2n/jym\lU_cCJp>2N`=). 1c~/3CFC.vVeu4LާRQ߀?~y_1is2<!wϖ@'O[3'B?p=pƔ (=Pr 7˱Π֢^^[ppH̲j_prd7M*lpӶ(Ud cWz[8R}1 _XQP}S tW3PW' SG @  ZṽM(Y j_Ts%AF4wfW3k( T_+[-K|ʍsed^;mhuX:lc] GD̗/sж'Ul2d5wvKҽFJ畧L*OUۈg8}eJ']FH;&{RQ4?\]{w&)ɮ{:yט4 y}|Y꼬^=֞*}7[ws!,ry[n 4~0+d\edlZ-o'nj5V%s(UxR2`$ЬnjEZ [q%AмB~Gz (;7eT]P''Q^-> =*=&蠄_\@ |17.CaL׃'X^X&!GotݯgJݰ7.jYfbZ/i3Tn~K@F}p6CӈE?vEˎĦD1VT[ȪO134= Xu)%?Y{UZNzf?C C7V#,՝9LU/Z} o˺b1A!׿7@B,{^ZbK'y&Dcq2Ib  tte#z<~Pu=Mq%Do@h 3^vm4R*zC4Ti D n81{Ik4C>>jh4kۜ;lzfaRpsob#|fzNU#ueu-3_`}N^z &jq!8i+Eg|¦ ]Qo/ 5?J1UkT~}g.@Ҙٲhb(n-;. P_uX̭9N9 XeuaC@ qf=9 7q@VȖܻ&aO?Xo0 Y7yOٿH!k cP6C[1JDrbm.&).`e>6??[M WϘI}dzJ( }]˕l[LJve@nuMLŹ|> 8meF:YyFyg<&*-ۧ8߰#:P]~J\5mn̩[v N-STJvuN4 n0r8˳d$MA ߄ΒњF6f*%H L' Y_FýyPaqޘԅK0% mT@@ A˧C@tދ+5.옻Qna{|<$^sJKh,ww9;cF8!8PG~,d^@ B .sșFպ XbzdCXBqyC` w ~Զk_cH=un#7n8vѨ)7DuGaf,|y|M0 Md< fj 2Zn4Et#7<}@ WutQԹHY1Q keLm%Gw*+84.3ܨ]\9ydf롋uL[a_'WU=Nʸ|780H$A?֯X?=# y0oգ ȴF ZB[ғ>ſn[aE1#n?MIӇ>E4?dFy; 9Doߌ8v~Eq|y-5`V\gwĀ]KNOzo!r6w}$t`a'3E&#Ht`0U^Қ5hdFW9!˄h:kDϘ,@ H qUZt (4~=6}Uz  |qPeW} ZaPS\%W6("!ozi}ݙC" nF,41Ov fO5R&t5l\ v\p.n%I<ͩ57eDo߼EXۥtѤ]#qOfE X1gn, 䍁'R)av|h f|s3JjYhT̙{f,w9Yk 7FnݒЄK -8|L~;|}l?WVկ"K:Z. +oot TM3.HoG * o<>FARJo^&Y34z9m"V(Nf'lSDqUy#Í&J6lԞV4o\k /^N\lmEtnPwޠȺj~ow٘\Zv+U$''R@T"Sxx̷VvކZ^L[k;xoϝGm24]蘹;_t20v$j0zgaj33r,:kS&pj;%K)SnYN j3SW:< H+˲OZnȚdH}k]815'z 7c=ws@Zr#[|z,z +gh8z fry@r\.}o^ Hhq q*z _n[ztDz_@oU-:iч7ҚN\> ƭ3m-WeYV<^ H+Ts7W'~@oxx@ZrUu ^? Hk:yw{!z|@ZYsUhՍSFٻך8(մ\PnlKMnbWve IVv3a ,?Z2qYˡFM+'-Grߏ|;:lVbY.9"{)LjmRTdӟ?ѺdC6_,sV o@ʜw~HC_UttdPpeIO6lY2C<hʰ7PwWENIʯR&-q<2tKJXAv7 GIà'.yPPQŭ\ L %etڄs{khd/CGÅ'Z}]ay+b񌸐W)OX\27:7\Zi|d\*]\]Y׉V}9-k$C>&c--OٙVxjCp5~iqo^pn9oL:b0}W?̾˳H?谂ɩqyd[qvoo=F;yՔX ~*>;#vsXB}/7[WeǕo[od2t&0JhvDK.5pg!yko{(3˜PWJPZ6p7\`v#Ad##6Hfey?"ĵgIlߝW7]vDw/7?4>]*>ya)c^(p~qo!"͍ow%7dbL8[7u43atR1%vfmNlx7źH%d+%"ʡNԜi*3Z+kt?}?o~5H9<ef9ne'{@,l>#@uۗ]`@zqsԮ0QQrf/n&kޙ.p{;?`@!X\ JxLC i΃4Cٔ7B]!X:Bfcp7s4b@!rxtF!@p)T@tVxC҈ N:=dX!-BvFBU B 9cw?8<]W~?֛Y…HbX)Pqaey M.(G脌.ӫG/jth'|r_u=Ẏ+bUjzzj%5@̜`@RZ$jq/5٥џ|'=ڄָ?SnVݻ0]2tz{DM-WJW8f!BAL 7k:3 wup^YelS{v L1LMg In䯮 BL E|B%}o.`IVՊW/\x5 &+or21M*\JSn51]U]֦:Xj:{ķB!P7QNɞʱ4{k-]L)zeG݆7N#93QL 7N"Y2۹ؓI /~vض;f1~g[z" 7 EZe^{GtGYQvI_,ZHh?1iZaV FO /zq -oOǖkGLOl&$ 7 J[g6ICt`qifM=ָHO-"xGZjyaw)7KG)p|^ bBK}]֫2y]x]a| !j-5uK\{H7?!BGCoa8Ko+^uz#})b+Y ̽k:+HZ#f:|u.+<@99";˾=[i$, _k>:&~QBB4o.^]ccn0 v|6^*`ͦ,fHDY MwN¼q"p0IX7_1+s {S=~oͱǙȟNJ]7o(Mn6s5.Rҩ)^ Z$E]9zCQOs\<;jI.~n Is) <EB͘7B!Tƺa ›?9ǀٌmCH(xzkr6e0D}W??>/®Z$=xzt=pܳOtGBع4H&V~ d+5`ųGhJ؅hM?t$ܕ(!OS35>m)Yrي-0 L F37e=a⓫LP;q 4":vN^ zW^'apS1l*ƍƟ^^1'So;i MFs,Q/gAmPϓuc4tFa9{ڻ&|vHO`==^\oF -P+!X[蒨bΝ^VS&h&/lcނ^2f姽Fn?gTQFښ~3lL(Jc, Y>/Q+mm>qh{(li0X[ue`[-"'/ 6G- v'_ S׶mG!п>W 3?'U5&|n}!v[t~Ìd:+a\fm9utVf;Z>a<霼@{\#§~-<9Jٙ; vayC:!(5?'1"iżB!P S~JQW]MʎbGWrٷ;0o B_$_iPgq HPX@,,?{wUa!a'Hd QlKj6Ccf^?Lo37SiQc1~y Q9 z:uam~CQY7qG(7F]TQwi Ms;sÍ?_@\Aj:y"#ZG0i?GwNJWGmQ`o3LuP(2R@}˜Q[}ŏ7QV&s⨃/8 7q8 7Q%K)TRQ)q`onesfL#'9.K{hGerdx{㨷+(Qkܷ㨏oQWQTQ/gQٻ8cJST FX*nM: @tssFܖ82" "^ b]~r =|5#>~Qshn|A?[1N(d~VXOIW6/ˤmy^Ew9M3C4GhG(Ah LT$"5Gy5eȖ]РQ7  ovQ4Q,9& 7hك&4G oLG 'b]\ڐ a8^#_̷MDFeL{zk4SL7;s3>ۯxFBybTb3/z=Qܨ/= b:.n"0]qd O ֔'[ĕ'I' eXH`88e2 oo)14G̀rAi&Tx oN:qxnI!ytZ.j*&04bg7ʚȯgh3Ukp*ѩ?| od rN9϶4ʲ2{.tw븻k2ʆ4 7AIy!vڪr* c21kanR1uWh g/jK9 .1c\z ėo}t]Uq͟jN= Б,hz2%L^x|1饨y 9!ycȋ bBd肔Ft+/cM ZqIi;Ӝd\>J^B05=}5I)6C$?53yuO2co trkut o7Dl_kXkmwS:G xή6#-B2"HvAρW(V1{j3Z9{COޠ$g?~SVsd ⭓ '^դX5.)*b1(t[(d#Doo\IRUߨ[ڧavG7W+x^ۻjR|mb.3psbYq{+<@ѣZIS#mvs#o oyc+HJ]z5-%4-p{}sI&)Zb;Qӛ7j,K-(4+U { xc8sC'8jy:{Cލ::Z!ؒ5h2=yn:jϼ![iQՓ7R*[/q2r>{}%9O|䱾iл;l[޷6l87TV=kbRB\82"s[Q[\ݺ-7%J!?`-OI_޹ż܏c6G.JW[$Qڄ8ܕ{)%U ]v!*%L&t>]5u^ǥzޯYߵ|8S~x(0Y_(>O-:OՒ`"WHJo͊MS[pHTpQt9eM'{+BLU78RA颺j=A3Ñ1[+MYiq!d`&Gql_!8 V@"~/LiKOtor%P~eƆzX] $P5=U/.Q5wչ:w-@+ԇl BokGa :=y=}ESk$X4REC7Kam[r@zӱ~_V+zq%Emv,3WedK)Beю Ta8*;PusKc8MQRԵi&؏7E%7e1Vť-2%gV5wے7 䆙lF$iRqф7Ջ8*׋K̍|XU)J jNSF Df1+}kOm&k'74C rU zm1F PJ/1@o |֣+N1Qadzq_PMO $+yNb8WtgIܵcQ*jb9__;KU<&*i#y\|Zlz}fٝ~7pN۹gSd1/2g;}#/)_W{x Fɿ=[tFsXW$c8n7b7Kgˡ"Ųdbqj˽/>K*-#f1$xT_M2E*jf4MbM$ot&kܭ+޵o묀ݪw8mۃğ&7IG }uuyqW-O 9e=ghӋh[ &{_jVēhy1s67<>l5 }oh>SC5K'C8, x}-Y,Np'@p'C'=Ll }Q䐣-:Hԫs΋}c Z]sR||FVkT:#mg/,HBfΧWvkϝav!f1,llXrᯖ>aqըzu.b[y1@_®5M4N3!b+ظ'=m6qi7ΙYbMozNh>َv̱?F(3Kmzzd1=o҄.,0_H~:<>bናƨ)c#ix~Tq1wlM+Ŗ)⋹'*Y}z|S}`%k(#'hMBJBЊY&1F.>8Bko]gl[mUfh*kq?Z-Fb˛}Fn\\;h_ˤa|q>;{8e-k6/ Q|O>1MOT5t=P"hk̵{˩N7W]Gݵ,=}O R7V <;CM5:l£qUf.OiP|uh$RD11Aˉo:cבr?-\ԏ_uLW&lX ő}ƣ?HсvVlަ.goZB 柛&|PJO^W׈rF0TOZH{9'6w.!R}FZu-CF\ Ov݃C7y}7t1`2GtVS5`'dㄏaH>ӸăKz[m~~y\bc߽+?$ UxT2KEG=ޯLcݧ8Ou\o/E&=h) =LSySdȕ7<5қkb9Rz<(e)o]Σzg %#;>#kCؽLq!d`&Gqс7 '}<<ުȜ8u҄0]IΤ>A"QʕBUrb'_HZ 7 zCaݔ )V&ho'7zi>0GUl\O?*哘c=bH u|niK,UnFqZ?;ONз27J~Zŕ#kxh\5/E;z'P H,7j`\Fvۖߨ.7f tiRqT7Ջ8*i|XU)J jNSF Df1+kOm&k'7=&HN]m7E<|ݶn-8Hؐy&fORz+W8-O{__Ec2Y>󛏹8o}7e"跰m_q5_@ɏ 'C 8O_\6 ,6#,>H-M+o? ΀a;} /x!~? rZ!tߦ1ppߗ؍h>`Zz7[X"ʄV $LO5𰜃Ϫx73+qAy+\֌~Pt+kmNX5_&&d@oɷBBbk N6;e$pǪ4@oJ8:l=pBq99?-2x0!q )^cbAqE%A]`͎M1)eP#qq#;=YcsHO{_ Zv YXlFujOZ83]EU|`wMbɁ>il޸_䫪R<2~ БS'dx]A@cW5.eQU`cw[oz nQbخoz[!8!ƾ3< T8Ԣ+ó^ʞjuD: 0Ѡ;y|6쪭J/'fxs+۶~x"<|c.שgP$֓F ̵N,è݄|Xk_n=|9o8r&S蟴7%IoFit]M9:tPgIK .s-e~BfU~odksZSg ڮޏ`k`NNΌSwS7u>92W V_wW7=6Ck6RWP9Ws*@R2%k.=al?k|.w, t<=au-NRѝ8=`Ṵz vh>f08=[֦p0%**w.h~td37wcͣZp>pASOs|0 ?ige»txv˼Abtũ yZs'ZW/TG>t"H7@RfOKUe:ۚ7.|=&ޝ4}qϖpq.)lK0(P: m'ԩdf&NŃp*CQ YX"wO,K҂O߷} |6i*5pz̴G+4%Uxt1@\dЯ3ݑb׳ÊWSn#>r ?rRoa0 [ǺZ·*n!np Ⱥ zaeb e{QlvK$W'GS CWZ1rAbԸMc?jL}A~yz-9y))*Է.CEIH=u ptzg?@K>p%#iQ=oWWUwO.2?TU)!@b~G}eZ[W3ԣl’I}N^BK{;OxȤߩSVgȺ?[z(GoˬC k=dy]m@~q,ߠ@UuMpZ.FyszBc(R2XVOzqyuGASMw@hJY.yCTfh-QUNfLo$hZ:yç_F&aՈ[rjj:zyF߃* ymmw{۝[RR*!rJnfz()7%4eRS]@(J 00rې^V=1du)۝ڵ14ȵ'sښztI7cVjjmaR4{NMAW>V=Q83wܳs B=IM/(:fpc=8!RJ3! @ Bww/ N1 W2o3ڰ@Cn"x!B蝀``0qORczSǼ[˞e߂ᇧw}G| 7B!-~ja˩)Bx55։̽+C>*|o hN{jmYWWw~:Xvr"aB! 8,@qH(,| Vl&&WA.0G{S/Zү~;^r=\?ޙi}8!BU )Qgz-C-`Aʬ^=gTEѓ#kr6{o|$rUyQiMzG/bX0@!zՌׂ{ZNĈ@2Ca6WUS?).:Jt. 7B!d?I p)MSLzmd'F^>>h7CEoX5' |o=ĦO z!ьʼn9l7B!Z4RaXXʀS) [|(޳D(ql e*?j(JdN?2YSB!5W^ĉ-P op]=31ѽdޅD/r(iq] ǚ n|^B!HTV{~c26j]p< n'c8hߏW~3"zt[l7BT??/'${[5Ipl|d9$pR,!K[kÙZ" lw-\DU>URS8?MH=tCvrv>J#4*jCtznħ=#QF~þjuY wv$Cwr]Asr&d;xA-= .t z|Ɯ_F_ײgsS3^xux"6?c=yl6J81~61>LZv=xl+q)OӉf5^1[yS{M-wCF21^=Łi} ]_l{=X)c&kۺphLչk#*aթY;iǻ~wlXBkTVŴqg)6пiYq3fãEt?uаk0lxucۗߏ F%:?Ns3dSR:o"7w`XJ豣M{\bE˯tǎRR&FHpr-~  ߭g\y Z6o$LjLyg|vK, BoG^{CZjV,fe=~ ;0*-m7ojeSt40'Nkn{Oq|۶;D;B$!\.!ŘMf Ufw.qč^Z@p4De =![9l[1ۜZح^Cx!FmYL*٘:3 XX:#>tG-$=wnƒ]FB[N]pl1eOW A#G;ϒ}S2CFv7dq즄e?iFq䜄AxrE qVlYr,d-9(|BojLZ!/r}!ga*gR\Z]i%cHEc Z}ǐomr+#\F҉ذc?-wmn\kzôO O Wg_z6Yin1taEE(%-H6[!yeoWW"ʘe#olL|phOOdu 1|e P,>o*'醷cWktBOtwKx#N>^h|Iue?Aђ#b<3EA/GwMUwBoWVO0s<osG&&+¿Uxt6Ѧ҂e,{ެJyx/Y]{+w~t=l*@UOhUX'z~`gx(̲U2 Or0+f맪9ZVr.2'CWѝ6*P\ JDUfξ9_R ~skDH5{FiK!ҷٮKamɍ?L>gr}FN5ҫOJ-H6exZx!Z7yB<\!Wkښ¬Ȁ1j># i?|9_¡>KtPber ._z_$ B}e@ ,L[ݕ7D*N{n~,y_Bt!Hj=.w=H7&Vvȍ pkezNwA#v,B33~=^ wJu\eHnB;= c4C͚o~c{~h*/́Ћ6wP f;k_GSw/BDuPX%]4(k蓤=g<B}6 N3(٥0shV*7ەw?)hf\sm?/»ԙ^TIɭ [[H-,|a5| 1/ #Pn+D&l5An0~ Ib6ӯ'Y}P O8+* Ҽ!gPKia0^ ߝOmzw!:4.+czOKEF~]g/٦Y“{>2e:E*b\m|f5>[zvLk0Hn2"%s}u󛊎79WYR[^X0#z|Q, ~.jG+:gܿz6֝Ĉ2j|%O$SbC2Pp-NoS%\ a4tB0o dg00h̀<)t>Gv {$Gy9țy?y]^سPoIXCQ s ezM~T?~_ / ι%''oJe|a xmPc(]`w۰N.앂o*Yut{hE%ϔ2si+=j_i jK>Bb<.vPpOM}#y!#o Ej_>:oPz8RSFmjx=p~q%Pmn%lT9dRǗ|n[Z½Ay!>?=7M_6Oᐾ A=옂}SVvAԈ>+!$-~-֌&I]-g>P% FjǤ0o j/uƐ'AHԧh$ǁ(߷Ofra~X0o ܼpp\PEeJʁ {r"HQ9"Kko,ڥ6'4(zs=&K<._䮿NcS*ytFVJ#Ol=^-f:&W\lpiF߭5oop ܧ;OcE0u݋>0 y!B@Q ùgυГtߪɧ[ ="#H4jV]JȿlR} DdFZC׸ا1f?ciۼ.o;ې$$I=CA3!w0dKȕS# :oyO^RJ^<ݧ=o}E9Y>'{Y %1=q~T\P}G( רawHyC$Bt:elЏdNMyGI:NK55Qo]0=cg, G(Sb]=O߭Kv1?L%}YKb=(;u\&z DxEwE VFcfJ$btb '׉6pq`KR83!ɗґamdr:, Kď& 3[f.H6$%"Mكb!I ITݐ޽ye-I I$I I$I I$I2oH$I2oH$I2oH$IyC$IyC$IyC$I$I޽G՘q̘˜jBn ab zFdZ8 v1IuR"Ii-Eej<٤ša|?篾>x}T uϹGf es;;M8:;<-(m 2ۄUlCF o7^*49[~E*'xDTwfY,ۜ 7J+̎oIj crqSkt`-B]s6ܩ3TMTu213!QZIѥ#1H# mdSFѹe+.l}yډM*6mա\! [t겔R;HzCק˨uX3)5QsqkuD?VPGhĿ6w@%vQy~c@G+@HHH%  zyy^~Q6z̹\p;';?pa Bjf5g:/֐o,V7,- *tȴs&Y[΋|\8e{V#?)PQ3,otqB!%}m~Gi4ޔiVgϺ(wyW{ 77ЎD K5|oz8Cp[[휹1w TTCW7b\byiS>Vkd!>BːW%Z(_&.rݾ;2jqtwr^UlkyC$>uúdQPw-o4z|6ΞmRC3ªKg]:tBIWcw)Wo +ț/>p&f%p!+•+E*NɝuqXn ߒt%##^#yqxV%4䍄%yņ~"~Hb}%_?}r+ټY) >y5 d*}ρk8Cc!D9- o>fdKZV᪥> wJwS^ư:dPF܆ZZ]^ptN>^qK\p50/7Nx jP)5S،p9(HM4UDUʞ&L6I,|qr`["h+9T\r\5CIKzQ6[ڔ~Va )#@ހvTg6gϳ͓C#J*jX83Ir` Å$ZA%.?@ h+œM-ةחĵT*%֟f_ M[Ί+_$9cdgjJ8?Tƒf"N}~$d:X6h1lc+% YP*%ֆnz9׽W;"f_yss8}N̫yCΏw_H!0o@q@_>ǍAgẓuw%)"urvя>5$0TD=pĻߩB  '`?yytx[јʇT$ V?wlFЁ+tT5~KZ+!y!TFjcPјplqo v~3F!P!!!}* SGkvy4>B!|8B.l!¼<5;59R _Fptղ | 8IZc@'&Ïh1G@;oP37>By=ÈJ9'[m+#Od$ Q 0dv6ʐ7.\~!FiGtفw6l a#?7OϽSf͸lxˇ%|x8@!B7ΨC-a FJQhFyv4"`hcBd],X3B:feq6U+ay4B!φ \J Yk7Oԕ7d.^(Gnp4&jm(T5^_PI3"6ĩ!{ mej~?%pF4 t.1Q@&c ,#ab40 p9{uy7\\Ҁj͜ܯeO9fm礪+fOKju/%Ie=k^ݮd}C*Dk.t _ _B!ysGoy?xkjN9@q%!Vk%?7qa5j:V@rga3Š AП;67%;yj.o^46tڞ+{'#z/-飭vl~1Iq8cڳ7לl31X7*kޤtk1kۭ(2vm8ڌ-1P޽,wėp^_Иf^HW G'm!Ndkq}C(B!¼]r2"4sO}H(hB- JteׯY._M%K}gLg'a fw{7^]o'4֥1!RUW,iHHkrPʿ8儠B=}kϏf`"uS/9)^ "ՇFՉ-hRllIJYwL:o#O!B7%KK?$oB.T0q'5}M KOH^ Fdʀ7rO - i+)uzu&}1ij£e~'$4B?F$f!tjXitsUyC>7'*_[5:[b? B!1i>A}PNw`yFNƥ3~7(,[BB\gy'K'>TyCM6+YH٣R(&}wgB\ !ivي.ʹZ:o[Yu37'f3"Ę7ʇkKW`s69SSI\biu BUL;}B =mGC'UKo8:o0ٷa?;6_>QSVy϶u#ug] ^Զ_eog^i@H8|!uO%}p,{;o#g'1ّ)הzMqs9H0|!Ciin|P99Ly!Bݼ1j(x#Us&q̪s Rp Fx5%F5!;3>:jLW;BH׃wޗ7 gBhg$kvPiǔ7cUʺAiRw2m֦/bnS Ύ_̲O)WJ^KTdDQ];kVz*o$xjgmdkX}??qv@!0;L$R1 )^>т$,aW?31h ;D6ѭVW~hw_N\ B,DVSChCj.zST ~,wn0ZݭsD10@vbV5;w|}_(U֣SR$n{o;x;oPM~e4Jħ6zFOot$`_v&iOؙ_y(1o-ppWi_~ϢW_޷ K% e{g 4mv2΍{\tm&oD}g[n7KNB 7(N>GScVgWKFSQk[\ILhhUCߛ-,5ΤJII1԰Ίzk4Bf٪DpR,hHnZ:m$EYv5%s(+[>)Q29L&oԝSg wN57'o PbrnleC'WfK ggFH-%>Y.Vc BS!Bb$烠P" LsD«=Uޠܖ^FxDhSeUx9FeE\cFf #N]FO]|:WByLwqE6% *xN05=,T4R/51rȚJ|%z^4&dbp`̶1'e+񝟭'~r L̛-cܥ=XcZ)A KSwfB,&ۤh*I/b^&͊ySj or;qumBٻO$b)Rb B.ɦH i5S(a&LjɆY(ȎΧagizno RQs>@S`ia^yrSzsӽ[őuzަ먅ʵJ.j̘fBˋ1js% V,Hv<^7"L2lYNqX%,~HdL7Ox;}yH+{!26lskHo_ [GUnn>/INgb#y` [2yw~9d Pfj.7)/a?N6cD'Dlst^slW.._4r짇?m,[aun^+td8'גi Tx?'@o<7֯_ob'Dd ңfk}x>2*Kև{ޘdc׿ # s IL 3'Fs[q^tCU2?1FN|Tto\kԎ{L1$ д֜( S;xMZ"eӣB ג{umZ7m7oRK(T,ji>yJԬ5#cH5VKu/J\^w 7{+bkvvwssysY12D#J31;h0ːoL. Ryw7|C S}+<7n.R}~w<{\ ?SI]fN ~NgE~稦6sqČ 7JOYJ?~WL>WO a$m|bbE0׋)ЫfގI /ڙm xXb&Vy+5}+/Sœ6k\veXn% }ܡB DXohZ^=u~9i귩S|-?vy''խp]mnc|u8V i C`>E @o\v&Kp̑y9S?O0*7+L9Pfsy4:K] \>$V7MVw֪%I  [AtIENDB`Path-IsDev-1.001002/layout/self_structure.dot0000644000175000017500000002766312373560357017454 0ustar kentkentstrict digraph Perl { graph [compound=1, concentrate=1, overlap=false, rankdir=LR, ranksep=1, smoothing=triangle, splines=spline]; node [label="\N", shape=record, style=dotted]; edge [minlen=1]; "Class::Tiny::Object" [label="Class::Tiny::Object"]; "Path::IsDev" [label="Path::IsDev"]; "Path::IsDev::Heuristic::Changelog" [label="Path::IsDev::Heuristic::Changelog", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; "Path::IsDev::Heuristic::DevDirMarker" [label="Path::IsDev::Heuristic::DevDirMarker", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; "Path::IsDev::Heuristic::META" [label="Path::IsDev::Heuristic::META", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; "Path::IsDev::Heuristic::MYMETA" [label="Path::IsDev::Heuristic::MYMETA", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; "Path::IsDev::Heuristic::Makefile" [label="Path::IsDev::Heuristic::Makefile", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; "Path::IsDev::Heuristic::TestDir" [label="Path::IsDev::Heuristic::TestDir", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; "Path::IsDev::Heuristic::Tool::Dzil" [label="Path::IsDev::Heuristic::Tool::Dzil", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; "Path::IsDev::Heuristic::Tool::MakeMaker" [label="Path::IsDev::Heuristic::Tool::MakeMaker", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; "Path::IsDev::Heuristic::Tool::ModuleBuild" [label="Path::IsDev::Heuristic::Tool::ModuleBuild", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; "Path::IsDev::Heuristic::VCS::Git" [label="Path::IsDev::Heuristic::VCS::Git", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; "Path::IsDev::HeuristicSet::Basic" [label="Path::IsDev::HeuristicSet::Basic", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; "Path::IsDev::NegativeHeuristic::HomeDir" [label="Path::IsDev::NegativeHeuristic::HomeDir", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; "Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile" [label="Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; "Path::IsDev::NegativeHeuristic::PerlINC" [label="Path::IsDev::NegativeHeuristic::PerlINC", shape=Mrecord, style=solid, color="#0343df", fontsize=7, height="0.1"]; "Path::IsDev::Object" [label="Path::IsDev::Object", shape=Mrecord, style=solid, color="#7e1e9c", fontsize=7, height="0.1"]; "Path::IsDev::Result" [label="Path::IsDev::Result", shape=Mrecord, style=solid, color="#7e1e9c", fontsize=7, height="0.1"]; "Path::IsDev::Role::Heuristic" [label="Path::IsDev::Role::Heuristic", shape=Mrecord, style=solid, color="#15b01a", fontsize=7, height="0.1"]; "Path::IsDev::Role::HeuristicSet" [label="Path::IsDev::Role::HeuristicSet", shape=Mrecord, style=solid, color="#15b01a", fontsize=7, height="0.1"]; "Path::IsDev::Role::HeuristicSet::Simple" [label="Path::IsDev::Role::HeuristicSet::Simple", shape=Mrecord, style=solid, color="#15b01a", fontsize=7, height="0.1"]; "Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp" [label="Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp", shape=Mrecord, style=solid, color="#15b01a", fontsize=7, height="0.1"]; "Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp::File" [label="Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp::File", shape=Mrecord, style=solid, color="#15b01a", fontsize=7, height="0.1"]; "Path::IsDev::Role::Matcher::Child::Exists::Any" [label="Path::IsDev::Role::Matcher::Child::Exists::Any", shape=Mrecord, style=solid, color="#15b01a", fontsize=7, height="0.1"]; "Path::IsDev::Role::Matcher::Child::Exists::Any::Dir" [label="Path::IsDev::Role::Matcher::Child::Exists::Any::Dir", shape=Mrecord, style=solid, color="#15b01a", fontsize=7, height="0.1"]; "Path::IsDev::Role::Matcher::Child::Exists::Any::File" [label="Path::IsDev::Role::Matcher::Child::Exists::Any::File", shape=Mrecord, style=solid, color="#15b01a", fontsize=7, height="0.1"]; "Path::IsDev::Role::Matcher::FullPath::Is::Any" [label="Path::IsDev::Role::Matcher::FullPath::Is::Any", shape=Mrecord, style=solid, color="#15b01a", fontsize=7, height="0.1"]; "Path::IsDev::Role::NegativeHeuristic" [label="Path::IsDev::Role::NegativeHeuristic", shape=Mrecord, style=solid, color="#15b01a", fontsize=7, height="0.1"]; "Class::Tiny::Object" -> "Path::IsDev::Object" [arrowhead=open, arrowsize="0.5", color="#ff81c0", dir=forward, fontsize=6, headclip=1, label="inherited by", samehead=head, tailclip=1, weight=10]; "Class::Tiny::Object" -> "Path::IsDev::Result" [arrowhead=open, arrowsize="0.5", color="#ff81c0", dir=forward, fontsize=6, headclip=1, label="inherited by", samehead=head, tailclip=1, weight=10]; "Path::IsDev::Role::Heuristic" -> "Path::IsDev::Heuristic::Changelog" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp::File" -> "Path::IsDev::Heuristic::Changelog" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::Heuristic" -> "Path::IsDev::Heuristic::DevDirMarker" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::Matcher::Child::Exists::Any::File" -> "Path::IsDev::Heuristic::DevDirMarker" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::Heuristic" -> "Path::IsDev::Heuristic::META" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::Matcher::Child::Exists::Any::File" -> "Path::IsDev::Heuristic::META" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::Heuristic" -> "Path::IsDev::Heuristic::MYMETA" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::Matcher::Child::Exists::Any::File" -> "Path::IsDev::Heuristic::MYMETA" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::Heuristic" -> "Path::IsDev::Heuristic::Makefile" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::Matcher::Child::Exists::Any::File" -> "Path::IsDev::Heuristic::Makefile" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::Heuristic" -> "Path::IsDev::Heuristic::TestDir" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::Matcher::Child::Exists::Any::Dir" -> "Path::IsDev::Heuristic::TestDir" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::HeuristicSet::Simple" -> "Path::IsDev::HeuristicSet::Basic" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::NegativeHeuristic" -> "Path::IsDev::NegativeHeuristic::HomeDir" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::Matcher::FullPath::Is::Any" -> "Path::IsDev::NegativeHeuristic::HomeDir" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::NegativeHeuristic" -> "Path::IsDev::NegativeHeuristic::PerlINC" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::Matcher::FullPath::Is::Any" -> "Path::IsDev::NegativeHeuristic::PerlINC" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::Heuristic" -> "Path::IsDev::Heuristic::Tool::Dzil" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::Matcher::Child::Exists::Any::File" -> "Path::IsDev::Heuristic::Tool::Dzil" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::Heuristic" -> "Path::IsDev::Heuristic::Tool::MakeMaker" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::Matcher::Child::Exists::Any::File" -> "Path::IsDev::Heuristic::Tool::MakeMaker" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::Heuristic" -> "Path::IsDev::Heuristic::Tool::ModuleBuild" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::Matcher::Child::Exists::Any::File" -> "Path::IsDev::Heuristic::Tool::ModuleBuild" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::Heuristic" -> "Path::IsDev::Heuristic::VCS::Git" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::Matcher::Child::Exists::Any::Dir" -> "Path::IsDev::Heuristic::VCS::Git" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::NegativeHeuristic" -> "Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::Matcher::Child::Exists::Any::File" -> "Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::HeuristicSet" -> "Path::IsDev::Role::HeuristicSet::Simple" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp" -> "Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp::File" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::Matcher::Child::Exists::Any" -> "Path::IsDev::Role::Matcher::Child::Exists::Any::Dir" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; "Path::IsDev::Role::Matcher::Child::Exists::Any" -> "Path::IsDev::Role::Matcher::Child::Exists::Any::File" [arrowhead=open, arrowsize="0.5", color="#653700", dir=forward, fontsize=6, headclip=1, label="consumed by", samehead=head, tailclip=1, weight=5]; } Path-IsDev-1.001002/META.yml0000644000175000017500000005535512373560357013626 0ustar kentkent--- abstract: 'Determine if a given Path resembles a development source tree' author: - 'Kent Fredric ' build_requires: ExtUtils::MakeMaker: '0' File::Spec: '0' File::Temp: '0' FindBin: '0' Test::Fatal: '0' Test::More: '0.89' configure_requires: ExtUtils::MakeMaker: '0' dynamic_config: '0' generated_by: 'Dist::Zilla version 5.020, CPAN::Meta::Converter version 2.142060' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: '1.4' name: Path-IsDev provides: Path::IsDev: file: lib/Path/IsDev.pm version: '1.001002' Path::IsDev::Heuristic::Changelog: file: lib/Path/IsDev/Heuristic/Changelog.pm version: '1.001002' Path::IsDev::Heuristic::DevDirMarker: file: lib/Path/IsDev/Heuristic/DevDirMarker.pm version: '1.001002' Path::IsDev::Heuristic::META: file: lib/Path/IsDev/Heuristic/META.pm version: '1.001002' Path::IsDev::Heuristic::MYMETA: file: lib/Path/IsDev/Heuristic/MYMETA.pm version: '1.001002' Path::IsDev::Heuristic::Makefile: file: lib/Path/IsDev/Heuristic/Makefile.pm version: '1.001002' Path::IsDev::Heuristic::TestDir: file: lib/Path/IsDev/Heuristic/TestDir.pm version: '1.001002' Path::IsDev::Heuristic::Tool::Dzil: file: lib/Path/IsDev/Heuristic/Tool/Dzil.pm version: '1.001002' Path::IsDev::Heuristic::Tool::MakeMaker: file: lib/Path/IsDev/Heuristic/Tool/MakeMaker.pm version: '1.001002' Path::IsDev::Heuristic::Tool::ModuleBuild: file: lib/Path/IsDev/Heuristic/Tool/ModuleBuild.pm version: '1.001002' Path::IsDev::Heuristic::VCS::Git: file: lib/Path/IsDev/Heuristic/VCS/Git.pm version: '1.001002' Path::IsDev::HeuristicSet::Basic: file: lib/Path/IsDev/HeuristicSet/Basic.pm version: '1.001002' Path::IsDev::NegativeHeuristic::HomeDir: file: lib/Path/IsDev/NegativeHeuristic/HomeDir.pm version: '1.001002' Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile: file: lib/Path/IsDev/NegativeHeuristic/IsDev/IgnoreFile.pm version: '1.001002' Path::IsDev::NegativeHeuristic::PerlINC: file: lib/Path/IsDev/NegativeHeuristic/PerlINC.pm version: '1.001002' Path::IsDev::Object: file: lib/Path/IsDev/Object.pm version: '1.001002' Path::IsDev::Result: file: lib/Path/IsDev/Result.pm version: '1.001002' Path::IsDev::Role::Heuristic: file: lib/Path/IsDev/Role/Heuristic.pm version: '1.001002' Path::IsDev::Role::HeuristicSet: file: lib/Path/IsDev/Role/HeuristicSet.pm version: '1.001002' Path::IsDev::Role::HeuristicSet::Simple: file: lib/Path/IsDev/Role/HeuristicSet/Simple.pm version: '1.001002' Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp: file: lib/Path/IsDev/Role/Matcher/Child/BaseName/MatchRegexp.pm version: '1.001002' Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp::File: file: lib/Path/IsDev/Role/Matcher/Child/BaseName/MatchRegexp/File.pm version: '1.001002' Path::IsDev::Role::Matcher::Child::Exists::Any: file: lib/Path/IsDev/Role/Matcher/Child/Exists/Any.pm version: '1.001002' Path::IsDev::Role::Matcher::Child::Exists::Any::Dir: file: lib/Path/IsDev/Role/Matcher/Child/Exists/Any/Dir.pm version: '1.001002' Path::IsDev::Role::Matcher::Child::Exists::Any::File: file: lib/Path/IsDev/Role/Matcher/Child/Exists/Any/File.pm version: '1.001002' Path::IsDev::Role::Matcher::FullPath::Is::Any: file: lib/Path/IsDev/Role/Matcher/FullPath/Is/Any.pm version: '1.001002' Path::IsDev::Role::NegativeHeuristic: file: lib/Path/IsDev/Role/NegativeHeuristic.pm version: '1.001002' requires: Carp: '0' Class::Tiny: '0.010' File::HomeDir: '0' Module::Runtime: '0' Path::Tiny: '0.004' Role::Tiny: '0' Role::Tiny::With: '0' Scalar::Util: '0' Sub::Exporter: '0' perl: '5.008' strict: '0' utf8: '0' warnings: '0' resources: bugtracker: https://github.com/kentnl/Path-IsDev/issues homepage: https://github.com/kentnl/Path-IsDev repository: https://github.com/kentnl/Path-IsDev.git version: '1.001002' x_BuiltWith: modules: CPAN::Meta: '2.142060' Carp: '1.34' Class::Tiny: '1.000' Dist::Zilla::App::Command::bakeini: '0.001001' Dist::Zilla::Plugin::Authority: '1.006' Dist::Zilla::Plugin::AutoPrereqs: '5.020' Dist::Zilla::Plugin::BumpVersionAfterRelease: '0.002' Dist::Zilla::Plugin::ConfirmRelease: '5.020' Dist::Zilla::Plugin::CopyFilesFromBuild: '0.103510' Dist::Zilla::Plugin::EOLTests: '0.02' Dist::Zilla::Plugin::Git::Check: '2.023' Dist::Zilla::Plugin::Git::Commit: '2.023' Dist::Zilla::Plugin::Git::CommitBuild: '2.023' Dist::Zilla::Plugin::Git::Contributors: '0.006' Dist::Zilla::Plugin::Git::GatherDir: '2.023' Dist::Zilla::Plugin::Git::NextRelease: '0.002012' Dist::Zilla::Plugin::Git::Tag: '2.023' Dist::Zilla::Plugin::GithubMeta: '0.46' Dist::Zilla::Plugin::License: '5.020' Dist::Zilla::Plugin::MakeMaker: '5.020' Dist::Zilla::Plugin::Manifest: '5.020' Dist::Zilla::Plugin::ManifestSkip: '5.020' Dist::Zilla::Plugin::MetaConfig: '5.020' Dist::Zilla::Plugin::MetaData::BuiltWith: '1.001001' Dist::Zilla::Plugin::MetaJSON: '5.020' Dist::Zilla::Plugin::MetaProvides::Package: '2.000004' Dist::Zilla::Plugin::MetaTests: '5.020' Dist::Zilla::Plugin::MetaYAML: '5.020' Dist::Zilla::Plugin::MinimumPerl: '1.003' Dist::Zilla::Plugin::PodCoverageTests: '5.020' Dist::Zilla::Plugin::PodSyntaxTests: '5.020' Dist::Zilla::Plugin::PodWeaver: '4.005' Dist::Zilla::Plugin::Prereqs: '5.020' Dist::Zilla::Plugin::Prereqs::Recommend::MatchInstalled: '0.002001' Dist::Zilla::Plugin::ReadmeAnyFromPod: '0.142250' Dist::Zilla::Plugin::ReadmeFromPod: '0.21' Dist::Zilla::Plugin::RewriteVersion::Sanitized: '0.001003' Dist::Zilla::Plugin::RunExtraTests: '0.022' Dist::Zilla::Plugin::Test::CPAN::Changes: '0.008' Dist::Zilla::Plugin::Test::Compile::PerFile: '0.002002' Dist::Zilla::Plugin::Test::Kwalitee: '2.07' Dist::Zilla::Plugin::Test::MinimumVersion: '2.000005' Dist::Zilla::Plugin::Test::Perl::Critic: '2.112410' Dist::Zilla::Plugin::Test::ReportPrereqs: '0.019' Dist::Zilla::Plugin::TestRelease: '5.020' Dist::Zilla::Plugin::Twitter: '0.025' Dist::Zilla::Plugin::UploadToCPAN: '5.020' Dist::Zilla::PluginBundle::Author::KENTNL: '2.017002' ExtUtils::MakeMaker: '6.98' File::HomeDir: '1.00' File::Spec: '3.48' File::Temp: '0.2304' FindBin: '1.51' Module::Runtime: '0.014' Path::Tiny: '0.056' Pod::Coverage::TrustPod: '0.100003' Role::Tiny: '1.003003' Role::Tiny::With: '1.003003' Scalar::Util: '1.39' Sub::Exporter: '0.987' Test::CPAN::Changes: '0.30' Test::CPAN::Meta: '0.23' Test::Fatal: '0.013' Test::Kwalitee: '1.22' Test::More: '1.001003' Test::Pod: '1.48' Test::Pod::Coverage: '1.10' strict: '1.08' utf8: '1.14' warnings: '1.24' perl: original: v5.21.1 qv: 1 version: - 5 - 21 - 1 perl-config: gccversion: 4.8.3 myarchname: x86_64-linux osname: linux platform: linux uname: 'Linux 3.15.5-aufs x86_64 GenuineIntel GNU/Linux' x_Dist_Zilla: perl: version: '5.021001' plugins: - class: Dist::Zilla::Plugin::MetaConfig name: '@Author::KENTNL/MetaConfig' version: '5.020' - class: Dist::Zilla::Plugin::GithubMeta name: '@Author::KENTNL/GithubMeta' version: '0.46' - class: Dist::Zilla::Plugin::MetaProvides::Package config: Dist::Zilla::Plugin::MetaProvides::Package: finder_objects: - class: Dist::Zilla::Plugin::FinderCode name: '@Author::KENTNL/MetaProvides::Package/AUTOVIV/:InstallModulesPM' version: '5.020' Dist::Zilla::Role::MetaProvider::Provider: inherit_missing: '1' inherit_version: '1' meta_noindex: '1' name: '@Author::KENTNL/MetaProvides::Package' version: '2.000004' - class: Dist::Zilla::Plugin::MetaData::BuiltWith config: Dist::Zilla::Plugin::MetaData::BuiltWith: _stash_key: x_BuiltWith show_config: '1' show_uname: '1' uname: uname_args: - -s - -o - -r - -m - -i uname_call: uname name: '@Author::KENTNL/MetaData::BuiltWith' version: '1.001001' - class: Dist::Zilla::Plugin::Git::Contributors config: Dist::Zilla::Plugin::Git::Contributors: include_authors: '0' include_releaser: '0' order_by: name name: '@Author::KENTNL/Git::Contributors' version: '0.006' - class: Dist::Zilla::Plugin::Git::GatherDir config: Dist::Zilla::Plugin::Git::GatherDir: include_untracked: '0' Dist::Zilla::Role::Git::Repo: repo_root: . name: '@Author::KENTNL/Git::GatherDir' version: '2.023' - class: Dist::Zilla::Plugin::License name: '@Author::KENTNL/License' version: '5.020' - class: Dist::Zilla::Plugin::MetaJSON name: '@Author::KENTNL/MetaJSON' version: '5.020' - class: Dist::Zilla::Plugin::MetaYAML name: '@Author::KENTNL/MetaYAML' version: '5.020' - class: Dist::Zilla::Plugin::Manifest name: '@Author::KENTNL/Manifest' version: '5.020' - class: Dist::Zilla::Plugin::CopyFilesFromBuild name: '@Author::KENTNL/CopyXBuild' version: '0.103510' - class: Dist::Zilla::Plugin::MetaTests name: '@Author::KENTNL/MetaTests' version: '5.020' - class: Dist::Zilla::Plugin::PodCoverageTests name: '@Author::KENTNL/PodCoverageTests' version: '5.020' - class: Dist::Zilla::Plugin::PodSyntaxTests name: '@Author::KENTNL/PodSyntaxTests' version: '5.020' - class: Dist::Zilla::Plugin::Test::ReportPrereqs name: '@Author::KENTNL/Test::ReportPrereqs' version: '0.019' - class: Dist::Zilla::Plugin::Test::Kwalitee name: '@Author::KENTNL/Test::Kwalitee' version: '2.07' - class: Dist::Zilla::Plugin::EOLTests name: '@Author::KENTNL/EOLTests' version: '0.02' - class: Dist::Zilla::Plugin::Test::MinimumVersion name: '@Author::KENTNL/Test::MinimumVersion' version: '2.000005' - class: Dist::Zilla::Plugin::FinderCode name: '@Author::KENTNL/Test::Compile::PerFile/AUTOVIV/:InstallModulesPM' version: '5.020' - class: Dist::Zilla::Plugin::Test::Compile::PerFile config: Dist::Zilla::Plugin::Test::Compile::PerFile: file: - lib/Path/IsDev.pm - lib/Path/IsDev/Heuristic/Changelog.pm - lib/Path/IsDev/Heuristic/DevDirMarker.pm - lib/Path/IsDev/Heuristic/META.pm - lib/Path/IsDev/Heuristic/MYMETA.pm - lib/Path/IsDev/Heuristic/Makefile.pm - lib/Path/IsDev/Heuristic/TestDir.pm - lib/Path/IsDev/Heuristic/Tool/Dzil.pm - lib/Path/IsDev/Heuristic/Tool/MakeMaker.pm - lib/Path/IsDev/Heuristic/Tool/ModuleBuild.pm - lib/Path/IsDev/Heuristic/VCS/Git.pm - lib/Path/IsDev/HeuristicSet/Basic.pm - lib/Path/IsDev/NegativeHeuristic/HomeDir.pm - lib/Path/IsDev/NegativeHeuristic/IsDev/IgnoreFile.pm - lib/Path/IsDev/NegativeHeuristic/PerlINC.pm - lib/Path/IsDev/Object.pm - lib/Path/IsDev/Result.pm - lib/Path/IsDev/Role/Heuristic.pm - lib/Path/IsDev/Role/HeuristicSet.pm - lib/Path/IsDev/Role/HeuristicSet/Simple.pm - lib/Path/IsDev/Role/Matcher/Child/BaseName/MatchRegexp.pm - lib/Path/IsDev/Role/Matcher/Child/BaseName/MatchRegexp/File.pm - lib/Path/IsDev/Role/Matcher/Child/Exists/Any.pm - lib/Path/IsDev/Role/Matcher/Child/Exists/Any/Dir.pm - lib/Path/IsDev/Role/Matcher/Child/Exists/Any/File.pm - lib/Path/IsDev/Role/Matcher/FullPath/Is/Any.pm - lib/Path/IsDev/Role/NegativeHeuristic.pm path_translator: base64_filter prefix: t/00-compile skip: [] test_template: 01-basic.t.tpl xt_mode: ~ name: '@Author::KENTNL/Test::Compile::PerFile' version: '0.002002' - class: Dist::Zilla::Plugin::Test::Perl::Critic name: '@Author::KENTNL/Test::Perl::Critic' version: '2.112410' - class: Dist::Zilla::Plugin::ManifestSkip name: '@Author::KENTNL/ManifestSkip' version: '5.020' - class: Dist::Zilla::Plugin::RewriteVersion::Sanitized config: Dist::Zilla::Role::Version::Sanitize: mantissa: '6' normal_form: numify name: '@Author::KENTNL/RewriteVersion::Sanitized' version: '0.001003' - class: Dist::Zilla::Plugin::PodWeaver config: Dist::Zilla::Plugin::PodWeaver: finder: - ':InstallModules' - ':ExecFiles' plugins: - class: Pod::Weaver::Plugin::EnsurePod5 name: '@CorePrep/EnsurePod5' version: '4.006' - class: Pod::Weaver::Plugin::H1Nester name: '@CorePrep/H1Nester' version: '4.006' - class: Pod::Weaver::Plugin::SingleEncoding name: -SingleEncoding version: '4.006' - class: Pod::Weaver::Section::Name name: Name version: '4.006' - class: Pod::Weaver::Section::Version name: Version version: '4.006' - class: Pod::Weaver::Section::Region name: prelude version: '4.006' - class: Pod::Weaver::Section::Generic name: SYNOPSIS version: '4.006' - class: Pod::Weaver::Section::Generic name: DESCRIPTION version: '4.006' - class: Pod::Weaver::Section::Generic name: OVERVIEW version: '4.006' - class: Pod::Weaver::Section::Collect name: REQUIRES version: '4.006' - class: Pod::Weaver::Section::Collect name: METHODS version: '4.006' - class: Pod::Weaver::Section::Collect name: FUNCTIONS version: '4.006' - class: Pod::Weaver::Section::Collect name: ATTRIBUTES version: '4.006' - class: Pod::Weaver::Section::Collect name: PRIVATE_ATTRIBUTES version: '4.006' - class: Pod::Weaver::Section::Collect name: PRIVATE_METHODS version: '4.006' - class: Pod::Weaver::Section::Leftovers name: Leftovers version: '4.006' - class: Pod::Weaver::Section::Region name: postlude version: '4.006' - class: Pod::Weaver::Section::Authors name: Authors version: '4.006' - class: Pod::Weaver::Section::Legal name: Legal version: '4.006' name: '@Author::KENTNL/PodWeaver' version: '4.005' - class: Dist::Zilla::Plugin::AutoPrereqs name: '@Author::KENTNL/AutoPrereqs' version: '5.020' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: develop type: suggests name: '@Author::KENTNL/BundleDevelSuggests' version: '5.020' - class: Dist::Zilla::Plugin::MinimumPerl name: '@Author::KENTNL/MinimumPerl' version: '1.003' - class: Dist::Zilla::Plugin::Authority name: '@Author::KENTNL/Authority' version: '1.006' - class: Dist::Zilla::Plugin::MakeMaker config: Dist::Zilla::Role::TestRunner: default_jobs: '10' name: '@Author::KENTNL/MakeMaker' version: '5.020' - class: Dist::Zilla::Plugin::ReadmeFromPod name: '@Author::KENTNL/ReadmeFromPod' version: '0.21' - class: Dist::Zilla::Plugin::ReadmeAnyFromPod name: '@Author::KENTNL/ReadmeAnyFromPod' version: '0.142250' - class: Dist::Zilla::Plugin::Test::CPAN::Changes name: '@Author::KENTNL/Test::CPAN::Changes' version: '0.008' - class: Dist::Zilla::Plugin::RunExtraTests config: Dist::Zilla::Role::TestRunner: default_jobs: '10' name: '@Author::KENTNL/RunExtraTests' version: '0.022' - class: Dist::Zilla::Plugin::TestRelease name: '@Author::KENTNL/TestRelease' version: '5.020' - class: Dist::Zilla::Plugin::ConfirmRelease name: '@Author::KENTNL/ConfirmRelease' version: '5.020' - class: Dist::Zilla::Plugin::Git::Check config: Dist::Zilla::Plugin::Git::Check: untracked_files: die Dist::Zilla::Role::Git::DirtyFiles: allow_dirty: - dist.ini - Changes allow_dirty_match: [] changelog: Changes Dist::Zilla::Role::Git::Repo: repo_root: . name: '@Author::KENTNL/Git::Check' version: '2.023' - class: Dist::Zilla::Plugin::Git::Commit config: Dist::Zilla::Plugin::Git::Commit: add_files_in: [] commit_msg: v%v%n%n%c time_zone: local Dist::Zilla::Role::Git::DirtyFiles: allow_dirty: - dist.ini - Changes allow_dirty_match: [] changelog: Changes Dist::Zilla::Role::Git::Repo: repo_root: . name: '@Author::KENTNL/commit_dirty_files' version: '2.023' - class: Dist::Zilla::Plugin::Git::Tag config: Dist::Zilla::Plugin::Git::Tag: branch: ~ signed: '0' tag: 1.001002-source tag_format: '%v-source' tag_message: v%v time_zone: local Dist::Zilla::Role::Git::Repo: repo_root: . name: '@Author::KENTNL/tag_master' version: '2.023' - class: Dist::Zilla::Plugin::Git::NextRelease name: '@Author::KENTNL/Git::NextRelease' version: '0.002012' - class: Dist::Zilla::Plugin::BumpVersionAfterRelease name: '@Author::KENTNL/BumpVersionAfterRelease' version: '0.002' - class: Dist::Zilla::Plugin::Git::Commit config: Dist::Zilla::Plugin::Git::Commit: add_files_in: [] commit_msg: v%v%n%n%c time_zone: local Dist::Zilla::Role::Git::DirtyFiles: allow_dirty: - dist.ini - Changes allow_dirty_match: - (?^u:^lib/) changelog: Changes Dist::Zilla::Role::Git::Repo: repo_root: . name: '@Author::KENTNL/commit_release_changes' version: '2.023' - class: Dist::Zilla::Plugin::Git::CommitBuild config: Dist::Zilla::Plugin::Git::CommitBuild: branch: build/%b build_root: ~ message: 'Build results of %h (on %b)' multiple_inheritance: '0' release_branch: releases release_message: 'Build results of %h (on %b)' Dist::Zilla::Role::Git::Repo: repo_root: . name: '@Author::KENTNL/Git::CommitBuild' version: '2.023' - class: Dist::Zilla::Plugin::Git::Tag config: Dist::Zilla::Plugin::Git::Tag: branch: releases signed: '0' tag: '1.001002' tag_format: '%v' tag_message: v%v time_zone: local Dist::Zilla::Role::Git::Repo: repo_root: . name: '@Author::KENTNL/tag_release' version: '2.023' - class: Dist::Zilla::Plugin::UploadToCPAN name: '@Author::KENTNL/UploadToCPAN' version: '5.020' - class: Dist::Zilla::Plugin::Twitter name: '@Author::KENTNL/Twitter' version: '0.025' - class: Dist::Zilla::Plugin::Prereqs::Recommend::MatchInstalled config: Dist::Zilla::Plugin::Prereqs::Recommend::MatchInstalled: applyto_map: - 'build.requires = build.recommends' - 'test.requires = test.recommends' - 'runtime.requires = runtime.recommends' - 'configure.requires = configure.recommends' - 'develop.requires = develop.recommends' applyto_phase: - build - test - runtime - configure - develop modules: - ExtUtils::MakeMaker - Test::More name: '@Author::KENTNL/Prereqs::Recommend::MatchInstalled' version: '0.002001' - class: Dist::Zilla::Plugin::Prereqs::Recommend::MatchInstalled config: Dist::Zilla::Plugin::Prereqs::Recommend::MatchInstalled: applyto_map: - 'develop.suggests = develop.suggests' applyto_phase: - develop modules: - Dist::Zilla::PluginBundle::Author::KENTNL - Dist::Zilla::App::Command::bakeini name: '@Author::KENTNL/always_latest_develop_bundle' version: '0.002001' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: develop type: requires name: '@Author::KENTNL/::Role::BundleDeps' version: '5.020' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: runtime type: requires name: Prereqs version: '5.020' - class: Dist::Zilla::Plugin::FinderCode name: ':InstallModules' version: '5.020' - class: Dist::Zilla::Plugin::FinderCode name: ':IncModules' version: '5.020' - class: Dist::Zilla::Plugin::FinderCode name: ':TestFiles' version: '5.020' - class: Dist::Zilla::Plugin::FinderCode name: ':ExecFiles' version: '5.020' - class: Dist::Zilla::Plugin::FinderCode name: ':ShareFiles' version: '5.020' - class: Dist::Zilla::Plugin::FinderCode name: ':MainModule' version: '5.020' - class: Dist::Zilla::Plugin::FinderCode name: ':AllFiles' version: '5.020' - class: Dist::Zilla::Plugin::FinderCode name: ':NoFiles' version: '5.020' - class: Dist::Zilla::Plugin::FinderCode name: '@Author::KENTNL/MetaProvides::Package/AUTOVIV/:InstallModulesPM' version: '5.020' zilla: class: Dist::Zilla::Dist::Builder config: is_trial: '0' version: '5.020' x_authority: cpan:KENTNL Path-IsDev-1.001002/perlcritic.rc0000644000175000017500000002275612373560357015042 0ustar kentkentcolor = 1 color-severity-low = green color-severity-medium = yellow only = 1 severity = 1 verbose = 9 [Bangs::ProhibitBitwiseOperators] [Bangs::ProhibitCommentedOutCode] [Bangs::ProhibitDebuggingModules] [-Bangs::ProhibitFlagComments] [Bangs::ProhibitNoPlan] [Bangs::ProhibitNumberedNames] [Bangs::ProhibitRefProtoOrProto] [Bangs::ProhibitUselessRegexModifiers] [Bangs::ProhibitVagueNames] [BuiltinFunctions::ProhibitBooleanGrep] [BuiltinFunctions::ProhibitComplexMappings] [BuiltinFunctions::ProhibitLvalueSubstr] [BuiltinFunctions::ProhibitReverseSortBlock] [BuiltinFunctions::ProhibitSleepViaSelect] [BuiltinFunctions::ProhibitStringyEval] allow_includes = 1 [BuiltinFunctions::ProhibitStringySplit] [BuiltinFunctions::ProhibitUniversalCan] [BuiltinFunctions::ProhibitUniversalIsa] [BuiltinFunctions::ProhibitVoidGrep] [BuiltinFunctions::ProhibitVoidMap] [BuiltinFunctions::RequireBlockGrep] [BuiltinFunctions::RequireBlockMap] [BuiltinFunctions::RequireGlobFunction] [BuiltinFunctions::RequireSimpleSortBlock] [ClassHierarchies::ProhibitAutoloading] [ClassHierarchies::ProhibitExplicitISA] [ClassHierarchies::ProhibitOneArgBless] [CodeLayout::ProhibitFatCommaNewline] [CodeLayout::ProhibitHardTabs] [-CodeLayout::ProhibitHashBarewords] [CodeLayout::ProhibitIfIfSameLine] [CodeLayout::ProhibitParensWithBuiltins] [CodeLayout::ProhibitQuotedWordLists] [CodeLayout::ProhibitTrailingWhitespace] [-CodeLayout::RequireASCII] [CodeLayout::RequireConsistentNewlines] [CodeLayout::RequireFinalSemicolon] [-CodeLayout::RequireTidyCode] [CodeLayout::RequireTrailingCommaAtNewline] [CodeLayout::RequireTrailingCommas] [CodeLayout::RequireUseUTF8] [Compatibility::ConstantLeadingUnderscore] [Compatibility::ConstantPragmaHash] [Compatibility::Gtk2Constants] [Compatibility::PerlMinimumVersionAndWhy] [-Compatibility::PodMinimumVersion] [Compatibility::ProhibitThreeArgumentOpen] [Compatibility::ProhibitUnixDevNull] [ControlStructures::ProhibitCStyleForLoops] [ControlStructures::ProhibitCascadingIfElse] [ControlStructures::ProhibitDeepNests] [ControlStructures::ProhibitLabelsWithSpecialBlockNames] [ControlStructures::ProhibitMutatingListFunctions] [ControlStructures::ProhibitNegativeExpressionsInUnlessAndUntilConditions] [-ControlStructures::ProhibitPostfixControls] [ControlStructures::ProhibitUnlessBlocks] [ControlStructures::ProhibitUnreachableCode] [ControlStructures::ProhibitUntilBlocks] [Documentation::PodSpelling] spell_command = aspell list --lang en_US stop_words = Changelog Config IsDev Makefile accessor accessors basename behaviours devdir introspectable pluggable [Documentation::ProhibitAdjacentLinks] [Documentation::ProhibitBadAproposMarkup] [Documentation::ProhibitDuplicateHeadings] [Documentation::ProhibitDuplicateSeeAlso] [Documentation::ProhibitLinkToSelf] [Documentation::ProhibitParagraphEndComma] [Documentation::ProhibitParagraphTwoDots] [Documentation::ProhibitUnbalancedParens] [Documentation::ProhibitVerbatimMarkup] [Documentation::RequireEndBeforeLastPod] [Documentation::RequireFinalCut] [Documentation::RequireLinkedURLs] [-Documentation::RequirePODUseEncodingUTF8] [Documentation::RequirePackageMatchesPodName] [Documentation::RequirePodAtEnd] [Documentation::RequirePodLinksIncludeText] [-Documentation::RequirePodSections] [-Editor::RequireEmacsFileVariables] [ErrorHandling::RequireCarping] [ErrorHandling::RequireCheckingReturnValueOfEval] [ErrorHandling::RequireUseOfExceptions] [InputOutput::ProhibitBacktickOperators] [InputOutput::ProhibitBarewordFileHandles] [InputOutput::ProhibitExplicitStdin] [InputOutput::ProhibitInteractiveTest] [InputOutput::ProhibitJoinedReadline] [InputOutput::ProhibitOneArgSelect] [InputOutput::ProhibitReadlineInForLoop] [InputOutput::ProhibitTwoArgOpen] [InputOutput::RequireBracedFileHandleWithPrint] [InputOutput::RequireBriefOpen] [InputOutput::RequireCheckedClose] [InputOutput::RequireCheckedOpen] [InputOutput::RequireCheckedSyscalls] [InputOutput::RequireEncodingWithUTF8Layer] [Lax::ProhibitComplexMappings::LinesNotStatements] [Lax::ProhibitEmptyQuotes::ExceptAsFallback] [Lax::ProhibitLeadingZeros::ExceptChmod] [Lax::ProhibitStringyEval::ExceptForRequire] [Lax::RequireEndWithTrueConst] [Lax::RequireExplicitPackage::ExceptForPragmata] allowed_pragmata = diagnostics feature perlversion strict warnings utf8 [Miscellanea::ProhibitFormats] [Miscellanea::ProhibitTies] [Miscellanea::ProhibitUnrestrictedNoCritic] [-Miscellanea::ProhibitUselessNoCritic] [-Miscellanea::RequireRcsKeywords] [Miscellanea::TextDomainPlaceholders] [Miscellanea::TextDomainUnused] [Modules::PerlMinimumVersion] [Modules::ProhibitAutomaticExportation] [Modules::ProhibitConditionalUseStatements] [Modules::ProhibitEvilModules] [Modules::ProhibitExcessMainComplexity] [Modules::ProhibitModuleShebang] [Modules::ProhibitMultiplePackages] [Modules::ProhibitPOSIXimport] [Modules::ProhibitUseQuotedVersion] [Modules::RequireBarewordIncludes] [Modules::RequireEndWithOne] [-Modules::RequireExplicitInclusion] [-Modules::RequireExplicitPackage] [Modules::RequireFilenameMatchesPackage] [Modules::RequireNoMatchVarsWithUseEnglish] [Modules::RequirePerlVersion] [Modules::RequireVersionVar] [-Moose::ProhibitMultipleWiths] [Moose::ProhibitNewMethod] [Moose::RequireCleanNamespace] [Moose::RequireMakeImmutable] [NamingConventions::Capitalization] [NamingConventions::ProhibitAmbiguousNames] [NamingConventions::ProhibitMixedCaseSubs] [NamingConventions::ProhibitMixedCaseVars] [Objects::ProhibitIndirectSyntax] [References::ProhibitDoubleSigils] [RegularExpressions::ProhibitCaptureWithoutTest] [RegularExpressions::ProhibitComplexRegexes] [RegularExpressions::ProhibitEnumeratedClasses] [RegularExpressions::ProhibitEscapedMetacharacters] [RegularExpressions::ProhibitFixedStringMatches] [RegularExpressions::ProhibitSingleCharAlternation] [RegularExpressions::ProhibitUnusedCapture] [RegularExpressions::ProhibitUnusualDelimiters] [RegularExpressions::RequireBracesForMultiline] [RegularExpressions::RequireDotMatchAnything] [RegularExpressions::RequireExtendedFormatting] [RegularExpressions::RequireLineBoundaryMatching] [Subroutines::ProhibitAmpersandSigils] [Subroutines::ProhibitBuiltinHomonyms] [Subroutines::ProhibitCallsToUndeclaredSubs] [Subroutines::ProhibitCallsToUnexportedSubs] [Subroutines::ProhibitExcessComplexity] [Subroutines::ProhibitExplicitReturnUndef] [Subroutines::ProhibitExportingUndeclaredSubs] [Subroutines::ProhibitManyArgs] [Subroutines::ProhibitNestedSubs] [Subroutines::ProhibitQualifiedSubDeclarations] [Subroutines::ProhibitReturnSort] [Subroutines::ProhibitSubroutinePrototypes] [Subroutines::ProhibitUnusedPrivateSubroutines] private_name_regex = _(?!build_)\w [Subroutines::ProtectPrivateSubs] [Subroutines::RequireArgUnpacking] [Subroutines::RequireFinalReturn] [TestingAndDebugging::ProhibitNoStrict] [TestingAndDebugging::ProhibitNoWarnings] [TestingAndDebugging::ProhibitProlongedStrictureOverride] [TestingAndDebugging::RequireTestLabels] [TestingAndDebugging::RequireUseStrict] equivalent_modules = Moose Moo [TestingAndDebugging::RequireUseWarnings] equivalent_modules = Moose Moo [Tics::ProhibitLongLines] base_max = 130 [Tics::ProhibitManyArrows] [Tics::ProhibitUseBase] [ValuesAndExpressions::ConstantBeforeLt] [ValuesAndExpressions::NotWithCompare] [ValuesAndExpressions::ProhibitArrayAssignAref] [ValuesAndExpressions::ProhibitBarewordDoubleColon] [ValuesAndExpressions::ProhibitCommaSeparatedStatements] [ValuesAndExpressions::ProhibitComplexVersion] [ValuesAndExpressions::ProhibitConstantPragma] [ValuesAndExpressions::ProhibitDuplicateHashKeys] [-ValuesAndExpressions::ProhibitEmptyCommas] [ValuesAndExpressions::ProhibitEmptyQuotes] [ValuesAndExpressions::ProhibitEscapedCharacters] [ValuesAndExpressions::ProhibitFiletest_f] [ValuesAndExpressions::ProhibitImplicitNewlines] [ValuesAndExpressions::ProhibitInterpolationOfLiterals] [ValuesAndExpressions::ProhibitLeadingZeros] [ValuesAndExpressions::ProhibitLongChainsOfMethodCalls] [-ValuesAndExpressions::ProhibitMagicNumbers] [ValuesAndExpressions::ProhibitMismatchedOperators] [ValuesAndExpressions::ProhibitMixedBooleanOperators] [ValuesAndExpressions::ProhibitNoisyQuotes] [ValuesAndExpressions::ProhibitNullStatements] [ValuesAndExpressions::ProhibitQuotesAsQuotelikeOperatorDelimiters] [ValuesAndExpressions::ProhibitSpecialLiteralHeredocTerminator] [ValuesAndExpressions::ProhibitUnknownBackslash] [ValuesAndExpressions::ProhibitVersionStrings] [ValuesAndExpressions::RequireConstantOnLeftSideOfEquality] [ValuesAndExpressions::RequireConstantVersion] [ValuesAndExpressions::RequireInterpolationOfMetachars] [ValuesAndExpressions::RequireNumberSeparators] [ValuesAndExpressions::RequireNumericVersion] [ValuesAndExpressions::RequireQuotedHeredocTerminator] [ValuesAndExpressions::RequireUpperCaseHeredocTerminator] [ValuesAndExpressions::RestrictLongStrings] [ValuesAndExpressions::UnexpandedSpecialLiteral] [Variables::ProhibitAugmentedAssignmentInDeclaration] [Variables::ProhibitConditionalDeclarations] [Variables::ProhibitEvilVariables] [Variables::ProhibitLocalVars] [Variables::ProhibitMatchVars] [Variables::ProhibitPackageVars] [Variables::ProhibitPerl4PackageNames] [-Variables::ProhibitPunctuationVars] [Variables::ProhibitReusedNames] [Variables::ProhibitUnusedVariables] [Variables::ProhibitUnusedVarsStricter] [Variables::ProtectPrivateVars] [Variables::RequireInitializationForLocalVars] [Variables::RequireLexicalLoopIterators] [Variables::RequireLocalizedPunctuationVars] [Variables::RequireNegativeIndices] Path-IsDev-1.001002/corpus/0000755000175000017500000000000012373560357013653 5ustar kentkentPath-IsDev-1.001002/corpus/Changelog/0000755000175000017500000000000012373560357015542 5ustar kentkentPath-IsDev-1.001002/corpus/Changelog/Changes0000644000175000017500000000000012373560357017023 0ustar kentkentPath-IsDev-1.001002/corpus/MYMETA/0000755000175000017500000000000012373560357014647 5ustar kentkentPath-IsDev-1.001002/corpus/MYMETA/MYMETA.json0000644000175000017500000000000012373560357016524 0ustar kentkentPath-IsDev-1.001002/corpus/TestDir/0000755000175000017500000000000012373560357015231 5ustar kentkentPath-IsDev-1.001002/corpus/TestDir/t/0000755000175000017500000000000012373560357015474 5ustar kentkentPath-IsDev-1.001002/corpus/TestDir/t/.keep0000644000175000017500000000000012373560357016407 0ustar kentkentPath-IsDev-1.001002/corpus/MakeMaker/0000755000175000017500000000000012373560357015510 5ustar kentkentPath-IsDev-1.001002/corpus/MakeMaker/Makefile.PL0000644000175000017500000000000012373560357017450 0ustar kentkentPath-IsDev-1.001002/corpus/DevDir/0000755000175000017500000000000012373560357015030 5ustar kentkentPath-IsDev-1.001002/corpus/DevDir/.devdir0000644000175000017500000000000012373560357016274 0ustar kentkentPath-IsDev-1.001002/corpus/META/0000755000175000017500000000000012373560357014401 5ustar kentkentPath-IsDev-1.001002/corpus/META/META.yml0000644000175000017500000000000012373560357015640 0ustar kentkentPath-IsDev-1.001002/corpus/DZil/0000755000175000017500000000000012373560357014515 5ustar kentkentPath-IsDev-1.001002/corpus/DZil/dist.ini0000644000175000017500000000000012373560357016147 0ustar kentkentPath-IsDev-1.001002/corpus/ModuleBuild/0000755000175000017500000000000012373560357016060 5ustar kentkentPath-IsDev-1.001002/corpus/ModuleBuild/Build.PL0000644000175000017500000000000012373560357017342 0ustar kentkentPath-IsDev-1.001002/corpus/Makefile/0000755000175000017500000000000012373560357015370 5ustar kentkentPath-IsDev-1.001002/corpus/Makefile/Makefile0000644000175000017500000000000012373560357017016 0ustar kentkentPath-IsDev-1.001002/dist.ini0000644000175000017500000001314312373560357014006 0ustar kentkent; This file is generated from dist.ini.meta by dzil bakeini. ; Edit that file or the bundles contained within for long-term changes. name = Path-IsDev author = Kent Fredric license = Perl_5 copyright_holder = Kent Fredric [MetaConfig / @Author::KENTNL/MetaConfig] [GithubMeta / @Author::KENTNL/GithubMeta] issues = 1 [MetaProvides::Package / @Author::KENTNL/MetaProvides::Package] :version = 1.14000001 [MetaData::BuiltWith / @Author::KENTNL/MetaData::BuiltWith] show_config = 1 show_uname = 1 uname_args = -s -o -r -m -i [Git::Contributors / @Author::KENTNL/Git::Contributors] :version = 0.006 include_authors = 0 include_releaser = 0 order_by = name [Git::GatherDir / @Author::KENTNL/Git::GatherDir] exclude_filename = README exclude_filename = README.mkdn exclude_filename = README.pod exclude_filename = LICENSE include_dotfiles = 1 [License / @Author::KENTNL/License] [MetaJSON / @Author::KENTNL/MetaJSON] [MetaYAML / @Author::KENTNL/MetaYAML] [Manifest / @Author::KENTNL/Manifest] [CopyFilesFromBuild / @Author::KENTNL/CopyXBuild] copy = LICENSE [MetaTests / @Author::KENTNL/MetaTests] [PodCoverageTests / @Author::KENTNL/PodCoverageTests] [PodSyntaxTests / @Author::KENTNL/PodSyntaxTests] [Test::ReportPrereqs / @Author::KENTNL/Test::ReportPrereqs] [Test::Kwalitee / @Author::KENTNL/Test::Kwalitee] [EOLTests / @Author::KENTNL/EOLTests] trailing_whitespace = 1 [Test::MinimumVersion / @Author::KENTNL/Test::MinimumVersion] [Test::Compile::PerFile / @Author::KENTNL/Test::Compile::PerFile] [Test::Perl::Critic / @Author::KENTNL/Test::Perl::Critic] [ManifestSkip / @Author::KENTNL/ManifestSkip] [RewriteVersion::Sanitized / @Author::KENTNL/RewriteVersion::Sanitized] mantissa = 6 normal_form = numify [PodWeaver / @Author::KENTNL/PodWeaver] replacer = replace_with_blank [AutoPrereqs / @Author::KENTNL/AutoPrereqs] [Prereqs / @Author::KENTNL/BundleDevelSuggests] -phase = develop -type = suggests Dist::Zilla::App::Command::bakeini = 0.001000 Dist::Zilla::PluginBundle::Author::KENTNL = 2.017002 [MinimumPerl / @Author::KENTNL/MinimumPerl] [Authority / @Author::KENTNL/Authority] :version = 1.006 authority = cpan:KENTNL do_metadata = 1 locate_comment = 1 [MakeMaker / @Author::KENTNL/MakeMaker] default_jobs = 10 [ReadmeFromPod / @Author::KENTNL/ReadmeFromPod] [ReadmeAnyFromPod / @Author::KENTNL/ReadmeAnyFromPod] filename = README.mkdn location = root type = markdown [Test::CPAN::Changes / @Author::KENTNL/Test::CPAN::Changes] [RunExtraTests / @Author::KENTNL/RunExtraTests] default_jobs = 10 [TestRelease / @Author::KENTNL/TestRelease] [ConfirmRelease / @Author::KENTNL/ConfirmRelease] [Git::Check / @Author::KENTNL/Git::Check] filename = Changes [Git::Commit / @Author::KENTNL/commit_dirty_files] [Git::Tag / @Author::KENTNL/tag_master] tag_format = %v-source [Git::NextRelease / @Author::KENTNL/Git::NextRelease] format = %v %{yyyy-MM-dd'T'HH:mm:ss}dZ time_zone = UTC [BumpVersionAfterRelease / @Author::KENTNL/BumpVersionAfterRelease] [Git::Commit / @Author::KENTNL/commit_release_changes] allow_dirty_match = ^lib/ [Git::CommitBuild / @Author::KENTNL/Git::CommitBuild] release_branch = releases [Git::Tag / @Author::KENTNL/tag_release] branch = releases tag_format = %v [UploadToCPAN / @Author::KENTNL/UploadToCPAN] [Twitter / @Author::KENTNL/Twitter] hash_tags = #perl #cpan tweet_url = https://metacpan.org/release/{{$AUTHOR_UC}}/{{$DIST}}-{{$VERSION}}{{$TRIAL}}#whatsnew url_shortener = none [Prereqs::Recommend::MatchInstalled / @Author::KENTNL/Prereqs::Recommend::MatchInstalled] modules = ExtUtils::MakeMaker modules = Test::More [Prereqs::Recommend::MatchInstalled / @Author::KENTNL/always_latest_develop_bundle] applyto_map = develop.suggests = develop.suggests applyto_phase = develop modules = Dist::Zilla::PluginBundle::Author::KENTNL modules = Dist::Zilla::App::Command::bakeini [Prereqs / @Author::KENTNL/::Role::BundleDeps] -phase = develop -relationship = requires Dist::Zilla::Plugin::Authority = 1.006 Dist::Zilla::Plugin::AutoPrereqs = 0 Dist::Zilla::Plugin::BumpVersionAfterRelease = 0 Dist::Zilla::Plugin::ConfirmRelease = 0 Dist::Zilla::Plugin::CopyFilesFromBuild = 0 Dist::Zilla::Plugin::EOLTests = 0 Dist::Zilla::Plugin::Git::Check = 0 Dist::Zilla::Plugin::Git::Commit = 0 Dist::Zilla::Plugin::Git::CommitBuild = 0 Dist::Zilla::Plugin::Git::Contributors = 0.006 Dist::Zilla::Plugin::Git::GatherDir = 0 Dist::Zilla::Plugin::Git::NextRelease = 0 Dist::Zilla::Plugin::Git::Tag = 0 Dist::Zilla::Plugin::GithubMeta = 0 Dist::Zilla::Plugin::License = 0 Dist::Zilla::Plugin::MakeMaker = 0 Dist::Zilla::Plugin::Manifest = 0 Dist::Zilla::Plugin::ManifestSkip = 0 Dist::Zilla::Plugin::MetaConfig = 0 Dist::Zilla::Plugin::MetaData::BuiltWith = 0 Dist::Zilla::Plugin::MetaJSON = 0 Dist::Zilla::Plugin::MetaProvides::Package = 1.14000001 Dist::Zilla::Plugin::MetaTests = 0 Dist::Zilla::Plugin::MetaYAML = 0 Dist::Zilla::Plugin::MinimumPerl = 0 Dist::Zilla::Plugin::PodCoverageTests = 0 Dist::Zilla::Plugin::PodSyntaxTests = 0 Dist::Zilla::Plugin::PodWeaver = 0 Dist::Zilla::Plugin::Prereqs = 0 Dist::Zilla::Plugin::Prereqs::Recommend::MatchInstalled = 0 Dist::Zilla::Plugin::ReadmeAnyFromPod = 0 Dist::Zilla::Plugin::ReadmeFromPod = 0 Dist::Zilla::Plugin::RewriteVersion::Sanitized = 0 Dist::Zilla::Plugin::RunExtraTests = 0 Dist::Zilla::Plugin::Test::CPAN::Changes = 0 Dist::Zilla::Plugin::Test::Compile::PerFile = 0 Dist::Zilla::Plugin::Test::Kwalitee = 0 Dist::Zilla::Plugin::Test::MinimumVersion = 0 Dist::Zilla::Plugin::Test::Perl::Critic = 0 Dist::Zilla::Plugin::Test::ReportPrereqs = 0 Dist::Zilla::Plugin::TestRelease = 0 Dist::Zilla::Plugin::Twitter = 0 Dist::Zilla::Plugin::UploadToCPAN = 0 [Prereqs] Path-IsDev-1.001002/.perltidyrc0000644000175000017500000000001412373560357014515 0ustar kentkent-i 2 -l 130 Path-IsDev-1.001002/META.json0000644000175000017500000010771412373560357013773 0ustar kentkent{ "abstract" : "Determine if a given Path resembles a development source tree", "author" : [ "Kent Fredric " ], "dynamic_config" : 0, "generated_by" : "Dist::Zilla version 5.020, CPAN::Meta::Converter version 2.142060", "license" : [ "perl_5" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : "2" }, "name" : "Path-IsDev", "prereqs" : { "configure" : { "recommends" : { "ExtUtils::MakeMaker" : "6.98" }, "requires" : { "ExtUtils::MakeMaker" : "0" } }, "develop" : { "requires" : { "Dist::Zilla::Plugin::Authority" : "1.006", "Dist::Zilla::Plugin::AutoPrereqs" : "0", "Dist::Zilla::Plugin::BumpVersionAfterRelease" : "0", "Dist::Zilla::Plugin::ConfirmRelease" : "0", "Dist::Zilla::Plugin::CopyFilesFromBuild" : "0", "Dist::Zilla::Plugin::EOLTests" : "0", "Dist::Zilla::Plugin::Git::Check" : "0", "Dist::Zilla::Plugin::Git::Commit" : "0", "Dist::Zilla::Plugin::Git::CommitBuild" : "0", "Dist::Zilla::Plugin::Git::Contributors" : "0.006", "Dist::Zilla::Plugin::Git::GatherDir" : "0", "Dist::Zilla::Plugin::Git::NextRelease" : "0", "Dist::Zilla::Plugin::Git::Tag" : "0", "Dist::Zilla::Plugin::GithubMeta" : "0", "Dist::Zilla::Plugin::License" : "0", "Dist::Zilla::Plugin::MakeMaker" : "0", "Dist::Zilla::Plugin::Manifest" : "0", "Dist::Zilla::Plugin::ManifestSkip" : "0", "Dist::Zilla::Plugin::MetaConfig" : "0", "Dist::Zilla::Plugin::MetaData::BuiltWith" : "0", "Dist::Zilla::Plugin::MetaJSON" : "0", "Dist::Zilla::Plugin::MetaProvides::Package" : "1.14000001", "Dist::Zilla::Plugin::MetaTests" : "0", "Dist::Zilla::Plugin::MetaYAML" : "0", "Dist::Zilla::Plugin::MinimumPerl" : "0", "Dist::Zilla::Plugin::PodCoverageTests" : "0", "Dist::Zilla::Plugin::PodSyntaxTests" : "0", "Dist::Zilla::Plugin::PodWeaver" : "0", "Dist::Zilla::Plugin::Prereqs" : "0", "Dist::Zilla::Plugin::Prereqs::Recommend::MatchInstalled" : "0", "Dist::Zilla::Plugin::ReadmeAnyFromPod" : "0", "Dist::Zilla::Plugin::ReadmeFromPod" : "0", "Dist::Zilla::Plugin::RewriteVersion::Sanitized" : "0", "Dist::Zilla::Plugin::RunExtraTests" : "0", "Dist::Zilla::Plugin::Test::CPAN::Changes" : "0", "Dist::Zilla::Plugin::Test::Compile::PerFile" : "0", "Dist::Zilla::Plugin::Test::Kwalitee" : "0", "Dist::Zilla::Plugin::Test::MinimumVersion" : "0", "Dist::Zilla::Plugin::Test::Perl::Critic" : "0", "Dist::Zilla::Plugin::Test::ReportPrereqs" : "0", "Dist::Zilla::Plugin::TestRelease" : "0", "Dist::Zilla::Plugin::Twitter" : "0", "Dist::Zilla::Plugin::UploadToCPAN" : "0", "Pod::Coverage::TrustPod" : "0", "Test::CPAN::Changes" : "0.19", "Test::CPAN::Meta" : "0", "Test::Kwalitee" : "1.12", "Test::Pod" : "1.41", "Test::Pod::Coverage" : "1.08" }, "suggests" : { "Dist::Zilla::App::Command::bakeini" : "0.001001", "Dist::Zilla::PluginBundle::Author::KENTNL" : "2.017002" } }, "runtime" : { "requires" : { "Carp" : "0", "Class::Tiny" : "0.010", "File::HomeDir" : "0", "Module::Runtime" : "0", "Path::Tiny" : "0.004", "Role::Tiny" : "0", "Role::Tiny::With" : "0", "Scalar::Util" : "0", "Sub::Exporter" : "0", "perl" : "5.008", "strict" : "0", "utf8" : "0", "warnings" : "0" } }, "test" : { "recommends" : { "CPAN::Meta" : "2.120900", "ExtUtils::MakeMaker" : "6.98", "Test::More" : "1.001003" }, "requires" : { "ExtUtils::MakeMaker" : "0", "File::Spec" : "0", "File::Temp" : "0", "FindBin" : "0", "Test::Fatal" : "0", "Test::More" : "0.89" } } }, "provides" : { "Path::IsDev" : { "file" : "lib/Path/IsDev.pm", "version" : "1.001002" }, "Path::IsDev::Heuristic::Changelog" : { "file" : "lib/Path/IsDev/Heuristic/Changelog.pm", "version" : "1.001002" }, "Path::IsDev::Heuristic::DevDirMarker" : { "file" : "lib/Path/IsDev/Heuristic/DevDirMarker.pm", "version" : "1.001002" }, "Path::IsDev::Heuristic::META" : { "file" : "lib/Path/IsDev/Heuristic/META.pm", "version" : "1.001002" }, "Path::IsDev::Heuristic::MYMETA" : { "file" : "lib/Path/IsDev/Heuristic/MYMETA.pm", "version" : "1.001002" }, "Path::IsDev::Heuristic::Makefile" : { "file" : "lib/Path/IsDev/Heuristic/Makefile.pm", "version" : "1.001002" }, "Path::IsDev::Heuristic::TestDir" : { "file" : "lib/Path/IsDev/Heuristic/TestDir.pm", "version" : "1.001002" }, "Path::IsDev::Heuristic::Tool::Dzil" : { "file" : "lib/Path/IsDev/Heuristic/Tool/Dzil.pm", "version" : "1.001002" }, "Path::IsDev::Heuristic::Tool::MakeMaker" : { "file" : "lib/Path/IsDev/Heuristic/Tool/MakeMaker.pm", "version" : "1.001002" }, "Path::IsDev::Heuristic::Tool::ModuleBuild" : { "file" : "lib/Path/IsDev/Heuristic/Tool/ModuleBuild.pm", "version" : "1.001002" }, "Path::IsDev::Heuristic::VCS::Git" : { "file" : "lib/Path/IsDev/Heuristic/VCS/Git.pm", "version" : "1.001002" }, "Path::IsDev::HeuristicSet::Basic" : { "file" : "lib/Path/IsDev/HeuristicSet/Basic.pm", "version" : "1.001002" }, "Path::IsDev::NegativeHeuristic::HomeDir" : { "file" : "lib/Path/IsDev/NegativeHeuristic/HomeDir.pm", "version" : "1.001002" }, "Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile" : { "file" : "lib/Path/IsDev/NegativeHeuristic/IsDev/IgnoreFile.pm", "version" : "1.001002" }, "Path::IsDev::NegativeHeuristic::PerlINC" : { "file" : "lib/Path/IsDev/NegativeHeuristic/PerlINC.pm", "version" : "1.001002" }, "Path::IsDev::Object" : { "file" : "lib/Path/IsDev/Object.pm", "version" : "1.001002" }, "Path::IsDev::Result" : { "file" : "lib/Path/IsDev/Result.pm", "version" : "1.001002" }, "Path::IsDev::Role::Heuristic" : { "file" : "lib/Path/IsDev/Role/Heuristic.pm", "version" : "1.001002" }, "Path::IsDev::Role::HeuristicSet" : { "file" : "lib/Path/IsDev/Role/HeuristicSet.pm", "version" : "1.001002" }, "Path::IsDev::Role::HeuristicSet::Simple" : { "file" : "lib/Path/IsDev/Role/HeuristicSet/Simple.pm", "version" : "1.001002" }, "Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp" : { "file" : "lib/Path/IsDev/Role/Matcher/Child/BaseName/MatchRegexp.pm", "version" : "1.001002" }, "Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp::File" : { "file" : "lib/Path/IsDev/Role/Matcher/Child/BaseName/MatchRegexp/File.pm", "version" : "1.001002" }, "Path::IsDev::Role::Matcher::Child::Exists::Any" : { "file" : "lib/Path/IsDev/Role/Matcher/Child/Exists/Any.pm", "version" : "1.001002" }, "Path::IsDev::Role::Matcher::Child::Exists::Any::Dir" : { "file" : "lib/Path/IsDev/Role/Matcher/Child/Exists/Any/Dir.pm", "version" : "1.001002" }, "Path::IsDev::Role::Matcher::Child::Exists::Any::File" : { "file" : "lib/Path/IsDev/Role/Matcher/Child/Exists/Any/File.pm", "version" : "1.001002" }, "Path::IsDev::Role::Matcher::FullPath::Is::Any" : { "file" : "lib/Path/IsDev/Role/Matcher/FullPath/Is/Any.pm", "version" : "1.001002" }, "Path::IsDev::Role::NegativeHeuristic" : { "file" : "lib/Path/IsDev/Role/NegativeHeuristic.pm", "version" : "1.001002" } }, "release_status" : "stable", "resources" : { "bugtracker" : { "web" : "https://github.com/kentnl/Path-IsDev/issues" }, "homepage" : "https://github.com/kentnl/Path-IsDev", "repository" : { "type" : "git", "url" : "https://github.com/kentnl/Path-IsDev.git", "web" : "https://github.com/kentnl/Path-IsDev" } }, "version" : "1.001002", "x_BuiltWith" : { "modules" : { "CPAN::Meta" : "2.142060", "Carp" : "1.34", "Class::Tiny" : "1.000", "Dist::Zilla::App::Command::bakeini" : "0.001001", "Dist::Zilla::Plugin::Authority" : "1.006", "Dist::Zilla::Plugin::AutoPrereqs" : "5.020", "Dist::Zilla::Plugin::BumpVersionAfterRelease" : "0.002", "Dist::Zilla::Plugin::ConfirmRelease" : "5.020", "Dist::Zilla::Plugin::CopyFilesFromBuild" : "0.103510", "Dist::Zilla::Plugin::EOLTests" : "0.02", "Dist::Zilla::Plugin::Git::Check" : "2.023", "Dist::Zilla::Plugin::Git::Commit" : "2.023", "Dist::Zilla::Plugin::Git::CommitBuild" : "2.023", "Dist::Zilla::Plugin::Git::Contributors" : "0.006", "Dist::Zilla::Plugin::Git::GatherDir" : "2.023", "Dist::Zilla::Plugin::Git::NextRelease" : "0.002012", "Dist::Zilla::Plugin::Git::Tag" : "2.023", "Dist::Zilla::Plugin::GithubMeta" : "0.46", "Dist::Zilla::Plugin::License" : "5.020", "Dist::Zilla::Plugin::MakeMaker" : "5.020", "Dist::Zilla::Plugin::Manifest" : "5.020", "Dist::Zilla::Plugin::ManifestSkip" : "5.020", "Dist::Zilla::Plugin::MetaConfig" : "5.020", "Dist::Zilla::Plugin::MetaData::BuiltWith" : "1.001001", "Dist::Zilla::Plugin::MetaJSON" : "5.020", "Dist::Zilla::Plugin::MetaProvides::Package" : "2.000004", "Dist::Zilla::Plugin::MetaTests" : "5.020", "Dist::Zilla::Plugin::MetaYAML" : "5.020", "Dist::Zilla::Plugin::MinimumPerl" : "1.003", "Dist::Zilla::Plugin::PodCoverageTests" : "5.020", "Dist::Zilla::Plugin::PodSyntaxTests" : "5.020", "Dist::Zilla::Plugin::PodWeaver" : "4.005", "Dist::Zilla::Plugin::Prereqs" : "5.020", "Dist::Zilla::Plugin::Prereqs::Recommend::MatchInstalled" : "0.002001", "Dist::Zilla::Plugin::ReadmeAnyFromPod" : "0.142250", "Dist::Zilla::Plugin::ReadmeFromPod" : "0.21", "Dist::Zilla::Plugin::RewriteVersion::Sanitized" : "0.001003", "Dist::Zilla::Plugin::RunExtraTests" : "0.022", "Dist::Zilla::Plugin::Test::CPAN::Changes" : "0.008", "Dist::Zilla::Plugin::Test::Compile::PerFile" : "0.002002", "Dist::Zilla::Plugin::Test::Kwalitee" : "2.07", "Dist::Zilla::Plugin::Test::MinimumVersion" : "2.000005", "Dist::Zilla::Plugin::Test::Perl::Critic" : "2.112410", "Dist::Zilla::Plugin::Test::ReportPrereqs" : "0.019", "Dist::Zilla::Plugin::TestRelease" : "5.020", "Dist::Zilla::Plugin::Twitter" : "0.025", "Dist::Zilla::Plugin::UploadToCPAN" : "5.020", "Dist::Zilla::PluginBundle::Author::KENTNL" : "2.017002", "ExtUtils::MakeMaker" : "6.98", "File::HomeDir" : "1.00", "File::Spec" : "3.48", "File::Temp" : "0.2304", "FindBin" : "1.51", "Module::Runtime" : "0.014", "Path::Tiny" : "0.056", "Pod::Coverage::TrustPod" : "0.100003", "Role::Tiny" : "1.003003", "Role::Tiny::With" : "1.003003", "Scalar::Util" : "1.39", "Sub::Exporter" : "0.987", "Test::CPAN::Changes" : "0.30", "Test::CPAN::Meta" : "0.23", "Test::Fatal" : "0.013", "Test::Kwalitee" : "1.22", "Test::More" : "1.001003", "Test::Pod" : "1.48", "Test::Pod::Coverage" : "1.10", "strict" : "1.08", "utf8" : "1.14", "warnings" : "1.24" }, "perl" : { "original" : "v5.21.1", "qv" : 1, "version" : [ 5, 21, 1 ] }, "perl-config" : { "gccversion" : "4.8.3", "myarchname" : "x86_64-linux", "osname" : "linux" }, "platform" : "linux", "uname" : "Linux 3.15.5-aufs x86_64 GenuineIntel GNU/Linux" }, "x_Dist_Zilla" : { "perl" : { "version" : "5.021001" }, "plugins" : [ { "class" : "Dist::Zilla::Plugin::MetaConfig", "name" : "@Author::KENTNL/MetaConfig", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::GithubMeta", "name" : "@Author::KENTNL/GithubMeta", "version" : "0.46" }, { "class" : "Dist::Zilla::Plugin::MetaProvides::Package", "config" : { "Dist::Zilla::Plugin::MetaProvides::Package" : { "finder_objects" : [ { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : "@Author::KENTNL/MetaProvides::Package/AUTOVIV/:InstallModulesPM", "version" : "5.020" } ] }, "Dist::Zilla::Role::MetaProvider::Provider" : { "inherit_missing" : "1", "inherit_version" : "1", "meta_noindex" : "1" } }, "name" : "@Author::KENTNL/MetaProvides::Package", "version" : "2.000004" }, { "class" : "Dist::Zilla::Plugin::MetaData::BuiltWith", "config" : { "Dist::Zilla::Plugin::MetaData::BuiltWith" : { "_stash_key" : "x_BuiltWith", "show_config" : "1", "show_uname" : "1", "uname" : { "uname_args" : [ "-s", "-o", "-r", "-m", "-i" ], "uname_call" : "uname" } } }, "name" : "@Author::KENTNL/MetaData::BuiltWith", "version" : "1.001001" }, { "class" : "Dist::Zilla::Plugin::Git::Contributors", "config" : { "Dist::Zilla::Plugin::Git::Contributors" : { "include_authors" : "0", "include_releaser" : "0", "order_by" : "name" } }, "name" : "@Author::KENTNL/Git::Contributors", "version" : "0.006" }, { "class" : "Dist::Zilla::Plugin::Git::GatherDir", "config" : { "Dist::Zilla::Plugin::Git::GatherDir" : { "include_untracked" : "0" }, "Dist::Zilla::Role::Git::Repo" : { "repo_root" : "." } }, "name" : "@Author::KENTNL/Git::GatherDir", "version" : "2.023" }, { "class" : "Dist::Zilla::Plugin::License", "name" : "@Author::KENTNL/License", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::MetaJSON", "name" : "@Author::KENTNL/MetaJSON", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::MetaYAML", "name" : "@Author::KENTNL/MetaYAML", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::Manifest", "name" : "@Author::KENTNL/Manifest", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::CopyFilesFromBuild", "name" : "@Author::KENTNL/CopyXBuild", "version" : "0.103510" }, { "class" : "Dist::Zilla::Plugin::MetaTests", "name" : "@Author::KENTNL/MetaTests", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::PodCoverageTests", "name" : "@Author::KENTNL/PodCoverageTests", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::PodSyntaxTests", "name" : "@Author::KENTNL/PodSyntaxTests", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::Test::ReportPrereqs", "name" : "@Author::KENTNL/Test::ReportPrereqs", "version" : "0.019" }, { "class" : "Dist::Zilla::Plugin::Test::Kwalitee", "name" : "@Author::KENTNL/Test::Kwalitee", "version" : "2.07" }, { "class" : "Dist::Zilla::Plugin::EOLTests", "name" : "@Author::KENTNL/EOLTests", "version" : "0.02" }, { "class" : "Dist::Zilla::Plugin::Test::MinimumVersion", "name" : "@Author::KENTNL/Test::MinimumVersion", "version" : "2.000005" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : "@Author::KENTNL/Test::Compile::PerFile/AUTOVIV/:InstallModulesPM", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::Test::Compile::PerFile", "config" : { "Dist::Zilla::Plugin::Test::Compile::PerFile" : { "file" : [ "lib/Path/IsDev.pm", "lib/Path/IsDev/Heuristic/Changelog.pm", "lib/Path/IsDev/Heuristic/DevDirMarker.pm", "lib/Path/IsDev/Heuristic/META.pm", "lib/Path/IsDev/Heuristic/MYMETA.pm", "lib/Path/IsDev/Heuristic/Makefile.pm", "lib/Path/IsDev/Heuristic/TestDir.pm", "lib/Path/IsDev/Heuristic/Tool/Dzil.pm", "lib/Path/IsDev/Heuristic/Tool/MakeMaker.pm", "lib/Path/IsDev/Heuristic/Tool/ModuleBuild.pm", "lib/Path/IsDev/Heuristic/VCS/Git.pm", "lib/Path/IsDev/HeuristicSet/Basic.pm", "lib/Path/IsDev/NegativeHeuristic/HomeDir.pm", "lib/Path/IsDev/NegativeHeuristic/IsDev/IgnoreFile.pm", "lib/Path/IsDev/NegativeHeuristic/PerlINC.pm", "lib/Path/IsDev/Object.pm", "lib/Path/IsDev/Result.pm", "lib/Path/IsDev/Role/Heuristic.pm", "lib/Path/IsDev/Role/HeuristicSet.pm", "lib/Path/IsDev/Role/HeuristicSet/Simple.pm", "lib/Path/IsDev/Role/Matcher/Child/BaseName/MatchRegexp.pm", "lib/Path/IsDev/Role/Matcher/Child/BaseName/MatchRegexp/File.pm", "lib/Path/IsDev/Role/Matcher/Child/Exists/Any.pm", "lib/Path/IsDev/Role/Matcher/Child/Exists/Any/Dir.pm", "lib/Path/IsDev/Role/Matcher/Child/Exists/Any/File.pm", "lib/Path/IsDev/Role/Matcher/FullPath/Is/Any.pm", "lib/Path/IsDev/Role/NegativeHeuristic.pm" ], "path_translator" : "base64_filter", "prefix" : "t/00-compile", "skip" : [], "test_template" : "01-basic.t.tpl", "xt_mode" : null } }, "name" : "@Author::KENTNL/Test::Compile::PerFile", "version" : "0.002002" }, { "class" : "Dist::Zilla::Plugin::Test::Perl::Critic", "name" : "@Author::KENTNL/Test::Perl::Critic", "version" : "2.112410" }, { "class" : "Dist::Zilla::Plugin::ManifestSkip", "name" : "@Author::KENTNL/ManifestSkip", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::RewriteVersion::Sanitized", "config" : { "Dist::Zilla::Role::Version::Sanitize" : { "mantissa" : "6", "normal_form" : "numify" } }, "name" : "@Author::KENTNL/RewriteVersion::Sanitized", "version" : "0.001003" }, { "class" : "Dist::Zilla::Plugin::PodWeaver", "config" : { "Dist::Zilla::Plugin::PodWeaver" : { "finder" : [ ":InstallModules", ":ExecFiles" ], "plugins" : [ { "class" : "Pod::Weaver::Plugin::EnsurePod5", "name" : "@CorePrep/EnsurePod5", "version" : "4.006" }, { "class" : "Pod::Weaver::Plugin::H1Nester", "name" : "@CorePrep/H1Nester", "version" : "4.006" }, { "class" : "Pod::Weaver::Plugin::SingleEncoding", "name" : "-SingleEncoding", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Name", "name" : "Name", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Version", "name" : "Version", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Region", "name" : "prelude", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "SYNOPSIS", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "DESCRIPTION", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "OVERVIEW", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "REQUIRES", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "METHODS", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "FUNCTIONS", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "ATTRIBUTES", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "PRIVATE_ATTRIBUTES", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "PRIVATE_METHODS", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Leftovers", "name" : "Leftovers", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Region", "name" : "postlude", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Authors", "name" : "Authors", "version" : "4.006" }, { "class" : "Pod::Weaver::Section::Legal", "name" : "Legal", "version" : "4.006" } ] } }, "name" : "@Author::KENTNL/PodWeaver", "version" : "4.005" }, { "class" : "Dist::Zilla::Plugin::AutoPrereqs", "name" : "@Author::KENTNL/AutoPrereqs", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "develop", "type" : "suggests" } }, "name" : "@Author::KENTNL/BundleDevelSuggests", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::MinimumPerl", "name" : "@Author::KENTNL/MinimumPerl", "version" : "1.003" }, { "class" : "Dist::Zilla::Plugin::Authority", "name" : "@Author::KENTNL/Authority", "version" : "1.006" }, { "class" : "Dist::Zilla::Plugin::MakeMaker", "config" : { "Dist::Zilla::Role::TestRunner" : { "default_jobs" : "10" } }, "name" : "@Author::KENTNL/MakeMaker", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::ReadmeFromPod", "name" : "@Author::KENTNL/ReadmeFromPod", "version" : "0.21" }, { "class" : "Dist::Zilla::Plugin::ReadmeAnyFromPod", "name" : "@Author::KENTNL/ReadmeAnyFromPod", "version" : "0.142250" }, { "class" : "Dist::Zilla::Plugin::Test::CPAN::Changes", "name" : "@Author::KENTNL/Test::CPAN::Changes", "version" : "0.008" }, { "class" : "Dist::Zilla::Plugin::RunExtraTests", "config" : { "Dist::Zilla::Role::TestRunner" : { "default_jobs" : "10" } }, "name" : "@Author::KENTNL/RunExtraTests", "version" : "0.022" }, { "class" : "Dist::Zilla::Plugin::TestRelease", "name" : "@Author::KENTNL/TestRelease", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::ConfirmRelease", "name" : "@Author::KENTNL/ConfirmRelease", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::Git::Check", "config" : { "Dist::Zilla::Plugin::Git::Check" : { "untracked_files" : "die" }, "Dist::Zilla::Role::Git::DirtyFiles" : { "allow_dirty" : [ "dist.ini", "Changes" ], "allow_dirty_match" : [], "changelog" : "Changes" }, "Dist::Zilla::Role::Git::Repo" : { "repo_root" : "." } }, "name" : "@Author::KENTNL/Git::Check", "version" : "2.023" }, { "class" : "Dist::Zilla::Plugin::Git::Commit", "config" : { "Dist::Zilla::Plugin::Git::Commit" : { "add_files_in" : [], "commit_msg" : "v%v%n%n%c", "time_zone" : "local" }, "Dist::Zilla::Role::Git::DirtyFiles" : { "allow_dirty" : [ "dist.ini", "Changes" ], "allow_dirty_match" : [], "changelog" : "Changes" }, "Dist::Zilla::Role::Git::Repo" : { "repo_root" : "." } }, "name" : "@Author::KENTNL/commit_dirty_files", "version" : "2.023" }, { "class" : "Dist::Zilla::Plugin::Git::Tag", "config" : { "Dist::Zilla::Plugin::Git::Tag" : { "branch" : null, "signed" : 0, "tag" : "1.001002-source", "tag_format" : "%v-source", "tag_message" : "v%v", "time_zone" : "local" }, "Dist::Zilla::Role::Git::Repo" : { "repo_root" : "." } }, "name" : "@Author::KENTNL/tag_master", "version" : "2.023" }, { "class" : "Dist::Zilla::Plugin::Git::NextRelease", "name" : "@Author::KENTNL/Git::NextRelease", "version" : "0.002012" }, { "class" : "Dist::Zilla::Plugin::BumpVersionAfterRelease", "name" : "@Author::KENTNL/BumpVersionAfterRelease", "version" : "0.002" }, { "class" : "Dist::Zilla::Plugin::Git::Commit", "config" : { "Dist::Zilla::Plugin::Git::Commit" : { "add_files_in" : [], "commit_msg" : "v%v%n%n%c", "time_zone" : "local" }, "Dist::Zilla::Role::Git::DirtyFiles" : { "allow_dirty" : [ "dist.ini", "Changes" ], "allow_dirty_match" : [ "(?^u:^lib/)" ], "changelog" : "Changes" }, "Dist::Zilla::Role::Git::Repo" : { "repo_root" : "." } }, "name" : "@Author::KENTNL/commit_release_changes", "version" : "2.023" }, { "class" : "Dist::Zilla::Plugin::Git::CommitBuild", "config" : { "Dist::Zilla::Plugin::Git::CommitBuild" : { "branch" : "build/%b", "build_root" : null, "message" : "Build results of %h (on %b)", "multiple_inheritance" : 0, "release_branch" : "releases", "release_message" : "Build results of %h (on %b)" }, "Dist::Zilla::Role::Git::Repo" : { "repo_root" : "." } }, "name" : "@Author::KENTNL/Git::CommitBuild", "version" : "2.023" }, { "class" : "Dist::Zilla::Plugin::Git::Tag", "config" : { "Dist::Zilla::Plugin::Git::Tag" : { "branch" : "releases", "signed" : 0, "tag" : "1.001002", "tag_format" : "%v", "tag_message" : "v%v", "time_zone" : "local" }, "Dist::Zilla::Role::Git::Repo" : { "repo_root" : "." } }, "name" : "@Author::KENTNL/tag_release", "version" : "2.023" }, { "class" : "Dist::Zilla::Plugin::UploadToCPAN", "name" : "@Author::KENTNL/UploadToCPAN", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::Twitter", "name" : "@Author::KENTNL/Twitter", "version" : "0.025" }, { "class" : "Dist::Zilla::Plugin::Prereqs::Recommend::MatchInstalled", "config" : { "Dist::Zilla::Plugin::Prereqs::Recommend::MatchInstalled" : { "applyto_map" : [ "build.requires = build.recommends", "test.requires = test.recommends", "runtime.requires = runtime.recommends", "configure.requires = configure.recommends", "develop.requires = develop.recommends" ], "applyto_phase" : [ "build", "test", "runtime", "configure", "develop" ], "modules" : [ "ExtUtils::MakeMaker", "Test::More" ] } }, "name" : "@Author::KENTNL/Prereqs::Recommend::MatchInstalled", "version" : "0.002001" }, { "class" : "Dist::Zilla::Plugin::Prereqs::Recommend::MatchInstalled", "config" : { "Dist::Zilla::Plugin::Prereqs::Recommend::MatchInstalled" : { "applyto_map" : [ "develop.suggests = develop.suggests" ], "applyto_phase" : [ "develop" ], "modules" : [ "Dist::Zilla::PluginBundle::Author::KENTNL", "Dist::Zilla::App::Command::bakeini" ] } }, "name" : "@Author::KENTNL/always_latest_develop_bundle", "version" : "0.002001" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "develop", "type" : "requires" } }, "name" : "@Author::KENTNL/::Role::BundleDeps", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "runtime", "type" : "requires" } }, "name" : "Prereqs", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":InstallModules", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":IncModules", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":TestFiles", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":ExecFiles", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":ShareFiles", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":MainModule", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":AllFiles", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":NoFiles", "version" : "5.020" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : "@Author::KENTNL/MetaProvides::Package/AUTOVIV/:InstallModulesPM", "version" : "5.020" } ], "zilla" : { "class" : "Dist::Zilla::Dist::Builder", "config" : { "is_trial" : "0" }, "version" : "5.020" } }, "x_authority" : "cpan:KENTNL" } Path-IsDev-1.001002/weaver.ini0000644000175000017500000000146412373560357014337 0ustar kentkent[@CorePrep] [-SingleEncoding] [Name] [Version] [Region / prelude] [Generic / SYNOPSIS] [Generic / DESCRIPTION] [Generic / OVERVIEW] ;[Generic / METHODS] ;[Collect / METHODS] [Collect / REQUIRES] header = ROLE REQUIRES command = requires [Collect / METHODS] command = method [Collect / FUNCTIONS] command = func [Collect / ATTRIBUTES] command = attr ;[Collect / FILTER_METHODS] ;header = FILTER METHODS ;command = filter ;[Collect / TERMINATOR_LIST_METHODS] ;header = TERMINATOR LIST METHODS ;command = terminator ;[Collect / MIRROR_LIST_METHODS] ;header = MIRROR LIST METHODS ;command = mirrorlist [Collect / PRIVATE_ATTRIBUTES] header = PRIVATE ATTRIBUTES command = p_attr [Collect / PRIVATE_METHODS] header = PRIVATE METHODS command = p_method [Leftovers] [Region / postlude] [Authors] [Legal] Path-IsDev-1.001002/MANIFEST0000644000175000017500000000734312373560357013500 0ustar kentkent# This file was automatically generated by Dist::Zilla::Plugin::Manifest v5.020. .gitignore .perltidyrc .travis.yml Changes LICENSE MANIFEST META.json META.yml Makefile.PL README corpus/Changelog/Changes corpus/DZil/dist.ini corpus/DevDir/.devdir corpus/META/META.yml corpus/MYMETA/MYMETA.json corpus/MakeMaker/Makefile.PL corpus/Makefile/Makefile corpus/ModuleBuild/Build.PL corpus/TestDir/t/.keep dist.ini dist.ini.meta layout/self_structure.dot layout/self_structure.png lib/Path/IsDev.pm lib/Path/IsDev/Heuristic/Changelog.pm lib/Path/IsDev/Heuristic/DevDirMarker.pm lib/Path/IsDev/Heuristic/META.pm lib/Path/IsDev/Heuristic/MYMETA.pm lib/Path/IsDev/Heuristic/Makefile.pm lib/Path/IsDev/Heuristic/TestDir.pm lib/Path/IsDev/Heuristic/Tool/Dzil.pm lib/Path/IsDev/Heuristic/Tool/MakeMaker.pm lib/Path/IsDev/Heuristic/Tool/ModuleBuild.pm lib/Path/IsDev/Heuristic/VCS/Git.pm lib/Path/IsDev/HeuristicSet/Basic.pm lib/Path/IsDev/NegativeHeuristic/HomeDir.pm lib/Path/IsDev/NegativeHeuristic/IsDev/IgnoreFile.pm lib/Path/IsDev/NegativeHeuristic/PerlINC.pm lib/Path/IsDev/Object.pm lib/Path/IsDev/Result.pm lib/Path/IsDev/Role/Heuristic.pm lib/Path/IsDev/Role/HeuristicSet.pm lib/Path/IsDev/Role/HeuristicSet/Simple.pm lib/Path/IsDev/Role/Matcher/Child/BaseName/MatchRegexp.pm lib/Path/IsDev/Role/Matcher/Child/BaseName/MatchRegexp/File.pm lib/Path/IsDev/Role/Matcher/Child/Exists/Any.pm lib/Path/IsDev/Role/Matcher/Child/Exists/Any/Dir.pm lib/Path/IsDev/Role/Matcher/Child/Exists/Any/File.pm lib/Path/IsDev/Role/Matcher/FullPath/Is/Any.pm lib/Path/IsDev/Role/NegativeHeuristic.pm maint/perlcritic.rc.gen.pl misc/Changes.deps misc/Changes.deps.all misc/Changes.deps.dev misc/Changes.deps.opt misc/perlcritic.deps perlcritic.rc t/00-compile/lib_Path_IsDev_HeuristicSet_Basic_pm.t t/00-compile/lib_Path_IsDev_Heuristic_Changelog_pm.t t/00-compile/lib_Path_IsDev_Heuristic_DevDirMarker_pm.t t/00-compile/lib_Path_IsDev_Heuristic_META_pm.t t/00-compile/lib_Path_IsDev_Heuristic_MYMETA_pm.t t/00-compile/lib_Path_IsDev_Heuristic_Makefile_pm.t t/00-compile/lib_Path_IsDev_Heuristic_TestDir_pm.t t/00-compile/lib_Path_IsDev_Heuristic_Tool_Dzil_pm.t t/00-compile/lib_Path_IsDev_Heuristic_Tool_MakeMaker_pm.t t/00-compile/lib_Path_IsDev_Heuristic_Tool_ModuleBuild_pm.t t/00-compile/lib_Path_IsDev_Heuristic_VCS_Git_pm.t t/00-compile/lib_Path_IsDev_NegativeHeuristic_HomeDir_pm.t t/00-compile/lib_Path_IsDev_NegativeHeuristic_IsDev_IgnoreFile_pm.t t/00-compile/lib_Path_IsDev_NegativeHeuristic_PerlINC_pm.t t/00-compile/lib_Path_IsDev_Object_pm.t t/00-compile/lib_Path_IsDev_Result_pm.t t/00-compile/lib_Path_IsDev_Role_HeuristicSet_Simple_pm.t t/00-compile/lib_Path_IsDev_Role_HeuristicSet_pm.t t/00-compile/lib_Path_IsDev_Role_Heuristic_pm.t t/00-compile/lib_Path_IsDev_Role_Matcher_Child_BaseName_MatchRegexp_File_pm.t t/00-compile/lib_Path_IsDev_Role_Matcher_Child_BaseName_MatchRegexp_pm.t t/00-compile/lib_Path_IsDev_Role_Matcher_Child_Exists_Any_Dir_pm.t t/00-compile/lib_Path_IsDev_Role_Matcher_Child_Exists_Any_File_pm.t t/00-compile/lib_Path_IsDev_Role_Matcher_Child_Exists_Any_pm.t t/00-compile/lib_Path_IsDev_Role_Matcher_FullPath_Is_Any_pm.t t/00-compile/lib_Path_IsDev_Role_NegativeHeuristic_pm.t t/00-compile/lib_Path_IsDev_pm.t t/00-report-prereqs.dd t/00-report-prereqs.t t/Path-IsDev-Object/_matches.t t/Path-IsDev-Object/basic.t t/Path-IsDev/is_dev/Changelog.t t/Path-IsDev/is_dev/DZil.t t/Path-IsDev/is_dev/DevDir.t t/Path-IsDev/is_dev/META.t t/Path-IsDev/is_dev/MYMETA.t t/Path-IsDev/is_dev/MakeMaker.t t/Path-IsDev/is_dev/ModuleBuild.t t/Path-IsDev/is_dev/TestDir.t t/Path-IsDev/is_dev/suite.t.tpl t/basic.t weaver.ini xt/author/critic.t xt/release/cpan-changes.t xt/release/distmeta.t xt/release/eol.t xt/release/kwalitee.t xt/release/minimum-version.t xt/release/pod-coverage.t xt/release/pod-syntax.t