diff options
-rw-r--r-- | Changes | 82 | ||||
-rw-r--r-- | INSTALL | 43 | ||||
-rw-r--r-- | LICENSE | 207 | ||||
-rw-r--r-- | MANIFEST | 30 | ||||
-rw-r--r-- | META.json | 742 | ||||
-rw-r--r-- | META.yml | 542 | ||||
-rw-r--r-- | Makefile.PL | 70 | ||||
-rw-r--r-- | README.md | 152 | ||||
-rw-r--r-- | cpanfile | 41 | ||||
-rw-r--r-- | dist.ini | 10 | ||||
-rw-r--r-- | lib/Package/DeprecationManager.pm | 292 | ||||
-rw-r--r-- | perlcriticrc | 58 | ||||
-rw-r--r-- | perltidyrc | 22 | ||||
-rw-r--r-- | t/00-compile.t | 51 | ||||
-rw-r--r-- | t/00-report-prereqs.dd | 51 | ||||
-rw-r--r-- | t/00-report-prereqs.t | 183 | ||||
-rw-r--r-- | t/author-eol.t | 37 | ||||
-rw-r--r-- | t/author-no-tabs.t | 37 | ||||
-rw-r--r-- | t/author-pod-spell.t | 40 | ||||
-rw-r--r-- | t/basic.t | 275 | ||||
-rw-r--r-- | t/release-cpan-changes.t | 19 | ||||
-rw-r--r-- | t/release-pod-coverage.t | 52 | ||||
-rw-r--r-- | t/release-pod-linkcheck.t | 28 | ||||
-rw-r--r-- | t/release-pod-no404s.t | 29 | ||||
-rw-r--r-- | t/release-pod-syntax.t | 14 | ||||
-rw-r--r-- | t/release-portability.t | 20 | ||||
-rw-r--r-- | t/release-test-version.t | 30 | ||||
-rw-r--r-- | t/release-tidyall.t | 17 | ||||
-rw-r--r-- | tidyall.ini | 19 |
29 files changed, 3193 insertions, 0 deletions
@@ -0,0 +1,82 @@ +0.14 2015-04-18 + +- Use any() from List::Util 1.33+ instead of List::MoreUtils. + + +0.13 2012-03-09 + +- Fix dist.ini to not add Test::Spelling as a requirement. (Tomas Doran) + + +0.12 2012-03-04 + +- Fix tests to pass with Carp 1.25. Reported by Andreas Koenig. RT #75520. + + +0.11 2011-06-19 + +- Allow an empty hash for the -deprecations parameter. + + +0.10 2010-10-25 + +- The test suite now uses Test::Fatal instead of Test::Exception. (Karen + Etheridge) + + +0.09 2010-10-17 + +- Added a compilation test, because otherwise all test files could not end up + doing skip_all, which may make smokers and test harnesses unhappy. + + +0.08 2010-10-15 + +- Include Test::Requires in prereq list. Reported by Todd Rinaldo. RT #62173. + + +0.07 2010-10-15 + +- The use of regular expressions in ignores didn't really work in 0.06. + +- Added missing dep on List::MoreUtils. + +- Replaced Test::Warn with Test::Output in the tests, and made the tests + actually test what I think they should be testing. + + +0.06 2010-10-14 + +- The -ignore parameter now accepts regular expressions as well as package + names. + + +0.05 2010-10-14 + +- Fixed what looked like a bug in -ignore handling, although I couldn't seem + to write a test that triggered it. + +- Removed hard dep on Test::Warn for the benefit of Moose. + + +0.04 2010-07-14 + +- A single feature will now warn more than once if each warning consists of a + different error message. + + +0.03 2010-07-14 + +- Added an -ignore parameter when importing Package::DeprecationManager. This + lets you explicitly ignore packages in the call stack when determining where + a deprecated feature was called. + + +0.02 2010-07-12 + +- Made it possible to deprecate any feature, not just a subroutine or method. + + +0.01 2010-07-12 + +- First release @@ -0,0 +1,43 @@ +This is the Perl distribution Package-DeprecationManager. + +Installing Package-DeprecationManager is straightforward. + +## Installation with cpanm + +If you have cpanm, you only need one line: + + % cpanm Package::DeprecationManager + +If you are installing into a system-wide directory, you may need to pass the +"-S" flag to cpanm, which uses sudo to install the module: + + % cpanm -S Package::DeprecationManager + +## Installing with the CPAN shell + +Alternatively, if your CPAN shell is set up, you should just be able to do: + + % cpan Package::DeprecationManager + +## Manual installation + +As a last resort, you can manually install it. Download the tarball, untar it, +then build it: + + % perl Makefile.PL + % make && make test + +Then install it: + + % make install + +If you are installing into a system-wide directory, you may need to run: + + % sudo make install + +## Documentation + +Package-DeprecationManager documentation is available as POD. +You can run perldoc from a shell to read the documentation: + + % perldoc Package::DeprecationManager @@ -0,0 +1,207 @@ +This software is Copyright (c) 2015 by Dave Rolsky. + +This is free software, licensed under: + + The Artistic License 2.0 (GPL Compatible) + + The Artistic License 2.0 + + Copyright (c) 2000-2006, The Perl Foundation. + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +Preamble + +This license establishes the terms under which a given free software +Package may be copied, modified, distributed, and/or redistributed. +The intent is that the Copyright Holder maintains some artistic +control over the development of that Package while still keeping the +Package available as open source and free software. + +You are always permitted to make arrangements wholly outside of this +license directly with the Copyright Holder of a given Package. If the +terms of this license do not permit the full use that you propose to +make of the Package, you should contact the Copyright Holder and seek +a different licensing arrangement. + +Definitions + + "Copyright Holder" means the individual(s) or organization(s) + named in the copyright notice for the entire Package. + + "Contributor" means any party that has contributed code or other + material to the Package, in accordance with the Copyright Holder's + procedures. + + "You" and "your" means any person who would like to copy, + distribute, or modify the Package. + + "Package" means the collection of files distributed by the + Copyright Holder, and derivatives of that collection and/or of + those files. A given Package may consist of either the Standard + Version, or a Modified Version. + + "Distribute" means providing a copy of the Package or making it + accessible to anyone else, or in the case of a company or + organization, to others outside of your company or organization. + + "Distributor Fee" means any fee that you charge for Distributing + this Package or providing support for this Package to another + party. It does not mean licensing fees. + + "Standard Version" refers to the Package if it has not been + modified, or has been modified only in ways explicitly requested + by the Copyright Holder. + + "Modified Version" means the Package, if it has been changed, and + such changes were not explicitly requested by the Copyright + Holder. + + "Original License" means this Artistic License as Distributed with + the Standard Version of the Package, in its current version or as + it may be modified by The Perl Foundation in the future. + + "Source" form means the source code, documentation source, and + configuration files for the Package. + + "Compiled" form means the compiled bytecode, object code, binary, + or any other form resulting from mechanical transformation or + translation of the Source form. + + +Permission for Use and Modification Without Distribution + +(1) You are permitted to use the Standard Version and create and use +Modified Versions for any purpose without restriction, provided that +you do not Distribute the Modified Version. + + +Permissions for Redistribution of the Standard Version + +(2) You may Distribute verbatim copies of the Source form of the +Standard Version of this Package in any medium without restriction, +either gratis or for a Distributor Fee, provided that you duplicate +all of the original copyright notices and associated disclaimers. At +your discretion, such verbatim copies may or may not include a +Compiled form of the Package. + +(3) You may apply any bug fixes, portability changes, and other +modifications made available from the Copyright Holder. The resulting +Package will still be considered the Standard Version, and as such +will be subject to the Original License. + + +Distribution of Modified Versions of the Package as Source + +(4) You may Distribute your Modified Version as Source (either gratis +or for a Distributor Fee, and with or without a Compiled form of the +Modified Version) provided that you clearly document how it differs +from the Standard Version, including, but not limited to, documenting +any non-standard features, executables, or modules, and provided that +you do at least ONE of the following: + + (a) make the Modified Version available to the Copyright Holder + of the Standard Version, under the Original License, so that the + Copyright Holder may include your modifications in the Standard + Version. + + (b) ensure that installation of your Modified Version does not + prevent the user installing or running the Standard Version. In + addition, the Modified Version must bear a name that is different + from the name of the Standard Version. + + (c) allow anyone who receives a copy of the Modified Version to + make the Source form of the Modified Version available to others + under + + (i) the Original License or + + (ii) a license that permits the licensee to freely copy, + modify and redistribute the Modified Version using the same + licensing terms that apply to the copy that the licensee + received, and requires that the Source form of the Modified + Version, and of any works derived from it, be made freely + available in that license fees are prohibited but Distributor + Fees are allowed. + + +Distribution of Compiled Forms of the Standard Version +or Modified Versions without the Source + +(5) You may Distribute Compiled forms of the Standard Version without +the Source, provided that you include complete instructions on how to +get the Source of the Standard Version. Such instructions must be +valid at the time of your distribution. If these instructions, at any +time while you are carrying out such distribution, become invalid, you +must provide new instructions on demand or cease further distribution. +If you provide valid instructions or cease distribution within thirty +days after you become aware that the instructions are invalid, then +you do not forfeit any of your rights under this license. + +(6) You may Distribute a Modified Version in Compiled form without +the Source, provided that you comply with Section 4 with respect to +the Source of the Modified Version. + + +Aggregating or Linking the Package + +(7) You may aggregate the Package (either the Standard Version or +Modified Version) with other packages and Distribute the resulting +aggregation provided that you do not charge a licensing fee for the +Package. Distributor Fees are permitted, and licensing fees for other +components in the aggregation are permitted. The terms of this license +apply to the use and Distribution of the Standard or Modified Versions +as included in the aggregation. + +(8) You are permitted to link Modified and Standard Versions with +other works, to embed the Package in a larger work of your own, or to +build stand-alone binary or bytecode versions of applications that +include the Package, and Distribute the result without restriction, +provided the result does not expose a direct interface to the Package. + + +Items That are Not Considered Part of a Modified Version + +(9) Works (including, but not limited to, modules and scripts) that +merely extend or make use of the Package, do not, by themselves, cause +the Package to be a Modified Version. In addition, such works are not +considered parts of the Package itself, and are not subject to the +terms of this license. + + +General Provisions + +(10) Any use, modification, and distribution of the Standard or +Modified Versions is governed by this Artistic License. By using, +modifying or distributing the Package, you accept this license. Do not +use, modify, or distribute the Package, if you do not accept this +license. + +(11) If your Modified Version has been derived from a Modified +Version made by someone other than you, you are nevertheless required +to ensure that your Modified Version complies with the requirements of +this license. + +(12) This license does not grant you the right to use any trademark, +service mark, tradename, or logo of the Copyright Holder. + +(13) This license includes the non-exclusive, worldwide, +free-of-charge patent license to make, have made, use, offer to sell, +sell, import and otherwise transfer the Package with respect to any +patent claims licensable by the Copyright Holder that are necessarily +infringed by the Package. If you institute patent litigation +(including a cross-claim or counterclaim) against any party alleging +that the Package constitutes direct or contributory patent +infringement, then this Artistic License to you shall terminate on the +date that such litigation is filed. + +(14) Disclaimer of Warranty: +THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS +IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR +NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL +LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/MANIFEST b/MANIFEST new file mode 100644 index 0000000..fd65c1f --- /dev/null +++ b/MANIFEST @@ -0,0 +1,30 @@ +# This file was automatically generated by Dist::Zilla::Plugin::Manifest v5.035. +Changes +INSTALL +LICENSE +MANIFEST +META.json +META.yml +Makefile.PL +README.md +cpanfile +dist.ini +lib/Package/DeprecationManager.pm +perlcriticrc +perltidyrc +t/00-compile.t +t/00-report-prereqs.dd +t/00-report-prereqs.t +t/author-eol.t +t/author-no-tabs.t +t/author-pod-spell.t +t/basic.t +t/release-cpan-changes.t +t/release-pod-coverage.t +t/release-pod-linkcheck.t +t/release-pod-no404s.t +t/release-pod-syntax.t +t/release-portability.t +t/release-test-version.t +t/release-tidyall.t +tidyall.ini diff --git a/META.json b/META.json new file mode 100644 index 0000000..1fe1e65 --- /dev/null +++ b/META.json @@ -0,0 +1,742 @@ +{ + "abstract" : "Manage deprecation warnings for your distribution", + "author" : [ + "Dave Rolsky <autarch@urth.org>" + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 5.035, CPAN::Meta::Converter version 2.150001", + "license" : [ + "artistic_2" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : 2 + }, + "name" : "Package-DeprecationManager", + "prereqs" : { + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "0" + } + }, + "develop" : { + "requires" : { + "Code::TidyAll" : "0.24", + "Perl::Critic" : "1.123", + "Perl::Tidy" : "20140711", + "Pod::Coverage::TrustPod" : "0", + "Test::CPAN::Changes" : "0.19", + "Test::Code::TidyAll" : "0.24", + "Test::EOL" : "0", + "Test::More" : "0.88", + "Test::NoTabs" : "0", + "Test::Pod" : "1.41", + "Test::Pod::Coverage" : "1.08", + "Test::Spelling" : "0.12", + "Test::Version" : "1" + } + }, + "runtime" : { + "requires" : { + "Carp" : "0", + "List::Util" : "1.33", + "Params::Util" : "0", + "Sub::Install" : "0", + "strict" : "0", + "warnings" : "0" + } + }, + "test" : { + "recommends" : { + "CPAN::Meta" : "2.120900" + }, + "requires" : { + "ExtUtils::MakeMaker" : "0", + "File::Spec" : "0", + "IO::Handle" : "0", + "IPC::Open3" : "0", + "Test::Fatal" : "0", + "Test::More" : "0.96", + "Test::Requires" : "0", + "perl" : "5.006" + } + } + }, + "provides" : { + "Package::DeprecationManager" : { + "file" : "lib/Package/DeprecationManager.pm", + "version" : "0.14" + } + }, + "release_status" : "stable", + "resources" : { + "bugtracker" : { + "mailto" : "bug-package-deprecationmanager@rt.cpan.org", + "web" : "http://rt.cpan.org/Public/Dist/Display.html?Name=Package-DeprecationManager" + }, + "homepage" : "http://metacpan.org/release/Package-DeprecationManager", + "repository" : { + "type" : "git", + "url" : "git://github.com/moose/Package-DeprecationManager.git", + "web" : "https://github.com/moose/Package-DeprecationManager" + } + }, + "version" : "0.14", + "x_Dist_Zilla" : { + "perl" : { + "version" : "5.020001" + }, + "plugins" : [ + { + "class" : "Dist::Zilla::Plugin::MakeMaker", + "config" : { + "Dist::Zilla::Role::TestRunner" : { + "default_jobs" : 1 + } + }, + "name" : "@DROLSKY/MakeMaker", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::Authority", + "name" : "@DROLSKY/Authority", + "version" : "1.009" + }, + { + "class" : "Dist::Zilla::Plugin::AutoPrereqs", + "name" : "@DROLSKY/AutoPrereqs", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::CopyFilesFromBuild", + "name" : "@DROLSKY/CopyFilesFromBuild", + "version" : "0.150250" + }, + { + "class" : "Dist::Zilla::Plugin::Git::GatherDir", + "config" : { + "Dist::Zilla::Plugin::GatherDir" : { + "exclude_filename" : [ + "Makefile.PL", + "Build.PL", + "cpanfile", + "README.md", + "LICENSE" + ], + "exclude_match" : [], + "follow_symlinks" : "0", + "include_dotfiles" : "0", + "prefix" : "", + "prune_directory" : [], + "root" : "." + }, + "Dist::Zilla::Plugin::Git::GatherDir" : { + "include_untracked" : "0" + } + }, + "name" : "@DROLSKY/Git::GatherDir", + "version" : "2.033" + }, + { + "class" : "Dist::Zilla::Plugin::GitHub::Meta", + "name" : "@DROLSKY/GitHub::Meta", + "version" : "0.40" + }, + { + "class" : "Dist::Zilla::Plugin::GitHub::Update", + "name" : "@DROLSKY/GitHub::Update", + "version" : "0.40" + }, + { + "class" : "Dist::Zilla::Plugin::MetaResources", + "name" : "@DROLSKY/MetaResources", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::MetaProvides::Package", + "config" : { + "Dist::Zilla::Plugin::MetaProvides::Package" : { + "finder_objects" : [ + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : "@DROLSKY/MetaProvides::Package/AUTOVIV/:InstallModulesPM", + "version" : "5.035" + } + ] + }, + "Dist::Zilla::Role::MetaProvider::Provider" : { + "inherit_missing" : "1", + "inherit_version" : "1", + "meta_noindex" : "1" + } + }, + "name" : "@DROLSKY/MetaProvides::Package", + "version" : "2.003001" + }, + { + "class" : "Dist::Zilla::Plugin::NextRelease", + "name" : "@DROLSKY/NextRelease", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::Prereqs", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "test", + "type" : "requires" + } + }, + "name" : "@DROLSKY/Test::More with subtest()", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::Prereqs", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "develop", + "type" : "requires" + } + }, + "name" : "@DROLSKY/Modules for use with tidyall", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::PromptIfStale", + "config" : { + "Dist::Zilla::Plugin::PromptIfStale" : { + "check_all_plugins" : "1", + "check_all_prereqs" : "1", + "modules" : [], + "phase" : "release", + "skip" : [ + "Dist::Zilla::Plugin::DROLSKY::Contributors", + "Dist::Zilla::Plugin::DROLSKY::License", + "Dist::Zilla::Plugin::DROLSKY::TidyAll" + ] + } + }, + "name" : "@DROLSKY/PromptIfStale", + "version" : "0.041" + }, + { + "class" : "Dist::Zilla::Plugin::ReadmeAnyFromPod", + "name" : "@DROLSKY/README.md in build", + "version" : "0.150250" + }, + { + "class" : "Dist::Zilla::Plugin::ReadmeAnyFromPod", + "name" : "@DROLSKY/README.md in root", + "version" : "0.150250" + }, + { + "class" : "Dist::Zilla::Plugin::Test::Pod::Coverage::Configurable", + "name" : "@DROLSKY/Test::Pod::Coverage::Configurable", + "version" : "0.05" + }, + { + "class" : "Dist::Zilla::Plugin::Test::PodSpelling", + "name" : "@DROLSKY/Test::PodSpelling", + "version" : "2.006008" + }, + { + "class" : "Dist::Zilla::Plugin::Test::ReportPrereqs", + "name" : "@DROLSKY/Test::ReportPrereqs", + "version" : "0.021" + }, + { + "class" : "Dist::Zilla::Plugin::Test::Version", + "name" : "@DROLSKY/Test::Version", + "version" : "0.003001" + }, + { + "class" : "Dist::Zilla::Plugin::ManifestSkip", + "name" : "@DROLSKY/ManifestSkip", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::MetaYAML", + "name" : "@DROLSKY/MetaYAML", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::License", + "name" : "@DROLSKY/License", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::ExtraTests", + "name" : "@DROLSKY/ExtraTests", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::ExecDir", + "name" : "@DROLSKY/ExecDir", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::ShareDir", + "name" : "@DROLSKY/ShareDir", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::Manifest", + "name" : "@DROLSKY/Manifest", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::CheckVersionIncrement", + "name" : "@DROLSKY/CheckVersionIncrement", + "version" : "0.121750" + }, + { + "class" : "Dist::Zilla::Plugin::TestRelease", + "name" : "@DROLSKY/TestRelease", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::ConfirmRelease", + "name" : "@DROLSKY/ConfirmRelease", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::UploadToCPAN", + "name" : "@DROLSKY/UploadToCPAN", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::CheckPrereqsIndexed", + "name" : "@DROLSKY/CheckPrereqsIndexed", + "version" : "0.015" + }, + { + "class" : "Dist::Zilla::Plugin::CPANFile", + "name" : "@DROLSKY/CPANFile", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::DROLSKY::Contributors", + "name" : "@DROLSKY/DROLSKY::Contributors", + "version" : "0.33" + }, + { + "class" : "Dist::Zilla::Plugin::DROLSKY::License", + "name" : "@DROLSKY/DROLSKY::License", + "version" : "0.33" + }, + { + "class" : "Dist::Zilla::Plugin::DROLSKY::TidyAll", + "name" : "@DROLSKY/DROLSKY::TidyAll", + "version" : "0.33" + }, + { + "class" : "Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch", + "config" : { + "Dist::Zilla::Role::Git::Repo" : { + "repo_root" : "." + } + }, + "name" : "@DROLSKY/Git::CheckFor::CorrectBranch", + "version" : "0.013" + }, + { + "class" : "Dist::Zilla::Plugin::Git::CheckFor::MergeConflicts", + "config" : { + "Dist::Zilla::Role::Git::Repo" : { + "repo_root" : "." + } + }, + "name" : "@DROLSKY/Git::CheckFor::MergeConflicts", + "version" : "0.013" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Contributors", + "config" : { + "Dist::Zilla::Plugin::Git::Contributors" : { + "include_authors" : "0", + "include_releaser" : "1", + "order_by" : "name", + "paths" : [] + } + }, + "name" : "@DROLSKY/Git::Contributors", + "version" : "0.011" + }, + { + "class" : "Dist::Zilla::Plugin::InstallGuide", + "name" : "@DROLSKY/InstallGuide", + "version" : "1.200006" + }, + { + "class" : "Dist::Zilla::Plugin::Meta::Contributors", + "name" : "@DROLSKY/Meta::Contributors", + "version" : "0.002" + }, + { + "class" : "Dist::Zilla::Plugin::MetaConfig", + "name" : "@DROLSKY/MetaConfig", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::MetaJSON", + "name" : "@DROLSKY/MetaJSON", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::RewriteVersion", + "name" : "@DROLSKY/RewriteVersion", + "version" : "0.009" + }, + { + "class" : "Dist::Zilla::Plugin::SurgicalPodWeaver", + "config" : { + "Dist::Zilla::Plugin::PodWeaver" : { + "finder" : [ + ":InstallModules", + ":ExecFiles" + ], + "plugins" : [ + { + "class" : "Pod::Weaver::Plugin::EnsurePod5", + "name" : "@CorePrep/EnsurePod5", + "version" : "4.010" + }, + { + "class" : "Pod::Weaver::Plugin::H1Nester", + "name" : "@CorePrep/H1Nester", + "version" : "4.010" + }, + { + "class" : "Pod::Weaver::Section::Name", + "name" : "Name", + "version" : "4.010" + }, + { + "class" : "Pod::Weaver::Section::Version", + "name" : "Version", + "version" : "4.010" + }, + { + "class" : "Pod::Weaver::Section::Region", + "name" : "prelude", + "version" : "4.010" + }, + { + "class" : "Pod::Weaver::Section::Generic", + "name" : "SYNOPSIS", + "version" : "4.010" + }, + { + "class" : "Pod::Weaver::Section::Generic", + "name" : "DESCRIPTION", + "version" : "4.010" + }, + { + "class" : "Pod::Weaver::Section::Leftovers", + "name" : "Leftovers", + "version" : "4.010" + }, + { + "class" : "Pod::Weaver::Section::Region", + "name" : "postlude", + "version" : "4.010" + }, + { + "class" : "Pod::Weaver::Section::Authors", + "name" : "Authors", + "version" : "4.010" + }, + { + "class" : "Pod::Weaver::Section::Contributors", + "name" : "Contributors", + "version" : "0.009" + }, + { + "class" : "Pod::Weaver::Section::Legal", + "name" : "Legal", + "version" : "4.010" + } + ] + } + }, + "name" : "@DROLSKY/SurgicalPodWeaver", + "version" : "0.0023" + }, + { + "class" : "Dist::Zilla::Plugin::PodSyntaxTests", + "name" : "@DROLSKY/PodSyntaxTests", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::Test::CPAN::Changes", + "name" : "@DROLSKY/Test::CPAN::Changes", + "version" : "0.009" + }, + { + "class" : "Dist::Zilla::Plugin::Test::Compile", + "config" : { + "Dist::Zilla::Plugin::Test::Compile" : { + "bail_out_on_fail" : "0", + "fail_on_warning" : "author", + "fake_home" : "0", + "filename" : "t/00-compile.t", + "module_finder" : [ + ":InstallModules" + ], + "needs_display" : "0", + "phase" : "test", + "script_finder" : [ + ":ExecFiles" + ], + "skips" : [] + } + }, + "name" : "@DROLSKY/Test::Compile", + "version" : "2.052" + }, + { + "class" : "Dist::Zilla::Plugin::Test::EOL", + "config" : { + "Dist::Zilla::Plugin::Test::EOL" : { + "filename" : "xt/author/eol.t", + "finder" : [ + ":InstallModules", + ":ExecFiles", + ":TestFiles" + ], + "trailing_whitespace" : "1" + } + }, + "name" : "@DROLSKY/Test::EOL", + "version" : "0.17" + }, + { + "class" : "Dist::Zilla::Plugin::Test::NoTabs", + "config" : { + "Dist::Zilla::Plugin::Test::NoTabs" : { + "filename" : "xt/author/no-tabs.t", + "finder" : [ + ":InstallModules", + ":ExecFiles", + ":TestFiles" + ] + } + }, + "name" : "@DROLSKY/Test::NoTabs", + "version" : "0.13" + }, + { + "class" : "Dist::Zilla::Plugin::Test::Pod::LinkCheck", + "name" : "@DROLSKY/Test::Pod::LinkCheck", + "version" : "1.001" + }, + { + "class" : "Dist::Zilla::Plugin::Test::Pod::No404s", + "name" : "@DROLSKY/Test::Pod::No404s", + "version" : "1.001" + }, + { + "class" : "Dist::Zilla::Plugin::Test::Portability", + "name" : "@DROLSKY/Test::Portability", + "version" : "2.000006" + }, + { + "class" : "Dist::Zilla::Plugin::Test::TidyAll", + "name" : "@DROLSKY/Test::TidyAll", + "version" : "0.01" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Check", + "config" : { + "Dist::Zilla::Plugin::Git::Check" : { + "untracked_files" : "die" + }, + "Dist::Zilla::Role::Git::DirtyFiles" : { + "allow_dirty" : [ + "Makefile.PL", + "Build.PL", + "cpanfile", + "README.md", + "LICENSE", + "Changes", + "CONTRIBUTING.md" + ], + "allow_dirty_match" : [], + "changelog" : "Changes" + }, + "Dist::Zilla::Role::Git::Repo" : { + "repo_root" : "." + } + }, + "name" : "@DROLSKY/Git::Check", + "version" : "2.033" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Commit", + "config" : { + "Dist::Zilla::Plugin::Git::Commit" : { + "add_files_in" : [], + "commit_msg" : "v%v%n%n%c", + "time_zone" : "local" + }, + "Dist::Zilla::Role::Git::DirtyFiles" : { + "allow_dirty" : [ + "Makefile.PL", + "Build.PL", + "cpanfile", + "README.md", + "LICENSE", + "Changes", + "CONTRIBUTING.md" + ], + "allow_dirty_match" : [], + "changelog" : "Changes" + }, + "Dist::Zilla::Role::Git::Repo" : { + "repo_root" : "." + } + }, + "name" : "@DROLSKY/commit generated files", + "version" : "2.033" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Tag", + "config" : { + "Dist::Zilla::Plugin::Git::Tag" : { + "branch" : null, + "signed" : 0, + "tag" : "v0.14", + "tag_format" : "v%v", + "tag_message" : "v%v", + "time_zone" : "local" + }, + "Dist::Zilla::Role::Git::Repo" : { + "repo_root" : "." + } + }, + "name" : "@DROLSKY/Git::Tag", + "version" : "2.033" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Push", + "config" : { + "Dist::Zilla::Plugin::Git::Push" : { + "push_to" : [ + "origin" + ], + "remotes_must_exist" : 1 + }, + "Dist::Zilla::Role::Git::Repo" : { + "repo_root" : "." + } + }, + "name" : "@DROLSKY/Git::Push", + "version" : "2.033" + }, + { + "class" : "Dist::Zilla::Plugin::BumpVersionAfterRelease", + "name" : "@DROLSKY/BumpVersionAfterRelease", + "version" : "0.009" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Commit", + "config" : { + "Dist::Zilla::Plugin::Git::Commit" : { + "add_files_in" : [], + "commit_msg" : "Bump version after release", + "time_zone" : "local" + }, + "Dist::Zilla::Role::Git::DirtyFiles" : { + "allow_dirty" : [ + "dist.ini", + "Changes" + ], + "allow_dirty_match" : [ + "(?^:.+)" + ], + "changelog" : "Changes" + }, + "Dist::Zilla::Role::Git::Repo" : { + "repo_root" : "." + } + }, + "name" : "@DROLSKY/commit version bump", + "version" : "2.033" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Push", + "config" : { + "Dist::Zilla::Plugin::Git::Push" : { + "push_to" : [ + "origin" + ], + "remotes_must_exist" : 1 + }, + "Dist::Zilla::Role::Git::Repo" : { + "repo_root" : "." + } + }, + "name" : "@DROLSKY/push version bump", + "version" : "2.033" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":InstallModules", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":IncModules", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":TestFiles", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ExecFiles", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ShareFiles", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":MainModule", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":AllFiles", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":NoFiles", + "version" : "5.035" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : "@DROLSKY/MetaProvides::Package/AUTOVIV/:InstallModulesPM", + "version" : "5.035" + } + ], + "zilla" : { + "class" : "Dist::Zilla::Dist::Builder", + "config" : { + "is_trial" : "" + }, + "version" : "5.035" + } + }, + "x_authority" : "cpan:DROLSKY", + "x_contributors" : [ + "Jesse Luehrs <doy@tozt.net>", + "Karen Etheridge <ether@cpan.org>", + "Tomas Doran <bobtfish@bobtfish.net>" + ] +} + diff --git a/META.yml b/META.yml new file mode 100644 index 0000000..fbfe7ff --- /dev/null +++ b/META.yml @@ -0,0 +1,542 @@ +--- +abstract: 'Manage deprecation warnings for your distribution' +author: + - 'Dave Rolsky <autarch@urth.org>' +build_requires: + ExtUtils::MakeMaker: '0' + File::Spec: '0' + IO::Handle: '0' + IPC::Open3: '0' + Test::Fatal: '0' + Test::More: '0.96' + Test::Requires: '0' + perl: '5.006' +configure_requires: + ExtUtils::MakeMaker: '0' +dynamic_config: 0 +generated_by: 'Dist::Zilla version 5.035, CPAN::Meta::Converter version 2.150001' +license: artistic_2 +meta-spec: + url: http://module-build.sourceforge.net/META-spec-v1.4.html + version: '1.4' +name: Package-DeprecationManager +provides: + Package::DeprecationManager: + file: lib/Package/DeprecationManager.pm + version: '0.14' +requires: + Carp: '0' + List::Util: '1.33' + Params::Util: '0' + Sub::Install: '0' + strict: '0' + warnings: '0' +resources: + bugtracker: http://rt.cpan.org/Public/Dist/Display.html?Name=Package-DeprecationManager + homepage: http://metacpan.org/release/Package-DeprecationManager + repository: git://github.com/moose/Package-DeprecationManager.git +version: '0.14' +x_Dist_Zilla: + perl: + version: '5.020001' + plugins: + - + class: Dist::Zilla::Plugin::MakeMaker + config: + Dist::Zilla::Role::TestRunner: + default_jobs: 1 + name: '@DROLSKY/MakeMaker' + version: '5.035' + - + class: Dist::Zilla::Plugin::Authority + name: '@DROLSKY/Authority' + version: '1.009' + - + class: Dist::Zilla::Plugin::AutoPrereqs + name: '@DROLSKY/AutoPrereqs' + version: '5.035' + - + class: Dist::Zilla::Plugin::CopyFilesFromBuild + name: '@DROLSKY/CopyFilesFromBuild' + version: '0.150250' + - + class: Dist::Zilla::Plugin::Git::GatherDir + config: + Dist::Zilla::Plugin::GatherDir: + exclude_filename: + - Makefile.PL + - Build.PL + - cpanfile + - README.md + - LICENSE + exclude_match: [] + follow_symlinks: '0' + include_dotfiles: '0' + prefix: '' + prune_directory: [] + root: . + Dist::Zilla::Plugin::Git::GatherDir: + include_untracked: '0' + name: '@DROLSKY/Git::GatherDir' + version: '2.033' + - + class: Dist::Zilla::Plugin::GitHub::Meta + name: '@DROLSKY/GitHub::Meta' + version: '0.40' + - + class: Dist::Zilla::Plugin::GitHub::Update + name: '@DROLSKY/GitHub::Update' + version: '0.40' + - + class: Dist::Zilla::Plugin::MetaResources + name: '@DROLSKY/MetaResources' + version: '5.035' + - + class: Dist::Zilla::Plugin::MetaProvides::Package + config: + Dist::Zilla::Plugin::MetaProvides::Package: + finder_objects: + - + class: Dist::Zilla::Plugin::FinderCode + name: '@DROLSKY/MetaProvides::Package/AUTOVIV/:InstallModulesPM' + version: '5.035' + Dist::Zilla::Role::MetaProvider::Provider: + inherit_missing: '1' + inherit_version: '1' + meta_noindex: '1' + name: '@DROLSKY/MetaProvides::Package' + version: '2.003001' + - + class: Dist::Zilla::Plugin::NextRelease + name: '@DROLSKY/NextRelease' + version: '5.035' + - + class: Dist::Zilla::Plugin::Prereqs + config: + Dist::Zilla::Plugin::Prereqs: + phase: test + type: requires + name: '@DROLSKY/Test::More with subtest()' + version: '5.035' + - + class: Dist::Zilla::Plugin::Prereqs + config: + Dist::Zilla::Plugin::Prereqs: + phase: develop + type: requires + name: '@DROLSKY/Modules for use with tidyall' + version: '5.035' + - + class: Dist::Zilla::Plugin::PromptIfStale + config: + Dist::Zilla::Plugin::PromptIfStale: + check_all_plugins: '1' + check_all_prereqs: '1' + modules: [] + phase: release + skip: + - Dist::Zilla::Plugin::DROLSKY::Contributors + - Dist::Zilla::Plugin::DROLSKY::License + - Dist::Zilla::Plugin::DROLSKY::TidyAll + name: '@DROLSKY/PromptIfStale' + version: '0.041' + - + class: Dist::Zilla::Plugin::ReadmeAnyFromPod + name: '@DROLSKY/README.md in build' + version: '0.150250' + - + class: Dist::Zilla::Plugin::ReadmeAnyFromPod + name: '@DROLSKY/README.md in root' + version: '0.150250' + - + class: Dist::Zilla::Plugin::Test::Pod::Coverage::Configurable + name: '@DROLSKY/Test::Pod::Coverage::Configurable' + version: '0.05' + - + class: Dist::Zilla::Plugin::Test::PodSpelling + name: '@DROLSKY/Test::PodSpelling' + version: '2.006008' + - + class: Dist::Zilla::Plugin::Test::ReportPrereqs + name: '@DROLSKY/Test::ReportPrereqs' + version: '0.021' + - + class: Dist::Zilla::Plugin::Test::Version + name: '@DROLSKY/Test::Version' + version: '0.003001' + - + class: Dist::Zilla::Plugin::ManifestSkip + name: '@DROLSKY/ManifestSkip' + version: '5.035' + - + class: Dist::Zilla::Plugin::MetaYAML + name: '@DROLSKY/MetaYAML' + version: '5.035' + - + class: Dist::Zilla::Plugin::License + name: '@DROLSKY/License' + version: '5.035' + - + class: Dist::Zilla::Plugin::ExtraTests + name: '@DROLSKY/ExtraTests' + version: '5.035' + - + class: Dist::Zilla::Plugin::ExecDir + name: '@DROLSKY/ExecDir' + version: '5.035' + - + class: Dist::Zilla::Plugin::ShareDir + name: '@DROLSKY/ShareDir' + version: '5.035' + - + class: Dist::Zilla::Plugin::Manifest + name: '@DROLSKY/Manifest' + version: '5.035' + - + class: Dist::Zilla::Plugin::CheckVersionIncrement + name: '@DROLSKY/CheckVersionIncrement' + version: '0.121750' + - + class: Dist::Zilla::Plugin::TestRelease + name: '@DROLSKY/TestRelease' + version: '5.035' + - + class: Dist::Zilla::Plugin::ConfirmRelease + name: '@DROLSKY/ConfirmRelease' + version: '5.035' + - + class: Dist::Zilla::Plugin::UploadToCPAN + name: '@DROLSKY/UploadToCPAN' + version: '5.035' + - + class: Dist::Zilla::Plugin::CheckPrereqsIndexed + name: '@DROLSKY/CheckPrereqsIndexed' + version: '0.015' + - + class: Dist::Zilla::Plugin::CPANFile + name: '@DROLSKY/CPANFile' + version: '5.035' + - + class: Dist::Zilla::Plugin::DROLSKY::Contributors + name: '@DROLSKY/DROLSKY::Contributors' + version: '0.33' + - + class: Dist::Zilla::Plugin::DROLSKY::License + name: '@DROLSKY/DROLSKY::License' + version: '0.33' + - + class: Dist::Zilla::Plugin::DROLSKY::TidyAll + name: '@DROLSKY/DROLSKY::TidyAll' + version: '0.33' + - + class: Dist::Zilla::Plugin::Git::CheckFor::CorrectBranch + config: + Dist::Zilla::Role::Git::Repo: + repo_root: . + name: '@DROLSKY/Git::CheckFor::CorrectBranch' + version: '0.013' + - + class: Dist::Zilla::Plugin::Git::CheckFor::MergeConflicts + config: + Dist::Zilla::Role::Git::Repo: + repo_root: . + name: '@DROLSKY/Git::CheckFor::MergeConflicts' + version: '0.013' + - + class: Dist::Zilla::Plugin::Git::Contributors + config: + Dist::Zilla::Plugin::Git::Contributors: + include_authors: '0' + include_releaser: '1' + order_by: name + paths: [] + name: '@DROLSKY/Git::Contributors' + version: '0.011' + - + class: Dist::Zilla::Plugin::InstallGuide + name: '@DROLSKY/InstallGuide' + version: '1.200006' + - + class: Dist::Zilla::Plugin::Meta::Contributors + name: '@DROLSKY/Meta::Contributors' + version: '0.002' + - + class: Dist::Zilla::Plugin::MetaConfig + name: '@DROLSKY/MetaConfig' + version: '5.035' + - + class: Dist::Zilla::Plugin::MetaJSON + name: '@DROLSKY/MetaJSON' + version: '5.035' + - + class: Dist::Zilla::Plugin::RewriteVersion + name: '@DROLSKY/RewriteVersion' + version: '0.009' + - + class: Dist::Zilla::Plugin::SurgicalPodWeaver + config: + Dist::Zilla::Plugin::PodWeaver: + finder: + - ':InstallModules' + - ':ExecFiles' + plugins: + - + class: Pod::Weaver::Plugin::EnsurePod5 + name: '@CorePrep/EnsurePod5' + version: '4.010' + - + class: Pod::Weaver::Plugin::H1Nester + name: '@CorePrep/H1Nester' + version: '4.010' + - + class: Pod::Weaver::Section::Name + name: Name + version: '4.010' + - + class: Pod::Weaver::Section::Version + name: Version + version: '4.010' + - + class: Pod::Weaver::Section::Region + name: prelude + version: '4.010' + - + class: Pod::Weaver::Section::Generic + name: SYNOPSIS + version: '4.010' + - + class: Pod::Weaver::Section::Generic + name: DESCRIPTION + version: '4.010' + - + class: Pod::Weaver::Section::Leftovers + name: Leftovers + version: '4.010' + - + class: Pod::Weaver::Section::Region + name: postlude + version: '4.010' + - + class: Pod::Weaver::Section::Authors + name: Authors + version: '4.010' + - + class: Pod::Weaver::Section::Contributors + name: Contributors + version: '0.009' + - + class: Pod::Weaver::Section::Legal + name: Legal + version: '4.010' + name: '@DROLSKY/SurgicalPodWeaver' + version: '0.0023' + - + class: Dist::Zilla::Plugin::PodSyntaxTests + name: '@DROLSKY/PodSyntaxTests' + version: '5.035' + - + class: Dist::Zilla::Plugin::Test::CPAN::Changes + name: '@DROLSKY/Test::CPAN::Changes' + version: '0.009' + - + class: Dist::Zilla::Plugin::Test::Compile + config: + Dist::Zilla::Plugin::Test::Compile: + bail_out_on_fail: '0' + fail_on_warning: author + fake_home: '0' + filename: t/00-compile.t + module_finder: + - ':InstallModules' + needs_display: '0' + phase: test + script_finder: + - ':ExecFiles' + skips: [] + name: '@DROLSKY/Test::Compile' + version: '2.052' + - + class: Dist::Zilla::Plugin::Test::EOL + config: + Dist::Zilla::Plugin::Test::EOL: + filename: xt/author/eol.t + finder: + - ':InstallModules' + - ':ExecFiles' + - ':TestFiles' + trailing_whitespace: '1' + name: '@DROLSKY/Test::EOL' + version: '0.17' + - + class: Dist::Zilla::Plugin::Test::NoTabs + config: + Dist::Zilla::Plugin::Test::NoTabs: + filename: xt/author/no-tabs.t + finder: + - ':InstallModules' + - ':ExecFiles' + - ':TestFiles' + name: '@DROLSKY/Test::NoTabs' + version: '0.13' + - + class: Dist::Zilla::Plugin::Test::Pod::LinkCheck + name: '@DROLSKY/Test::Pod::LinkCheck' + version: '1.001' + - + class: Dist::Zilla::Plugin::Test::Pod::No404s + name: '@DROLSKY/Test::Pod::No404s' + version: '1.001' + - + class: Dist::Zilla::Plugin::Test::Portability + name: '@DROLSKY/Test::Portability' + version: '2.000006' + - + class: Dist::Zilla::Plugin::Test::TidyAll + name: '@DROLSKY/Test::TidyAll' + version: '0.01' + - + class: Dist::Zilla::Plugin::Git::Check + config: + Dist::Zilla::Plugin::Git::Check: + untracked_files: die + Dist::Zilla::Role::Git::DirtyFiles: + allow_dirty: + - Makefile.PL + - Build.PL + - cpanfile + - README.md + - LICENSE + - Changes + - CONTRIBUTING.md + allow_dirty_match: [] + changelog: Changes + Dist::Zilla::Role::Git::Repo: + repo_root: . + name: '@DROLSKY/Git::Check' + version: '2.033' + - + class: Dist::Zilla::Plugin::Git::Commit + config: + Dist::Zilla::Plugin::Git::Commit: + add_files_in: [] + commit_msg: v%v%n%n%c + time_zone: local + Dist::Zilla::Role::Git::DirtyFiles: + allow_dirty: + - Makefile.PL + - Build.PL + - cpanfile + - README.md + - LICENSE + - Changes + - CONTRIBUTING.md + allow_dirty_match: [] + changelog: Changes + Dist::Zilla::Role::Git::Repo: + repo_root: . + name: '@DROLSKY/commit generated files' + version: '2.033' + - + class: Dist::Zilla::Plugin::Git::Tag + config: + Dist::Zilla::Plugin::Git::Tag: + branch: ~ + signed: 0 + tag: v0.14 + tag_format: v%v + tag_message: v%v + time_zone: local + Dist::Zilla::Role::Git::Repo: + repo_root: . + name: '@DROLSKY/Git::Tag' + version: '2.033' + - + class: Dist::Zilla::Plugin::Git::Push + config: + Dist::Zilla::Plugin::Git::Push: + push_to: + - origin + remotes_must_exist: 1 + Dist::Zilla::Role::Git::Repo: + repo_root: . + name: '@DROLSKY/Git::Push' + version: '2.033' + - + class: Dist::Zilla::Plugin::BumpVersionAfterRelease + name: '@DROLSKY/BumpVersionAfterRelease' + version: '0.009' + - + class: Dist::Zilla::Plugin::Git::Commit + config: + Dist::Zilla::Plugin::Git::Commit: + add_files_in: [] + commit_msg: 'Bump version after release' + time_zone: local + Dist::Zilla::Role::Git::DirtyFiles: + allow_dirty: + - dist.ini + - Changes + allow_dirty_match: + - (?^:.+) + changelog: Changes + Dist::Zilla::Role::Git::Repo: + repo_root: . + name: '@DROLSKY/commit version bump' + version: '2.033' + - + class: Dist::Zilla::Plugin::Git::Push + config: + Dist::Zilla::Plugin::Git::Push: + push_to: + - origin + remotes_must_exist: 1 + Dist::Zilla::Role::Git::Repo: + repo_root: . + name: '@DROLSKY/push version bump' + version: '2.033' + - + class: Dist::Zilla::Plugin::FinderCode + name: ':InstallModules' + version: '5.035' + - + class: Dist::Zilla::Plugin::FinderCode + name: ':IncModules' + version: '5.035' + - + class: Dist::Zilla::Plugin::FinderCode + name: ':TestFiles' + version: '5.035' + - + class: Dist::Zilla::Plugin::FinderCode + name: ':ExecFiles' + version: '5.035' + - + class: Dist::Zilla::Plugin::FinderCode + name: ':ShareFiles' + version: '5.035' + - + class: Dist::Zilla::Plugin::FinderCode + name: ':MainModule' + version: '5.035' + - + class: Dist::Zilla::Plugin::FinderCode + name: ':AllFiles' + version: '5.035' + - + class: Dist::Zilla::Plugin::FinderCode + name: ':NoFiles' + version: '5.035' + - + class: Dist::Zilla::Plugin::FinderCode + name: '@DROLSKY/MetaProvides::Package/AUTOVIV/:InstallModulesPM' + version: '5.035' + zilla: + class: Dist::Zilla::Dist::Builder + config: + is_trial: '' + version: '5.035' +x_authority: cpan:DROLSKY +x_contributors: + - 'Jesse Luehrs <doy@tozt.net>' + - 'Karen Etheridge <ether@cpan.org>' + - 'Tomas Doran <bobtfish@bobtfish.net>' diff --git a/Makefile.PL b/Makefile.PL new file mode 100644 index 0000000..d380f36 --- /dev/null +++ b/Makefile.PL @@ -0,0 +1,70 @@ +# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v5.035. +use strict; +use warnings; + +use 5.006; + +use ExtUtils::MakeMaker; + +my %WriteMakefileArgs = ( + "ABSTRACT" => "Manage deprecation warnings for your distribution", + "AUTHOR" => "Dave Rolsky <autarch\@urth.org>", + "CONFIGURE_REQUIRES" => { + "ExtUtils::MakeMaker" => 0 + }, + "DISTNAME" => "Package-DeprecationManager", + "EXE_FILES" => [], + "LICENSE" => "artistic_2", + "MIN_PERL_VERSION" => "5.006", + "NAME" => "Package::DeprecationManager", + "PREREQ_PM" => { + "Carp" => 0, + "List::Util" => "1.33", + "Params::Util" => 0, + "Sub::Install" => 0, + "strict" => 0, + "warnings" => 0 + }, + "TEST_REQUIRES" => { + "ExtUtils::MakeMaker" => 0, + "File::Spec" => 0, + "IO::Handle" => 0, + "IPC::Open3" => 0, + "Test::Fatal" => 0, + "Test::More" => "0.96", + "Test::Requires" => 0 + }, + "VERSION" => "0.14", + "test" => { + "TESTS" => "t/*.t" + } +); + + +my %FallbackPrereqs = ( + "Carp" => 0, + "ExtUtils::MakeMaker" => 0, + "File::Spec" => 0, + "IO::Handle" => 0, + "IPC::Open3" => 0, + "List::Util" => "1.33", + "Params::Util" => 0, + "Sub::Install" => 0, + "Test::Fatal" => 0, + "Test::More" => "0.96", + "Test::Requires" => 0, + "strict" => 0, + "warnings" => 0 +); + + +unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) { + delete $WriteMakefileArgs{TEST_REQUIRES}; + delete $WriteMakefileArgs{BUILD_REQUIRES}; + $WriteMakefileArgs{PREREQ_PM} = \%FallbackPrereqs; +} + +delete $WriteMakefileArgs{CONFIGURE_REQUIRES} + unless eval { ExtUtils::MakeMaker->VERSION(6.52) }; + +WriteMakefile(%WriteMakefileArgs); diff --git a/README.md b/README.md new file mode 100644 index 0000000..14b8413 --- /dev/null +++ b/README.md @@ -0,0 +1,152 @@ +NAME + + Package::DeprecationManager - Manage deprecation warnings for your + distribution + +VERSION + + version 0.14 + +SYNOPSIS + + package My::Class; + + use Package::DeprecationManager -deprecations => { + 'My::Class::foo' => '0.02', + 'My::Class::bar' => '0.05', + 'feature-X' => '0.07', + }; + + sub foo { + deprecated( 'Do not call foo!' ); + + ... + } + + sub bar { + deprecated(); + + ... + } + + sub baz { + my %args = @_; + + if ( $args{foo} ) { + deprecated( + message => ..., + feature => 'feature-X', + ); + } + } + + package Other::Class; + + use My::Class -api_version => '0.04'; + + My::Class->new()->foo(); # warns + My::Class->new()->bar(); # does not warn + My::Class->new()->bar(); # does not warn again + +DESCRIPTION + + This module allows you to manage a set of deprecations for one or more + modules. + + When you import Package::DeprecationManager, you must provide a set of + -deprecations as a hash ref. The keys are "feature" names, and the + values are the version when that feature was deprecated. + + In many cases, you can simply use the fully qualified name of a + subroutine or method as the feature name. This works for cases where + the whole subroutine is deprecated. However, the feature names can be + any string. This is useful if you don't want to deprecate an entire + subroutine, just a certain usage. + + You can also provide an optional array reference in the -ignore + parameter. + + The values to be ignored can be package names or regular expressions + (made with qr//). Use this to ignore packages in your distribution that + can appear on the call stack when a deprecated feature is used. + + As part of the import process, Package::DeprecationManager will export + two subroutines into its caller. It provides an import() sub for the + caller and a deprecated() sub. + + The import() sub allows callers of your class to specify an + -api_version parameter. If this is supplied, then deprecation warnings + are only issued for deprecations with API versions earlier than the one + specified. + + You must call the deprecated() sub in each deprecated subroutine. When + called, it will issue a warning using Carp::cluck(). + + The deprecated() sub can be called in several ways. If you do not pass + any arguments, it will generate an appropriate warning message. If you + pass a single argument, this is used as the warning message. + + Finally, you can call it with named arguments. Currently, the only + allowed names are message and feature. The feature argument should + correspond to the feature name passed in the -deprecations hash. + + If you don't explicitly specify a feature, the deprecated() sub uses + caller() to identify its caller, using its fully qualified subroutine + name. + + A given deprecation warning is only issued once for a given package. + This module tracks this based on both the feature name and the error + message itself. This means that if you provide several different error + messages for the same feature, all of those errors will appear. + +BUGS + + Please report any bugs or feature requests to + bug-package-deprecationmanager@rt.cpan.org, or through the web + interface at http://rt.cpan.org. I will be notified, and then you'll + automatically be notified of progress on your bug as I make changes. + +DONATIONS + + If you'd like to thank me for the work I've done on this module, please + consider making a "donation" to me via PayPal. I spend a lot of free + time creating free software, and would appreciate any support you'd + care to offer. + + Please note that I am not suggesting that you must do this in order for + me to continue working on this particular software. I will continue to + do so, inasmuch as I have in the past, for as long as it interests me. + + Similarly, a donation made in this way will probably not make me work + on this software much more, unless I get so many donations that I can + consider working on free software full time, which seems unlikely at + best. + + To donate, log into PayPal and send money to autarch@urth.org or use + the button on this page: http://www.urth.org/~autarch/fs-donation.html + +CREDITS + + The idea for this functionality and some of its implementation was + originally created as Class::MOP::Deprecated by Goro Fuji. + +AUTHOR + + Dave Rolsky <autarch@urth.org> + +CONTRIBUTORS + + * Jesse Luehrs <doy@tozt.net> + + * Karen Etheridge <ether@cpan.org> + + * Tomas Doran <bobtfish@bobtfish.net> + +COPYRIGHT AND LICENSE + + This software is Copyright (c) 2015 by Dave Rolsky. + + This is free software, licensed under: + + The Artistic License 2.0 (GPL Compatible) + diff --git a/cpanfile b/cpanfile new file mode 100644 index 0000000..1b4bd68 --- /dev/null +++ b/cpanfile @@ -0,0 +1,41 @@ +requires "Carp" => "0"; +requires "List::Util" => "1.33"; +requires "Params::Util" => "0"; +requires "Sub::Install" => "0"; +requires "strict" => "0"; +requires "warnings" => "0"; + +on 'test' => sub { + requires "ExtUtils::MakeMaker" => "0"; + requires "File::Spec" => "0"; + requires "IO::Handle" => "0"; + requires "IPC::Open3" => "0"; + requires "Test::Fatal" => "0"; + requires "Test::More" => "0.96"; + requires "Test::Requires" => "0"; + requires "perl" => "5.006"; +}; + +on 'test' => sub { + recommends "CPAN::Meta" => "2.120900"; +}; + +on 'configure' => sub { + requires "ExtUtils::MakeMaker" => "0"; +}; + +on 'develop' => sub { + requires "Code::TidyAll" => "0.24"; + requires "Perl::Critic" => "1.123"; + requires "Perl::Tidy" => "20140711"; + requires "Pod::Coverage::TrustPod" => "0"; + requires "Test::CPAN::Changes" => "0.19"; + requires "Test::Code::TidyAll" => "0.24"; + requires "Test::EOL" => "0"; + requires "Test::More" => "0.88"; + requires "Test::NoTabs" => "0"; + requires "Test::Pod" => "1.41"; + requires "Test::Pod::Coverage" => "1.08"; + requires "Test::Spelling" => "0.12"; + requires "Test::Version" => "1"; +}; diff --git a/dist.ini b/dist.ini new file mode 100644 index 0000000..3e349a3 --- /dev/null +++ b/dist.ini @@ -0,0 +1,10 @@ +name = Package-DeprecationManager +author = Dave Rolsky <autarch@urth.org> +license = Artistic_2_0 +copyright_holder = Dave Rolsky + +[@DROLSKY] +dist = Package-DeprecationManager +stopwords = Goro +stopwords = deprecations +-remove = Test::Synopsis diff --git a/lib/Package/DeprecationManager.pm b/lib/Package/DeprecationManager.pm new file mode 100644 index 0000000..646897e --- /dev/null +++ b/lib/Package/DeprecationManager.pm @@ -0,0 +1,292 @@ +package Package::DeprecationManager; + +use strict; +use warnings; + +our $VERSION = '0.14'; + +use Carp qw( croak ); +use List::Util 1.33 qw( any ); +use Params::Util qw( _HASH0 ); +use Sub::Install; + +sub import { + shift; + my %args = @_; + + croak + 'You must provide a hash reference -deprecations parameter when importing Package::DeprecationManager' + unless $args{-deprecations} && _HASH0( $args{-deprecations} ); + + my %registry; + + my $import = _build_import( \%registry ); + my $warn + = _build_warn( \%registry, $args{-deprecations}, $args{-ignore} ); + + my $caller = caller(); + + Sub::Install::install_sub( + { + code => $import, + into => $caller, + as => 'import', + } + ); + + Sub::Install::install_sub( + { + code => $warn, + into => $caller, + as => 'deprecated', + } + ); + + return; +} + +sub _build_import { + my $registry = shift; + + return sub { + my $class = shift; + my %args = @_; + + $args{-api_version} ||= delete $args{-compatible}; + + $registry->{ caller() } = $args{-api_version} + if $args{-api_version}; + + return; + }; +} + +sub _build_warn { + my $registry = shift; + my $deprecated_at = shift; + my $ignore = shift; + + my %ignore = map { $_ => 1 } grep { !ref } @{ $ignore || [] }; + my @ignore_res = grep {ref} @{ $ignore || [] }; + + my %warned; + + return sub { + my %args = @_ < 2 ? ( message => shift ) : @_; + + my ( $package, undef, undef, $sub ) = caller(1); + + my $skipped = 1; + + if ( @ignore_res || keys %ignore ) { + while ( defined $package + && ( $ignore{$package} || any { $package =~ $_ } @ignore_res ) + ) { + $package = caller( $skipped++ ); + } + } + + $package = 'unknown package' unless defined $package; + + unless ( defined $args{feature} ) { + $args{feature} = $sub; + } + + my $compat_version = $registry->{$package}; + + my $at = $deprecated_at->{ $args{feature} }; + + return + if defined $compat_version + && defined $deprecated_at + && $compat_version lt $at; + + my $msg; + if ( defined $args{message} ) { + $msg = $args{message}; + } + else { + $msg = "$args{feature} has been deprecated"; + $msg .= " since version $at" + if defined $at; + } + + return if $warned{$package}{ $args{feature} }{$msg}; + + $warned{$package}{ $args{feature} }{$msg} = 1; + + # We skip at least two levels. One for this anon sub, and one for the + # sub calling it. + local $Carp::CarpLevel = $Carp::CarpLevel + $skipped; + + Carp::cluck($msg); + }; +} + +1; + +# ABSTRACT: Manage deprecation warnings for your distribution + +__END__ + +=pod + +=head1 NAME + +Package::DeprecationManager - Manage deprecation warnings for your distribution + +=head1 VERSION + +version 0.14 + +=head1 SYNOPSIS + + package My::Class; + + use Package::DeprecationManager -deprecations => { + 'My::Class::foo' => '0.02', + 'My::Class::bar' => '0.05', + 'feature-X' => '0.07', + }; + + sub foo { + deprecated( 'Do not call foo!' ); + + ... + } + + sub bar { + deprecated(); + + ... + } + + sub baz { + my %args = @_; + + if ( $args{foo} ) { + deprecated( + message => ..., + feature => 'feature-X', + ); + } + } + + package Other::Class; + + use My::Class -api_version => '0.04'; + + My::Class->new()->foo(); # warns + My::Class->new()->bar(); # does not warn + My::Class->new()->bar(); # does not warn again + +=head1 DESCRIPTION + +This module allows you to manage a set of deprecations for one or more modules. + +When you import C<Package::DeprecationManager>, you must provide a set of +C<-deprecations> as a hash ref. The keys are "feature" names, and the values +are the version when that feature was deprecated. + +In many cases, you can simply use the fully qualified name of a subroutine or +method as the feature name. This works for cases where the whole subroutine is +deprecated. However, the feature names can be any string. This is useful if +you don't want to deprecate an entire subroutine, just a certain usage. + +You can also provide an optional array reference in the C<-ignore> +parameter. + +The values to be ignored can be package names or regular expressions (made +with C<qr//>). Use this to ignore packages in your distribution that can +appear on the call stack when a deprecated feature is used. + +As part of the import process, C<Package::DeprecationManager> will export two +subroutines into its caller. It provides an C<import()> sub for the caller and a +C<deprecated()> sub. + +The C<import()> sub allows callers of I<your> class to specify an C<-api_version> +parameter. If this is supplied, then deprecation warnings are only issued for +deprecations with API versions earlier than the one specified. + +You must call the C<deprecated()> sub in each deprecated subroutine. When +called, it will issue a warning using C<Carp::cluck()>. + +The C<deprecated()> sub can be called in several ways. If you do not pass any +arguments, it will generate an appropriate warning message. If you pass a +single argument, this is used as the warning message. + +Finally, you can call it with named arguments. Currently, the only allowed +names are C<message> and C<feature>. The C<feature> argument should correspond +to the feature name passed in the C<-deprecations> hash. + +If you don't explicitly specify a feature, the C<deprecated()> sub uses +C<caller()> to identify its caller, using its fully qualified subroutine name. + +A given deprecation warning is only issued once for a given package. This +module tracks this based on both the feature name I<and> the error message +itself. This means that if you provide several different error messages for +the same feature, all of those errors will appear. + +=head1 BUGS + +Please report any bugs or feature requests to +C<bug-package-deprecationmanager@rt.cpan.org>, or through the web interface at +L<http://rt.cpan.org>. I will be notified, and then you'll automatically be +notified of progress on your bug as I make changes. + +=head1 DONATIONS + +If you'd like to thank me for the work I've done on this module, please +consider making a "donation" to me via PayPal. I spend a lot of free time +creating free software, and would appreciate any support you'd care to offer. + +Please note that B<I am not suggesting that you must do this> in order +for me to continue working on this particular software. I will +continue to do so, inasmuch as I have in the past, for as long as it +interests me. + +Similarly, a donation made in this way will probably not make me work on this +software much more, unless I get so many donations that I can consider working +on free software full time, which seems unlikely at best. + +To donate, log into PayPal and send money to autarch@urth.org or use the +button on this page: L<http://www.urth.org/~autarch/fs-donation.html> + +=head1 CREDITS + +The idea for this functionality and some of its implementation was originally +created as L<Class::MOP::Deprecated> by Goro Fuji. + +=head1 AUTHOR + +Dave Rolsky <autarch@urth.org> + +=head1 CONTRIBUTORS + +=for stopwords Jesse Luehrs Karen Etheridge Tomas Doran + +=over 4 + +=item * + +Jesse Luehrs <doy@tozt.net> + +=item * + +Karen Etheridge <ether@cpan.org> + +=item * + +Tomas Doran <bobtfish@bobtfish.net> + +=back + +=head1 COPYRIGHT AND LICENSE + +This software is Copyright (c) 2015 by Dave Rolsky. + +This is free software, licensed under: + + The Artistic License 2.0 (GPL Compatible) + +=cut diff --git a/perlcriticrc b/perlcriticrc new file mode 100644 index 0000000..1ab0851 --- /dev/null +++ b/perlcriticrc @@ -0,0 +1,58 @@ +severity = 3 +verbose = 11 +theme = core + pbp + bugs + maintenance + cosmetic + complexity + security + tests + moose + +exclude = Subroutines::ProhibitCallsToUndeclaredSubs + +[BuiltinFunctions::ProhibitStringySplit] +severity = 3 + +[CodeLayout::RequireTrailingCommas] +severity = 3 + +[ControlStructures::ProhibitCStyleForLoops] +severity = 3 + +[InputOutput::RequireCheckedSyscalls] +functions = :builtins +exclude_functions = sleep +severity = 3 + +[RegularExpressions::ProhibitComplexRegexes] +max_characters = 200 + +[RegularExpressions::ProhibitUnusualDelimiters] +severity = 3 + +[Subroutines::ProhibitUnusedPrivateSubroutines] +private_name_regex = _(?!build)\w+ + +[TestingAndDebugging::ProhibitNoWarnings] +allow = redefine + +[ValuesAndExpressions::ProhibitEmptyQuotes] +severity = 3 + +[ValuesAndExpressions::ProhibitInterpolationOfLiterals] +severity = 3 + +[ValuesAndExpressions::RequireUpperCaseHeredocTerminator] +severity = 3 + +[Variables::ProhibitPackageVars] +add_packages = Carp Test::Builder + +[-Subroutines::RequireFinalReturn] + +[-ErrorHandling::RequireCarping] + +# No need for /xsm everywhere +[-RegularExpressions::RequireDotMatchAnything] +[-RegularExpressions::RequireExtendedFormatting] +[-RegularExpressions::RequireLineBoundaryMatching] + +# http://stackoverflow.com/questions/2275317/why-does-perlcritic-dislike-using-shift-to-populate-subroutine-variables +[-Subroutines::RequireArgUnpacking] + +# "use v5.14" is more readable than "use 5.014" +[-ValuesAndExpressions::ProhibitVersionStrings] diff --git a/perltidyrc b/perltidyrc new file mode 100644 index 0000000..b54e60d --- /dev/null +++ b/perltidyrc @@ -0,0 +1,22 @@ +-l=78 +-i=4 +-ci=4 +-se +-b +-bar +-boc +-vt=0 +-vtc=0 +-cti=0 +-pt=1 +-bt=1 +-sbt=1 +-bbt=1 +-nolq +-npro +-nsfs +--blank-lines-before-packages=0 +--opening-hash-brace-right +--no-outdent-long-comments +--iterations=2 +-wbb="% + - * / x != == >= <= =~ !~ < > | & >= < = **= += *= &= <<= &&= -= /= |= >>= ||= .= %= ^= x=" diff --git a/t/00-compile.t b/t/00-compile.t new file mode 100644 index 0000000..5e29d26 --- /dev/null +++ b/t/00-compile.t @@ -0,0 +1,51 @@ +use 5.006; +use strict; +use warnings; + +# this test was generated with Dist::Zilla::Plugin::Test::Compile 2.052 + +use Test::More; + +plan tests => 1 + ($ENV{AUTHOR_TESTING} ? 1 : 0); + +my @module_files = ( + 'Package/DeprecationManager.pm' +); + + + +# no fake home requested + +my $inc_switch = -d 'blib' ? '-Mblib' : '-Ilib'; + +use File::Spec; +use IPC::Open3; +use IO::Handle; + +open my $stdin, '<', File::Spec->devnull or die "can't open devnull: $!"; + +my @warnings; +for my $lib (@module_files) +{ + # see L<perlfaq8/How can I capture STDERR from an external command?> + my $stderr = IO::Handle->new; + + my $pid = open3($stdin, '>&STDERR', $stderr, $^X, $inc_switch, '-e', "require q[$lib]"); + binmode $stderr, ':crlf' if $^O eq 'MSWin32'; + my @_warnings = <$stderr>; + waitpid($pid, 0); + is($?, 0, "$lib loaded ok"); + + if (@_warnings) + { + warn @_warnings; + push @warnings, @_warnings; + } +} + + + +is(scalar(@warnings), 0, 'no warnings found') + or diag 'got warnings: ', ( Test::More->can('explain') ? Test::More::explain(\@warnings) : join("\n", '', @warnings) ) if $ENV{AUTHOR_TESTING}; + + diff --git a/t/00-report-prereqs.dd b/t/00-report-prereqs.dd new file mode 100644 index 0000000..b31b4a1 --- /dev/null +++ b/t/00-report-prereqs.dd @@ -0,0 +1,51 @@ +do { my $x = { + 'configure' => { + 'requires' => { + 'ExtUtils::MakeMaker' => '0' + } + }, + 'develop' => { + 'requires' => { + 'Code::TidyAll' => '0.24', + 'Perl::Critic' => '1.123', + 'Perl::Tidy' => '20140711', + 'Pod::Coverage::TrustPod' => '0', + 'Test::CPAN::Changes' => '0.19', + 'Test::Code::TidyAll' => '0.24', + 'Test::EOL' => '0', + 'Test::More' => '0.88', + 'Test::NoTabs' => '0', + 'Test::Pod' => '1.41', + 'Test::Pod::Coverage' => '1.08', + 'Test::Spelling' => '0.12', + 'Test::Version' => '1' + } + }, + 'runtime' => { + 'requires' => { + 'Carp' => '0', + 'List::Util' => '1.33', + 'Params::Util' => '0', + 'Sub::Install' => '0', + 'strict' => '0', + 'warnings' => '0' + } + }, + 'test' => { + 'recommends' => { + 'CPAN::Meta' => '2.120900' + }, + 'requires' => { + 'ExtUtils::MakeMaker' => '0', + 'File::Spec' => '0', + 'IO::Handle' => '0', + 'IPC::Open3' => '0', + 'Test::Fatal' => '0', + 'Test::More' => '0.96', + 'Test::Requires' => '0', + 'perl' => '5.006' + } + } + }; + $x; + }
\ No newline at end of file diff --git a/t/00-report-prereqs.t b/t/00-report-prereqs.t new file mode 100644 index 0000000..d8d15ba --- /dev/null +++ b/t/00-report-prereqs.t @@ -0,0 +1,183 @@ +#!perl + +use strict; +use warnings; + +# This test was generated by Dist::Zilla::Plugin::Test::ReportPrereqs 0.021 + +use Test::More tests => 1; + +use ExtUtils::MakeMaker; +use File::Spec; + +# from $version::LAX +my $lax_version_re = + qr/(?: undef | (?: (?:[0-9]+) (?: \. | (?:\.[0-9]+) (?:_[0-9]+)? )? + | + (?:\.[0-9]+) (?:_[0-9]+)? + ) | (?: + v (?:[0-9]+) (?: (?:\.[0-9]+)+ (?:_[0-9]+)? )? + | + (?:[0-9]+)? (?:\.[0-9]+){2,} (?:_[0-9]+)? + ) + )/x; + +# hide optional CPAN::Meta modules from prereq scanner +# and check if they are available +my $cpan_meta = "CPAN::Meta"; +my $cpan_meta_pre = "CPAN::Meta::Prereqs"; +my $HAS_CPAN_META = eval "require $cpan_meta; $cpan_meta->VERSION('2.120900')" && eval "require $cpan_meta_pre"; ## no critic + +# Verify requirements? +my $DO_VERIFY_PREREQS = 1; + +sub _max { + my $max = shift; + $max = ( $_ > $max ) ? $_ : $max for @_; + return $max; +} + +sub _merge_prereqs { + my ($collector, $prereqs) = @_; + + # CPAN::Meta::Prereqs object + if (ref $collector eq $cpan_meta_pre) { + return $collector->with_merged_prereqs( + CPAN::Meta::Prereqs->new( $prereqs ) + ); + } + + # Raw hashrefs + for my $phase ( keys %$prereqs ) { + for my $type ( keys %{ $prereqs->{$phase} } ) { + for my $module ( keys %{ $prereqs->{$phase}{$type} } ) { + $collector->{$phase}{$type}{$module} = $prereqs->{$phase}{$type}{$module}; + } + } + } + + return $collector; +} + +my @include = qw( + +); + +my @exclude = qw( + +); + +# Add static prereqs to the included modules list +my $static_prereqs = do 't/00-report-prereqs.dd'; + +# Merge all prereqs (either with ::Prereqs or a hashref) +my $full_prereqs = _merge_prereqs( + ( $HAS_CPAN_META ? $cpan_meta_pre->new : {} ), + $static_prereqs +); + +# Add dynamic prereqs to the included modules list (if we can) +my ($source) = grep { -f } 'MYMETA.json', 'MYMETA.yml'; +if ( $source && $HAS_CPAN_META ) { + if ( my $meta = eval { CPAN::Meta->load_file($source) } ) { + $full_prereqs = _merge_prereqs($full_prereqs, $meta->prereqs); + } +} +else { + $source = 'static metadata'; +} + +my @full_reports; +my @dep_errors; +my $req_hash = $HAS_CPAN_META ? $full_prereqs->as_string_hash : $full_prereqs; + +# Add static includes into a fake section +for my $mod (@include) { + $req_hash->{other}{modules}{$mod} = 0; +} + +for my $phase ( qw(configure build test runtime develop other) ) { + next unless $req_hash->{$phase}; + next if ($phase eq 'develop' and not $ENV{AUTHOR_TESTING}); + + for my $type ( qw(requires recommends suggests conflicts modules) ) { + next unless $req_hash->{$phase}{$type}; + + my $title = ucfirst($phase).' '.ucfirst($type); + my @reports = [qw/Module Want Have/]; + + for my $mod ( sort keys %{ $req_hash->{$phase}{$type} } ) { + next if $mod eq 'perl'; + next if grep { $_ eq $mod } @exclude; + + my $file = $mod; + $file =~ s{::}{/}g; + $file .= ".pm"; + my ($prefix) = grep { -e File::Spec->catfile($_, $file) } @INC; + + my $want = $req_hash->{$phase}{$type}{$mod}; + $want = "undef" unless defined $want; + $want = "any" if !$want && $want == 0; + + my $req_string = $want eq 'any' ? 'any version required' : "version '$want' required"; + + if ($prefix) { + my $have = MM->parse_version( File::Spec->catfile($prefix, $file) ); + $have = "undef" unless defined $have; + push @reports, [$mod, $want, $have]; + + if ( $DO_VERIFY_PREREQS && $HAS_CPAN_META && $type eq 'requires' ) { + if ( $have !~ /\A$lax_version_re\z/ ) { + push @dep_errors, "$mod version '$have' cannot be parsed ($req_string)"; + } + elsif ( ! $full_prereqs->requirements_for( $phase, $type )->accepts_module( $mod => $have ) ) { + push @dep_errors, "$mod version '$have' is not in required range '$want'"; + } + } + } + else { + push @reports, [$mod, $want, "missing"]; + + if ( $DO_VERIFY_PREREQS && $type eq 'requires' ) { + push @dep_errors, "$mod is not installed ($req_string)"; + } + } + } + + if ( @reports ) { + push @full_reports, "=== $title ===\n\n"; + + my $ml = _max( map { length $_->[0] } @reports ); + my $wl = _max( map { length $_->[1] } @reports ); + my $hl = _max( map { length $_->[2] } @reports ); + + if ($type eq 'modules') { + splice @reports, 1, 0, ["-" x $ml, "", "-" x $hl]; + push @full_reports, map { sprintf(" %*s %*s\n", -$ml, $_->[0], $hl, $_->[2]) } @reports; + } + else { + splice @reports, 1, 0, ["-" x $ml, "-" x $wl, "-" x $hl]; + push @full_reports, map { sprintf(" %*s %*s %*s\n", -$ml, $_->[0], $wl, $_->[1], $hl, $_->[2]) } @reports; + } + + push @full_reports, "\n"; + } + } +} + +if ( @full_reports ) { + diag "\nVersions for all modules listed in $source (including optional ones):\n\n", @full_reports; +} + +if ( @dep_errors ) { + diag join("\n", + "\n*** WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING ***\n", + "The following REQUIRED prerequisites were not satisfied:\n", + @dep_errors, + "\n" + ); +} + +pass; + +# vim: ts=4 sts=4 sw=4 et: diff --git a/t/author-eol.t b/t/author-eol.t new file mode 100644 index 0000000..9dd7031 --- /dev/null +++ b/t/author-eol.t @@ -0,0 +1,37 @@ + +BEGIN { + unless ($ENV{AUTHOR_TESTING}) { + require Test::More; + Test::More::plan(skip_all => 'these tests are for testing by the author'); + } +} + +use strict; +use warnings; + +# this test was generated with Dist::Zilla::Plugin::Test::EOL 0.17 + +use Test::More 0.88; +use Test::EOL; + +my @files = ( + 'lib/Package/DeprecationManager.pm', + 't/00-compile.t', + 't/00-report-prereqs.dd', + 't/00-report-prereqs.t', + 't/author-eol.t', + 't/author-no-tabs.t', + 't/author-pod-spell.t', + 't/basic.t', + 't/release-cpan-changes.t', + 't/release-pod-coverage.t', + 't/release-pod-linkcheck.t', + 't/release-pod-no404s.t', + 't/release-pod-syntax.t', + 't/release-portability.t', + 't/release-test-version.t', + 't/release-tidyall.t' +); + +eol_unix_ok($_, { trailing_whitespace => 1 }) foreach @files; +done_testing; diff --git a/t/author-no-tabs.t b/t/author-no-tabs.t new file mode 100644 index 0000000..41ea27f --- /dev/null +++ b/t/author-no-tabs.t @@ -0,0 +1,37 @@ + +BEGIN { + unless ($ENV{AUTHOR_TESTING}) { + require Test::More; + Test::More::plan(skip_all => 'these tests are for testing by the author'); + } +} + +use strict; +use warnings; + +# this test was generated with Dist::Zilla::Plugin::Test::NoTabs 0.13 + +use Test::More 0.88; +use Test::NoTabs; + +my @files = ( + 'lib/Package/DeprecationManager.pm', + 't/00-compile.t', + 't/00-report-prereqs.dd', + 't/00-report-prereqs.t', + 't/author-eol.t', + 't/author-no-tabs.t', + 't/author-pod-spell.t', + 't/basic.t', + 't/release-cpan-changes.t', + 't/release-pod-coverage.t', + 't/release-pod-linkcheck.t', + 't/release-pod-no404s.t', + 't/release-pod-syntax.t', + 't/release-portability.t', + 't/release-test-version.t', + 't/release-tidyall.t' +); + +notabs_ok($_) foreach @files; +done_testing; diff --git a/t/author-pod-spell.t b/t/author-pod-spell.t new file mode 100644 index 0000000..74bbbd8 --- /dev/null +++ b/t/author-pod-spell.t @@ -0,0 +1,40 @@ + +BEGIN { + unless ($ENV{AUTHOR_TESTING}) { + require Test::More; + Test::More::plan(skip_all => 'these tests are for testing by the author'); + } +} + +use strict; +use warnings; +use Test::More; + +# generated by Dist::Zilla::Plugin::Test::PodSpelling 2.006008 +use Test::Spelling 0.12; +use Pod::Wordlist; + + +add_stopwords(<DATA>); +all_pod_files_spelling_ok( qw( bin lib ) ); +__DATA__ +DROLSKY +DROLSKY's +Rolsky +Rolsky's +Goro +deprecations +Dave +autarch +Jesse +Luehrs +doy +Karen +Etheridge +ether +Tomas +Doran +bobtfish +lib +Package +DeprecationManager diff --git a/t/basic.t b/t/basic.t new file mode 100644 index 0000000..34dce52 --- /dev/null +++ b/t/basic.t @@ -0,0 +1,275 @@ +use strict; +use warnings; + +use Test::Fatal; +use Test::More 0.88; + +use Test::Requires { + 'Test::Output' => '0.16', +}; + +{ + ## no critic (BuiltinFunctions::ProhibitStringyEval, ErrorHandling::RequireCheckingReturnValueOfEval) + like( + exception { + eval 'package Whatever; use Package::DeprecationManager;'; + die $@ if $@; + }, + qr/^\QYou must provide a hash reference -deprecations parameter when importing Package::DeprecationManager/, + 'must provide a set of deprecations when using Package::DeprecationManager' + ); +} + +## no critic (Modules::ProhibitMultiplePackages) + +{ + package Foo; + + use Package::DeprecationManager -deprecations => { + 'Foo::foo' => '0.02', + 'Foo::bar' => '0.03', + 'Foo::baz' => '1.21', + 'not a sub' => '1.23', + }; + + sub foo { + deprecated('foo is deprecated'); + } + + sub bar { + deprecated('bar is deprecated'); + } + + sub baz { + deprecated(); + } + + sub quux { + if ( $_[0] > 5 ) { + deprecated( + message => 'quux > 5 has been deprecated', + feature => 'not a sub', + ); + } + } + + sub varies { + deprecated("The varies sub varies: $_[0]"); + } + +} + +{ + package Bar; + + Foo->import(); + + ::stderr_like( + sub { Foo::foo() }, + qr/\Qfoo is deprecated/, + 'deprecation warning for foo' + ); + + ::stderr_like( + sub { Foo::bar() }, + qr/\Qbar is deprecated/, + 'deprecation warning for bar' + ); + + ::stderr_like( + sub { Foo::baz() }, + qr/\QFoo::baz has been deprecated since version 1.21/, + 'deprecation warning for baz, and message is generated by Package::DeprecationManager' + ); + + ::stderr_is( + sub { Foo::foo() }, + q{}, 'no warning on second call to foo' + ); + + ::stderr_is( + sub { Foo::bar() }, + q{}, 'no warning on second call to bar' + ); + + ::stderr_is( + sub { Foo::baz() }, + q{}, 'no warning on second call to baz' + ); + + ::stderr_like( + sub { Foo::varies(1) }, + qr/\QThe varies sub varies: 1/, + 'warning for varies sub' + ); + + ::stderr_like( + sub { Foo::varies(2) }, + qr/\QThe varies sub varies: 2/, + 'warning for varies sub with different error' + ); + + ::stderr_is( + sub { Foo::varies(1) }, + q{}, + 'no warning for varies sub with same message as first call' + ); +} + +{ + package Baz; + + Foo->import( -api_version => '0.01' ); + + ::stderr_is( + sub { Foo::foo() }, + q{}, + 'no warning for foo with api_version = 0.01' + ); + + ::stderr_is( + sub { Foo::bar() }, + q{}, + 'no warning for bar with api_version = 0.01' + ); + + ::stderr_is( + sub { Foo::baz() }, + q{}, + 'no warning for baz with api_version = 0.01' + ); +} + +{ + package Quux; + + Foo->import( -api_version => '1.17' ); + + ::stderr_like( + sub { Foo::foo() }, + qr/\Qfoo is deprecated/, + 'deprecation warning for foo with api_version = 1.17' + ); + + ::stderr_like( + sub { Foo::bar() }, + qr/\Qbar is deprecated/, + 'deprecation warning for bar with api_version = 1.17' + ); + + ::stderr_is( + sub { Foo::baz() }, + q{}, + 'no warning for baz with api_version = 1.17' + ); +} + +{ + package Another; + + Foo->import(); + + ::stderr_is( + sub { Foo::quux(1) }, + q{}, + 'no warning for quux(1)' + ); + + ::stderr_like( + sub { Foo::quux(10) }, + qr/\Qquux > 5 has been deprecated/, + 'got a warning for quux(10)' + ); +} + +{ + package Dep; + + use Package::DeprecationManager -deprecations => { + 'Dep::foo' => '1.00', + }, + -ignore => [ 'My::Package1', 'My::Package2' ]; + + sub foo { + deprecated('foo is deprecated'); + } +} + +{ + package Dep2; + + use Package::DeprecationManager -deprecations => { + 'Dep2::bar' => '1.00', + }, + -ignore => [qr/My::Package[12]/]; + + sub bar { + deprecated('bar is deprecated'); + } +} + +{ + package My::Package1; + + sub foo { Dep::foo() } + sub bar { Dep2::bar() } +} + +{ + package My::Package2; + + sub foo { My::Package1::foo() } + sub bar { My::Package1::bar() } +} + +{ + package My::Baz; + + ::stderr_like( + sub { My::Package2::foo() }, + qr/^foo is deprecated at t.basic\.t line \d+\.?\s+My::Baz/, + 'deprecation warning for call to My::Package2::foo() and mentions My::Baz but not My::Package[12]' + ); + + ::stderr_is( + sub { My::Package2::foo() }, + q{}, + 'no deprecation warning for second call to My::Package2::foo()' + ); + + ::stderr_is( + sub { My::Package1::foo() }, + q{}, + 'no deprecation warning for call to My::Package1::foo()' + ); + + ::stderr_like( + sub { My::Package2::bar() }, + qr/^bar is deprecated at t.basic\.t line \d+\.?\s+My::Baz/, + 'deprecation warning for call to My::Package2::foo() and mentions My::Baz but not My::Package[12]' + ); + + ::stderr_is( + sub { My::Package2::bar() }, + q{}, + 'no deprecation warning for second call to My::Package2::bar()' + ); +} + +{ + package My::Quux; + + ::stderr_like( + sub { My::Package1::foo() }, + qr/^foo is deprecated at t.basic\.t line \d+\.?\s+My::Quux/, + 'deprecation warning for call to My::Package1::foo() and mentions My::Quux but not My::Package[12]' + ); + + ::stderr_is( + sub { My::Package1::foo() }, + q{}, + 'no deprecation warning for second call to My::Package1::foo()' + ); +} + +done_testing(); diff --git a/t/release-cpan-changes.t b/t/release-cpan-changes.t new file mode 100644 index 0000000..214650f --- /dev/null +++ b/t/release-cpan-changes.t @@ -0,0 +1,19 @@ +#!perl + +BEGIN { + unless ($ENV{RELEASE_TESTING}) { + require Test::More; + Test::More::plan(skip_all => 'these tests are for release candidate testing'); + } +} + + +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(); diff --git a/t/release-pod-coverage.t b/t/release-pod-coverage.t new file mode 100644 index 0000000..149bb2f --- /dev/null +++ b/t/release-pod-coverage.t @@ -0,0 +1,52 @@ +#!perl + +BEGIN { + unless ($ENV{RELEASE_TESTING}) { + require Test::More; + Test::More::plan(skip_all => 'these tests are for release candidate testing'); + } +} + +# This file was automatically generated by Dist::Zilla::Plugin::Test::Pod::Coverage::Configurable. + +use Test::Pod::Coverage 1.08; +use Test::More 0.88; + +BEGIN { + if ( $] <= 5.008008 ) { + plan skip_all => 'These tests require Pod::Coverage::TrustPod, which only works with Perl 5.8.9+'; + } +} +use Pod::Coverage::TrustPod; + +my %skip = map { $_ => 1 } qw( ); + +my @modules; +for my $module ( all_modules() ) { + next if $skip{$module}; + + push @modules, $module; +} + +plan skip_all => 'All the modules we found were excluded from POD coverage test.' + unless @modules; + +plan tests => scalar @modules; + +my %trustme = (); + +my @also_private; + +for my $module ( sort @modules ) { + pod_coverage_ok( + $module, + { + coverage_class => 'Pod::Coverage::TrustPod', + also_private => \@also_private, + trustme => $trustme{$module} || [], + }, + "pod coverage for $module" + ); +} + +done_testing(); diff --git a/t/release-pod-linkcheck.t b/t/release-pod-linkcheck.t new file mode 100644 index 0000000..654cf06 --- /dev/null +++ b/t/release-pod-linkcheck.t @@ -0,0 +1,28 @@ +#!perl + +BEGIN { + unless ($ENV{RELEASE_TESTING}) { + require Test::More; + Test::More::plan(skip_all => 'these tests are for release candidate testing'); + } +} + + +use strict; +use warnings; +use Test::More; + +foreach my $env_skip ( qw( + SKIP_POD_LINKCHECK +) ){ + plan skip_all => "\$ENV{$env_skip} is set, skipping" + if $ENV{$env_skip}; +} + +eval "use Test::Pod::LinkCheck"; +if ( $@ ) { + plan skip_all => 'Test::Pod::LinkCheck required for testing POD'; +} +else { + Test::Pod::LinkCheck->new->all_pod_ok; +} diff --git a/t/release-pod-no404s.t b/t/release-pod-no404s.t new file mode 100644 index 0000000..da185ec --- /dev/null +++ b/t/release-pod-no404s.t @@ -0,0 +1,29 @@ +#!perl + +BEGIN { + unless ($ENV{RELEASE_TESTING}) { + require Test::More; + Test::More::plan(skip_all => 'these tests are for release candidate testing'); + } +} + + +use strict; +use warnings; +use Test::More; + +foreach my $env_skip ( qw( + SKIP_POD_NO404S + AUTOMATED_TESTING +) ){ + plan skip_all => "\$ENV{$env_skip} is set, skipping" + if $ENV{$env_skip}; +} + +eval "use Test::Pod::No404s"; +if ( $@ ) { + plan skip_all => 'Test::Pod::No404s required for testing POD'; +} +else { + all_pod_files_ok(); +} diff --git a/t/release-pod-syntax.t b/t/release-pod-syntax.t new file mode 100644 index 0000000..cdd6a6c --- /dev/null +++ b/t/release-pod-syntax.t @@ -0,0 +1,14 @@ +#!perl + +BEGIN { + unless ($ENV{RELEASE_TESTING}) { + require Test::More; + Test::More::plan(skip_all => 'these tests are for release candidate testing'); + } +} + +# This file was automatically generated by Dist::Zilla::Plugin::PodSyntaxTests. +use Test::More; +use Test::Pod 1.41; + +all_pod_files_ok(); diff --git a/t/release-portability.t b/t/release-portability.t new file mode 100644 index 0000000..ad285b4 --- /dev/null +++ b/t/release-portability.t @@ -0,0 +1,20 @@ +#!perl + +BEGIN { + unless ($ENV{RELEASE_TESTING}) { + require Test::More; + Test::More::plan(skip_all => 'these tests are for release candidate testing'); + } +} + + +use strict; +use warnings; + +use Test::More; + +eval 'use Test::Portability::Files'; +plan skip_all => 'Test::Portability::Files required for testing portability' + if $@; + +run_tests(); diff --git a/t/release-test-version.t b/t/release-test-version.t new file mode 100644 index 0000000..f453957 --- /dev/null +++ b/t/release-test-version.t @@ -0,0 +1,30 @@ + +BEGIN { + unless ($ENV{RELEASE_TESTING}) { + require Test::More; + Test::More::plan(skip_all => 'these tests are for release candidate testing'); + } +} + +use strict; +use warnings; +use Test::More; + +# generated by Dist::Zilla::Plugin::Test::Version 0.003001 +use Test::Version; + +my @imports = ( 'version_all_ok' ); + +my $params = { + is_strict => 1, + has_version => 1, +}; + +push @imports, $params + if version->parse( $Test::Version::VERSION ) >= version->parse('1.002'); + + +Test::Version->import(@imports); + +version_all_ok; +done_testing; diff --git a/t/release-tidyall.t b/t/release-tidyall.t new file mode 100644 index 0000000..9625e53 --- /dev/null +++ b/t/release-tidyall.t @@ -0,0 +1,17 @@ +#!perl + +BEGIN { + unless ($ENV{RELEASE_TESTING}) { + require Test::More; + Test::More::plan(skip_all => 'these tests are for release candidate testing'); + } +} + +# This file was automatically generated by Dist::Zilla::Plugin::Test::TidyAll + +use Test::Code::TidyAll 0.24; +use Test::More 0.88; + +tidyall_ok(); + +done_testing(); diff --git a/tidyall.ini b/tidyall.ini new file mode 100644 index 0000000..dddc950 --- /dev/null +++ b/tidyall.ini @@ -0,0 +1,19 @@ +[PerlTidy] +select = **/*.{pl,pm,t,psgi} +ignore = t/00-* +ignore = t/author-* +ignore = t/release-* +ignore = blib/**/* +ignore = .build/**/* +ignore = Package-DeprecationManager-*/**/* +argv = --profile=$ROOT/perltidyrc + +[PerlCritic] +select = **/*.{pl,pm,t,psgi} +ignore = t/00-* +ignore = t/author-* +ignore = t/release-* +ignore = blib/**/* +ignore = .build/**/* +ignore = Package-DeprecationManager-*/**/* +argv = --profile $ROOT/perlcriticrc --program-extensions .pl --program-extensions .t --program-extensions .psgi |