Path-IsDev-1.000002/0000755000175000017500000000000012243547526012336 5ustar kentkentPath-IsDev-1.000002/LICENSE0000644000175000017500000004376312243547526013360 0ustar kentkentThis software is copyright (c) 2013 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) 2013 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, Suite 500, Boston, MA 02110-1335 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) 2013 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.000002/Changes0000644000175000017500000001476612243547526013647 0ustar kentkentRelease history for Path-IsDev 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, see Changes.deps{,.all,.dev} 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, see Changes.deps{,.all,.dev} 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, see Changes.deps{,.all,.dev} 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, see Changes.deps{,.all,.dev} 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, see Changes.deps{,.all,.dev} for details - develop: +2 -3 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, see Changes.deps{,.all,.dev} 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, see Changes.deps{,.all,.dev} 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, see Changes.deps{,.all,.dev} 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, see Changes.deps{,.all,.dev} for details - build: ↑1 - configure: ↑1 - develop: +1 ↑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, see Changes.deps{,.all,.dev} 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, see Changes.deps{,.all,.dev} 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.000002/lib/0000755000175000017500000000000012243547526013104 5ustar kentkentPath-IsDev-1.000002/lib/Path/0000755000175000017500000000000012243547526014000 5ustar kentkentPath-IsDev-1.000002/lib/Path/IsDev.pm0000644000175000017500000002407512243547526015360 0ustar kentkentuse strict; use warnings; package Path::IsDev; BEGIN { $Path::IsDev::AUTHORITY = 'cpan:KENTNL'; } { $Path::IsDev::VERSION = '1.000002'; } # ABSTRACT: Determine if a given Path resembles a development source tree 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 ( $class, $name, $arg ) = @_; my $object; return sub { my ($path) = @_; $object ||= do { require Path::IsDev::Object; Path::IsDev::Object->new( %{ $arg || {} } ); }; return $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.000002 =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". =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. =begin MetaPOD::JSON v1.1.0 { "namespace":"Path::IsDev", "interface":"exporter" } =end MetaPOD::JSON =head1 AUTHOR Kent Fredric =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2013 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.000002/lib/Path/IsDev/0000755000175000017500000000000012243547526015012 5ustar kentkentPath-IsDev-1.000002/lib/Path/IsDev/Object.pm0000644000175000017500000001257112243547526016564 0ustar kentkentuse strict; use warnings; package Path::IsDev::Object; BEGIN { $Path::IsDev::Object::AUTHORITY = 'cpan:KENTNL'; } { $Path::IsDev::Object::VERSION = '1.000002'; } # ABSTRACT: Object Oriented guts for C export 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 $object = Path::IsDev::Result->new( path => $path ); my $result; $self->_with_debug( sub { $self->_debug( 'Matching ' . $object->path ); $result = $self->loaded_set_module->matches($object); } ); if ( !!$result != !!$object->result ) { _carp(q[Result and Result Object missmatch]); } return $object; } sub matches { my ( $self, $path ) = @_; my $object = $self->_matches($path); if ( not $object->result ) { $self->_debug('no match found'); } return $object->result; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Path::IsDev::Object - Object Oriented guts for C export =head1 VERSION version 1.000002 =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) 2013 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.000002/lib/Path/IsDev/Heuristic/0000755000175000017500000000000012243547526016751 5ustar kentkentPath-IsDev-1.000002/lib/Path/IsDev/Heuristic/TestDir.pm0000644000175000017500000000301712243547526020666 0ustar kentkentuse strict; use warnings; package Path::IsDev::Heuristic::TestDir; BEGIN { $Path::IsDev::Heuristic::TestDir::AUTHORITY = 'cpan:KENTNL'; } { $Path::IsDev::Heuristic::TestDir::VERSION = '1.000002'; } # ABSTRACT: Determine if a path contains a t/ or xt/ directory use Role::Tiny::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.000002 =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) 2013 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.000002/lib/Path/IsDev/Heuristic/DevDirMarker.pm0000644000175000017500000000401212243547526021623 0ustar kentkentuse strict; use warnings; package Path::IsDev::Heuristic::DevDirMarker; BEGIN { $Path::IsDev::Heuristic::DevDirMarker::AUTHORITY = 'cpan:KENTNL'; } { $Path::IsDev::Heuristic::DevDirMarker::VERSION = '1.000002'; } # ABSTRACT: Determine if a path contains a C<.devdir> file 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 C<.devdir> file =head1 VERSION version 1.000002 =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) 2013 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.000002/lib/Path/IsDev/Heuristic/Changelog.pm0000644000175000017500000000363212243547526021202 0ustar kentkentuse strict; use warnings; package Path::IsDev::Heuristic::Changelog; BEGIN { $Path::IsDev::Heuristic::Changelog::AUTHORITY = 'cpan:KENTNL'; } { $Path::IsDev::Heuristic::Changelog::VERSION = '1.000002'; } # ABSTRACT: Determine if a path contains a C (or similar) use Role::Tiny::With; with 'Path::IsDev::Role::Heuristic', 'Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp::File'; sub basename_regexp { return qr/\AChange(s|log)(|[.][^.\s]+)\z/isxm; } 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 C (or similar) =head1 VERSION version 1.000002 =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) 2013 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.000002/lib/Path/IsDev/Heuristic/MYMETA.pm0000644000175000017500000000354412243547526020311 0ustar kentkentuse strict; use warnings; package Path::IsDev::Heuristic::MYMETA; BEGIN { $Path::IsDev::Heuristic::MYMETA::AUTHORITY = 'cpan:KENTNL'; } { $Path::IsDev::Heuristic::MYMETA::VERSION = '1.000002'; } # ABSTRACT: Determine if a path contains MYMETA.(json|yml) use Role::Tiny::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.000002 =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) 2013 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.000002/lib/Path/IsDev/Heuristic/VCS/0000755000175000017500000000000012243547526017404 5ustar kentkentPath-IsDev-1.000002/lib/Path/IsDev/Heuristic/VCS/Git.pm0000644000175000017500000000276112243547526020473 0ustar kentkentuse strict; use warnings; package Path::IsDev::Heuristic::VCS::Git; BEGIN { $Path::IsDev::Heuristic::VCS::Git::AUTHORITY = 'cpan:KENTNL'; } { $Path::IsDev::Heuristic::VCS::Git::VERSION = '1.000002'; } # ABSTRACT: Determine if a path contains a C<.git> repository use Role::Tiny::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 C<.git> repository =head1 VERSION version 1.000002 =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) 2013 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.000002/lib/Path/IsDev/Heuristic/Tool/0000755000175000017500000000000012243547526017666 5ustar kentkentPath-IsDev-1.000002/lib/Path/IsDev/Heuristic/Tool/Dzil.pm0000644000175000017500000000300112243547526021120 0ustar kentkentuse strict; use warnings; package Path::IsDev::Heuristic::Tool::Dzil; BEGIN { $Path::IsDev::Heuristic::Tool::Dzil::AUTHORITY = 'cpan:KENTNL'; } { $Path::IsDev::Heuristic::Tool::Dzil::VERSION = '1.000002'; } # ABSTRACT: Determine if a path is a Dist::Zilla Source tree 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.000002 =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) 2013 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.000002/lib/Path/IsDev/Heuristic/Tool/MakeMaker.pm0000644000175000017500000000306212243547526022062 0ustar kentkentuse strict; use warnings; package Path::IsDev::Heuristic::Tool::MakeMaker; BEGIN { $Path::IsDev::Heuristic::Tool::MakeMaker::AUTHORITY = 'cpan:KENTNL'; } { $Path::IsDev::Heuristic::Tool::MakeMaker::VERSION = '1.000002'; } # ABSTRACT: Determine if a path is an C Tooled source directory 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 C Tooled source directory =head1 VERSION version 1.000002 =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) 2013 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.000002/lib/Path/IsDev/Heuristic/Tool/ModuleBuild.pm0000644000175000017500000000305112243547526022430 0ustar kentkentuse strict; use warnings; package Path::IsDev::Heuristic::Tool::ModuleBuild; BEGIN { $Path::IsDev::Heuristic::Tool::ModuleBuild::AUTHORITY = 'cpan:KENTNL'; } { $Path::IsDev::Heuristic::Tool::ModuleBuild::VERSION = '1.000002'; } # ABSTRACT: Determine if a path is a Module::Build Source tree 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.000002 =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) 2013 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.000002/lib/Path/IsDev/Heuristic/META.pm0000644000175000017500000000275312243547526020044 0ustar kentkentuse strict; use warnings; package Path::IsDev::Heuristic::META; BEGIN { $Path::IsDev::Heuristic::META::AUTHORITY = 'cpan:KENTNL'; } { $Path::IsDev::Heuristic::META::VERSION = '1.000002'; } # ABSTRACT: Determine if a path contains META.(json|yml) use Role::Tiny::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.000002 =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) 2013 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.000002/lib/Path/IsDev/Heuristic/Makefile.pm0000644000175000017500000000302412243547526021023 0ustar kentkentuse strict; use warnings; package Path::IsDev::Heuristic::Makefile; BEGIN { $Path::IsDev::Heuristic::Makefile::AUTHORITY = 'cpan:KENTNL'; } { $Path::IsDev::Heuristic::Makefile::VERSION = '1.000002'; } # ABSTRACT: Determine if a path contains a C use Role::Tiny::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 C =head1 VERSION version 1.000002 =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) 2013 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.000002/lib/Path/IsDev/HeuristicSet/0000755000175000017500000000000012243547526017425 5ustar kentkentPath-IsDev-1.000002/lib/Path/IsDev/HeuristicSet/Basic.pm0000644000175000017500000000432212243547526021005 0ustar kentkentuse strict; use warnings; package Path::IsDev::HeuristicSet::Basic; BEGIN { $Path::IsDev::HeuristicSet::Basic::AUTHORITY = 'cpan:KENTNL'; } { $Path::IsDev::HeuristicSet::Basic::VERSION = '1.000002'; } # ABSTRACT: Basic C set of Heuristics use Role::Tiny::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 C set of Heuristics =head1 VERSION version 1.000002 =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) 2013 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.000002/lib/Path/IsDev/Result.pm0000644000175000017500000000737112243547526016636 0ustar kentkentuse strict; use warnings; package Path::IsDev::Result; BEGIN { $Path::IsDev::Result::AUTHORITY = 'cpan:KENTNL'; } { $Path::IsDev::Result::VERSION = '1.000002'; } # ABSTRACT: Result container use Class::Tiny 'path', 'result', { reasons => sub { [] } }; sub _path { require Path::Tiny; goto &Path::Tiny::path } sub _croak { require Carp; goto &Carp::croak } sub _debug { require Path::IsDev; shift; goto &Path::IsDev::debug } sub BUILD { my ( $self, $args ) = @_; 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.000002 =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) 2013 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.000002/lib/Path/IsDev/Role/0000755000175000017500000000000012243547526015713 5ustar kentkentPath-IsDev-1.000002/lib/Path/IsDev/Role/Heuristic.pm0000644000175000017500000000431712243547526020215 0ustar kentkentuse strict; use warnings; package Path::IsDev::Role::Heuristic; BEGIN { $Path::IsDev::Role::Heuristic::AUTHORITY = 'cpan:KENTNL'; } { $Path::IsDev::Role::Heuristic::VERSION = '1.000002'; } # ABSTRACT: Base role for Heuristic things. sub _blessed { require Scalar::Util; goto &Scalar::Util::blessed } use Role::Tiny; 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.000002 =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) 2013 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.000002/lib/Path/IsDev/Role/NegativeHeuristic.pm0000644000175000017500000000445612243547526021704 0ustar kentkentuse strict; use warnings; package Path::IsDev::Role::NegativeHeuristic; BEGIN { $Path::IsDev::Role::NegativeHeuristic::AUTHORITY = 'cpan:KENTNL'; } { $Path::IsDev::Role::NegativeHeuristic::VERSION = '1.000002'; } # ABSTRACT: Base role for Negative Heuristic things. sub _blessed { require Scalar::Util; goto &Scalar::Util::blessed } use Role::Tiny; 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.000002 =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) 2013 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.000002/lib/Path/IsDev/Role/Matcher/0000755000175000017500000000000012243547526017276 5ustar kentkentPath-IsDev-1.000002/lib/Path/IsDev/Role/Matcher/Child/0000755000175000017500000000000012243547526020321 5ustar kentkentPath-IsDev-1.000002/lib/Path/IsDev/Role/Matcher/Child/BaseName/0000755000175000017500000000000012243547526021774 5ustar kentkentPath-IsDev-1.000002/lib/Path/IsDev/Role/Matcher/Child/BaseName/MatchRegexp/0000755000175000017500000000000012243547526024203 5ustar kentkentPath-IsDev-1.000002/lib/Path/IsDev/Role/Matcher/Child/BaseName/MatchRegexp/File.pm0000644000175000017500000000506112243547526025422 0ustar kentkentuse strict; use warnings; package Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp::File; BEGIN { $Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp::File::AUTHORITY = 'cpan:KENTNL'; } { $Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp::File::VERSION = '1.000002'; } # ABSTRACT: Match if any children have Cs that match a regexp and are files use Role::Tiny; 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}; 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 Cs that match a regexp and are files =head1 VERSION version 1.000002 =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) 2013 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.000002/lib/Path/IsDev/Role/Matcher/Child/BaseName/MatchRegexp.pm0000644000175000017500000000465712243547526024555 0ustar kentkentuse strict; use warnings; package Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp; BEGIN { $Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp::AUTHORITY = 'cpan:KENTNL'; } { $Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp::VERSION = '1.000002'; } # ABSTRACT: Match when a path has a child file matching an expression 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.000002 =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) 2013 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.000002/lib/Path/IsDev/Role/Matcher/Child/Exists/0000755000175000017500000000000012243547526021600 5ustar kentkentPath-IsDev-1.000002/lib/Path/IsDev/Role/Matcher/Child/Exists/Any/0000755000175000017500000000000012243547526022327 5ustar kentkentPath-IsDev-1.000002/lib/Path/IsDev/Role/Matcher/Child/Exists/Any/File.pm0000644000175000017500000000440012243547526023542 0ustar kentkentuse strict; use warnings; package Path::IsDev::Role::Matcher::Child::Exists::Any::File; BEGIN { $Path::IsDev::Role::Matcher::Child::Exists::Any::File::AUTHORITY = 'cpan:KENTNL'; } { $Path::IsDev::Role::Matcher::Child::Exists::Any::File::VERSION = '1.000002'; } # ABSTRACT: Match if a path contains one of any of a list of files use Role::Tiny; 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}; 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.000002 =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) 2013 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.000002/lib/Path/IsDev/Role/Matcher/Child/Exists/Any/Dir.pm0000644000175000017500000000441012243547526023402 0ustar kentkentuse strict; use warnings; package Path::IsDev::Role::Matcher::Child::Exists::Any::Dir; BEGIN { $Path::IsDev::Role::Matcher::Child::Exists::Any::Dir::AUTHORITY = 'cpan:KENTNL'; } { $Path::IsDev::Role::Matcher::Child::Exists::Any::Dir::VERSION = '1.000002'; } # ABSTRACT: Match if a path contains one of any of a list of directories use Role::Tiny; 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.000002 =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) 2013 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.000002/lib/Path/IsDev/Role/Matcher/Child/Exists/Any.pm0000644000175000017500000000371212243547526022670 0ustar kentkentuse strict; use warnings; package Path::IsDev::Role::Matcher::Child::Exists::Any; BEGIN { $Path::IsDev::Role::Matcher::Child::Exists::Any::AUTHORITY = 'cpan:KENTNL'; } { $Path::IsDev::Role::Matcher::Child::Exists::Any::VERSION = '1.000002'; } # ABSTRACT: Match if any of a list of children exists 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.000002 =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) 2013 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.000002/lib/Path/IsDev/Role/Matcher/FullPath/0000755000175000017500000000000012243547526021015 5ustar kentkentPath-IsDev-1.000002/lib/Path/IsDev/Role/Matcher/FullPath/Is/0000755000175000017500000000000012243547526021370 5ustar kentkentPath-IsDev-1.000002/lib/Path/IsDev/Role/Matcher/FullPath/Is/Any.pm0000644000175000017500000000545212243547526022463 0ustar kentkent use strict; use warnings; package Path::IsDev::Role::Matcher::FullPath::Is::Any; BEGIN { $Path::IsDev::Role::Matcher::FullPath::Is::Any::AUTHORITY = 'cpan:KENTNL'; } { $Path::IsDev::Role::Matcher::FullPath::Is::Any::VERSION = '1.000002'; } # ABSTRACT: Match if the current directory is the same directory from a list of absolute paths. sub _path { require Path::Tiny; 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.000002 =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) 2013 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.000002/lib/Path/IsDev/Role/HeuristicSet.pm0000644000175000017500000000430712243547526020670 0ustar kentkentuse strict; use warnings; package Path::IsDev::Role::HeuristicSet; BEGIN { $Path::IsDev::Role::HeuristicSet::AUTHORITY = 'cpan:KENTNL'; } { $Path::IsDev::Role::HeuristicSet::VERSION = '1.000002'; } # ABSTRACT: Role for sets of Heuristics. sub _use_module { require Module::Runtime; goto &Module::Runtime::use_module } sub _com_mn { require Module::Runtime; goto &Module::Runtime::compose_module_name; } sub _debug { require Path::IsDev; goto &Path::IsDev::debug } use Role::Tiny; requires 'modules'; sub _expand_heuristic { my ( $self, $hn ) = @_; return _com_mn( 'Path::IsDev::Heuristic', $hn ); } sub _expand_negative_heuristic { my ( $self, $hn ) = @_; return _com_mn( 'Path::IsDev::NegativeHeuristic', $hn ); } sub _load_module { my ( $self, $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.000002 =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) 2013 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.000002/lib/Path/IsDev/Role/HeuristicSet/0000755000175000017500000000000012243547526020326 5ustar kentkentPath-IsDev-1.000002/lib/Path/IsDev/Role/HeuristicSet/Simple.pm0000644000175000017500000000355612243547526022126 0ustar kentkent use strict; use warnings; package Path::IsDev::Role::HeuristicSet::Simple; BEGIN { $Path::IsDev::Role::HeuristicSet::Simple::AUTHORITY = 'cpan:KENTNL'; } { $Path::IsDev::Role::HeuristicSet::Simple::VERSION = '1.000002'; } # ABSTRACT: Simple excludes/includes set use Role::Tiny; 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.000002 =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) 2013 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.000002/lib/Path/IsDev/NegativeHeuristic/0000755000175000017500000000000012243547526020434 5ustar kentkentPath-IsDev-1.000002/lib/Path/IsDev/NegativeHeuristic/IsDev/0000755000175000017500000000000012243547526021446 5ustar kentkentPath-IsDev-1.000002/lib/Path/IsDev/NegativeHeuristic/IsDev/IgnoreFile.pm0000644000175000017500000000377512243547526024043 0ustar kentkent use strict; use warnings; package Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile; BEGIN { $Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile::AUTHORITY = 'cpan:KENTNL'; } { $Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile::VERSION = '1.000002'; } # ABSTRACT: An explicit exclusion file heuristic use Role::Tiny::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 ( my $result = $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.000002 =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) 2013 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.000002/lib/Path/IsDev/NegativeHeuristic/PerlINC.pm0000644000175000017500000000371312243547526022232 0ustar kentkentuse strict; use warnings; package Path::IsDev::NegativeHeuristic::PerlINC; BEGIN { $Path::IsDev::NegativeHeuristic::PerlINC::AUTHORITY = 'cpan:KENTNL'; } { $Path::IsDev::NegativeHeuristic::PerlINC::VERSION = '1.000002'; } # ABSTRACT: White-list paths in C as being non-development roots. ## no critic (RequireArgUnpacking, ProhibitSubroutinePrototypes) sub _uniq (@) { my %seen = (); return grep { not $seen{$_}++ } @_; } use Role::Tiny::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 C as being non-development roots. =head1 VERSION version 1.000002 =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) 2013 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.000002/lib/Path/IsDev/NegativeHeuristic/HomeDir.pm0000644000175000017500000000426412243547526022327 0ustar kentkent use strict; use warnings; package Path::IsDev::NegativeHeuristic::HomeDir; BEGIN { $Path::IsDev::NegativeHeuristic::HomeDir::AUTHORITY = 'cpan:KENTNL'; } { $Path::IsDev::NegativeHeuristic::HomeDir::VERSION = '1.000002'; } # ABSTRACT: User home directories are not development roots ## no critic (RequireArgUnpacking, ProhibitSubroutinePrototypes) sub _uniq (@) { my %seen = (); return grep { not $seen{$_}++ } @_; } use Role::Tiny::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.000002 =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) 2013 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.000002/xt/0000755000175000017500000000000012243547526012771 5ustar kentkentPath-IsDev-1.000002/xt/release/0000755000175000017500000000000012243547526014411 5ustar kentkentPath-IsDev-1.000002/xt/release/pod-coverage.t0000644000175000017500000000052712243547526017155 0ustar kentkent#!perl use Test::More; eval "use Test::Pod::Coverage 1.08"; plan skip_all => "Test::Pod::Coverage 1.08 required for testing POD coverage" if $@; eval "use Pod::Coverage::TrustPod"; plan skip_all => "Pod::Coverage::TrustPod required for testing POD coverage" if $@; all_pod_coverage_ok({ coverage_class => 'Pod::Coverage::TrustPod' }); Path-IsDev-1.000002/xt/release/cpan-changes.t0000644000175000017500000000026312243547526017126 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.000002/xt/release/pod-syntax.t0000644000175000017500000000021212243547526016677 0ustar kentkent#!perl use Test::More; eval "use Test::Pod 1.41"; plan skip_all => "Test::Pod 1.41 required for testing POD" if $@; all_pod_files_ok(); Path-IsDev-1.000002/xt/release/distmeta.t0000644000175000017500000000021712243547526016410 0ustar kentkent#!perl use Test::More; eval "use Test::CPAN::Meta"; plan skip_all => "Test::CPAN::Meta required for testing META.yml" if $@; meta_yaml_ok(); Path-IsDev-1.000002/xt/release/minimum-version.t0000644000175000017500000000027012243547526017733 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.000002/xt/release/kwalitee.t0000644000175000017500000000016612243547526016406 0ustar kentkent# this test was generated with Dist::Zilla::Plugin::Test::Kwalitee 2.07 use strict; use warnings; use Test::Kwalitee; Path-IsDev-1.000002/xt/release/eol.t0000644000175000017500000000024012243547526015351 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.000002/xt/author/0000755000175000017500000000000012243547526014273 5ustar kentkentPath-IsDev-1.000002/xt/author/critic.t0000644000175000017500000000043512243547526015737 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.000002/Build.PL0000644000175000017500000000260112243547526013631 0ustar kentkent use strict; use warnings; use Module::Build 0.3601; my %module_build_args = ( "build_requires" => { "Module::Build" => "0.4202" }, "configure_requires" => { "Module::Build" => "0.4202" }, "dist_abstract" => "Determine if a given Path resembles a development source tree", "dist_author" => [ "Kent Fredric " ], "dist_name" => "Path-IsDev", "dist_version" => "1.000002", "license" => "perl", "module_name" => "Path::IsDev", "recommends" => {}, "recursive_test_files" => 1, "requires" => { "Carp" => 0, "Class::Tiny" => "0.010", "File::HomeDir" => 0, "Module::Runtime" => 0, "Path::Tiny" => 0, "Role::Tiny" => 0, "Role::Tiny::With" => 0, "Scalar::Util" => 0, "Sub::Exporter" => 0, "perl" => "5.006", "strict" => 0, "warnings" => 0 }, "script_files" => [], "test_requires" => { "File::Temp" => 0, "FindBin" => 0, "Test::Fatal" => 0, "Test::More" => "1.001002" } ); my %fallback_build_requires = ( "File::Temp" => 0, "FindBin" => 0, "Module::Build" => "0.4202", "Test::Fatal" => 0, "Test::More" => "1.001002" ); unless ( eval { Module::Build->VERSION(0.4004) } ) { delete $module_build_args{test_requires}; $module_build_args{build_requires} = \%fallback_build_requires; } my $build = Module::Build->new(%module_build_args); $build->create_build_script; Path-IsDev-1.000002/t/0000755000175000017500000000000012243547526012601 5ustar kentkentPath-IsDev-1.000002/t/Path-IsDev/0000755000175000017500000000000012243547526014505 5ustar kentkentPath-IsDev-1.000002/t/Path-IsDev/is_dev/0000755000175000017500000000000012243547526015756 5ustar kentkentPath-IsDev-1.000002/t/Path-IsDev/is_dev/MYMETA.t0000644000175000017500000000120312243547526017133 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.000002/t/Path-IsDev/is_dev/DZil.t0000644000175000017500000000120112243547526016777 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.000002/t/Path-IsDev/is_dev/MakeMaker.t0000644000175000017500000000120612243547526017777 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.000002/t/Path-IsDev/is_dev/TestDir.t0000644000175000017500000000120412243547526017516 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.000002/t/Path-IsDev/is_dev/Changelog.t0000644000175000017500000000120612243547526020031 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.000002/t/Path-IsDev/is_dev/DevDir.t0000644000175000017500000000120312243547526017314 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.000002/t/Path-IsDev/is_dev/suite.t.tpl0000644000175000017500000000120612243547526020071 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.000002/t/Path-IsDev/is_dev/META.t0000644000175000017500000000120112243547526016663 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.000002/t/Path-IsDev/is_dev/ModuleBuild.t0000644000175000017500000000121012243547526020342 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.000002/t/Path-IsDev-Object/0000755000175000017500000000000012243547526015711 5ustar kentkentPath-IsDev-1.000002/t/Path-IsDev-Object/_matches.t0000644000175000017500000000600712243547526017664 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.000002/t/Path-IsDev-Object/basic.t0000644000175000017500000000477612243547526017175 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.000002/t/00-compile/0000755000175000017500000000000012243547526014446 5ustar kentkentPath-IsDev-1.000002/t/00-compile/lib_Path_IsDev_Role_Matcher_Child_Exists_Any_File_pm.t0000644000175000017500000000055112243547526027000 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.001001 # 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.000002/t/00-compile/lib_Path_IsDev_Heuristic_Changelog_pm.t0000644000175000017500000000051312243547526024130 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.001001 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Heuristic/Changelog.pm"); Path-IsDev-1.000002/t/00-compile/lib_Path_IsDev_Heuristic_TestDir_pm.t0000644000175000017500000000050712243547526023622 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.001001 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Heuristic/TestDir.pm"); Path-IsDev-1.000002/t/00-compile/lib_Path_IsDev_Role_Matcher_Child_BaseName_MatchRegexp_pm.t0000644000175000017500000000056312243547526027720 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.001001 # 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.000002/t/00-compile/lib_Path_IsDev_Result_pm.t0000644000175000017500000000046112243547526021502 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.001001 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Result.pm"); Path-IsDev-1.000002/t/00-compile/lib_Path_IsDev_Object_pm.t0000644000175000017500000000046112243547526021432 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.001001 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Object.pm"); Path-IsDev-1.000002/t/00-compile/lib_Path_IsDev_Heuristic_Tool_ModuleBuild_pm.t0000644000175000017500000000053112243547526025443 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.001001 # 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.000002/t/00-compile/lib_Path_IsDev_Role_HeuristicSet_pm.t0000644000175000017500000000050712243547526023621 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.001001 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Role/HeuristicSet.pm"); Path-IsDev-1.000002/t/00-compile/lib_Path_IsDev_NegativeHeuristic_PerlINC_pm.t0000644000175000017500000000052712243547526025165 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.001001 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/NegativeHeuristic/PerlINC.pm"); Path-IsDev-1.000002/t/00-compile/lib_Path_IsDev_Heuristic_Tool_MakeMaker_pm.t0000644000175000017500000000052512243547526025076 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.001001 # 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.000002/t/00-compile/lib_Path_IsDev_Heuristic_Tool_Dzil_pm.t0000644000175000017500000000051312243547526024140 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.001001 # 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.000002/t/00-compile/lib_Path_IsDev_NegativeHeuristic_HomeDir_pm.t0000644000175000017500000000052712243547526025260 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.001001 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/NegativeHeuristic/HomeDir.pm"); Path-IsDev-1.000002/t/00-compile/lib_Path_IsDev_Heuristic_DevDirMarker_pm.t0000644000175000017500000000052112243547526024557 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.001001 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Heuristic/DevDirMarker.pm"); Path-IsDev-1.000002/t/00-compile/lib_Path_IsDev_pm.t0000644000175000017500000000044312243547526020144 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.001001 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev.pm"); Path-IsDev-1.000002/t/00-compile/lib_Path_IsDev_Role_NegativeHeuristic_pm.t0000644000175000017500000000052112243547526024624 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.001001 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Role/NegativeHeuristic.pm"); Path-IsDev-1.000002/t/00-compile/lib_Path_IsDev_Role_Matcher_Child_Exists_Any_pm.t0000644000175000017500000000053712243547526026045 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.001001 # 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.000002/t/00-compile/lib_Path_IsDev_Heuristic_META_pm.t0000644000175000017500000000050112243547526022764 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.001001 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Heuristic/META.pm"); Path-IsDev-1.000002/t/00-compile/lib_Path_IsDev_Role_Matcher_Child_BaseName_MatchRegexp_File_pm.t0000644000175000017500000000057512243547526030662 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.001001 # 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.000002/t/00-compile/lib_Path_IsDev_HeuristicSet_Basic_pm.t0000644000175000017500000000051112243547526023734 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.001001 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/HeuristicSet/Basic.pm"); Path-IsDev-1.000002/t/00-compile/lib_Path_IsDev_Heuristic_VCS_Git_pm.t0000644000175000017500000000050712243547526023502 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.001001 # 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.000002/t/00-compile/lib_Path_IsDev_Role_Matcher_FullPath_Is_Any_pm.t0000644000175000017500000000053512243547526025633 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.001001 # 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.000002/t/00-compile/lib_Path_IsDev_Role_Heuristic_pm.t0000644000175000017500000000050112243547526023137 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.001001 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Role/Heuristic.pm"); Path-IsDev-1.000002/t/00-compile/lib_Path_IsDev_Role_HeuristicSet_Simple_pm.t0000644000175000017500000000052512243547526025132 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.001001 # 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.000002/t/00-compile/lib_Path_IsDev_NegativeHeuristic_IsDev_IgnoreFile_pm.t0000644000175000017500000000055112243547526027043 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.001001 # 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.000002/t/00-compile/lib_Path_IsDev_Role_Matcher_Child_Exists_Any_Dir_pm.t0000644000175000017500000000054712243547526026644 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.001001 # 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.000002/t/00-compile/lib_Path_IsDev_Heuristic_Makefile_pm.t0000644000175000017500000000051112243547526023754 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.001001 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Heuristic/Makefile.pm"); Path-IsDev-1.000002/t/00-compile/lib_Path_IsDev_Heuristic_MYMETA_pm.t0000644000175000017500000000050512243547526023236 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.001001 # with template 01-basic.t.tpl use Test::More 0.89 tests => 1; require_ok("lib/Path/IsDev/Heuristic/MYMETA.pm"); Path-IsDev-1.000002/t/000-report-versions-tiny.t0000644000175000017500000000515412243547526017432 0ustar kentkentuse strict; use warnings; use Test::More 0.88; # This is a relatively nice way to avoid Test::NoWarnings breaking our # expectations by adding extra tests, without using no_plan. It also helps # avoid any other test module that feels introducing random tests, or even # test plans, is a nice idea. our $success = 0; END { $success && done_testing; } # List our own version used to generate this my $v = "\nGenerated by Dist::Zilla::Plugin::ReportVersions::Tiny v1.10\n"; eval { # no excuses! # report our Perl details my $want = '5.006'; $v .= "perl: $] (wanted $want) on $^O from $^X\n\n"; }; defined($@) and diag("$@"); # Now, our module version dependencies: sub pmver { my ($module, $wanted) = @_; $wanted = " (want $wanted)"; my $pmver; eval "require $module;"; if ($@) { if ($@ =~ m/Can't locate .* in \@INC/) { $pmver = 'module not found.'; } else { diag("${module}: $@"); $pmver = 'died during require.'; } } else { my $version; eval { $version = $module->VERSION; }; if ($@) { diag("${module}: $@"); $pmver = 'died during VERSION check.'; } elsif (defined $version) { $pmver = "$version"; } else { $pmver = ''; } } # So, we should be good, right? return sprintf('%-45s => %-10s%-15s%s', $module, $pmver, $wanted, "\n"); } eval { $v .= pmver('Carp','any version') }; eval { $v .= pmver('Class::Tiny','0.010') }; eval { $v .= pmver('File::HomeDir','any version') }; eval { $v .= pmver('File::Temp','any version') }; eval { $v .= pmver('FindBin','any version') }; eval { $v .= pmver('Module::Build','0.4202') }; eval { $v .= pmver('Module::Runtime','any version') }; eval { $v .= pmver('Path::Tiny','any version') }; eval { $v .= pmver('Role::Tiny','any version') }; eval { $v .= pmver('Role::Tiny::With','any version') }; eval { $v .= pmver('Scalar::Util','any version') }; eval { $v .= pmver('Sub::Exporter','any version') }; eval { $v .= pmver('Test::Fatal','any version') }; eval { $v .= pmver('Test::More','1.001002') }; eval { $v .= pmver('strict','any version') }; eval { $v .= pmver('warnings','any version') }; # All done. $v .= <<'EOT'; Thanks for using my code. I hope it works for you. If not, please try and include this output in the bug report. That will help me reproduce the issue and solve your problem. EOT diag($v); ok(1, "we really didn't test anything, just reporting data"); $success = 1; # Work around another nasty module on CPAN. :/ no warnings 'once'; $Template::Test::NO_FLUSH = 1; exit 0; Path-IsDev-1.000002/t/basic.t0000644000175000017500000000047412243547526014054 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.000002/.travis.yml0000644000175000017500000000201112243547526014441 0ustar kentkentlanguage: perl matrix: 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.18" env: STERILIZE_ENV=0 - perl: "5.19" env: STERILIZE_ENV=0 - perl: "5.8" env: STERILIZE_ENV=1 - perl: "5.10" env: STERILIZE_ENV=1 - perl: "5.19" env: STERILIZE_ENV=1 - perl: "5.19" env: STERILIZE_ENV=0 DEVELOPER_DEPS=1 - perl: "5.19" env: STERILIZE_ENV=0 RELEASE_TESTING=1 AUTHOR_TESTING=1 before_install: - perlbrew list - time perl ./maint-travis-ci/sterilize_env.pl install: - 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.000002/README0000644000175000017500000002171012243547526013217 0ustar kentkentNAME Path::IsDev - Determine if a given Path resembles a development source tree VERSION version 1.000002 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) 2013 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.000002/Changes.deps.all0000644000175000017500000000770412243547526015342 0ustar kentkent1.000002 [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 Path-IsDev-1.000002/layout/0000755000175000017500000000000012243547526013653 5ustar kentkentPath-IsDev-1.000002/layout/self_structure.png0000644000175000017500000042417612243547526017450 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.000002/layout/self_structure.dot0000644000175000017500000002766312243547526017452 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.000002/Changes.deps0000644000175000017500000000271412243547526014567 0ustar kentkent1.000002 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 Path-IsDev-1.000002/Changes.deps.dev0000644000175000017500000000556112243547526015347 0ustar kentkent1.000002 [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 Path-IsDev-1.000002/META.yml0000644000175000017500000004640712243547526013622 0ustar kentkent--- abstract: 'Determine if a given Path resembles a development source tree' author: - 'Kent Fredric ' build_requires: File::Temp: 0 FindBin: 0 Module::Build: 0.4202 Test::Fatal: 0 Test::More: 1.001002 configure_requires: Module::Build: 0.4202 dynamic_config: 0 generated_by: 'Dist::Zilla version 5.006, CPAN::Meta::Converter version 2.132830' 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.000002 Path::IsDev::Heuristic::Changelog: file: lib/Path/IsDev/Heuristic/Changelog.pm version: 1.000002 Path::IsDev::Heuristic::DevDirMarker: file: lib/Path/IsDev/Heuristic/DevDirMarker.pm version: 1.000002 Path::IsDev::Heuristic::META: file: lib/Path/IsDev/Heuristic/META.pm version: 1.000002 Path::IsDev::Heuristic::MYMETA: file: lib/Path/IsDev/Heuristic/MYMETA.pm version: 1.000002 Path::IsDev::Heuristic::Makefile: file: lib/Path/IsDev/Heuristic/Makefile.pm version: 1.000002 Path::IsDev::Heuristic::TestDir: file: lib/Path/IsDev/Heuristic/TestDir.pm version: 1.000002 Path::IsDev::Heuristic::Tool::Dzil: file: lib/Path/IsDev/Heuristic/Tool/Dzil.pm version: 1.000002 Path::IsDev::Heuristic::Tool::MakeMaker: file: lib/Path/IsDev/Heuristic/Tool/MakeMaker.pm version: 1.000002 Path::IsDev::Heuristic::Tool::ModuleBuild: file: lib/Path/IsDev/Heuristic/Tool/ModuleBuild.pm version: 1.000002 Path::IsDev::Heuristic::VCS::Git: file: lib/Path/IsDev/Heuristic/VCS/Git.pm version: 1.000002 Path::IsDev::HeuristicSet::Basic: file: lib/Path/IsDev/HeuristicSet/Basic.pm version: 1.000002 Path::IsDev::NegativeHeuristic::HomeDir: file: lib/Path/IsDev/NegativeHeuristic/HomeDir.pm version: 1.000002 Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile: file: lib/Path/IsDev/NegativeHeuristic/IsDev/IgnoreFile.pm version: 1.000002 Path::IsDev::NegativeHeuristic::PerlINC: file: lib/Path/IsDev/NegativeHeuristic/PerlINC.pm version: 1.000002 Path::IsDev::Object: file: lib/Path/IsDev/Object.pm version: 1.000002 Path::IsDev::Result: file: lib/Path/IsDev/Result.pm version: 1.000002 Path::IsDev::Role::Heuristic: file: lib/Path/IsDev/Role/Heuristic.pm version: 1.000002 Path::IsDev::Role::HeuristicSet: file: lib/Path/IsDev/Role/HeuristicSet.pm version: 1.000002 Path::IsDev::Role::HeuristicSet::Simple: file: lib/Path/IsDev/Role/HeuristicSet/Simple.pm version: 1.000002 Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp: file: lib/Path/IsDev/Role/Matcher/Child/BaseName/MatchRegexp.pm version: 1.000002 Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp::File: file: lib/Path/IsDev/Role/Matcher/Child/BaseName/MatchRegexp/File.pm version: 1.000002 Path::IsDev::Role::Matcher::Child::Exists::Any: file: lib/Path/IsDev/Role/Matcher/Child/Exists/Any.pm version: 1.000002 Path::IsDev::Role::Matcher::Child::Exists::Any::Dir: file: lib/Path/IsDev/Role/Matcher/Child/Exists/Any/Dir.pm version: 1.000002 Path::IsDev::Role::Matcher::Child::Exists::Any::File: file: lib/Path/IsDev/Role/Matcher/Child/Exists/Any/File.pm version: 1.000002 Path::IsDev::Role::Matcher::FullPath::Is::Any: file: lib/Path/IsDev/Role/Matcher/FullPath/Is/Any.pm version: 1.000002 Path::IsDev::Role::NegativeHeuristic: file: lib/Path/IsDev/Role/NegativeHeuristic.pm version: 1.000002 requires: Carp: 0 Class::Tiny: 0.010 File::HomeDir: 0 Module::Runtime: 0 Path::Tiny: 0 Role::Tiny: 0 Role::Tiny::With: 0 Scalar::Util: 0 Sub::Exporter: 0 perl: 5.006 strict: 0 warnings: 0 resources: bugtracker: https://github.com/kentfredric/Path-IsDev/issues homepage: https://github.com/kentfredric/Path-IsDev repository: https://github.com/kentfredric/Path-IsDev.git version: 1.000002 x_BuiltWith: failures: Role::Tiny::With: 'Module::MetaData could not parse a version from /home/kent/perl5/perlbrew/perls/perl-5.19.5/lib/site_perl/5.19.5/Role/Tiny/With.pm' modules: Carp: 1.32 Class::Tiny: 0.012 Dist::Zilla::Plugin::Author::KENTNL::MinimumPerl: 2.004000 Dist::Zilla::Plugin::Authority: 1.006 Dist::Zilla::Plugin::AutoPrereqs: 5.006 Dist::Zilla::Plugin::CheckExtraTests: 0.016 Dist::Zilla::Plugin::ConfirmRelease: 5.006 Dist::Zilla::Plugin::EOLTests: 0.02 Dist::Zilla::Plugin::Git::Check: 2.017 Dist::Zilla::Plugin::Git::Commit: 2.017 Dist::Zilla::Plugin::Git::CommitBuild: 2.017 Dist::Zilla::Plugin::Git::GatherDir: 2.017 Dist::Zilla::Plugin::Git::NextVersion: 2.017 Dist::Zilla::Plugin::Git::Tag: 2.017 Dist::Zilla::Plugin::GithubMeta: 0.42 Dist::Zilla::Plugin::License: 5.006 Dist::Zilla::Plugin::Manifest: 5.006 Dist::Zilla::Plugin::ManifestSkip: 5.006 Dist::Zilla::Plugin::MetaConfig: 5.006 Dist::Zilla::Plugin::MetaData::BuiltWith: 0.04000000 Dist::Zilla::Plugin::MetaJSON: 5.006 Dist::Zilla::Plugin::MetaProvides::Package: 1.15000000 Dist::Zilla::Plugin::MetaTests: 5.006 Dist::Zilla::Plugin::MetaYAML: 5.006 Dist::Zilla::Plugin::ModuleBuild: 5.006 Dist::Zilla::Plugin::NextRelease: 5.006 Dist::Zilla::Plugin::PkgVersion: 5.006 Dist::Zilla::Plugin::PodCoverageTests: 5.006 Dist::Zilla::Plugin::PodSyntaxTests: 5.006 Dist::Zilla::Plugin::PodWeaver: 4.002 Dist::Zilla::Plugin::Prereqs: 5.006 Dist::Zilla::Plugin::Prereqs::MatchInstalled: 0.1.4 Dist::Zilla::Plugin::PruneCruft: 5.006 Dist::Zilla::Plugin::ReadmeAnyFromPod: 0.133060 Dist::Zilla::Plugin::ReadmeFromPod: 0.21 Dist::Zilla::Plugin::ReportVersions::Tiny: 1.10 Dist::Zilla::Plugin::Test::CPAN::Changes: 0.008 Dist::Zilla::Plugin::Test::Compile::PerFile: 0.001001 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::TestRelease: 5.006 Dist::Zilla::Plugin::Twitter: 0.023 Dist::Zilla::Plugin::UploadToCPAN: 5.006 Dist::Zilla::PluginBundle::Author::KENTNL: 2.004000 Dist::Zilla::PluginBundle::Author::KENTNL::Lite: 1.7.2 File::HomeDir: 1.00 File::Temp: 0.2304 FindBin: 1.51 Module::Build: 0.4202 Module::Runtime: 0.013 Path::Tiny: 0.044 Pod::Coverage::TrustPod: 0.100003 Role::Tiny: 1.003002 Scalar::Util: 1.35 Sub::Exporter: 0.987 Test::CPAN::Changes: 0.26 Test::CPAN::Meta: 0.23 Test::Fatal: 0.013 Test::Kwalitee: 1.17 Test::More: 1.001002 Test::Pod: 1.48 Test::Pod::Coverage: 1.08 strict: 1.08 version: 0.9904 warnings: 1.20 perl: original: v5.19.5 qv: 1 version: - 5 - 19 - 5 perl-config: gccversion: 4.7.3 myarchname: x86_64-linux osname: linux platform: linux uname: 'Linux 3.12.0-gentoo x86_64 GenuineIntel GNU/Linux' x_Dist_Zilla: perl: version: 5.019005 plugins: - class: Dist::Zilla::Plugin::Git::NextVersion name: '@Author::KENTNL/Git::NextVersion' version: 2.017 - class: Dist::Zilla::Plugin::MetaConfig name: '@Author::KENTNL/MetaConfig' version: 5.006 - class: Dist::Zilla::Plugin::GithubMeta name: '@Author::KENTNL/GithubMeta' version: 0.42 - class: Dist::Zilla::Plugin::FinderCode name: '@Author::KENTNL/MetaProvides::Package/AUTOVIV/:InstallModulesPM' version: 5.006 - class: Dist::Zilla::Plugin::MetaProvides::Package config: Dist::Zilla::Plugin::MetaProvides::Package: {} Dist::Zilla::Role::MetaProvider::Provider: inherit_missing: 1 inherit_version: 1 meta_noindex: 1 name: '@Author::KENTNL/MetaProvides::Package' version: 1.15000000 - 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: 0.04000000 - class: Dist::Zilla::Plugin::Git::GatherDir name: '@Author::KENTNL/Git::GatherDir' version: 2.017 - class: Dist::Zilla::Plugin::License name: '@Author::KENTNL/License' version: 5.006 - class: Dist::Zilla::Plugin::MetaJSON name: '@Author::KENTNL/MetaJSON' version: 5.006 - class: Dist::Zilla::Plugin::MetaYAML name: '@Author::KENTNL/MetaYAML' version: 5.006 - class: Dist::Zilla::Plugin::Manifest name: '@Author::KENTNL/Manifest' version: 5.006 - class: Dist::Zilla::Plugin::MetaTests name: '@Author::KENTNL/MetaTests' version: 5.006 - class: Dist::Zilla::Plugin::PodCoverageTests name: '@Author::KENTNL/PodCoverageTests' version: 5.006 - class: Dist::Zilla::Plugin::PodSyntaxTests name: '@Author::KENTNL/PodSyntaxTests' version: 5.006 - class: Dist::Zilla::Plugin::ReportVersions::Tiny name: '@Author::KENTNL/ReportVersions::Tiny' version: 1.10 - 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.006 - 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.001001 - class: Dist::Zilla::Plugin::Test::Perl::Critic name: '@Author::KENTNL/Test::Perl::Critic' version: 2.112410 - class: Dist::Zilla::Plugin::PruneCruft name: '@Author::KENTNL/PruneCruft' version: 5.006 - class: Dist::Zilla::Plugin::ManifestSkip name: '@Author::KENTNL/ManifestSkip' version: 5.006 - class: Dist::Zilla::Plugin::PkgVersion name: '@Author::KENTNL/PkgVersion' version: 5.006 - class: Dist::Zilla::Plugin::PodWeaver config: Dist::Zilla::Plugin::PodWeaver: finder: - ':InstallModules' - ':ExecFiles' plugins: - class: Pod::Weaver::Plugin::EnsurePod5 name: '@CorePrep/EnsurePod5' version: 4.004 - class: Pod::Weaver::Plugin::H1Nester name: '@CorePrep/H1Nester' version: 4.004 - class: Pod::Weaver::Plugin::SingleEncoding name: '-SingleEncoding' version: 4.004 - class: Pod::Weaver::Section::Name name: Name version: 4.004 - class: Pod::Weaver::Section::Version name: Version version: 4.004 - class: Pod::Weaver::Section::Region name: prelude version: 4.004 - class: Pod::Weaver::Section::Generic name: SYNOPSIS version: 4.004 - class: Pod::Weaver::Section::Generic name: DESCRIPTION version: 4.004 - class: Pod::Weaver::Section::Generic name: OVERVIEW version: 4.004 - class: Pod::Weaver::Section::Collect name: REQUIRES version: 4.004 - class: Pod::Weaver::Section::Collect name: METHODS version: 4.004 - class: Pod::Weaver::Section::Collect name: FUNCTIONS version: 4.004 - class: Pod::Weaver::Section::Collect name: ATTRIBUTES version: 4.004 - class: Pod::Weaver::Section::Collect name: PRIVATE_ATTRIBUTES version: 4.004 - class: Pod::Weaver::Section::Collect name: PRIVATE_METHODS version: 4.004 - class: Pod::Weaver::Section::Leftovers name: Leftovers version: 4.004 - class: Pod::Weaver::Section::Region name: postlude version: 4.004 - class: Pod::Weaver::Section::Authors name: Authors version: 4.004 - class: Pod::Weaver::Section::Legal name: Legal version: 4.004 name: '@Author::KENTNL/PodWeaver' version: 4.002 - class: Dist::Zilla::Plugin::NextRelease name: '@Author::KENTNL/NextRelease' version: 5.006 - class: Dist::Zilla::Plugin::AutoPrereqs name: '@Author::KENTNL/AutoPrereqs' version: 5.006 - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: develop type: suggests name: '@Author::KENTNL/Prereqs/BundleDevelSuggests' version: 5.006 - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: develop type: requires name: '@Author::KENTNL/Prereqs/BundleDevelRequires' version: 5.006 - class: Dist::Zilla::Plugin::Author::KENTNL::MinimumPerl name: '@Author::KENTNL/Author::KENTNL::MinimumPerl' version: 2.004000 - class: Dist::Zilla::Plugin::Authority name: '@Author::KENTNL/Authority' version: 1.006 - class: Dist::Zilla::Plugin::ModuleBuild name: '@Author::KENTNL/ModuleBuild' version: 5.006 - class: Dist::Zilla::Plugin::ReadmeFromPod name: '@Author::KENTNL/ReadmeFromPod' version: 0.21 - class: Dist::Zilla::Plugin::ReadmeAnyFromPod name: '@Author::KENTNL/ReadmeAnyFromPod' version: 0.133060 - class: Dist::Zilla::Plugin::Test::CPAN::Changes name: '@Author::KENTNL/Test::CPAN::Changes' version: 0.008 - class: Dist::Zilla::Plugin::CheckExtraTests name: '@Author::KENTNL/CheckExtraTests' version: 0.016 - class: Dist::Zilla::Plugin::TestRelease name: '@Author::KENTNL/TestRelease' version: 5.006 - class: Dist::Zilla::Plugin::ConfirmRelease name: '@Author::KENTNL/ConfirmRelease' version: 5.006 - class: Dist::Zilla::Plugin::Git::Check name: '@Author::KENTNL/Git::Check' version: 2.017 - class: Dist::Zilla::Plugin::Git::Tag name: '@Author::KENTNL/Git::Tag/tag_master' version: 2.017 - class: Dist::Zilla::Plugin::Git::Commit name: '@Author::KENTNL/Git::Commit' version: 2.017 - class: Dist::Zilla::Plugin::Git::CommitBuild name: '@Author::KENTNL/Git::CommitBuild' version: 2.017 - class: Dist::Zilla::Plugin::Git::Tag name: '@Author::KENTNL/Git::Tag/tag_release' version: 2.017 - class: Dist::Zilla::Plugin::UploadToCPAN name: '@Author::KENTNL/UploadToCPAN' version: 5.006 - class: Dist::Zilla::Plugin::Twitter name: '@Author::KENTNL/Twitter' version: 0.023 - class: Dist::Zilla::Plugin::Prereqs::MatchInstalled config: Dist::Zilla::Plugin::Prereqs::MatchInstalled: applyto: - build.requires - build.recommends - build.suggests - test.requires - test.recommends - test.suggests - runtime.requires - runtime.recommends - runtime.suggests - configure.requires - configure.recommends - configure.suggests - develop.requires - develop.recommends - develop.suggests applyto_phase: - build - test - runtime - configure - develop applyto_relation: - requires - recommends - suggests modules: - Module::Build - Test::More - Dist::Zilla::PluginBundle::Author::KENTNL name: '@Author::KENTNL/Prereqs::MatchInstalled' version: 0.1.4 - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: develop type: requires name: '@Author::KENTNL/::Role::BundleDeps' version: 5.006 - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: runtime type: requires name: Prereqs version: 5.006 - class: Dist::Zilla::Plugin::FinderCode name: ':InstallModules' version: 5.006 - class: Dist::Zilla::Plugin::FinderCode name: ':IncModules' version: 5.006 - class: Dist::Zilla::Plugin::FinderCode name: ':TestFiles' version: 5.006 - class: Dist::Zilla::Plugin::FinderCode name: ':ExecFiles' version: 5.006 - class: Dist::Zilla::Plugin::FinderCode name: ':ShareFiles' version: 5.006 - class: Dist::Zilla::Plugin::FinderCode name: ':MainModule' version: 5.006 zilla: class: Dist::Zilla::Dist::Builder config: is_trial: 0 version: 5.006 x_authority: cpan:KENTNL Path-IsDev-1.000002/perlcritic.rc0000644000175000017500000000126212243547526015025 0ustar kentkentseverity = 1 exclude = RequireTidyCode RequirePodSections ProhibitPostfixControls RequireRcsKeywords RequireExplicitPackage include = Moose::ProhibitMultipleWiths Moose::ProhibitNewMethod Moose::RequireCleanNamespace Moose::RequireMakeImmutable color = 1 verbose = 9 [BuiltinFunctions::ProhibitStringyEval] allow_includes = 1 [CodeLayout::ProhibitTrailingWhitespace] [Documentation::PodSpelling] stop_words = behaviours pluggable accessor accessors introspectable [Subroutines::ProhibitUnusedPrivateSubroutines] private_name_regex = _(?!build_)\w [TestingAndDebugging::RequireUseStrict] equivalent_modules = Moose [TestingAndDebugging::RequireUseWarnings] equivalent_modules = Moose Path-IsDev-1.000002/corpus/0000755000175000017500000000000012243547526013651 5ustar kentkentPath-IsDev-1.000002/corpus/Changelog/0000755000175000017500000000000012243547526015540 5ustar kentkentPath-IsDev-1.000002/corpus/Changelog/Changes0000644000175000017500000000000012243547526017021 0ustar kentkentPath-IsDev-1.000002/corpus/MYMETA/0000755000175000017500000000000012243547526014645 5ustar kentkentPath-IsDev-1.000002/corpus/MYMETA/MYMETA.json0000644000175000017500000000000012243547526016522 0ustar kentkentPath-IsDev-1.000002/corpus/TestDir/0000755000175000017500000000000012243547526015227 5ustar kentkentPath-IsDev-1.000002/corpus/TestDir/t/0000755000175000017500000000000012243547526015472 5ustar kentkentPath-IsDev-1.000002/corpus/TestDir/t/.keep0000644000175000017500000000000012243547526016405 0ustar kentkentPath-IsDev-1.000002/corpus/MakeMaker/0000755000175000017500000000000012243547526015506 5ustar kentkentPath-IsDev-1.000002/corpus/MakeMaker/Makefile.PL0000644000175000017500000000000012243547526017446 0ustar kentkentPath-IsDev-1.000002/corpus/DevDir/0000755000175000017500000000000012243547526015026 5ustar kentkentPath-IsDev-1.000002/corpus/DevDir/.devdir0000644000175000017500000000000012243547526016272 0ustar kentkentPath-IsDev-1.000002/corpus/META/0000755000175000017500000000000012243547526014377 5ustar kentkentPath-IsDev-1.000002/corpus/META/META.yml0000644000175000017500000000000012243547526015636 0ustar kentkentPath-IsDev-1.000002/corpus/DZil/0000755000175000017500000000000012243547526014513 5ustar kentkentPath-IsDev-1.000002/corpus/DZil/dist.ini0000644000175000017500000000000012243547526016145 0ustar kentkentPath-IsDev-1.000002/corpus/ModuleBuild/0000755000175000017500000000000012243547526016056 5ustar kentkentPath-IsDev-1.000002/corpus/ModuleBuild/Build.PL0000644000175000017500000000000012243547526017340 0ustar kentkentPath-IsDev-1.000002/corpus/Makefile/0000755000175000017500000000000012243547526015366 5ustar kentkentPath-IsDev-1.000002/corpus/Makefile/Makefile0000644000175000017500000000000012243547526017014 0ustar kentkentPath-IsDev-1.000002/dist.ini0000644000175000017500000000131612243547526014003 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 = 1.2.0 git_versions = 1 ; 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.000002/maint-travis-ci/0000755000175000017500000000000012243547526015345 5ustar kentkentPath-IsDev-1.000002/maint-travis-ci/lib/0000755000175000017500000000000012243547526016113 5ustar kentkentPath-IsDev-1.000002/maint-travis-ci/lib/tools.pm0000644000175000017500000000730212243547526017613 0ustar kentkentuse strict; use warnings; package tools; use Cwd qw(cwd); use Config; sub diag { my $handle = \*STDERR; for (@_) { print {$handle} $_; } print {$handle} "\n"; } sub env_exists { return exists $ENV{ $_[0] }; } sub env_true { return ( env_exists( $_[0] ) and $ENV{ $_[0] } ); } sub env_is { return ( env_exists( $_[0] ) and $ENV{ $_[0] } eq $_[1] ) } sub safe_exec_nonfatal { my ( $command, @params ) = @_; diag("running $command @params"); my $exit = system( $command, @params ); if ( $exit != 0 ) { my $low = $exit & 0b11111111; my $high = $exit >> 8; warn "$command failed: $? $! and exit = $high , flags = $low"; if ( $high != 0 ) { return $high; } else { return 1; } } return 0; } sub safe_exec { my ( $command, @params ) = @_; my $exit_code = safe_exec_nonfatal( $command, @params ); if ( $exit_code != 0 ) { exit $exit_code; } return 1; } sub cpanm { my (@params) = @_; my $exit_code = safe_exec_nonfatal( 'cpanm', @params ); if ( $exit_code != 0 ) { safe_exec( 'tail', '-n', '200', '/home/travis/.cpanm/build.log' ); exit $exit_code; } return 1; } sub git { my (@params) = @_; safe_exec( 'git', @params ); } my $got_fixes; sub get_fixes { return if $got_fixes; my $cwd = cwd(); chdir '/tmp'; safe_exec( 'git', 'clone', 'https://github.com/kentfredric/cpan-fixes.git' ); chdir $cwd; $got_fixes = 1; } my $got_sterile; sub get_sterile { return if $got_sterile; my $cwd = cwd(); chdir '/tmp'; my $version = $]; safe_exec( 'git', 'clone', '--depth=1', '--branch=' . $version, 'https://github.com/kentfredric/perl5-sterile.git', 'perl5-sterile' ); chdir $cwd; $got_sterile = 1; } my $fixed_up; sub fixup_sterile { return if $fixed_up; get_sterile(); my $cwd = cwd(); chdir '/tmp/perl5-sterile'; safe_exec( 'bash', 'patch_fixlist.sh', '/home/travis/perl5/perlbrew/perls/' . $ENV{TRAVIS_PERL_VERSION} ); chdir $cwd; $fixed_up = 1; } my $sterile_deployed; sub deploy_sterile { return if $sterile_deployed; fixup_sterile(); for my $key ( keys %Config ) { next unless $key =~ /(lib|arch)exp$/; my $value = $Config{$key}; next unless defined $value; next unless length $value; my $clean_path = '/tmp/perl5-sterile/' . $key; diag("\e[32m?$clean_path\e[0m"); if ( -e $clean_path and -d $clean_path ) { diag("\e[31mRsyncing over $value\e[0m"); $clean_path =~ s{/?$}{/}; $value =~ s{/?$}{/}; safe_exec( 'rsync', '-a', '--delete-delay', $clean_path, $value ); } } } sub cpanm_fix { my (@params) = @_; get_fixes(); my $cwd = cwd(); chdir '/tmp/cpan-fixes'; cpanm(@params); chdir $cwd; } sub parse_meta_json { $_[0] ||= 'META.json'; require CPAN::Meta; return CPAN::Meta->load_file( $_[0] ); } sub capture_stdout(&) { require Capture::Tiny; goto &Capture::Tiny::capture_stdout; } sub import { my ( $self, @args ) = @_; my $caller = [caller]->[0]; my $caller_stash = do { no strict 'refs'; *{ $caller . '::' }; }; $caller_stash->{diag} = *diag; $caller_stash->{env_exists} = *env_exists; $caller_stash->{env_true} = *env_true; $caller_stash->{env_is} = *env_is; $caller_stash->{safe_exec_nonfatal} = *safe_exec_nonfatal; $caller_stash->{safe_exec} = *safe_exec; $caller_stash->{cpanm} = *cpanm; $caller_stash->{git} = *git; $caller_stash->{get_fixes} = *get_fixes; $caller_stash->{cpanm_fix} = *cpanm_fix; $caller_stash->{parse_meta_json} = *parse_meta_json; $caller_stash->{capture_stdout} = *capture_stdout; $caller_stash->{deploy_sterile} = *deploy_sterile; } 1; Path-IsDev-1.000002/maint-travis-ci/README.mkdn0000644000175000017500000000261712243547526017163 0ustar kentkent# ABOUT This repository contains a directory full of utilities to bolt on to CPAN-targeting distributions, to add useful `travis-ci` features to those dists. # PREREQS All that is needed at present to get started, is a copy of `git` that provides `git subtree`, and a copy of `Path::FindDev` from `CPAN`. You don't need `Path::FindDev` during deployment, its just used to streamline automated patching. # INSTALLING First, check out a copy of these scripts, it can be a temporary directory, and you'll only need to do this once. ```shell $ mkdir /tmp/tci-scripts $ cd /tmp/tci-scripts $ git clone https://github.com/kentfredric/travis-scripts.git ``` Then, chdir to the root of your project ```shell $ chdir $PROJECT ``` And lastly, execute the installer ```shell $ /tmp/tci-scripts/sync_tree.pl ``` This will create the folder called `maint-travis-ci` within your distribution, with a tree installed by `git subtree`, which will track this distribution. To update your copy of `/maint-travis-ci` to the latest, simply execute ```shell $ $PROJECT/maint-travis-ci/sync_tree.pl ``` While somewhere in your project. # CAVEATS Note, this tool uses `Path::FindDev`, and by proxy, `Path::IsDev` to find a development root directory somewhere in the ancestry of `$CWD`. As such, you will likely need to appease `Path::IsDev` by having a file of some description that marks the root of the development tree. Path-IsDev-1.000002/maint-travis-ci/before_script.pl0000644000175000017500000000104512243547526020530 0ustar kentkent#!/usr/bin/env perl use strict; use warnings; use FindBin; use lib "$FindBin::Bin/lib"; use tools; if ( not env_exists('STERILIZE_ENV') ) { diag("\e[31mSTERILIZE_ENV \e[32munset\e[0m, skipping"); exit 0; } if ( env_is( 'TRAVIS_BRANCH', 'master' ) ) { diag("before_script skipped, TRAVIS_BRANCH=master"); exit 0; } else { if ( -e './Build.PL' ) { safe_exec( $^X, './Build.PL' ); safe_exec("./Build"); exit 0; } if ( -e './Makefile.PL' ) { safe_exec( $^X, './Makefile.PL' ); safe_exec("make"); exit 0; } } Path-IsDev-1.000002/maint-travis-ci/install_deps.pl0000644000175000017500000000403712243547526020367 0ustar kentkent#!/usr/bin/env perl use strict; use warnings; use utf8; use FindBin; use lib "$FindBin::Bin/lib"; use tools; if ( not env_exists('TRAVIS') ) { diag('Is not running under travis!'); exit 1; } if ( not env_exists('STERILIZE_ENV') ) { diag("\e[31STERILIZE_ENV is not set, skipping, because this is probably Travis's Default ( and unwanted ) target"); exit 0; } if ( env_is( 'TRAVIS_BRANCH', 'master' ) and env_is( 'TRAVIS_PERL_VERSION', '5.8' ) ) { diag("\e[31minstalldeps skipped on 5.8 on master, because \@Git, a dependency of \@Author::KENTNL, is unavailble on 5.8\e[0m"); exit 0; } my (@params) = qw[ --quiet --notest --mirror http://cpan.metacpan.org/ --no-man-pages ]; if ( env_true('DEVELOPER_DEPS') ) { push @params, '--dev'; } if ( env_is( 'TRAVIS_BRANCH', 'master' ) ) { cpanm( @params, 'Dist::Zilla', 'Capture::Tiny', 'Pod::Weaver' ); cpanm( @params, '--dev', 'Dist::Zilla~>5.002', 'Pod::Weaver' ); safe_exec( 'git', 'config', '--global', 'user.email', 'kentfredric+travisci@gmail.com' ); safe_exec( 'git', 'config', '--global', 'user.name', 'Travis CI ( On behalf of Kent Fredric )' ); my $stdout = capture_stdout { safe_exec( 'dzil', 'authordeps', '--missing' ); }; if ( $stdout !~ /^\s*$/msx ) { cpanm( @params, split /\n/, $stdout ); } $stdout = capture_stdout { safe_exec( 'dzil', 'listdeps', '--missing' ); }; if ( $stdout !~ /^\s*$/msx ) { cpanm( @params, split /\n/, $stdout ); } } else { cpanm( @params, '--installdeps', '.' ); if ( env_true('AUTHOR_TESTING') or env_true('RELEASE_TESTING') ) { my $prereqs = parse_meta_json()->effective_prereqs; my $reqs = $prereqs->requirements_for( 'develop', 'requires' ); my @wanted; for my $want ( $reqs->required_modules ) { my $module_requirement = $reqs->requirements_for_module($want); if ( $module_requirement =~ /^\d/ ) { push @wanted, $want . '~>=' . $module_requirement; next; } push @wanted, $want . '~' . $module_requirement; } cpanm( @params, @wanted ); } } exit 0; Path-IsDev-1.000002/maint-travis-ci/sync_tree.pl0000755000175000017500000000107312243547526017701 0ustar kentkent#!/usr/bin/env perl use strict; use warnings; use FindBin; use lib "$FindBin::Bin/lib"; use tools; use Path::FindDev qw( find_dev ); my $root = find_dev('./'); chdir "$root"; sub git_subtree { safe_exec( 'git', 'subtree', @_ ); } my $travis = 'https://github.com/kentfredric/travis-scripts.git'; my $prefix = 'maint-travis-ci'; if ( not -d -e $root->child($prefix) ) { git_subtree( 'add', '--prefix=' . $prefix, $travis, 'master' ); } else { git_subtree( 'pull', '-m', 'Synchronise git subtree maint-travis-ci', '--prefix=' . $prefix, $travis, 'master' ); } Path-IsDev-1.000002/maint-travis-ci/yamls/0000755000175000017500000000000012243547526016472 5ustar kentkentPath-IsDev-1.000002/maint-travis-ci/yamls/sterile.yaml0000644000175000017500000000171412243547526021030 0ustar kentkentlanguage: perl matrix: 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.18" env: STERILIZE_ENV=0 - perl: "5.19" env: STERILIZE_ENV=0 - perl: "5.12" env: STERILIZE_ENV=1 - perl: "5.19" env: STERILIZE_ENV=1 - perl: "5.19" env: STERILIZE_ENV=0 DEVELOPER_DEPS=1 - perl: "5.19" env: STERILIZE_ENV=0 RELEASE_TESTING=1 AUTHOR_TESTING=1 before_install: - perlbrew list - time perl ./maint-travis-ci/sterilize_env.pl install: - 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: - "build/master" - "releases" Path-IsDev-1.000002/maint-travis-ci/yamls/sterile2.yaml0000644000175000017500000000201112243547526021101 0ustar kentkentlanguage: perl matrix: 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.18" env: STERILIZE_ENV=0 - perl: "5.19" env: STERILIZE_ENV=0 - perl: "5.8" env: STERILIZE_ENV=1 - perl: "5.10" env: STERILIZE_ENV=1 - perl: "5.19" env: STERILIZE_ENV=1 - perl: "5.19" env: STERILIZE_ENV=0 DEVELOPER_DEPS=1 - perl: "5.19" env: STERILIZE_ENV=0 RELEASE_TESTING=1 AUTHOR_TESTING=1 before_install: - perlbrew list - time perl ./maint-travis-ci/sterilize_env.pl install: - 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.000002/maint-travis-ci/yamls/sterile.mkdn0000644000175000017500000000314312243547526021015 0ustar kentkent## ABOUT sterile.yaml ## Tests ### Version conformance tests Every version of Perl that can be tested on travis is tested. - perl: env: STERILIZE_ENV=0 This is to test simply that the code works on that platform ### Installable tests This tests both the maximum and minimum perls on travis to ensure that: a. All dependencies are installable on all versions of Perl b. No dependencies are inherently required by the code which are not specified. - perl: env: STERILIZE_ENV=1 Tree sterilization occurs here to ensure that only the versions of things that are provided by that version of perl exists prior to installing dependencies. ### Pending upstream breakage This tests that of all the listed direct dependencies, that the code works as expected after upgrading to the latest version of all direct dependencies. Presently this only runs on the newest `perl` on travis, because it is seemed that if "-dev" versions are going to be a problem, they'll exhibit the same problems on all perls. Tree sterilization is not performed here, though may be in future, because that will reveal breakages between downstream dependencies. - perl: env: STERILIZE_ENV=0 DEVELOPER_DEPS=1 ### Author Testing This is the most dependency expensive method, as this mode pulls in all dependencies listed in `develop.requires`, and additionally runs `xt/*` This is presently only performed on the latest perl due to the time expensiveness of this, requiring significantly more dependencies to perform tests. - perl: env: STERILIZE_ENV=0 RELEASE_TESTING=1 AUTHOR_TESTING=1 Path-IsDev-1.000002/maint-travis-ci/sterilize_env.pl0000644000175000017500000000326612243547526020573 0ustar kentkent#!/usr/bin/env perl use strict; use warnings; use FindBin; use lib "$FindBin::Bin/lib"; use tools; my $corelists = "$FindBin::Bin/corelist-data"; sub no_sterile_warning { if ( env_is( 'TRAVIS_PERL_VERSION', '5.8' ) or env_is( 'TRAVIS_PERL_VERSION', '5.10' ) ) { diag("\e[31m TREE STERILIZATION IMPOSSIBLE <= 5.10\e[0m"); diag("\e[32m ... because prior to 5.11.*, dual-life installed to \e[33mprivlib\e[0m"); diag("\e[32m ... because prior to 5.11.*, \e[33m\@INC\e[32m order was \e[33mprivlib,sitelib\e[0m"); diag("\e[32m ... whereas after to 5.11.*, \e[33m\@INC\e[32m order is \e[33msitelib,privlib\e[0m"); diag("\e[32m ... and now most dual-life things simply install to \e[33msitelib\e[0m"); diag("\e[34m ( However, there are still a few naughty CPAN modules that install to \e[33mprivlib\e[34m )"); diag( "\e[32m but the net effect of this is that installing \e[33mModule::Build 0.4007\e[32m which pulls \e[33mPerl::OSType\e[0m" ); diag("\e[32m and results in \e[33mPerl::OSType\e[32m being later removed \e[0m"); diag("\e[32m leaving behind a broken \e[33mModule::Build 0.4007\e[32m\e[0m"); diag("\e[34m Set \e[35m MAYBE_BREAK_MODULE_BUILD=1\e[34m if this is ok\e[0m"); exit 0 unless env_true('MAYBE_BREAK_MODULE_BUILD'); diag("\e[35m PROCEEDING\e[0m"); } } if ( not env_exists('STERILIZE_ENV') ) { diag("\e[31STERILIZE_ENV is not set, skipping, because this is probably Travis's Default ( and unwanted ) target"); exit 0; } if ( not env_true('STERILIZE_ENV') ) { diag('STERILIZE_ENV unset or false, not sterilizing'); exit 0; } if ( not env_true('TRAVIS') ) { diag('Is not running under travis!'); exit 1; } deploy_sterile(); Path-IsDev-1.000002/maint-travis-ci/script.pl0000644000175000017500000000207212243547526017207 0ustar kentkent#!/usr/bin/env perl use strict; use warnings; use utf8; use FindBin; use lib "$FindBin::Bin/lib"; use tools; if ( not env_exists('TRAVIS') ) { diag('Is not running under travis!'); exit 1; } if ( not env_exists('STERILIZE_ENV') ) { diag("\e[31mSTERILIZE_ENV is not set, skipping, because this is probably Travis's Default ( and unwanted ) target"); exit 0; } if ( env_is( 'TRAVIS_BRANCH', 'master' ) and env_is( 'TRAVIS_PERL_VERSION', '5.8' ) ) { diag("\e[31mscript skipped on 5.8 on master\e[32m, because \@Git, a dependency of \@Author::KENTNL, is unavailble on 5.8\e[0m"); exit 0; } if ( env_is( 'TRAVIS_BRANCH', 'master' ) ) { my $xtest = safe_exec_nonfatal( 'dzil', 'xtest' ); my $test = safe_exec_nonfatal( 'dzil', 'test' ); if ( $test != 0 ) { exit $test; } if ( $xtest != 0 ) { exit $xtest; } exit 0; } else { my @paths = './t'; if ( env_true('AUTHOR_TESTING') or env_true('RELEASE_TESTING') ) { push @paths, './xt'; } safe_exec( 'prove', '--blib', '--shuffle', '--color', '--recurse', '--timer', '--jobs', 30, @paths ); } Path-IsDev-1.000002/maint-travis-ci/merge_travis_yml.pl0000644000175000017500000000122012243547526021245 0ustar kentkent#!/usr/bin/env perl use strict; use warnings; use utf8; use Path::FindDev qw( find_dev ); my $hashref = {}; my $template = find_dev('./')->child('.travis-template.yml'); my $target = find_dev('./')->child('.travis.yml'); if ( -f -e $template ) { require YAML::Loader; my $loader = YAML::Loader->new(); $hashref = $loader->load( $template->slurp ); } if ( not exists $hashref->{language} ) { $hashref->{language} = 'perl'; } if ( not exists $hashref->{perl} ) { $hashref->{perl} = [ '5.18', '5.19' ]; } use Data::Dump qw(pp); pp($hashref); require YAML::Dumper; my $dumper = YAML::Dumper->new(); $target->spew( $dumper->dump($hashref) ); Path-IsDev-1.000002/maint-travis-ci/report_fail_ctx.pl0000644000175000017500000000035512243547526021071 0ustar kentkent#!/usr/bin/env perl use strict; use warnings; use utf8; use FindBin; use lib "$FindBin::Bin/lib"; use tools; diag("\e[31mLast 1000 lines of cpanm build log\e[0m"); safe_exec( 'tail', '-n', '1000', $ENV{HOME} . '/.cpanm/build.log' ); Path-IsDev-1.000002/.perltidyrc0000644000175000017500000000001412243547526014513 0ustar kentkent-i 2 -l 130 Path-IsDev-1.000002/META.json0000644000175000017500000007534012243547526013770 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.006, CPAN::Meta::Converter version 2.132830", "license" : [ "perl_5" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : "2" }, "name" : "Path-IsDev", "prereqs" : { "build" : { "requires" : { "Module::Build" : "0.4202" } }, "configure" : { "requires" : { "Module::Build" : "0.4202" } }, "develop" : { "requires" : { "Dist::Zilla::Plugin::Author::KENTNL::MinimumPerl" : "0", "Dist::Zilla::Plugin::Authority" : "1.006", "Dist::Zilla::Plugin::AutoPrereqs" : "0", "Dist::Zilla::Plugin::CheckExtraTests" : "0", "Dist::Zilla::Plugin::ConfirmRelease" : "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::GatherDir" : "0", "Dist::Zilla::Plugin::Git::NextVersion" : "0", "Dist::Zilla::Plugin::Git::Tag" : "0", "Dist::Zilla::Plugin::GithubMeta" : "0", "Dist::Zilla::Plugin::License" : "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::ModuleBuild" : "0", "Dist::Zilla::Plugin::NextRelease" : "0", "Dist::Zilla::Plugin::PkgVersion" : "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::MatchInstalled" : "0", "Dist::Zilla::Plugin::PruneCruft" : "0", "Dist::Zilla::Plugin::ReadmeAnyFromPod" : "0", "Dist::Zilla::Plugin::ReadmeFromPod" : "0", "Dist::Zilla::Plugin::ReportVersions::Tiny" : "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::TestRelease" : "0", "Dist::Zilla::Plugin::Twitter" : "0", "Dist::Zilla::Plugin::UploadToCPAN" : "0", "Dist::Zilla::PluginBundle::Author::KENTNL" : "2.004000", "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", "version" : "0.9901" }, "suggests" : { "Dist::Zilla::PluginBundle::Author::KENTNL::Lite" : "v1.3.0" } }, "runtime" : { "requires" : { "Carp" : "0", "Class::Tiny" : "0.010", "File::HomeDir" : "0", "Module::Runtime" : "0", "Path::Tiny" : "0", "Role::Tiny" : "0", "Role::Tiny::With" : "0", "Scalar::Util" : "0", "Sub::Exporter" : "0", "perl" : "5.006", "strict" : "0", "warnings" : "0" } }, "test" : { "requires" : { "File::Temp" : "0", "FindBin" : "0", "Test::Fatal" : "0", "Test::More" : "1.001002" } } }, "provides" : { "Path::IsDev" : { "file" : "lib/Path/IsDev.pm", "version" : "1.000002" }, "Path::IsDev::Heuristic::Changelog" : { "file" : "lib/Path/IsDev/Heuristic/Changelog.pm", "version" : "1.000002" }, "Path::IsDev::Heuristic::DevDirMarker" : { "file" : "lib/Path/IsDev/Heuristic/DevDirMarker.pm", "version" : "1.000002" }, "Path::IsDev::Heuristic::META" : { "file" : "lib/Path/IsDev/Heuristic/META.pm", "version" : "1.000002" }, "Path::IsDev::Heuristic::MYMETA" : { "file" : "lib/Path/IsDev/Heuristic/MYMETA.pm", "version" : "1.000002" }, "Path::IsDev::Heuristic::Makefile" : { "file" : "lib/Path/IsDev/Heuristic/Makefile.pm", "version" : "1.000002" }, "Path::IsDev::Heuristic::TestDir" : { "file" : "lib/Path/IsDev/Heuristic/TestDir.pm", "version" : "1.000002" }, "Path::IsDev::Heuristic::Tool::Dzil" : { "file" : "lib/Path/IsDev/Heuristic/Tool/Dzil.pm", "version" : "1.000002" }, "Path::IsDev::Heuristic::Tool::MakeMaker" : { "file" : "lib/Path/IsDev/Heuristic/Tool/MakeMaker.pm", "version" : "1.000002" }, "Path::IsDev::Heuristic::Tool::ModuleBuild" : { "file" : "lib/Path/IsDev/Heuristic/Tool/ModuleBuild.pm", "version" : "1.000002" }, "Path::IsDev::Heuristic::VCS::Git" : { "file" : "lib/Path/IsDev/Heuristic/VCS/Git.pm", "version" : "1.000002" }, "Path::IsDev::HeuristicSet::Basic" : { "file" : "lib/Path/IsDev/HeuristicSet/Basic.pm", "version" : "1.000002" }, "Path::IsDev::NegativeHeuristic::HomeDir" : { "file" : "lib/Path/IsDev/NegativeHeuristic/HomeDir.pm", "version" : "1.000002" }, "Path::IsDev::NegativeHeuristic::IsDev::IgnoreFile" : { "file" : "lib/Path/IsDev/NegativeHeuristic/IsDev/IgnoreFile.pm", "version" : "1.000002" }, "Path::IsDev::NegativeHeuristic::PerlINC" : { "file" : "lib/Path/IsDev/NegativeHeuristic/PerlINC.pm", "version" : "1.000002" }, "Path::IsDev::Object" : { "file" : "lib/Path/IsDev/Object.pm", "version" : "1.000002" }, "Path::IsDev::Result" : { "file" : "lib/Path/IsDev/Result.pm", "version" : "1.000002" }, "Path::IsDev::Role::Heuristic" : { "file" : "lib/Path/IsDev/Role/Heuristic.pm", "version" : "1.000002" }, "Path::IsDev::Role::HeuristicSet" : { "file" : "lib/Path/IsDev/Role/HeuristicSet.pm", "version" : "1.000002" }, "Path::IsDev::Role::HeuristicSet::Simple" : { "file" : "lib/Path/IsDev/Role/HeuristicSet/Simple.pm", "version" : "1.000002" }, "Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp" : { "file" : "lib/Path/IsDev/Role/Matcher/Child/BaseName/MatchRegexp.pm", "version" : "1.000002" }, "Path::IsDev::Role::Matcher::Child::BaseName::MatchRegexp::File" : { "file" : "lib/Path/IsDev/Role/Matcher/Child/BaseName/MatchRegexp/File.pm", "version" : "1.000002" }, "Path::IsDev::Role::Matcher::Child::Exists::Any" : { "file" : "lib/Path/IsDev/Role/Matcher/Child/Exists/Any.pm", "version" : "1.000002" }, "Path::IsDev::Role::Matcher::Child::Exists::Any::Dir" : { "file" : "lib/Path/IsDev/Role/Matcher/Child/Exists/Any/Dir.pm", "version" : "1.000002" }, "Path::IsDev::Role::Matcher::Child::Exists::Any::File" : { "file" : "lib/Path/IsDev/Role/Matcher/Child/Exists/Any/File.pm", "version" : "1.000002" }, "Path::IsDev::Role::Matcher::FullPath::Is::Any" : { "file" : "lib/Path/IsDev/Role/Matcher/FullPath/Is/Any.pm", "version" : "1.000002" }, "Path::IsDev::Role::NegativeHeuristic" : { "file" : "lib/Path/IsDev/Role/NegativeHeuristic.pm", "version" : "1.000002" } }, "release_status" : "stable", "resources" : { "bugtracker" : { "web" : "https://github.com/kentfredric/Path-IsDev/issues" }, "homepage" : "https://github.com/kentfredric/Path-IsDev", "repository" : { "type" : "git", "url" : "https://github.com/kentfredric/Path-IsDev.git", "web" : "https://github.com/kentfredric/Path-IsDev" } }, "version" : "1.000002", "x_BuiltWith" : { "failures" : { "Role::Tiny::With" : "Module::MetaData could not parse a version from /home/kent/perl5/perlbrew/perls/perl-5.19.5/lib/site_perl/5.19.5/Role/Tiny/With.pm" }, "modules" : { "Carp" : "1.32", "Class::Tiny" : "0.012", "Dist::Zilla::Plugin::Author::KENTNL::MinimumPerl" : "2.004000", "Dist::Zilla::Plugin::Authority" : "1.006", "Dist::Zilla::Plugin::AutoPrereqs" : "5.006", "Dist::Zilla::Plugin::CheckExtraTests" : "0.016", "Dist::Zilla::Plugin::ConfirmRelease" : "5.006", "Dist::Zilla::Plugin::EOLTests" : "0.02", "Dist::Zilla::Plugin::Git::Check" : "2.017", "Dist::Zilla::Plugin::Git::Commit" : "2.017", "Dist::Zilla::Plugin::Git::CommitBuild" : "2.017", "Dist::Zilla::Plugin::Git::GatherDir" : "2.017", "Dist::Zilla::Plugin::Git::NextVersion" : "2.017", "Dist::Zilla::Plugin::Git::Tag" : "2.017", "Dist::Zilla::Plugin::GithubMeta" : "0.42", "Dist::Zilla::Plugin::License" : "5.006", "Dist::Zilla::Plugin::Manifest" : "5.006", "Dist::Zilla::Plugin::ManifestSkip" : "5.006", "Dist::Zilla::Plugin::MetaConfig" : "5.006", "Dist::Zilla::Plugin::MetaData::BuiltWith" : "0.04000000", "Dist::Zilla::Plugin::MetaJSON" : "5.006", "Dist::Zilla::Plugin::MetaProvides::Package" : "1.15000000", "Dist::Zilla::Plugin::MetaTests" : "5.006", "Dist::Zilla::Plugin::MetaYAML" : "5.006", "Dist::Zilla::Plugin::ModuleBuild" : "5.006", "Dist::Zilla::Plugin::NextRelease" : "5.006", "Dist::Zilla::Plugin::PkgVersion" : "5.006", "Dist::Zilla::Plugin::PodCoverageTests" : "5.006", "Dist::Zilla::Plugin::PodSyntaxTests" : "5.006", "Dist::Zilla::Plugin::PodWeaver" : "4.002", "Dist::Zilla::Plugin::Prereqs" : "5.006", "Dist::Zilla::Plugin::Prereqs::MatchInstalled" : "0.1.4", "Dist::Zilla::Plugin::PruneCruft" : "5.006", "Dist::Zilla::Plugin::ReadmeAnyFromPod" : "0.133060", "Dist::Zilla::Plugin::ReadmeFromPod" : "0.21", "Dist::Zilla::Plugin::ReportVersions::Tiny" : "1.10", "Dist::Zilla::Plugin::Test::CPAN::Changes" : "0.008", "Dist::Zilla::Plugin::Test::Compile::PerFile" : "0.001001", "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::TestRelease" : "5.006", "Dist::Zilla::Plugin::Twitter" : "0.023", "Dist::Zilla::Plugin::UploadToCPAN" : "5.006", "Dist::Zilla::PluginBundle::Author::KENTNL" : "2.004000", "Dist::Zilla::PluginBundle::Author::KENTNL::Lite" : "1.7.2", "File::HomeDir" : "1.00", "File::Temp" : "0.2304", "FindBin" : "1.51", "Module::Build" : "0.4202", "Module::Runtime" : "0.013", "Path::Tiny" : "0.044", "Pod::Coverage::TrustPod" : "0.100003", "Role::Tiny" : "1.003002", "Scalar::Util" : "1.35", "Sub::Exporter" : "0.987", "Test::CPAN::Changes" : "0.26", "Test::CPAN::Meta" : "0.23", "Test::Fatal" : "0.013", "Test::Kwalitee" : "1.17", "Test::More" : "1.001002", "Test::Pod" : "1.48", "Test::Pod::Coverage" : "1.08", "strict" : "1.08", "version" : "0.9904", "warnings" : "1.20" }, "perl" : { "original" : "v5.19.5", "qv" : 1, "version" : [ 5, 19, 5 ] }, "perl-config" : { "gccversion" : "4.7.3", "myarchname" : "x86_64-linux", "osname" : "linux" }, "platform" : "linux", "uname" : "Linux 3.12.0-gentoo x86_64 GenuineIntel GNU/Linux" }, "x_Dist_Zilla" : { "perl" : { "version" : "5.019005" }, "plugins" : [ { "class" : "Dist::Zilla::Plugin::Git::NextVersion", "name" : "@Author::KENTNL/Git::NextVersion", "version" : "2.017" }, { "class" : "Dist::Zilla::Plugin::MetaConfig", "name" : "@Author::KENTNL/MetaConfig", "version" : "5.006" }, { "class" : "Dist::Zilla::Plugin::GithubMeta", "name" : "@Author::KENTNL/GithubMeta", "version" : "0.42" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : "@Author::KENTNL/MetaProvides::Package/AUTOVIV/:InstallModulesPM", "version" : "5.006" }, { "class" : "Dist::Zilla::Plugin::MetaProvides::Package", "config" : { "Dist::Zilla::Plugin::MetaProvides::Package" : {}, "Dist::Zilla::Role::MetaProvider::Provider" : { "inherit_missing" : "1", "inherit_version" : "1", "meta_noindex" : "1" } }, "name" : "@Author::KENTNL/MetaProvides::Package", "version" : "1.15000000" }, { "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" : "0.04000000" }, { "class" : "Dist::Zilla::Plugin::Git::GatherDir", "name" : "@Author::KENTNL/Git::GatherDir", "version" : "2.017" }, { "class" : "Dist::Zilla::Plugin::License", "name" : "@Author::KENTNL/License", "version" : "5.006" }, { "class" : "Dist::Zilla::Plugin::MetaJSON", "name" : "@Author::KENTNL/MetaJSON", "version" : "5.006" }, { "class" : "Dist::Zilla::Plugin::MetaYAML", "name" : "@Author::KENTNL/MetaYAML", "version" : "5.006" }, { "class" : "Dist::Zilla::Plugin::Manifest", "name" : "@Author::KENTNL/Manifest", "version" : "5.006" }, { "class" : "Dist::Zilla::Plugin::MetaTests", "name" : "@Author::KENTNL/MetaTests", "version" : "5.006" }, { "class" : "Dist::Zilla::Plugin::PodCoverageTests", "name" : "@Author::KENTNL/PodCoverageTests", "version" : "5.006" }, { "class" : "Dist::Zilla::Plugin::PodSyntaxTests", "name" : "@Author::KENTNL/PodSyntaxTests", "version" : "5.006" }, { "class" : "Dist::Zilla::Plugin::ReportVersions::Tiny", "name" : "@Author::KENTNL/ReportVersions::Tiny", "version" : "1.10" }, { "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.006" }, { "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.001001" }, { "class" : "Dist::Zilla::Plugin::Test::Perl::Critic", "name" : "@Author::KENTNL/Test::Perl::Critic", "version" : "2.112410" }, { "class" : "Dist::Zilla::Plugin::PruneCruft", "name" : "@Author::KENTNL/PruneCruft", "version" : "5.006" }, { "class" : "Dist::Zilla::Plugin::ManifestSkip", "name" : "@Author::KENTNL/ManifestSkip", "version" : "5.006" }, { "class" : "Dist::Zilla::Plugin::PkgVersion", "name" : "@Author::KENTNL/PkgVersion", "version" : "5.006" }, { "class" : "Dist::Zilla::Plugin::PodWeaver", "config" : { "Dist::Zilla::Plugin::PodWeaver" : { "finder" : [ ":InstallModules", ":ExecFiles" ], "plugins" : [ { "class" : "Pod::Weaver::Plugin::EnsurePod5", "name" : "@CorePrep/EnsurePod5", "version" : "4.004" }, { "class" : "Pod::Weaver::Plugin::H1Nester", "name" : "@CorePrep/H1Nester", "version" : "4.004" }, { "class" : "Pod::Weaver::Plugin::SingleEncoding", "name" : "-SingleEncoding", "version" : "4.004" }, { "class" : "Pod::Weaver::Section::Name", "name" : "Name", "version" : "4.004" }, { "class" : "Pod::Weaver::Section::Version", "name" : "Version", "version" : "4.004" }, { "class" : "Pod::Weaver::Section::Region", "name" : "prelude", "version" : "4.004" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "SYNOPSIS", "version" : "4.004" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "DESCRIPTION", "version" : "4.004" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "OVERVIEW", "version" : "4.004" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "REQUIRES", "version" : "4.004" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "METHODS", "version" : "4.004" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "FUNCTIONS", "version" : "4.004" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "ATTRIBUTES", "version" : "4.004" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "PRIVATE_ATTRIBUTES", "version" : "4.004" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "PRIVATE_METHODS", "version" : "4.004" }, { "class" : "Pod::Weaver::Section::Leftovers", "name" : "Leftovers", "version" : "4.004" }, { "class" : "Pod::Weaver::Section::Region", "name" : "postlude", "version" : "4.004" }, { "class" : "Pod::Weaver::Section::Authors", "name" : "Authors", "version" : "4.004" }, { "class" : "Pod::Weaver::Section::Legal", "name" : "Legal", "version" : "4.004" } ] } }, "name" : "@Author::KENTNL/PodWeaver", "version" : "4.002" }, { "class" : "Dist::Zilla::Plugin::NextRelease", "name" : "@Author::KENTNL/NextRelease", "version" : "5.006" }, { "class" : "Dist::Zilla::Plugin::AutoPrereqs", "name" : "@Author::KENTNL/AutoPrereqs", "version" : "5.006" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "develop", "type" : "suggests" } }, "name" : "@Author::KENTNL/Prereqs/BundleDevelSuggests", "version" : "5.006" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "develop", "type" : "requires" } }, "name" : "@Author::KENTNL/Prereqs/BundleDevelRequires", "version" : "5.006" }, { "class" : "Dist::Zilla::Plugin::Author::KENTNL::MinimumPerl", "name" : "@Author::KENTNL/Author::KENTNL::MinimumPerl", "version" : "2.004000" }, { "class" : "Dist::Zilla::Plugin::Authority", "name" : "@Author::KENTNL/Authority", "version" : "1.006" }, { "class" : "Dist::Zilla::Plugin::ModuleBuild", "name" : "@Author::KENTNL/ModuleBuild", "version" : "5.006" }, { "class" : "Dist::Zilla::Plugin::ReadmeFromPod", "name" : "@Author::KENTNL/ReadmeFromPod", "version" : "0.21" }, { "class" : "Dist::Zilla::Plugin::ReadmeAnyFromPod", "name" : "@Author::KENTNL/ReadmeAnyFromPod", "version" : "0.133060" }, { "class" : "Dist::Zilla::Plugin::Test::CPAN::Changes", "name" : "@Author::KENTNL/Test::CPAN::Changes", "version" : "0.008" }, { "class" : "Dist::Zilla::Plugin::CheckExtraTests", "name" : "@Author::KENTNL/CheckExtraTests", "version" : "0.016" }, { "class" : "Dist::Zilla::Plugin::TestRelease", "name" : "@Author::KENTNL/TestRelease", "version" : "5.006" }, { "class" : "Dist::Zilla::Plugin::ConfirmRelease", "name" : "@Author::KENTNL/ConfirmRelease", "version" : "5.006" }, { "class" : "Dist::Zilla::Plugin::Git::Check", "name" : "@Author::KENTNL/Git::Check", "version" : "2.017" }, { "class" : "Dist::Zilla::Plugin::Git::Tag", "name" : "@Author::KENTNL/Git::Tag/tag_master", "version" : "2.017" }, { "class" : "Dist::Zilla::Plugin::Git::Commit", "name" : "@Author::KENTNL/Git::Commit", "version" : "2.017" }, { "class" : "Dist::Zilla::Plugin::Git::CommitBuild", "name" : "@Author::KENTNL/Git::CommitBuild", "version" : "2.017" }, { "class" : "Dist::Zilla::Plugin::Git::Tag", "name" : "@Author::KENTNL/Git::Tag/tag_release", "version" : "2.017" }, { "class" : "Dist::Zilla::Plugin::UploadToCPAN", "name" : "@Author::KENTNL/UploadToCPAN", "version" : "5.006" }, { "class" : "Dist::Zilla::Plugin::Twitter", "name" : "@Author::KENTNL/Twitter", "version" : "0.023" }, { "class" : "Dist::Zilla::Plugin::Prereqs::MatchInstalled", "config" : { "Dist::Zilla::Plugin::Prereqs::MatchInstalled" : { "applyto" : [ "build.requires", "build.recommends", "build.suggests", "test.requires", "test.recommends", "test.suggests", "runtime.requires", "runtime.recommends", "runtime.suggests", "configure.requires", "configure.recommends", "configure.suggests", "develop.requires", "develop.recommends", "develop.suggests" ], "applyto_phase" : [ "build", "test", "runtime", "configure", "develop" ], "applyto_relation" : [ "requires", "recommends", "suggests" ], "modules" : [ "Module::Build", "Test::More", "Dist::Zilla::PluginBundle::Author::KENTNL" ] } }, "name" : "@Author::KENTNL/Prereqs::MatchInstalled", "version" : "0.1.4" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "develop", "type" : "requires" } }, "name" : "@Author::KENTNL/::Role::BundleDeps", "version" : "5.006" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "runtime", "type" : "requires" } }, "name" : "Prereqs", "version" : "5.006" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":InstallModules", "version" : "5.006" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":IncModules", "version" : "5.006" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":TestFiles", "version" : "5.006" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":ExecFiles", "version" : "5.006" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":ShareFiles", "version" : "5.006" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":MainModule", "version" : "5.006" } ], "zilla" : { "class" : "Dist::Zilla::Dist::Builder", "config" : { "is_trial" : "0" }, "version" : "5.006" } }, "x_authority" : "cpan:KENTNL" } Path-IsDev-1.000002/weaver.ini0000644000175000017500000000146412243547526014335 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.000002/MANIFEST0000644000175000017500000000762412243547526013500 0ustar kentkent.perltidyrc .travis.yml Build.PL Changes Changes.deps Changes.deps.all Changes.deps.dev LICENSE MANIFEST META.json META.yml 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 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-travis-ci/README.mkdn maint-travis-ci/before_script.pl maint-travis-ci/install_deps.pl maint-travis-ci/lib/tools.pm maint-travis-ci/merge_travis_yml.pl maint-travis-ci/report_fail_ctx.pl maint-travis-ci/script.pl maint-travis-ci/sterilize_env.pl maint-travis-ci/sync_tree.pl maint-travis-ci/yamls/sterile.mkdn maint-travis-ci/yamls/sterile.yaml maint-travis-ci/yamls/sterile2.yaml 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/000-report-versions-tiny.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