diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..d923b1c --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,131 @@ +# CONTRIBUTING + +Thank you for considering contributing to this distribution. This file +contains instructions that will help you work with the source code. + +Please note that if you have any questions or difficulties, you can reach the +maintainer(s) through the bug queue described later in this document +(preferred), or by emailing the releaser directly. You are not required to +follow any of the steps in this document to submit a patch or bug report; +these are just recommendations, intended to help you (and help us help you +faster). + + +The distribution is managed with +[Dist::Zilla](https://metacpan.org/release/Dist-Zilla). + +However, you can still compile and test the code with the `Makefile.PL` or +`Build.PL` in the repository: + + perl Makefile.PL + make + make test + +or + perl Build.PL + ./Build + ./Build test + +As well as: + + $ prove -bvr t + +or + + $ perl -Mblib t/some_test_file.t + +You may need to satisfy some dependencies. The easiest way to satisfy +dependencies is to install the last release. This is available at +https://metacpan.org/release/Package-DeprecationManager + +If you use cpanminus, you can do it without downloading the tarball first: + + $ cpanm --reinstall --installdeps --with-recommends Package::DeprecationManager + +Dist::Zilla is a very powerful authoring tool, but requires a number of +author-specific plugins. If you would like to use it for contributing, install +it from CPAN, then run one of the following commands, depending on your CPAN +client: + + $ cpan `dzil authordeps --missing` + +or + + $ dzil authordeps --missing | cpanm + +They may also be additional requirements not needed by the dzil build which +are needed for tests or other development: + + $ cpan `dzil listdeps --author --missing` + +or + + $ dzil listdeps --author --missing | cpanm + +Or, you can use the 'dzil stale' command to install all requirements at once: + + $ cpan Dist::Zilla::App::Command::stale + $ cpan `dzil stale --all` + +or + + $ cpanm Dist::Zilla::App::Command::stale + $ dzil stale --all | cpanm + +You can also do this via cpanm directly: + + $ cpanm --reinstall --installdeps --with-develop --with-recommends Package::DeprecationManager + +Once installed, here are some dzil commands you might try: + + $ dzil build + $ dzil test + $ dzil test --release + $ dzil xtest + $ dzil listdeps --json + $ dzil build --notgz + +You can learn more about Dist::Zilla at http://dzil.org/. + +The code for this distribution is [hosted at GitHub](https://github.com/moose/Package-DeprecationManager). + +You can submit code changes by forking the repository, pushing your code +changes to your clone, and then submitting a pull request. Detailed +instructions for doing that is available here: + +https://help.github.com/articles/creating-a-pull-request + +If you have found a bug, but do not have an accompanying patch to fix it, you +can submit an issue report [via the web](http://rt.cpan.org/Public/Dist/Display.html?Name=Package-DeprecationManager) +or [via email](bug-package-deprecationmanager@rt.cpan.org. +This is a good place to send your questions about the usage of this distribution. + +## Travis + +All pull requests for this distribution will be automatically tested by +[Travis](https://travis-ci.org/) and the build status will be reported on the +pull request page. If your build fails, please take a look at the output. + +## Tidyall + +This distribution uses +[Code::TidyAll](https://metacpan.org/release/Code-TidyAll) to enforce a +uniform coding style. This is tested as part of the author testing suite. You +can install and run tidyall by running the following commands: + + $ cpanm Code::TidyAll + $ tidyall -a + +Please run this before committing your changes and address any issues it +brings up. + +## Contributor Names + +If you send me a patch or pull request, your name and email address will be +included in the documentation as a contributor (using the attribution on the +commit or patch), unless you specifically request for it not to be. If you +wish to be listed under a different name or address, you should submit a pull +request to the .mailmap file to contain the correct mapping. + +This file was generated via Dist::Zilla::Plugin::GenerateFile::FromShareDir 0.009 from a +template file originating in Dist-Zilla-PluginBundle-DROLSKY-0.62. diff --git a/Changes b/Changes new file mode 100644 index 0000000..768c170 --- /dev/null +++ b/Changes @@ -0,0 +1,101 @@ +0.17 2016-06-17 + +- Remove use of namespace::autoclean. + + +0.16 2016-03-21 + +- The subs installed into the caller are now named with Sub::Name. This makes + these subs appear to be part of the caller, as opposed to an import, which + is what we want, since each installed sub is constructed uniquely for a + given package. + + +0.15 2015-11-13 + +- Made this module co-operate with existing import() subs in packages that use + this module, as long as you use this module last. + + +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 diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..9fb2557 --- /dev/null +++ b/INSTALL @@ -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 it does not have permission to install modules to the current perl, cpanm +will automatically set up and install to a local::lib in your home directory. +See the local::lib documentation (https://metacpan.org/pod/local::lib) for +details on enabling it in your environment. + +## Installing with the CPAN shell + +Alternatively, if your CPAN shell is set up, you should just be able to do: + + % cpan 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 your perl is system-managed, you can create a local::lib in your home +directory to install modules to. For details, see the local::lib documentation: +https://metacpan.org/pod/local::lib + +## Documentation + +Package-DeprecationManager documentation is available as POD. +You can run perldoc from a shell to read the documentation: + + % perldoc Package::DeprecationManager diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7232f57 --- /dev/null +++ b/LICENSE @@ -0,0 +1,207 @@ +This software is Copyright (c) 2016 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..8562436 --- /dev/null +++ b/MANIFEST @@ -0,0 +1,34 @@ +# This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.005. +CONTRIBUTING.md +Changes +INSTALL +LICENSE +MANIFEST +META.json +META.yml +Makefile.PL +README.md +cpanfile +dist.ini +lib/Package/DeprecationManager.pm +perlcriticrc +perltidyrc +t/00-report-prereqs.dd +t/00-report-prereqs.t +t/basic.t +t/export.t +tidyall.ini +xt/author/00-compile.t +xt/author/eol.t +xt/author/mojibake.t +xt/author/no-tabs.t +xt/author/pod-coverage.t +xt/author/pod-no404s.t +xt/author/pod-spell.t +xt/author/pod-syntax.t +xt/author/portability.t +xt/author/test-version.t +xt/release/cpan-changes.t +xt/release/meta-json.t +xt/release/pod-linkcheck.t +xt/release/tidyall.t diff --git a/META.json b/META.json new file mode 100644 index 0000000..eab060d --- /dev/null +++ b/META.json @@ -0,0 +1,947 @@ +{ + "abstract" : "Manage deprecation warnings for your distribution", + "author" : [ + "Dave Rolsky " + ], + "dynamic_config" : 0, + "generated_by" : "Dist::Zilla version 6.005, CPAN::Meta::Converter version 2.150005", + "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::Plugin::Test::Vars" : "0.02", + "File::Spec" : "0", + "IO::Handle" : "0", + "IPC::Open3" : "0", + "Perl::Critic" : "1.126", + "Perl::Tidy" : "20160302", + "Pod::Coverage::TrustPod" : "0", + "Pod::Wordlist" : "0", + "Test::CPAN::Changes" : "0.19", + "Test::CPAN::Meta::JSON" : "0.16", + "Test::Code::TidyAll" : "0.24", + "Test::EOL" : "0", + "Test::Mojibake" : "0", + "Test::More" : "0.96", + "Test::NoTabs" : "0", + "Test::Pod" : "1.41", + "Test::Pod::Coverage" : "1.08", + "Test::Pod::LinkCheck" : "0", + "Test::Pod::No404s" : "0", + "Test::Portability::Files" : "0", + "Test::Spelling" : "0.12", + "Test::Vars" : "0.009", + "Test::Version" : "1", + "blib" : "1.01", + "perl" : "5.006" + } + }, + "runtime" : { + "requires" : { + "Carp" : "0", + "List::Util" : "1.33", + "Package::Stash" : "0", + "Params::Util" : "0", + "Sub::Install" : "0", + "Sub::Name" : "0", + "strict" : "0", + "warnings" : "0" + } + }, + "test" : { + "recommends" : { + "CPAN::Meta" : "2.120900" + }, + "requires" : { + "Exporter" : "0", + "ExtUtils::MakeMaker" : "0", + "File::Spec" : "0", + "Test::Fatal" : "0", + "Test::More" : "0.96", + "Test::Warnings" : "0" + } + } + }, + "provides" : { + "Package::DeprecationManager" : { + "file" : "lib/Package/DeprecationManager.pm", + "version" : "0.17" + } + }, + "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.17", + "x_Dist_Zilla" : { + "perl" : { + "version" : "5.024000" + }, + "plugins" : [ + { + "class" : "Dist::Zilla::Plugin::MakeMaker", + "config" : { + "Dist::Zilla::Role::TestRunner" : { + "default_jobs" : 1 + } + }, + "name" : "@DROLSKY/MakeMaker", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::Git::GatherDir", + "config" : { + "Dist::Zilla::Plugin::GatherDir" : { + "exclude_filename" : [ + "Build.PL", + "CONTRIBUTING.md", + "LICENSE", + "Makefile.PL", + "README.md", + "cpanfile", + "ppport.h" + ], + "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.039" + }, + { + "class" : "Dist::Zilla::Plugin::ManifestSkip", + "name" : "@DROLSKY/ManifestSkip", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::License", + "name" : "@DROLSKY/License", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::ExecDir", + "name" : "@DROLSKY/ExecDir", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::ShareDir", + "name" : "@DROLSKY/ShareDir", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::Manifest", + "name" : "@DROLSKY/Manifest", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::CheckVersionIncrement", + "name" : "@DROLSKY/CheckVersionIncrement", + "version" : "0.121750" + }, + { + "class" : "Dist::Zilla::Plugin::TestRelease", + "name" : "@DROLSKY/TestRelease", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::ConfirmRelease", + "name" : "@DROLSKY/ConfirmRelease", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::UploadToCPAN", + "name" : "@DROLSKY/UploadToCPAN", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::DROLSKY::VersionProvider", + "name" : "@DROLSKY/DROLSKY::VersionProvider", + "version" : "0.62" + }, + { + "class" : "Dist::Zilla::Plugin::Authority", + "name" : "@DROLSKY/Authority", + "version" : "1.009" + }, + { + "class" : "Dist::Zilla::Plugin::AutoPrereqs", + "name" : "@DROLSKY/AutoPrereqs", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::CopyFilesFromBuild", + "name" : "@DROLSKY/CopyFilesFromBuild", + "version" : "0.161350" + }, + { + "class" : "Dist::Zilla::Plugin::GitHub::Meta", + "name" : "@DROLSKY/GitHub::Meta", + "version" : "0.42" + }, + { + "class" : "Dist::Zilla::Plugin::GitHub::Update", + "config" : { + "Dist::Zilla::Plugin::GitHub::Update" : { + "metacpan" : 1 + } + }, + "name" : "@DROLSKY/GitHub::Update", + "version" : "0.42" + }, + { + "class" : "Dist::Zilla::Plugin::MetaResources", + "name" : "@DROLSKY/MetaResources", + "version" : "6.005" + }, + { + "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" : "6.005" + } + ] + }, + "Dist::Zilla::Role::MetaProvider::Provider" : { + "Dist::Zilla::Role::MetaProvider::Provider::VERSION" : "2.001011", + "inherit_missing" : "1", + "inherit_version" : "1", + "meta_noindex" : "1" + } + }, + "name" : "@DROLSKY/MetaProvides::Package", + "version" : "2.003002" + }, + { + "class" : "Dist::Zilla::Plugin::MetaYAML", + "name" : "@DROLSKY/MetaYAML", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::Meta::Contributors", + "name" : "@DROLSKY/Meta::Contributors", + "version" : "0.003" + }, + { + "class" : "Dist::Zilla::Plugin::MetaConfig", + "name" : "@DROLSKY/MetaConfig", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::MetaJSON", + "name" : "@DROLSKY/MetaJSON", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::NextRelease", + "name" : "@DROLSKY/NextRelease", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::Prereqs", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "test", + "type" : "requires" + } + }, + "name" : "@DROLSKY/Test::More with subtest", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::Prereqs", + "config" : { + "Dist::Zilla::Plugin::Prereqs" : { + "phase" : "develop", + "type" : "requires" + } + }, + "name" : "@DROLSKY/Modules for use with tidyall", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::PromptIfStale", + "config" : { + "Dist::Zilla::Plugin::PromptIfStale" : { + "check_all_plugins" : 0, + "check_all_prereqs" : 0, + "modules" : [ + "Dist::Zilla::PluginBundle::DROLSKY" + ], + "phase" : "build", + "run_under_travis" : 0, + "skip" : [] + } + }, + "name" : "@DROLSKY/Dist::Zilla::PluginBundle::DROLSKY", + "version" : "0.051" + }, + { + "class" : "Dist::Zilla::Plugin::PromptIfStale", + "config" : { + "Dist::Zilla::Plugin::PromptIfStale" : { + "check_all_plugins" : 1, + "check_all_prereqs" : 1, + "modules" : [], + "phase" : "release", + "run_under_travis" : 0, + "skip" : [ + "Dist::Zilla::Plugin::DROLSKY::CheckChangesHasContent", + "Dist::Zilla::Plugin::DROLSKY::Contributors", + "Dist::Zilla::Plugin::DROLSKY::Git::CheckFor::CorrectBranch", + "Dist::Zilla::Plugin::DROLSKY::License", + "Dist::Zilla::Plugin::DROLSKY::TidyAll", + "Dist::Zilla::Plugin::DROLSKY::VersionProvider", + "Pod::Weaver::PluginBundle::DROLSKY" + ] + } + }, + "name" : "@DROLSKY/PromptIfStale", + "version" : "0.051" + }, + { + "class" : "Dist::Zilla::Plugin::Test::Pod::Coverage::Configurable", + "name" : "@DROLSKY/Test::Pod::Coverage::Configurable", + "version" : "0.06" + }, + { + "class" : "Dist::Zilla::Plugin::Test::PodSpelling", + "config" : { + "Dist::Zilla::Plugin::Test::PodSpelling" : { + "directories" : [], + "spell_cmd" : "", + "stopwords" : [ + "DROLSKY", + "DROLSKY's", + "Goro", + "PayPal", + "Rolsky", + "Rolsky's", + "deprecations", + "drolsky" + ], + "wordlist" : "Pod::Wordlist" + } + }, + "name" : "@DROLSKY/Test::PodSpelling", + "version" : "2.007002" + }, + { + "class" : "Dist::Zilla::Plugin::PodSyntaxTests", + "name" : "@DROLSKY/PodSyntaxTests", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::Test::Pod::LinkCheck", + "name" : "@DROLSKY/Test::Pod::LinkCheck", + "version" : "1.002" + }, + { + "class" : "Dist::Zilla::Plugin::Test::Pod::No404s", + "name" : "@DROLSKY/Test::Pod::No404s", + "version" : "1.003" + }, + { + "class" : "Dist::Zilla::Plugin::RunExtraTests", + "config" : { + "Dist::Zilla::Role::TestRunner" : { + "default_jobs" : 1 + } + }, + "name" : "@DROLSKY/RunExtraTests", + "version" : "0.029" + }, + { + "class" : "Dist::Zilla::Plugin::MojibakeTests", + "name" : "@DROLSKY/MojibakeTests", + "version" : "0.8" + }, + { + "class" : "Dist::Zilla::Plugin::Test::CPAN::Changes", + "config" : { + "Dist::Zilla::Plugin::Test::CPAN::Changes" : { + "changelog" : "Changes" + } + }, + "name" : "@DROLSKY/Test::CPAN::Changes", + "version" : "0.012" + }, + { + "class" : "Dist::Zilla::Plugin::Test::CPAN::Meta::JSON", + "name" : "@DROLSKY/Test::CPAN::Meta::JSON", + "version" : "0.004" + }, + { + "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.18" + }, + { + "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.15" + }, + { + "class" : "Dist::Zilla::Plugin::Test::Portability", + "name" : "@DROLSKY/Test::Portability", + "version" : "2.000007" + }, + { + "class" : "Dist::Zilla::Plugin::Test::TidyAll", + "name" : "@DROLSKY/Test::TidyAll", + "version" : "0.03" + }, + { + "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" : "xt/author/00-compile.t", + "module_finder" : [ + ":InstallModules" + ], + "needs_display" : 0, + "phase" : "develop", + "script_finder" : [ + ":PerlExecFiles" + ], + "skips" : [] + } + }, + "name" : "@DROLSKY/Test::Compile", + "version" : "2.054" + }, + { + "class" : "Dist::Zilla::Plugin::Test::ReportPrereqs", + "name" : "@DROLSKY/Test::ReportPrereqs", + "version" : "0.025" + }, + { + "class" : "Dist::Zilla::Plugin::Test::Version", + "name" : "@DROLSKY/Test::Version", + "version" : "1.09" + }, + { + "class" : "Dist::Zilla::Plugin::DROLSKY::Contributors", + "name" : "@DROLSKY/DROLSKY::Contributors", + "version" : "0.62" + }, + { + "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.023" + }, + { + "class" : "Dist::Zilla::Plugin::SurgicalPodWeaver", + "config" : { + "Dist::Zilla::Plugin::PodWeaver" : { + "config_plugins" : [ + "@DROLSKY" + ], + "finder" : [ + ":InstallModules", + ":ExecFiles" + ], + "plugins" : [ + { + "class" : "Pod::Weaver::Plugin::EnsurePod5", + "name" : "@CorePrep/EnsurePod5", + "version" : "4.013" + }, + { + "class" : "Pod::Weaver::Plugin::H1Nester", + "name" : "@CorePrep/H1Nester", + "version" : "4.013" + }, + { + "class" : "Pod::Weaver::Plugin::SingleEncoding", + "name" : "@DROLSKY/SingleEncoding", + "version" : "4.013" + }, + { + "class" : "Pod::Weaver::Plugin::Transformer", + "name" : "@DROLSKY/List", + "version" : "4.013" + }, + { + "class" : "Pod::Weaver::Plugin::Transformer", + "name" : "@DROLSKY/Verbatim", + "version" : "4.013" + }, + { + "class" : "Pod::Weaver::Section::Region", + "name" : "@DROLSKY/header", + "version" : "4.013" + }, + { + "class" : "Pod::Weaver::Section::Name", + "name" : "@DROLSKY/Name", + "version" : "4.013" + }, + { + "class" : "Pod::Weaver::Section::Version", + "name" : "@DROLSKY/Version", + "version" : "4.013" + }, + { + "class" : "Pod::Weaver::Section::Region", + "name" : "@DROLSKY/prelude", + "version" : "4.013" + }, + { + "class" : "Pod::Weaver::Section::Generic", + "name" : "SYNOPSIS", + "version" : "4.013" + }, + { + "class" : "Pod::Weaver::Section::Generic", + "name" : "DESCRIPTION", + "version" : "4.013" + }, + { + "class" : "Pod::Weaver::Section::Generic", + "name" : "OVERVIEW", + "version" : "4.013" + }, + { + "class" : "Pod::Weaver::Section::Collect", + "name" : "ATTRIBUTES", + "version" : "4.013" + }, + { + "class" : "Pod::Weaver::Section::Collect", + "name" : "METHODS", + "version" : "4.013" + }, + { + "class" : "Pod::Weaver::Section::Collect", + "name" : "FUNCTIONS", + "version" : "4.013" + }, + { + "class" : "Pod::Weaver::Section::Collect", + "name" : "TYPES", + "version" : "4.013" + }, + { + "class" : "Pod::Weaver::Section::Leftovers", + "name" : "@DROLSKY/Leftovers", + "version" : "4.013" + }, + { + "class" : "Pod::Weaver::Section::Region", + "name" : "@DROLSKY/postlude", + "version" : "4.013" + }, + { + "class" : "Pod::Weaver::Section::GenerateSection", + "name" : "@DROLSKY/generate SUPPORT", + "version" : "1.01" + }, + { + "class" : "Pod::Weaver::Section::AllowOverride", + "name" : "@DROLSKY/allow override SUPPORT", + "version" : "0.05" + }, + { + "class" : "Pod::Weaver::Section::GenerateSection", + "name" : "@DROLSKY/generate DONATIONS", + "version" : "1.01" + }, + { + "class" : "Pod::Weaver::Section::Authors", + "name" : "@DROLSKY/Authors", + "version" : "4.013" + }, + { + "class" : "Pod::Weaver::Section::Contributors", + "name" : "@DROLSKY/Contributors", + "version" : "0.009" + }, + { + "class" : "Pod::Weaver::Section::Legal", + "name" : "@DROLSKY/Legal", + "version" : "4.013" + }, + { + "class" : "Pod::Weaver::Section::Region", + "name" : "@DROLSKY/footer", + "version" : "4.013" + } + ] + } + }, + "name" : "@DROLSKY/SurgicalPodWeaver", + "version" : "0.0023" + }, + { + "class" : "Dist::Zilla::Plugin::ReadmeAnyFromPod", + "config" : { + "Dist::Zilla::Role::FileWatcher" : { + "version" : "0.006" + } + }, + "name" : "@DROLSKY/README.md in build", + "version" : "0.161170" + }, + { + "class" : "Dist::Zilla::Plugin::GenerateFile::FromShareDir", + "config" : { + "Dist::Zilla::Plugin::GenerateFile::FromShareDir" : { + "destination_filename" : "CONTRIBUTING.md", + "dist" : "Dist-Zilla-PluginBundle-DROLSKY", + "encoding" : "UTF-8", + "has_xs" : "0", + "location" : "build", + "source_filename" : "CONTRIBUTING.md" + }, + "Dist::Zilla::Role::RepoFileInjector" : { + "allow_overwrite" : 1, + "repo_root" : ".", + "version" : "0.006" + } + }, + "name" : "@DROLSKY/generate CONTRIBUTING", + "version" : "0.009" + }, + { + "class" : "Dist::Zilla::Plugin::InstallGuide", + "name" : "@DROLSKY/InstallGuide", + "version" : "1.200007" + }, + { + "class" : "Dist::Zilla::Plugin::CPANFile", + "name" : "@DROLSKY/CPANFile", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::DROLSKY::License", + "name" : "@DROLSKY/DROLSKY::License", + "version" : "0.62" + }, + { + "class" : "Dist::Zilla::Plugin::CheckPrereqsIndexed", + "name" : "@DROLSKY/CheckPrereqsIndexed", + "version" : "0.018" + }, + { + "class" : "Dist::Zilla::Plugin::DROLSKY::CheckChangesHasContent", + "name" : "@DROLSKY/DROLSKY::CheckChangesHasContent", + "version" : "0.62" + }, + { + "class" : "Dist::Zilla::Plugin::DROLSKY::Git::CheckFor::CorrectBranch", + "config" : { + "Dist::Zilla::Role::Git::Repo" : { + "repo_root" : "." + } + }, + "name" : "@DROLSKY/DROLSKY::Git::CheckFor::CorrectBranch", + "version" : "0.62" + }, + { + "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::DROLSKY::TidyAll", + "name" : "@DROLSKY/DROLSKY::TidyAll", + "version" : "0.62" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Check", + "config" : { + "Dist::Zilla::Plugin::Git::Check" : { + "untracked_files" : "die" + }, + "Dist::Zilla::Role::Git::DirtyFiles" : { + "allow_dirty" : [ + "Build.PL", + "CONTRIBUTING.md", + "Changes", + "LICENSE", + "Makefile.PL", + "README.md", + "cpanfile", + "ppport.h", + "tidyall.ini" + ], + "allow_dirty_match" : [], + "changelog" : "Changes" + }, + "Dist::Zilla::Role::Git::Repo" : { + "repo_root" : "." + } + }, + "name" : "@DROLSKY/Git::Check", + "version" : "2.039" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Commit", + "config" : { + "Dist::Zilla::Plugin::Git::Commit" : { + "add_files_in" : [], + "commit_msg" : "v%v%n%n%c" + }, + "Dist::Zilla::Role::Git::DirtyFiles" : { + "allow_dirty" : [ + "Build.PL", + "CONTRIBUTING.md", + "Changes", + "LICENSE", + "Makefile.PL", + "README.md", + "cpanfile", + "ppport.h", + "tidyall.ini" + ], + "allow_dirty_match" : [], + "changelog" : "Changes" + }, + "Dist::Zilla::Role::Git::Repo" : { + "repo_root" : "." + }, + "Dist::Zilla::Role::Git::StringFormatter" : { + "time_zone" : "local" + } + }, + "name" : "@DROLSKY/commit generated files", + "version" : "2.039" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Tag", + "config" : { + "Dist::Zilla::Plugin::Git::Tag" : { + "branch" : null, + "changelog" : "Changes", + "signed" : 0, + "tag" : "v0.17", + "tag_format" : "v%v", + "tag_message" : "v%v" + }, + "Dist::Zilla::Role::Git::Repo" : { + "repo_root" : "." + }, + "Dist::Zilla::Role::Git::StringFormatter" : { + "time_zone" : "local" + } + }, + "name" : "@DROLSKY/Git::Tag", + "version" : "2.039" + }, + { + "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.039" + }, + { + "class" : "Dist::Zilla::Plugin::BumpVersionAfterRelease", + "config" : { + "Dist::Zilla::Plugin::BumpVersionAfterRelease" : { + "finders" : [ + ":ExecFiles", + ":InstallModules" + ], + "global" : 0, + "munge_makefile_pl" : 1 + } + }, + "name" : "@DROLSKY/BumpVersionAfterRelease", + "version" : "0.015" + }, + { + "class" : "Dist::Zilla::Plugin::Git::Commit", + "config" : { + "Dist::Zilla::Plugin::Git::Commit" : { + "add_files_in" : [], + "commit_msg" : "Bump version after release" + }, + "Dist::Zilla::Role::Git::DirtyFiles" : { + "allow_dirty" : [ + "Changes", + "dist.ini" + ], + "allow_dirty_match" : [ + "(?^:.+)" + ], + "changelog" : "Changes" + }, + "Dist::Zilla::Role::Git::Repo" : { + "repo_root" : "." + }, + "Dist::Zilla::Role::Git::StringFormatter" : { + "time_zone" : "local" + } + }, + "name" : "@DROLSKY/commit version bump", + "version" : "2.039" + }, + { + "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.039" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":InstallModules", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":IncModules", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":TestFiles", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ExtraTestFiles", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ExecFiles", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":PerlExecFiles", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":ShareFiles", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":MainModule", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":AllFiles", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : ":NoFiles", + "version" : "6.005" + }, + { + "class" : "Dist::Zilla::Plugin::FinderCode", + "name" : "@DROLSKY/MetaProvides::Package/AUTOVIV/:InstallModulesPM", + "version" : "6.005" + } + ], + "zilla" : { + "class" : "Dist::Zilla::Dist::Builder", + "config" : { + "is_trial" : "0" + }, + "version" : "6.005" + } + }, + "x_authority" : "cpan:DROLSKY", + "x_contributors" : [ + "Jesse Luehrs ", + "Karen Etheridge ", + "Tomas Doran " + ] +} + diff --git a/META.yml b/META.yml new file mode 100644 index 0000000..f30cbc1 --- /dev/null +++ b/META.yml @@ -0,0 +1,691 @@ +--- +abstract: 'Manage deprecation warnings for your distribution' +author: + - 'Dave Rolsky ' +build_requires: + Exporter: '0' + ExtUtils::MakeMaker: '0' + File::Spec: '0' + Test::Fatal: '0' + Test::More: '0.96' + Test::Warnings: '0' +configure_requires: + ExtUtils::MakeMaker: '0' +dynamic_config: 0 +generated_by: 'Dist::Zilla version 6.005, CPAN::Meta::Converter version 2.150005' +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.17' +requires: + Carp: '0' + List::Util: '1.33' + Package::Stash: '0' + Params::Util: '0' + Sub::Install: '0' + Sub::Name: '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.17' +x_Dist_Zilla: + perl: + version: '5.024000' + plugins: + - + class: Dist::Zilla::Plugin::MakeMaker + config: + Dist::Zilla::Role::TestRunner: + default_jobs: 1 + name: '@DROLSKY/MakeMaker' + version: '6.005' + - + class: Dist::Zilla::Plugin::Git::GatherDir + config: + Dist::Zilla::Plugin::GatherDir: + exclude_filename: + - Build.PL + - CONTRIBUTING.md + - LICENSE + - Makefile.PL + - README.md + - cpanfile + - ppport.h + 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.039' + - + class: Dist::Zilla::Plugin::ManifestSkip + name: '@DROLSKY/ManifestSkip' + version: '6.005' + - + class: Dist::Zilla::Plugin::License + name: '@DROLSKY/License' + version: '6.005' + - + class: Dist::Zilla::Plugin::ExecDir + name: '@DROLSKY/ExecDir' + version: '6.005' + - + class: Dist::Zilla::Plugin::ShareDir + name: '@DROLSKY/ShareDir' + version: '6.005' + - + class: Dist::Zilla::Plugin::Manifest + name: '@DROLSKY/Manifest' + version: '6.005' + - + class: Dist::Zilla::Plugin::CheckVersionIncrement + name: '@DROLSKY/CheckVersionIncrement' + version: '0.121750' + - + class: Dist::Zilla::Plugin::TestRelease + name: '@DROLSKY/TestRelease' + version: '6.005' + - + class: Dist::Zilla::Plugin::ConfirmRelease + name: '@DROLSKY/ConfirmRelease' + version: '6.005' + - + class: Dist::Zilla::Plugin::UploadToCPAN + name: '@DROLSKY/UploadToCPAN' + version: '6.005' + - + class: Dist::Zilla::Plugin::DROLSKY::VersionProvider + name: '@DROLSKY/DROLSKY::VersionProvider' + version: '0.62' + - + class: Dist::Zilla::Plugin::Authority + name: '@DROLSKY/Authority' + version: '1.009' + - + class: Dist::Zilla::Plugin::AutoPrereqs + name: '@DROLSKY/AutoPrereqs' + version: '6.005' + - + class: Dist::Zilla::Plugin::CopyFilesFromBuild + name: '@DROLSKY/CopyFilesFromBuild' + version: '0.161350' + - + class: Dist::Zilla::Plugin::GitHub::Meta + name: '@DROLSKY/GitHub::Meta' + version: '0.42' + - + class: Dist::Zilla::Plugin::GitHub::Update + config: + Dist::Zilla::Plugin::GitHub::Update: + metacpan: 1 + name: '@DROLSKY/GitHub::Update' + version: '0.42' + - + class: Dist::Zilla::Plugin::MetaResources + name: '@DROLSKY/MetaResources' + version: '6.005' + - + 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: '6.005' + Dist::Zilla::Role::MetaProvider::Provider: + Dist::Zilla::Role::MetaProvider::Provider::VERSION: '2.001011' + inherit_missing: '1' + inherit_version: '1' + meta_noindex: '1' + name: '@DROLSKY/MetaProvides::Package' + version: '2.003002' + - + class: Dist::Zilla::Plugin::MetaYAML + name: '@DROLSKY/MetaYAML' + version: '6.005' + - + class: Dist::Zilla::Plugin::Meta::Contributors + name: '@DROLSKY/Meta::Contributors' + version: '0.003' + - + class: Dist::Zilla::Plugin::MetaConfig + name: '@DROLSKY/MetaConfig' + version: '6.005' + - + class: Dist::Zilla::Plugin::MetaJSON + name: '@DROLSKY/MetaJSON' + version: '6.005' + - + class: Dist::Zilla::Plugin::NextRelease + name: '@DROLSKY/NextRelease' + version: '6.005' + - + class: Dist::Zilla::Plugin::Prereqs + config: + Dist::Zilla::Plugin::Prereqs: + phase: test + type: requires + name: '@DROLSKY/Test::More with subtest' + version: '6.005' + - + class: Dist::Zilla::Plugin::Prereqs + config: + Dist::Zilla::Plugin::Prereqs: + phase: develop + type: requires + name: '@DROLSKY/Modules for use with tidyall' + version: '6.005' + - + class: Dist::Zilla::Plugin::PromptIfStale + config: + Dist::Zilla::Plugin::PromptIfStale: + check_all_plugins: 0 + check_all_prereqs: 0 + modules: + - Dist::Zilla::PluginBundle::DROLSKY + phase: build + run_under_travis: 0 + skip: [] + name: '@DROLSKY/Dist::Zilla::PluginBundle::DROLSKY' + version: '0.051' + - + class: Dist::Zilla::Plugin::PromptIfStale + config: + Dist::Zilla::Plugin::PromptIfStale: + check_all_plugins: 1 + check_all_prereqs: 1 + modules: [] + phase: release + run_under_travis: 0 + skip: + - Dist::Zilla::Plugin::DROLSKY::CheckChangesHasContent + - Dist::Zilla::Plugin::DROLSKY::Contributors + - Dist::Zilla::Plugin::DROLSKY::Git::CheckFor::CorrectBranch + - Dist::Zilla::Plugin::DROLSKY::License + - Dist::Zilla::Plugin::DROLSKY::TidyAll + - Dist::Zilla::Plugin::DROLSKY::VersionProvider + - Pod::Weaver::PluginBundle::DROLSKY + name: '@DROLSKY/PromptIfStale' + version: '0.051' + - + class: Dist::Zilla::Plugin::Test::Pod::Coverage::Configurable + name: '@DROLSKY/Test::Pod::Coverage::Configurable' + version: '0.06' + - + class: Dist::Zilla::Plugin::Test::PodSpelling + config: + Dist::Zilla::Plugin::Test::PodSpelling: + directories: [] + spell_cmd: '' + stopwords: + - DROLSKY + - "DROLSKY's" + - Goro + - PayPal + - Rolsky + - "Rolsky's" + - deprecations + - drolsky + wordlist: Pod::Wordlist + name: '@DROLSKY/Test::PodSpelling' + version: '2.007002' + - + class: Dist::Zilla::Plugin::PodSyntaxTests + name: '@DROLSKY/PodSyntaxTests' + version: '6.005' + - + class: Dist::Zilla::Plugin::Test::Pod::LinkCheck + name: '@DROLSKY/Test::Pod::LinkCheck' + version: '1.002' + - + class: Dist::Zilla::Plugin::Test::Pod::No404s + name: '@DROLSKY/Test::Pod::No404s' + version: '1.003' + - + class: Dist::Zilla::Plugin::RunExtraTests + config: + Dist::Zilla::Role::TestRunner: + default_jobs: 1 + name: '@DROLSKY/RunExtraTests' + version: '0.029' + - + class: Dist::Zilla::Plugin::MojibakeTests + name: '@DROLSKY/MojibakeTests' + version: '0.8' + - + class: Dist::Zilla::Plugin::Test::CPAN::Changes + config: + Dist::Zilla::Plugin::Test::CPAN::Changes: + changelog: Changes + name: '@DROLSKY/Test::CPAN::Changes' + version: '0.012' + - + class: Dist::Zilla::Plugin::Test::CPAN::Meta::JSON + name: '@DROLSKY/Test::CPAN::Meta::JSON' + version: '0.004' + - + 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.18' + - + 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.15' + - + class: Dist::Zilla::Plugin::Test::Portability + name: '@DROLSKY/Test::Portability' + version: '2.000007' + - + class: Dist::Zilla::Plugin::Test::TidyAll + name: '@DROLSKY/Test::TidyAll' + version: '0.03' + - + 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: xt/author/00-compile.t + module_finder: + - ':InstallModules' + needs_display: 0 + phase: develop + script_finder: + - ':PerlExecFiles' + skips: [] + name: '@DROLSKY/Test::Compile' + version: '2.054' + - + class: Dist::Zilla::Plugin::Test::ReportPrereqs + name: '@DROLSKY/Test::ReportPrereqs' + version: '0.025' + - + class: Dist::Zilla::Plugin::Test::Version + name: '@DROLSKY/Test::Version' + version: '1.09' + - + class: Dist::Zilla::Plugin::DROLSKY::Contributors + name: '@DROLSKY/DROLSKY::Contributors' + version: '0.62' + - + 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.023' + - + class: Dist::Zilla::Plugin::SurgicalPodWeaver + config: + Dist::Zilla::Plugin::PodWeaver: + config_plugins: + - '@DROLSKY' + finder: + - ':InstallModules' + - ':ExecFiles' + plugins: + - + class: Pod::Weaver::Plugin::EnsurePod5 + name: '@CorePrep/EnsurePod5' + version: '4.013' + - + class: Pod::Weaver::Plugin::H1Nester + name: '@CorePrep/H1Nester' + version: '4.013' + - + class: Pod::Weaver::Plugin::SingleEncoding + name: '@DROLSKY/SingleEncoding' + version: '4.013' + - + class: Pod::Weaver::Plugin::Transformer + name: '@DROLSKY/List' + version: '4.013' + - + class: Pod::Weaver::Plugin::Transformer + name: '@DROLSKY/Verbatim' + version: '4.013' + - + class: Pod::Weaver::Section::Region + name: '@DROLSKY/header' + version: '4.013' + - + class: Pod::Weaver::Section::Name + name: '@DROLSKY/Name' + version: '4.013' + - + class: Pod::Weaver::Section::Version + name: '@DROLSKY/Version' + version: '4.013' + - + class: Pod::Weaver::Section::Region + name: '@DROLSKY/prelude' + version: '4.013' + - + class: Pod::Weaver::Section::Generic + name: SYNOPSIS + version: '4.013' + - + class: Pod::Weaver::Section::Generic + name: DESCRIPTION + version: '4.013' + - + class: Pod::Weaver::Section::Generic + name: OVERVIEW + version: '4.013' + - + class: Pod::Weaver::Section::Collect + name: ATTRIBUTES + version: '4.013' + - + class: Pod::Weaver::Section::Collect + name: METHODS + version: '4.013' + - + class: Pod::Weaver::Section::Collect + name: FUNCTIONS + version: '4.013' + - + class: Pod::Weaver::Section::Collect + name: TYPES + version: '4.013' + - + class: Pod::Weaver::Section::Leftovers + name: '@DROLSKY/Leftovers' + version: '4.013' + - + class: Pod::Weaver::Section::Region + name: '@DROLSKY/postlude' + version: '4.013' + - + class: Pod::Weaver::Section::GenerateSection + name: '@DROLSKY/generate SUPPORT' + version: '1.01' + - + class: Pod::Weaver::Section::AllowOverride + name: '@DROLSKY/allow override SUPPORT' + version: '0.05' + - + class: Pod::Weaver::Section::GenerateSection + name: '@DROLSKY/generate DONATIONS' + version: '1.01' + - + class: Pod::Weaver::Section::Authors + name: '@DROLSKY/Authors' + version: '4.013' + - + class: Pod::Weaver::Section::Contributors + name: '@DROLSKY/Contributors' + version: '0.009' + - + class: Pod::Weaver::Section::Legal + name: '@DROLSKY/Legal' + version: '4.013' + - + class: Pod::Weaver::Section::Region + name: '@DROLSKY/footer' + version: '4.013' + name: '@DROLSKY/SurgicalPodWeaver' + version: '0.0023' + - + class: Dist::Zilla::Plugin::ReadmeAnyFromPod + config: + Dist::Zilla::Role::FileWatcher: + version: '0.006' + name: '@DROLSKY/README.md in build' + version: '0.161170' + - + class: Dist::Zilla::Plugin::GenerateFile::FromShareDir + config: + Dist::Zilla::Plugin::GenerateFile::FromShareDir: + destination_filename: CONTRIBUTING.md + dist: Dist-Zilla-PluginBundle-DROLSKY + encoding: UTF-8 + has_xs: '0' + location: build + source_filename: CONTRIBUTING.md + Dist::Zilla::Role::RepoFileInjector: + allow_overwrite: 1 + repo_root: . + version: '0.006' + name: '@DROLSKY/generate CONTRIBUTING' + version: '0.009' + - + class: Dist::Zilla::Plugin::InstallGuide + name: '@DROLSKY/InstallGuide' + version: '1.200007' + - + class: Dist::Zilla::Plugin::CPANFile + name: '@DROLSKY/CPANFile' + version: '6.005' + - + class: Dist::Zilla::Plugin::DROLSKY::License + name: '@DROLSKY/DROLSKY::License' + version: '0.62' + - + class: Dist::Zilla::Plugin::CheckPrereqsIndexed + name: '@DROLSKY/CheckPrereqsIndexed' + version: '0.018' + - + class: Dist::Zilla::Plugin::DROLSKY::CheckChangesHasContent + name: '@DROLSKY/DROLSKY::CheckChangesHasContent' + version: '0.62' + - + class: Dist::Zilla::Plugin::DROLSKY::Git::CheckFor::CorrectBranch + config: + Dist::Zilla::Role::Git::Repo: + repo_root: . + name: '@DROLSKY/DROLSKY::Git::CheckFor::CorrectBranch' + version: '0.62' + - + 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::DROLSKY::TidyAll + name: '@DROLSKY/DROLSKY::TidyAll' + version: '0.62' + - + class: Dist::Zilla::Plugin::Git::Check + config: + Dist::Zilla::Plugin::Git::Check: + untracked_files: die + Dist::Zilla::Role::Git::DirtyFiles: + allow_dirty: + - Build.PL + - CONTRIBUTING.md + - Changes + - LICENSE + - Makefile.PL + - README.md + - cpanfile + - ppport.h + - tidyall.ini + allow_dirty_match: [] + changelog: Changes + Dist::Zilla::Role::Git::Repo: + repo_root: . + name: '@DROLSKY/Git::Check' + version: '2.039' + - + class: Dist::Zilla::Plugin::Git::Commit + config: + Dist::Zilla::Plugin::Git::Commit: + add_files_in: [] + commit_msg: v%v%n%n%c + Dist::Zilla::Role::Git::DirtyFiles: + allow_dirty: + - Build.PL + - CONTRIBUTING.md + - Changes + - LICENSE + - Makefile.PL + - README.md + - cpanfile + - ppport.h + - tidyall.ini + allow_dirty_match: [] + changelog: Changes + Dist::Zilla::Role::Git::Repo: + repo_root: . + Dist::Zilla::Role::Git::StringFormatter: + time_zone: local + name: '@DROLSKY/commit generated files' + version: '2.039' + - + class: Dist::Zilla::Plugin::Git::Tag + config: + Dist::Zilla::Plugin::Git::Tag: + branch: ~ + changelog: Changes + signed: 0 + tag: v0.17 + tag_format: v%v + tag_message: v%v + Dist::Zilla::Role::Git::Repo: + repo_root: . + Dist::Zilla::Role::Git::StringFormatter: + time_zone: local + name: '@DROLSKY/Git::Tag' + version: '2.039' + - + 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.039' + - + class: Dist::Zilla::Plugin::BumpVersionAfterRelease + config: + Dist::Zilla::Plugin::BumpVersionAfterRelease: + finders: + - ':ExecFiles' + - ':InstallModules' + global: 0 + munge_makefile_pl: 1 + name: '@DROLSKY/BumpVersionAfterRelease' + version: '0.015' + - + class: Dist::Zilla::Plugin::Git::Commit + config: + Dist::Zilla::Plugin::Git::Commit: + add_files_in: [] + commit_msg: 'Bump version after release' + Dist::Zilla::Role::Git::DirtyFiles: + allow_dirty: + - Changes + - dist.ini + allow_dirty_match: + - (?^:.+) + changelog: Changes + Dist::Zilla::Role::Git::Repo: + repo_root: . + Dist::Zilla::Role::Git::StringFormatter: + time_zone: local + name: '@DROLSKY/commit version bump' + version: '2.039' + - + 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.039' + - + class: Dist::Zilla::Plugin::FinderCode + name: ':InstallModules' + version: '6.005' + - + class: Dist::Zilla::Plugin::FinderCode + name: ':IncModules' + version: '6.005' + - + class: Dist::Zilla::Plugin::FinderCode + name: ':TestFiles' + version: '6.005' + - + class: Dist::Zilla::Plugin::FinderCode + name: ':ExtraTestFiles' + version: '6.005' + - + class: Dist::Zilla::Plugin::FinderCode + name: ':ExecFiles' + version: '6.005' + - + class: Dist::Zilla::Plugin::FinderCode + name: ':PerlExecFiles' + version: '6.005' + - + class: Dist::Zilla::Plugin::FinderCode + name: ':ShareFiles' + version: '6.005' + - + class: Dist::Zilla::Plugin::FinderCode + name: ':MainModule' + version: '6.005' + - + class: Dist::Zilla::Plugin::FinderCode + name: ':AllFiles' + version: '6.005' + - + class: Dist::Zilla::Plugin::FinderCode + name: ':NoFiles' + version: '6.005' + - + class: Dist::Zilla::Plugin::FinderCode + name: '@DROLSKY/MetaProvides::Package/AUTOVIV/:InstallModulesPM' + version: '6.005' + zilla: + class: Dist::Zilla::Dist::Builder + config: + is_trial: '0' + version: '6.005' +x_authority: cpan:DROLSKY +x_contributors: + - 'Jesse Luehrs ' + - 'Karen Etheridge ' + - 'Tomas Doran ' diff --git a/Makefile.PL b/Makefile.PL new file mode 100644 index 0000000..e2eae85 --- /dev/null +++ b/Makefile.PL @@ -0,0 +1,70 @@ +# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v6.005. +use strict; +use warnings; + + + +use ExtUtils::MakeMaker; + +my %WriteMakefileArgs = ( + "ABSTRACT" => "Manage deprecation warnings for your distribution", + "AUTHOR" => "Dave Rolsky ", + "CONFIGURE_REQUIRES" => { + "ExtUtils::MakeMaker" => 0 + }, + "DISTNAME" => "Package-DeprecationManager", + "LICENSE" => "artistic_2", + "NAME" => "Package::DeprecationManager", + "PREREQ_PM" => { + "Carp" => 0, + "List::Util" => "1.33", + "Package::Stash" => 0, + "Params::Util" => 0, + "Sub::Install" => 0, + "Sub::Name" => 0, + "strict" => 0, + "warnings" => 0 + }, + "TEST_REQUIRES" => { + "Exporter" => 0, + "ExtUtils::MakeMaker" => 0, + "File::Spec" => 0, + "Test::Fatal" => 0, + "Test::More" => "0.96", + "Test::Warnings" => 0 + }, + "VERSION" => "0.17", + "test" => { + "TESTS" => "t/*.t" + } +); + + +my %FallbackPrereqs = ( + "Carp" => 0, + "Exporter" => 0, + "ExtUtils::MakeMaker" => 0, + "File::Spec" => 0, + "List::Util" => "1.33", + "Package::Stash" => 0, + "Params::Util" => 0, + "Sub::Install" => 0, + "Sub::Name" => 0, + "Test::Fatal" => 0, + "Test::More" => "0.96", + "Test::Warnings" => 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..76cfff9 --- /dev/null +++ b/README.md @@ -0,0 +1,183 @@ +# NAME + +Package::DeprecationManager - Manage deprecation warnings for your distribution + +# VERSION + +version 0.17 + +# 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. + +## Other import() subs + +This module works by installing an `import` sub in any package that uses +it. If that package _already_ has an `import` sub, then that `import` will +be called after any arguments passed for `Package::DeprecationManager` are +stripped out. You need to define your `import` sub before you `use +Package::DeprecationManager` to make this work: + + package HasExporter; + + use Exporter qw( import ); + + use Package::DeprecationManager -deprecations => { + 'HasExporter::foo' => '0.02', + }; + + our @EXPORT_OK = qw( some_sub another_sub ); + +# 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](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](https://metacpan.org/pod/Class::MOP::Deprecated) by Goro Fuji. + +# 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](http://rt.cpan.org). I will be notified, and then you'll automatically be +notified of progress on your bug as I make changes. + +Bugs may be submitted through [the RT bug tracker](http://rt.cpan.org/Public/Dist/Display.html?Name=Package-DeprecationManager) +(or [bug-package-deprecationmanager@rt.cpan.org](mailto:bug-package-deprecationmanager@rt.cpan.org)). + +I am also usually active on IRC as 'drolsky' on `irc://irc.perl.org`. + +# 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 (let's all have a chuckle at that together). + +To donate, log into PayPal and send money to autarch@urth.org, or use the +button at [http://www.urth.org/~autarch/fs-donation.html](http://www.urth.org/~autarch/fs-donation.html). + +# AUTHOR + +Dave Rolsky + +# CONTRIBUTORS + +- Jesse Luehrs +- Karen Etheridge +- Tomas Doran + +# COPYRIGHT AND LICENCE + +This software is Copyright (c) 2016 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..793565d --- /dev/null +++ b/cpanfile @@ -0,0 +1,53 @@ +requires "Carp" => "0"; +requires "List::Util" => "1.33"; +requires "Package::Stash" => "0"; +requires "Params::Util" => "0"; +requires "Sub::Install" => "0"; +requires "Sub::Name" => "0"; +requires "strict" => "0"; +requires "warnings" => "0"; + +on 'test' => sub { + requires "Exporter" => "0"; + requires "ExtUtils::MakeMaker" => "0"; + requires "File::Spec" => "0"; + requires "Test::Fatal" => "0"; + requires "Test::More" => "0.96"; + requires "Test::Warnings" => "0"; +}; + +on 'test' => sub { + recommends "CPAN::Meta" => "2.120900"; +}; + +on 'configure' => sub { + requires "ExtUtils::MakeMaker" => "0"; +}; + +on 'develop' => sub { + requires "Code::TidyAll::Plugin::Test::Vars" => "0.02"; + requires "File::Spec" => "0"; + requires "IO::Handle" => "0"; + requires "IPC::Open3" => "0"; + requires "Perl::Critic" => "1.126"; + requires "Perl::Tidy" => "20160302"; + requires "Pod::Coverage::TrustPod" => "0"; + requires "Pod::Wordlist" => "0"; + requires "Test::CPAN::Changes" => "0.19"; + requires "Test::CPAN::Meta::JSON" => "0.16"; + requires "Test::Code::TidyAll" => "0.24"; + requires "Test::EOL" => "0"; + requires "Test::Mojibake" => "0"; + requires "Test::More" => "0.96"; + requires "Test::NoTabs" => "0"; + requires "Test::Pod" => "1.41"; + requires "Test::Pod::Coverage" => "1.08"; + requires "Test::Pod::LinkCheck" => "0"; + requires "Test::Pod::No404s" => "0"; + requires "Test::Portability::Files" => "0"; + requires "Test::Spelling" => "0.12"; + requires "Test::Vars" => "0.009"; + requires "Test::Version" => "1"; + requires "blib" => "1.01"; + requires "perl" => "5.006"; +}; diff --git a/dist.ini b/dist.ini new file mode 100644 index 0000000..5c717db --- /dev/null +++ b/dist.ini @@ -0,0 +1,13 @@ +name = Package-DeprecationManager +author = Dave Rolsky +license = Artistic_2_0 +copyright_holder = Dave Rolsky + +[@DROLSKY] +dist = Package-DeprecationManager +stopwords = Goro +stopwords = deprecations +; We don't want to use ns::clean or autoclean in this distro, so it's easier +; to just skip this test +-remove = Test::CleanNamespaces +-remove = Test::Synopsis diff --git a/lib/Package/DeprecationManager.pm b/lib/Package/DeprecationManager.pm new file mode 100644 index 0000000..4f3cedc --- /dev/null +++ b/lib/Package/DeprecationManager.pm @@ -0,0 +1,361 @@ +package Package::DeprecationManager; + +use strict; +use warnings; + +our $VERSION = '0.17'; + +use Carp qw( croak ); +use List::Util 1.33 qw( any ); +use Package::Stash; +use Params::Util qw( _HASH0 ); +use Sub::Install; +use Sub::Name qw( subname ); + +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 $caller = caller(); + + my $orig_import = $caller->can('import'); + + my $import = _build_import( \%registry, $orig_import ); + my $warn + = _build_warn( \%registry, $args{-deprecations}, $args{-ignore} ); + + # We need to remove this to prevent a 'subroutine redefined' warning. + if ($orig_import) { + Package::Stash->new($caller)->remove_symbol('&import'); + } + + Sub::Install::install_sub( + { + code => subname( $caller . '::import', $import ), + into => $caller, + as => 'import', + } + ); + + Sub::Install::install_sub( + { + code => subname( $caller . '::deprecated', $warn ), + into => $caller, + as => 'deprecated', + } + ); + + return; +} + +sub _build_import { + my $registry = shift; + my $orig_import = shift; + + return sub { + my $class = shift; + + my @args; + + my $api_version; + ## no critic (ControlStructures::ProhibitCStyleForLoops) + for ( my $i = 0; $i < @_; $i++ ) { + if ( $_[$i] eq '-api_version' || $_[$i] eq '-compatible' ) { + $api_version = $_[ ++$i ]; + } + else { + push @args, $_[$i]; + } + } + ## use critic + + my $caller = caller(); + $registry->{$caller} = $api_version + if defined $api_version; + + if ($orig_import) { + @_ = ( $class, @args ); + goto &{$orig_import}; + } + + 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 + +=encoding UTF-8 + +=head1 NAME + +Package::DeprecationManager - Manage deprecation warnings for your distribution + +=head1 VERSION + +version 0.17 + +=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, 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). 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 will export two +subroutines into its caller. It provides an C sub for the caller and a +C sub. + +The C sub allows callers of I 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 sub in each deprecated subroutine. When +called, it will issue a warning using C. + +The C 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 and C. The C argument should correspond +to the feature name passed in the C<-deprecations> hash. + +If you don't explicitly specify a feature, the C sub uses +C 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 the error message +itself. This means that if you provide several different error messages for +the same feature, all of those errors will appear. + +=head2 Other import() subs + +This module works by installing an C sub in any package that uses +it. If that package I has an C sub, then that C will +be called after any arguments passed for C are +stripped out. You need to define your C sub before you C to make this work: + + package HasExporter; + + use Exporter qw( import ); + + use Package::DeprecationManager -deprecations => { + 'HasExporter::foo' => '0.02', + }; + + our @EXPORT_OK = qw( some_sub another_sub ); + +=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 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 + +=head1 CREDITS + +The idea for this functionality and some of its implementation was originally +created as L by Goro Fuji. + +=head1 BUGS + +Please report any bugs or feature requests to +C, or through the web interface at +L. I will be notified, and then you'll automatically be +notified of progress on your bug as I make changes. + +Bugs may be submitted through L +(or L). + +I am also usually active on IRC as 'drolsky' on C. + +=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 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 (let's all have a chuckle at that together). + +To donate, log into PayPal and send money to autarch@urth.org, or use the +button at L. + +=head1 AUTHOR + +Dave Rolsky + +=head1 CONTRIBUTORS + +=for stopwords Jesse Luehrs Karen Etheridge Tomas Doran + +=over 4 + +=item * + +Jesse Luehrs + +=item * + +Karen Etheridge + +=item * + +Tomas Doran + +=back + +=head1 COPYRIGHT AND LICENCE + +This software is Copyright (c) 2016 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..1abe358 --- /dev/null +++ b/perlcriticrc @@ -0,0 +1,67 @@ +severity = 3 +verbose = 11 +theme = core + pbp + bugs + maintenance + cosmetic + complexity + security + tests + moose +program-extensions = pl psgi t + +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] + +# This incorrectly thinks signatures are prototypes. +[-Subroutines::ProhibitSubroutinePrototypes] + +[-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] + +# Explicitly returning undef is a _good_ thing in many cases, since it +# prevents very common errors when using a sub in list context to construct a +# hash and ending up with a missing value or key. +[-Subroutines::ProhibitExplicitReturnUndef] 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-report-prereqs.dd b/t/00-report-prereqs.dd new file mode 100644 index 0000000..724f6f7 --- /dev/null +++ b/t/00-report-prereqs.dd @@ -0,0 +1,63 @@ +do { my $x = { + 'configure' => { + 'requires' => { + 'ExtUtils::MakeMaker' => '0' + } + }, + 'develop' => { + 'requires' => { + 'Code::TidyAll::Plugin::Test::Vars' => '0.02', + 'File::Spec' => '0', + 'IO::Handle' => '0', + 'IPC::Open3' => '0', + 'Perl::Critic' => '1.126', + 'Perl::Tidy' => '20160302', + 'Pod::Coverage::TrustPod' => '0', + 'Pod::Wordlist' => '0', + 'Test::CPAN::Changes' => '0.19', + 'Test::CPAN::Meta::JSON' => '0.16', + 'Test::Code::TidyAll' => '0.24', + 'Test::EOL' => '0', + 'Test::Mojibake' => '0', + 'Test::More' => '0.96', + 'Test::NoTabs' => '0', + 'Test::Pod' => '1.41', + 'Test::Pod::Coverage' => '1.08', + 'Test::Pod::LinkCheck' => '0', + 'Test::Pod::No404s' => '0', + 'Test::Portability::Files' => '0', + 'Test::Spelling' => '0.12', + 'Test::Vars' => '0.009', + 'Test::Version' => '1', + 'blib' => '1.01', + 'perl' => '5.006' + } + }, + 'runtime' => { + 'requires' => { + 'Carp' => '0', + 'List::Util' => '1.33', + 'Package::Stash' => '0', + 'Params::Util' => '0', + 'Sub::Install' => '0', + 'Sub::Name' => '0', + 'strict' => '0', + 'warnings' => '0' + } + }, + 'test' => { + 'recommends' => { + 'CPAN::Meta' => '2.120900' + }, + 'requires' => { + 'Exporter' => '0', + 'ExtUtils::MakeMaker' => '0', + 'File::Spec' => '0', + 'Test::Fatal' => '0', + 'Test::More' => '0.96', + 'Test::Warnings' => '0' + } + } + }; + $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..e338372 --- /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.025 + +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 + && (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/basic.t b/t/basic.t new file mode 100644 index 0000000..8963809 --- /dev/null +++ b/t/basic.t @@ -0,0 +1,275 @@ +use strict; +use warnings; + +use Test::More 0.88; +use Test::Fatal; +use Test::Warnings qw( warning warnings ); + +{ + ## 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(); + + ::like( + ::warning { Foo::foo() }, + qr/\Qfoo is deprecated/, + 'deprecation warning for foo' + ); + + ::like( + ::warning { Foo::bar() }, + qr/\Qbar is deprecated/, + 'deprecation warning for bar' + ); + + ::like( + ::warning { Foo::baz() }, + qr/\QFoo::baz has been deprecated since version 1.21/, + 'deprecation warning for baz, and message is generated by Package::DeprecationManager' + ); + + ::is_deeply( + [ ::warnings { Foo::foo() } ], + [], + 'no warning on second call to foo' + ); + + ::is_deeply( + [ ::warnings { Foo::bar() } ], + [], + 'no warning on second call to bar' + ); + + ::is_deeply( + [ ::warnings { Foo::baz() } ], + [], + 'no warning on second call to baz' + ); + + ::like( + ::warning { Foo::varies(1) }, + qr/\QThe varies sub varies: 1/, + 'warning for varies sub' + ); + + ::like( + ::warning { Foo::varies(2) }, + qr/\QThe varies sub varies: 2/, + 'warning for varies sub with different error' + ); + + ::is_deeply( + [ ::warnings { Foo::varies(1) } ], + [], + 'no warning for varies sub with same message as first call' + ); +} + +{ + package Baz; + + Foo->import( -api_version => '0.01' ); + + ::is_deeply( + [ ::warnings { Foo::foo() } ], + [], + 'no warning for foo with api_version = 0.01' + ); + + ::is_deeply( + [ ::warnings { Foo::bar() } ], + [], + 'no warning for bar with api_version = 0.01' + ); + + ::is_deeply( + [ ::warnings { Foo::baz() } ], + [], + 'no warning for baz with api_version = 0.01' + ); +} + +{ + package Quux; + + Foo->import( -api_version => '1.17' ); + + ::like( + ::warning { Foo::foo() }, + qr/\Qfoo is deprecated/, + 'deprecation warning for foo with api_version = 1.17' + ); + + ::like( + ::warning { Foo::bar() }, + qr/\Qbar is deprecated/, + 'deprecation warning for bar with api_version = 1.17' + ); + + ::is_deeply( + [ ::warnings { Foo::baz() } ], + [], + 'no warning for baz with api_version = 1.17' + ); +} + +{ + package Another; + + Foo->import(); + + ::is_deeply( + [ ::warnings { Foo::quux(1) } ], + [], + 'no warning for quux(1)' + ); + + ::like( + ::warning { 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; + + ::like( + ::warning { 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]' + ); + + ::is_deeply( + [ ::warnings { My::Package2::foo() } ], + [], + 'no deprecation warning for second call to My::Package2::foo()' + ); + + ::is_deeply( + [ ::warnings { My::Package1::foo() } ], + [], + 'no deprecation warning for call to My::Package1::foo()' + ); + + ::like( + ::warning { 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]' + ); + + ::is_deeply( + [ ::warnings { My::Package2::bar() } ], + [], + 'no deprecation warning for second call to My::Package2::bar()' + ); +} + +{ + package My::Quux; + + ::like( + ::warning { 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]' + ); + + ::is_deeply( + [ ::warnings { My::Package1::foo() } ], + [], + 'no deprecation warning for second call to My::Package1::foo()' + ); +} + +done_testing(); diff --git a/t/export.t b/t/export.t new file mode 100644 index 0000000..2118706 --- /dev/null +++ b/t/export.t @@ -0,0 +1,49 @@ +use strict; +use warnings; + +use Test::More 0.88; +use Test::Warnings qw( warnings ); + +## no critic (Modules::ProhibitMultiplePackages) + +{ + package Foo; + + our $VERSION = '0.03'; + + use Exporter qw( import ); + + our @EXPORT_OK = qw( exported ); + + use Package::DeprecationManager -deprecations => { + 'Foo::foo' => '0.02', + }; + + sub foo { + deprecated(); + } + + sub exported { + return 'exported'; + } +} + +{ + package Bar; + + Foo->import( 'exported', -api_version => '0.01' ); + + ::is_deeply( + [ ::warnings { Foo::foo() } ], + [], + 'no warning for foo with api_version = 0.01' + ); + + ::is( + exported(), + 'exported', + 'sub exported by Foo was imported and work as expected' + ); +} + +done_testing(); diff --git a/tidyall.ini b/tidyall.ini new file mode 100644 index 0000000..b601f8b --- /dev/null +++ b/tidyall.ini @@ -0,0 +1,31 @@ +[PerlCritic] +select = **/*.{pl,pm,t,psgi} +ignore = .build/**/* +ignore = Package-DeprecationManager-*/**/* +ignore = blib/**/* +ignore = t/00-* +ignore = t/author-* +ignore = t/release-* +ignore = xt/**/* +argv = --profile=$ROOT/perlcriticrc + +[PerlTidy] +select = **/*.{pl,pm,t,psgi} +ignore = .build/**/* +ignore = Package-DeprecationManager-*/**/* +ignore = blib/**/* +ignore = t/00-* +ignore = t/author-* +ignore = t/release-* +ignore = xt/**/* +argv = --profile=$ROOT/perltidyrc + +[Test::Vars] +select = **/*.pm +ignore = .build/**/* +ignore = Package-DeprecationManager-*/**/* +ignore = blib/**/* +ignore = t/00-* +ignore = t/author-* +ignore = t/release-* +ignore = xt/**/* diff --git a/xt/author/00-compile.t b/xt/author/00-compile.t new file mode 100644 index 0000000..811e5ca --- /dev/null +++ b/xt/author/00-compile.t @@ -0,0 +1,54 @@ +use 5.006; +use strict; +use warnings; + +# this test was generated with Dist::Zilla::Plugin::Test::Compile 2.054 + +use Test::More; + +plan tests => 2; + +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 + 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"); + + shift @_warnings if @_warnings and $_warnings[0] =~ /^Using .*\bblib/ + and not eval { require blib; blib->VERSION('1.01') }; + + if (@_warnings) + { + warn @_warnings; + push @warnings, @_warnings; + } +} + + + +is(scalar(@warnings), 0, 'no warnings found') + or diag 'got warnings: ', ( Test::More->can('explain') ? Test::More::explain(\@warnings) : join("\n", '', @warnings) ); + + diff --git a/xt/author/eol.t b/xt/author/eol.t new file mode 100644 index 0000000..c74672a --- /dev/null +++ b/xt/author/eol.t @@ -0,0 +1,18 @@ +use strict; +use warnings; + +# this test was generated with Dist::Zilla::Plugin::Test::EOL 0.18 + +use Test::More 0.88; +use Test::EOL; + +my @files = ( + 'lib/Package/DeprecationManager.pm', + 't/00-report-prereqs.dd', + 't/00-report-prereqs.t', + 't/basic.t', + 't/export.t' +); + +eol_unix_ok($_, { trailing_whitespace => 1 }) foreach @files; +done_testing; diff --git a/xt/author/mojibake.t b/xt/author/mojibake.t new file mode 100644 index 0000000..5ef161e --- /dev/null +++ b/xt/author/mojibake.t @@ -0,0 +1,9 @@ +#!perl + +use strict; +use warnings qw(all); + +use Test::More; +use Test::Mojibake; + +all_files_encoding_ok(); diff --git a/xt/author/no-tabs.t b/xt/author/no-tabs.t new file mode 100644 index 0000000..6046d40 --- /dev/null +++ b/xt/author/no-tabs.t @@ -0,0 +1,18 @@ +use strict; +use warnings; + +# this test was generated with Dist::Zilla::Plugin::Test::NoTabs 0.15 + +use Test::More 0.88; +use Test::NoTabs; + +my @files = ( + 'lib/Package/DeprecationManager.pm', + 't/00-report-prereqs.dd', + 't/00-report-prereqs.t', + 't/basic.t', + 't/export.t' +); + +notabs_ok($_) foreach @files; +done_testing; diff --git a/xt/author/pod-coverage.t b/xt/author/pod-coverage.t new file mode 100644 index 0000000..f9ff28d --- /dev/null +++ b/xt/author/pod-coverage.t @@ -0,0 +1,44 @@ +#!perl +# 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/xt/author/pod-no404s.t b/xt/author/pod-no404s.t new file mode 100644 index 0000000..eb9760c --- /dev/null +++ b/xt/author/pod-no404s.t @@ -0,0 +1,21 @@ +#!perl + +use strict; +use warnings; +use Test::More; + +foreach my $env_skip ( qw( + SKIP_POD_NO404S + AUTOMATED_TESTING +) ){ + plan skip_all => "\$ENV{$env_skip} is set, skipping" + if $ENV{$env_skip}; +} + +eval "use Test::Pod::No404s"; +if ( $@ ) { + plan skip_all => 'Test::Pod::No404s required for testing POD'; +} +else { + all_pod_files_ok(); +} diff --git a/xt/author/pod-spell.t b/xt/author/pod-spell.t new file mode 100644 index 0000000..0148738 --- /dev/null +++ b/xt/author/pod-spell.t @@ -0,0 +1,34 @@ +use strict; +use warnings; +use Test::More; + +# generated by Dist::Zilla::Plugin::Test::PodSpelling 2.007002 +use Test::Spelling 0.12; +use Pod::Wordlist; + + +add_stopwords(); +all_pod_files_spelling_ok( qw( bin lib ) ); +__DATA__ +drolsky +DROLSKY +DROLSKY's +PayPal +Rolsky +Rolsky's +Goro +deprecations +Dave +autarch +Jesse +Luehrs +doy +Karen +Etheridge +ether +Tomas +Doran +bobtfish +lib +Package +DeprecationManager diff --git a/xt/author/pod-syntax.t b/xt/author/pod-syntax.t new file mode 100644 index 0000000..e563e5d --- /dev/null +++ b/xt/author/pod-syntax.t @@ -0,0 +1,7 @@ +#!perl +# This file was automatically generated by Dist::Zilla::Plugin::PodSyntaxTests. +use strict; use warnings; +use Test::More; +use Test::Pod 1.41; + +all_pod_files_ok(); diff --git a/xt/author/portability.t b/xt/author/portability.t new file mode 100644 index 0000000..bb53c7b --- /dev/null +++ b/xt/author/portability.t @@ -0,0 +1,12 @@ +#!perl + +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/xt/author/test-version.t b/xt/author/test-version.t new file mode 100644 index 0000000..b47210e --- /dev/null +++ b/xt/author/test-version.t @@ -0,0 +1,23 @@ +use strict; +use warnings; +use Test::More; + +# generated by Dist::Zilla::Plugin::Test::Version 1.09 +use Test::Version; + +my @imports = qw( version_all_ok ); + +my $params = { + is_strict => 1, + has_version => 1, + multiple => 0, + +}; + +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/xt/release/cpan-changes.t b/xt/release/cpan-changes.t new file mode 100644 index 0000000..286005a --- /dev/null +++ b/xt/release/cpan-changes.t @@ -0,0 +1,10 @@ +use strict; +use warnings; + +# this test was generated with Dist::Zilla::Plugin::Test::CPAN::Changes 0.012 + +use Test::More 0.96 tests => 1; +use Test::CPAN::Changes; +subtest 'changes_ok' => sub { + changes_file_ok('Changes'); +}; diff --git a/xt/release/meta-json.t b/xt/release/meta-json.t new file mode 100644 index 0000000..5ddad73 --- /dev/null +++ b/xt/release/meta-json.t @@ -0,0 +1,4 @@ +#!perl + +use Test::CPAN::Meta::JSON; +meta_json_ok(); diff --git a/xt/release/pod-linkcheck.t b/xt/release/pod-linkcheck.t new file mode 100644 index 0000000..00602db --- /dev/null +++ b/xt/release/pod-linkcheck.t @@ -0,0 +1,20 @@ +#!perl + +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/xt/release/tidyall.t b/xt/release/tidyall.t new file mode 100644 index 0000000..87bc5fd --- /dev/null +++ b/xt/release/tidyall.t @@ -0,0 +1,15 @@ +# This file was automatically generated by Dist::Zilla::Plugin::Test::TidyAll v$VERSION + +use Test::More 0.88; +BEGIN { + if ( $] < 5.010 ) { + plan skip_all => 'This test requires Perl version 5.010'; + } +} +use Test::Code::TidyAll 0.24; + +tidyall_ok( + verbose => ( exists $ENV{TEST_TIDYALL_VERBOSE} ? $ENV{TEST_TIDYALL_VERBOSE} : 1 ), +); + +done_testing();