Pod-Weaver-4.015000755000767000024 013000276322 12715 5ustar00rjbsstaff000000000000README100644000767000024 57613000276322 13646 0ustar00rjbsstaff000000000000Pod-Weaver-4.015 This archive contains the distribution Pod-Weaver, version 4.015: weave together a Pod document from an outline This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. This README file was generated by Dist::Zilla::Plugin::Readme v6.008. Changes100644000767000024 1542113000276322 14314 0ustar00rjbsstaff000000000000Pod-Weaver-4.015Revision history for Pod-Weaver 4.015 2016-10-14 20:48:13-04:00 America/New_York - fix bugs introduced in 4.014 that would cause [Bugs] and [Legal] to run even when they should've skipped 4.014 2016-09-18 22:25:51-04:00 America/New_York - make links in [Bugs] use L<> (thanks, David Zurborg!) - added debug level logging to the weaver, plugins, and section. GitHub #42. (thanks, Dave Rolsky) 4.013 2016-04-24 23:19:14+01:00 Europe/London - use text for PPI, not octet 4.012 2015-05-05 21:01:33-04:00 America/New_York - avoid breaking up words when wrapping text in [Bugs] 4.011 2015-03-17 07:48:54-04:00 America/New_York - add "header" attributes to more sections, to change the =head1 headert ext (thanks, David Wheeler) 4.010 2014-12-30 22:02:58-05:00 America/New_York - use of Moose::Autobox has been dropped (thanks Karen Etheridge!) 4.009 2014-12-02 23:00:37-05:00 America/New_York - when a Collect-worthy header exists (like =head1 METHODS) use it, rather than making a new one *and* leaving the old one around (thanks, Christian Walde) 4.008 2014-11-12 09:37:13-05:00 America/New_York - handle UTF-8 data in PODNAME and ABSTRACT (thanks, Blabos de Blebe) - Explain Section::Region naming, nonpod, and flattening (thanks, Kent Fredric) 4.007 2014-10-27 22:21:55-04:00 America/New_York - immutabilize ALL THE THINGS! 4.006 2014-01-07 20:12:37-05:00 America/New_York - update tests to pass octets to ->read_string, as is proper 4.005 2013-12-21 15:01:46-0500 America/New_York - updated tests for the new (fixed, consistent) string behavior in Mixin::Linewise 4.004 2013-11-05 21:50:13 America/New_York - allow multi-line formats for VERSION plugin (thanks, Alex Peters) - ...including the %T-prefix for lines only included in trial releases - look for PODNAME more consistently (thanks, Chris Weyl) - put license filename in F<> formatting (thanks, Alex Peters) 4.003 2013-11-02 22:58:43 America/New_York - note that [@Default] contains [-SingleEncoding] (thanks, Caleb Cushing) 4.002 2013-11-02 11:37:04 America/New_York [ THIS MIGHT BREAK YOUR CODE ] - stable release of previous v4 changes 4.001 2013-10-20 10:50:50 America/New_York (TRIAL RELEASE) [ THIS MIGHT BREAK YOUR CODE ] - SingleEncoding now accepts found =encodings as long as they match, unless the plugin's encoding attribute was set explicitly 4.000 2013-10-19 17:20:59 America/New_York (TRIAL RELEASE) [ THIS MIGHT BREAK YOUR CODE ] - the SingleEncoding plugin to force one consistent =encoding - ...is now enabled, for UTF-8, in the default configuration 3.101640 2013-09-17 08:57:41 Asia/Tokyo - fix repository links! argh, oops 3.101639 2013-09-17 08:56:05 Asia/Tokyo - documentation fix: mention that =func exists in the default configuration (thanks, Joshua Keroes!) - removed use of deprecated Class::MOP::load_class (thanks, Karen Etheridge) 3.101638 2012-08-03 20:42:44 America/New_York - add more helpful information to the "no document name" error (thanks, Leto Labs, LLC!) 3.101637 2012-06-07 22:18:55 America/New_York - add header_command attribute to the Collect section (thanks, Christopher J. Madsen) 3.101636 2012-05-04 21:28:10 America/New_York - break the content-generating code in the Version section into its own method (thanks, Chris Weyl) 3.101635 2012-02-07 22:03:26 America/New_York - restore the full-document scan for ABSTRACT if not found in a comment token (thanks, David Golden) 3.101634 2011-10-31 22:56:36 America/New_York - throw a (helpful?) exception when %m is used in a version format, but no package was found in the file - the Legal plugin can now be given the filename in which the dist's full license can be found (thanks, APOCAL!) 3.101633 2011-09-19 15:48:16 America/New_York - speed up performance by changing how we use PPI (thanks, Dave Rolsky) 3.101632 2010-10-19 07:49:32 America/New_York - add missing DateTime prereq 3.101631 2010-10-14 23:00:19 America/New_York - Name section now looks for a PODNAME comment if no package is found (hanekomu) - Added a Bugs section (thanks, David Golden) - Version, Region, and Generic are all more configurable (thanks, Apocalypse) 3.101630 2010-06-12 14:42:26 America/New_York - Author section now emits a normal para or bulleted list (Florian Ragwitz) 3.101460 2010-05-26 22:36:13 America/New_York - compat with Config::MVP::Reader v2 3.101450 2010-05-25 18:38:44 America/New_York - compat with Config::MVP::Reader v1 3.101270 2010-05-07 21:36:45 America/New_York - allow an explicit header arg to Generic 3.100710 2010-03-12 10:03:42 America/New_York - further logging improvements; now uses Log::Dispatchouli explicitly 3.100680 2010-03-09 23:38:30 America/New_York - improve logging delegation to interoperate with recent DZ changes 3.100650 2010-03-06 23:21:19 America/New_York - expect a Log::Dispatchouli-like logger - added a means to tweak the configuration loaded during new - log the file in which errors occur more often 3.100310 2010-01-31 15:32:00 America/New_York - add =func/FUNCTIONS to match =method and =attr - require newer Pod::Elemental (to avoid Moose incompat) 3.093530 2009-12-19 22:52:47 America/New_York - add the -Transformer plugin to allow pass-through for arbitrary Pod::Elemental::Transformers 3.093130 2009-11-09 - add Config::MVP::Reader::INI to prereq 3.093120 2009-11-08 - fix broken prereq (Config::MVP) 3.093001 2009-10-27 - create @Default and use it to set up the new_with_default_config 3.093000 2009-10-27 - plugins for common preparation: -H1Nester, -EnsurePod5, @CorePrep "-" as prefix now denotes a non-Section plugin - tweak weaving phases and methods to add Dialect 3.092990 2009-10-26 - Pod::Weaver::Config and tests for config-from-ini 3.092972 2009-10-24 - no code changes; Pod robuilt 3.092971 2009-10-24 - fixes to make the NAME section "just work" 3.092970 2009-10-24 - total rewrite 1.003 2008-10-?? - use $doc->serialize instead of "$doc" to work with here-docs 1.002 2008-10-13 - add missing prereq (PPI) 1.001 2008-10-12 - fix prereq for testing 1.000 2008-10-12 - first release (at the Pittsburgh Perl Workshop) LICENSE100644000767000024 4366313000276322 14037 0ustar00rjbsstaff000000000000Pod-Weaver-4.015This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. Terms of the Perl programming language system itself a) the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version, or b) the "Artistic License" --- The GNU General Public License, Version 1, February 1989 --- This software is Copyright (c) 2016 by Ricardo SIGNES. This is free software, licensed under: The GNU General Public License, Version 1, February 1989 GNU GENERAL PUBLIC LICENSE Version 1, February 1989 Copyright (C) 1989 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The license agreements of most software companies try to keep users at the mercy of those companies. By contrast, our General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. The General Public License applies to the Free Software Foundation's software and to any other program whose authors commit to using it. You can use it for your programs, too. When we speak of free software, we are referring to freedom, not price. Specifically, the General Public License is designed to make sure that you have the freedom to give away or sell copies of free software, that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of a such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must tell them their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any work containing the Program or a portion of it, either verbatim or with modifications. Each licensee is addressed as "you". 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this General Public License and to the absence of any warranty; and give any other recipients of the Program a copy of this General Public License along with the Program. You may charge a fee for the physical act of transferring a copy. 2. You may modify your copy or copies of the Program or any portion of it, and copy and distribute such modifications under the terms of Paragraph 1 above, provided that you also do the following: a) cause the modified files to carry prominent notices stating that you changed the files and the date of any change; and b) cause the whole of any work that you distribute or publish, that in whole or in part contains the Program or any part thereof, either with or without modifications, to be licensed at no charge to all third parties under the terms of this General Public License (except that you may choose to grant warranty protection to some or all third parties, at your option). c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the simplest and most usual way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this General Public License. d) You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. Mere aggregation of another independent work with the Program (or its derivative) on a volume of a storage or distribution medium does not bring the other work under the scope of these terms. 3. You may copy and distribute the Program (or a portion or derivative of it, under Paragraph 2) in object code or executable form under the terms of Paragraphs 1 and 2 above provided that you also do one of the following: a) accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Paragraphs 1 and 2 above; or, b) accompany it with a written offer, valid for at least three years, to give any third party free (except for a nominal charge for the cost of distribution) a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Paragraphs 1 and 2 above; or, c) accompany it with the information you received as to where the corresponding source code may be obtained. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form alone.) Source code for a work means the preferred form of the work for making modifications to it. For an executable file, complete source code means all the source code for all modules it contains; but, as a special exception, it need not include source code for modules which are standard libraries that accompany the operating system on which the executable file runs, or for standard header files or definitions files that accompany that operating system. 4. You may not copy, modify, sublicense, distribute or transfer the Program except as expressly provided under this General Public License. Any attempt otherwise to copy, modify, sublicense, distribute or transfer the Program is void, and will automatically terminate your rights to use the Program under this License. However, parties who have received copies, or rights to use copies, from you under this General Public License will not have their licenses terminated so long as such parties remain in full compliance. 5. By copying, distributing or modifying the Program (or any work based on the Program) you indicate your acceptance of this license to do so, and all its terms and conditions. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. 7. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of the license which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the license, you may choose any version ever published by the Free Software Foundation. 8. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to humanity, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19xx name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (a program to direct compilers to make passes at assemblers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice That's all there is to it! --- The Artistic License 1.0 --- This software is Copyright (c) 2016 by Ricardo SIGNES. This is free software, licensed under: The Artistic License 1.0 The Artistic License Preamble The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. Definitions: - "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. - "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder. - "Copyright Holder" is whoever is named in the copyright or copyrights for the package. - "You" is you, if you're thinking about copying or distributing this Package. - "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) - "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. 1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. 2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. 3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as ftp.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. b) use the modified Package only within your corporation or organization. c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. d) make other distribution arrangements with the Copyright Holder. 4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. b) accompany the distribution with the machine-readable source of the Package with your modifications. c) accompany any non-standard executables with their corresponding Standard Version executables, giving the non-standard executables non-standard names, and clearly documenting the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. d) make other distribution arrangements with the Copyright Holder. 5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. 6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whomever generated them, and may be sold commercially, and may be aggregated with this Package. 7. C or perl subroutines supplied by you and linked into this Package shall not be considered part of this Package. 8. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. 9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. The End dist.ini100644000767000024 40213000276322 14416 0ustar00rjbsstaff000000000000Pod-Weaver-4.015name = Pod-Weaver author = Ricardo SIGNES license = Perl_5 copyright_holder = Ricardo SIGNES [Prereqs] Config::MVP::Reader::INI = 0 ; to make testing simpler Mixin::Linewise::Readers = 0.103 ; fixed string semantics [@RJBS] version = 3 META.yml100644000767000024 3207713000276322 14300 0ustar00rjbsstaff000000000000Pod-Weaver-4.015--- abstract: 'weave together a Pod document from an outline' author: - 'Ricardo SIGNES ' build_requires: ExtUtils::MakeMaker: '0' File::Spec: '0' PPI: '0' Software::License::Artistic_1_0: '0' Software::License::Perl_5: '0' Test::Differences: '0' Test::More: '0.96' utf8: '0' configure_requires: ExtUtils::MakeMaker: '0' dynamic_config: 0 generated_by: 'Dist::Zilla version 6.008, CPAN::Meta::Converter version 2.150005' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: '1.4' name: Pod-Weaver requires: Config::MVP: '2' Config::MVP::Assembler: '0' Config::MVP::Assembler::WithBundles: '0' Config::MVP::Reader::Finder: '0' Config::MVP::Reader::INI: '0' DateTime: '0' File::Spec: '0' List::MoreUtils: '0' List::Util: '1.33' Log::Dispatchouli: '1.100710' Mixin::Linewise::Readers: '0.103' Module::Runtime: '0' Moose: '0' Moose::Role: '0' Moose::Util::TypeConstraints: '0' Params::Util: '0' Pod::Elemental: '0.100220' Pod::Elemental::Document: '0' Pod::Elemental::Element::Nested: '0' Pod::Elemental::Element::Pod5::Command: '0' Pod::Elemental::Element::Pod5::Ordinary: '0' Pod::Elemental::Element::Pod5::Region: '0' Pod::Elemental::Element::Pod5::Verbatim: '0' Pod::Elemental::Selectors: '0' Pod::Elemental::Transformer::Gatherer: '0' Pod::Elemental::Transformer::Nester: '0' Pod::Elemental::Transformer::Pod5: '0' Pod::Elemental::Types: '0' String::Flogger: '1' String::Formatter: '0.100680' String::RewritePrefix: '0' Text::Wrap: '0' namespace::autoclean: '0' strict: '0' warnings: '0' resources: bugtracker: https://github.com/rjbs/Pod-Weaver/issues homepage: https://github.com/rjbs/Pod-Weaver repository: https://github.com/rjbs/Pod-Weaver.git version: '4.015' x_Dist_Zilla: perl: version: '5.024000' plugins: - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: runtime type: requires name: Prereqs version: '6.008' - class: Dist::Zilla::Plugin::Git::GatherDir config: Dist::Zilla::Plugin::GatherDir: exclude_filename: [] exclude_match: [] follow_symlinks: 0 include_dotfiles: 0 prefix: '' prune_directory: [] root: . Dist::Zilla::Plugin::Git::GatherDir: include_untracked: 0 name: '@RJBS/Git::GatherDir' version: '2.039' - class: Dist::Zilla::Plugin::CheckPrereqsIndexed name: '@RJBS/CheckPrereqsIndexed' version: '0.020' - class: Dist::Zilla::Plugin::CheckExtraTests name: '@RJBS/CheckExtraTests' version: '0.029' - class: Dist::Zilla::Plugin::PromptIfStale config: Dist::Zilla::Plugin::PromptIfStale: check_all_plugins: 0 check_all_prereqs: 0 modules: - Dist::Zilla::PluginBundle::RJBS phase: build run_under_travis: 0 skip: [] name: '@RJBS/RJBS-Outdated' version: '0.051' - class: Dist::Zilla::Plugin::PromptIfStale config: Dist::Zilla::Plugin::PromptIfStale: check_all_plugins: 1 check_all_prereqs: 0 modules: [] phase: release run_under_travis: 0 skip: [] name: '@RJBS/CPAN-Outdated' version: '0.051' - class: Dist::Zilla::Plugin::PruneCruft name: '@RJBS/@Filter/PruneCruft' version: '6.008' - class: Dist::Zilla::Plugin::ManifestSkip name: '@RJBS/@Filter/ManifestSkip' version: '6.008' - class: Dist::Zilla::Plugin::MetaYAML name: '@RJBS/@Filter/MetaYAML' version: '6.008' - class: Dist::Zilla::Plugin::License name: '@RJBS/@Filter/License' version: '6.008' - class: Dist::Zilla::Plugin::Readme name: '@RJBS/@Filter/Readme' version: '6.008' - class: Dist::Zilla::Plugin::ExecDir name: '@RJBS/@Filter/ExecDir' version: '6.008' - class: Dist::Zilla::Plugin::ShareDir name: '@RJBS/@Filter/ShareDir' version: '6.008' - class: Dist::Zilla::Plugin::Manifest name: '@RJBS/@Filter/Manifest' version: '6.008' - class: Dist::Zilla::Plugin::TestRelease name: '@RJBS/@Filter/TestRelease' version: '6.008' - class: Dist::Zilla::Plugin::ConfirmRelease name: '@RJBS/@Filter/ConfirmRelease' version: '6.008' - class: Dist::Zilla::Plugin::UploadToCPAN name: '@RJBS/@Filter/UploadToCPAN' version: '6.008' - class: Dist::Zilla::Plugin::MakeMaker config: Dist::Zilla::Role::TestRunner: default_jobs: 9 name: '@RJBS/MakeMaker' version: '6.008' - class: Dist::Zilla::Plugin::AutoPrereqs name: '@RJBS/AutoPrereqs' version: '6.008' - class: Dist::Zilla::Plugin::Git::NextVersion config: Dist::Zilla::Plugin::Git::NextVersion: first_version: '0.001' version_by_branch: 1 version_regexp: (?^:^([0-9]+\.[0-9]+)$) Dist::Zilla::Role::Git::Repo: repo_root: . name: '@RJBS/Git::NextVersion' version: '2.039' - class: Dist::Zilla::Plugin::PkgVersion name: '@RJBS/PkgVersion' version: '6.008' - class: Dist::Zilla::Plugin::MetaConfig name: '@RJBS/MetaConfig' version: '6.008' - class: Dist::Zilla::Plugin::MetaJSON name: '@RJBS/MetaJSON' version: '6.008' - class: Dist::Zilla::Plugin::NextRelease name: '@RJBS/NextRelease' version: '6.008' - class: Dist::Zilla::Plugin::Test::ChangesHasContent name: '@RJBS/Test::ChangesHasContent' version: '0.010' - class: Dist::Zilla::Plugin::PodSyntaxTests name: '@RJBS/PodSyntaxTests' version: '6.008' - class: Dist::Zilla::Plugin::Test::ReportPrereqs name: '@RJBS/Test::ReportPrereqs' version: '0.025' - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: test type: requires name: '@RJBS/TestMoreWithSubtests' version: '6.008' - class: Dist::Zilla::Plugin::PodWeaver config: Dist::Zilla::Plugin::PodWeaver: config_plugins: - '@RJBS' 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: '@RJBS/SingleEncoding' version: '4.013' - class: Pod::Weaver::Section::Name name: '@RJBS/Name' version: '4.013' - class: Pod::Weaver::Section::Version name: '@RJBS/Version' version: '4.013' - class: Pod::Weaver::Section::Region name: '@RJBS/Prelude' version: '4.013' - class: Pod::Weaver::Section::Generic name: '@RJBS/Synopsis' version: '4.013' - class: Pod::Weaver::Section::Generic name: '@RJBS/Description' version: '4.013' - class: Pod::Weaver::Section::Generic name: '@RJBS/Overview' version: '4.013' - class: Pod::Weaver::Section::Generic name: '@RJBS/Stability' 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::Leftovers name: '@RJBS/Leftovers' version: '4.013' - class: Pod::Weaver::Section::Region name: '@RJBS/postlude' version: '4.013' - class: Pod::Weaver::Section::Authors name: '@RJBS/Authors' version: '4.013' - class: Pod::Weaver::Section::Contributors name: '@RJBS/Contributors' version: '0.009' - class: Pod::Weaver::Section::Legal name: '@RJBS/Legal' version: '4.013' - class: Pod::Weaver::Plugin::Transformer name: '@RJBS/List' version: '4.013' name: '@RJBS/PodWeaver' version: '4.008' - class: Dist::Zilla::Plugin::GithubMeta name: '@RJBS/GithubMeta' version: '0.54' - class: Dist::Zilla::Plugin::Git::Check config: Dist::Zilla::Plugin::Git::Check: untracked_files: die Dist::Zilla::Role::Git::DirtyFiles: allow_dirty: - Changes - dist.ini allow_dirty_match: [] changelog: Changes Dist::Zilla::Role::Git::Repo: repo_root: . name: '@RJBS/@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: - Changes - dist.ini allow_dirty_match: [] changelog: Changes Dist::Zilla::Role::Git::Repo: repo_root: . Dist::Zilla::Role::Git::StringFormatter: time_zone: local name: '@RJBS/@Git/Commit' version: '2.039' - class: Dist::Zilla::Plugin::Git::Tag config: Dist::Zilla::Plugin::Git::Tag: branch: ~ changelog: Changes signed: 0 tag: '4.015' tag_format: '%v' tag_message: v%v Dist::Zilla::Role::Git::Repo: repo_root: . Dist::Zilla::Role::Git::StringFormatter: time_zone: local name: '@RJBS/@Git/Tag' version: '2.039' - class: Dist::Zilla::Plugin::Git::Push config: Dist::Zilla::Plugin::Git::Push: push_to: - 'origin :' - 'github :' remotes_must_exist: 0 Dist::Zilla::Role::Git::Repo: repo_root: . name: '@RJBS/@Git/Push' version: '2.039' - class: Dist::Zilla::Plugin::Git::Contributors config: Dist::Zilla::Plugin::Git::Contributors: 'git --version': 2.10.0 include_authors: 0 include_releaser: 1 order_by: name paths: [] name: '@RJBS/Git::Contributors' version: '0.029' - class: Dist::Zilla::Plugin::FinderCode name: ':InstallModules' version: '6.008' - class: Dist::Zilla::Plugin::FinderCode name: ':IncModules' version: '6.008' - class: Dist::Zilla::Plugin::FinderCode name: ':TestFiles' version: '6.008' - class: Dist::Zilla::Plugin::FinderCode name: ':ExtraTestFiles' version: '6.008' - class: Dist::Zilla::Plugin::FinderCode name: ':ExecFiles' version: '6.008' - class: Dist::Zilla::Plugin::FinderCode name: ':PerlExecFiles' version: '6.008' - class: Dist::Zilla::Plugin::FinderCode name: ':ShareFiles' version: '6.008' - class: Dist::Zilla::Plugin::FinderCode name: ':MainModule' version: '6.008' - class: Dist::Zilla::Plugin::FinderCode name: ':AllFiles' version: '6.008' - class: Dist::Zilla::Plugin::FinderCode name: ':NoFiles' version: '6.008' zilla: class: Dist::Zilla::Dist::Builder config: is_trial: '0' version: '6.008' x_contributors: - 'Alex Peters ' - 'Apocalypse ' - 'Blabos de Blebe ' - 'Caleb Cushing ' - 'Christian Walde ' - 'Christopher J. Madsen ' - 'Chris Weyl ' - 'Dave Houston ' - 'Dave Rolsky ' - 'David E. Wheeler ' - 'David Golden ' - 'David Zurborg ' - 'Doug Bell ' - 'Florian Ragwitz ' - 'Jonathan "Duke" Leto ' - 'Joshua Keroes ' - 'Karen Etheridge ' - 'Kent Fredric ' - 'Marcel Gruenauer ' - 'Randy Stauner ' - 'Sam Graham ' - 'Shlomi Fish ' x_serialization_backend: 'YAML::Tiny version 1.69' MANIFEST100644000767000024 376113000276322 14136 0ustar00rjbsstaff000000000000Pod-Weaver-4.015# This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.008. Changes LICENSE MANIFEST META.json META.yml Makefile.PL README dist.ini lib/Pod/Weaver.pm lib/Pod/Weaver/Config.pm lib/Pod/Weaver/Config/Assembler.pm lib/Pod/Weaver/Config/Finder.pm lib/Pod/Weaver/Plugin/EnsurePod5.pm lib/Pod/Weaver/Plugin/H1Nester.pm lib/Pod/Weaver/Plugin/SingleEncoding.pm lib/Pod/Weaver/Plugin/Transformer.pm lib/Pod/Weaver/PluginBundle/CorePrep.pm lib/Pod/Weaver/PluginBundle/Default.pm lib/Pod/Weaver/Role/Dialect.pm lib/Pod/Weaver/Role/Finalizer.pm lib/Pod/Weaver/Role/Plugin.pm lib/Pod/Weaver/Role/Preparer.pm lib/Pod/Weaver/Role/Section.pm lib/Pod/Weaver/Role/StringFromComment.pm lib/Pod/Weaver/Role/Transformer.pm lib/Pod/Weaver/Section/Authors.pm lib/Pod/Weaver/Section/Bugs.pm lib/Pod/Weaver/Section/Collect.pm lib/Pod/Weaver/Section/Generic.pm lib/Pod/Weaver/Section/Leftovers.pm lib/Pod/Weaver/Section/Legal.pm lib/Pod/Weaver/Section/Name.pm lib/Pod/Weaver/Section/Region.pm lib/Pod/Weaver/Section/Version.pm t/00-report-prereqs.dd t/00-report-prereqs.t t/basic.t t/eg/basic.in.pod t/eg/basic.out.pod t/eg/encoding.in.pod t/eg/encoding.out.pod t/eg/legal_t1.in.pod t/eg/legal_t1.out.pod t/eg/legal_t2.in.pod t/eg/legal_t2.out.pod t/eg/region_t1.in.pod t/eg/region_t1.out.pod t/eg/region_t2.in.pod t/eg/region_t2.out.pod t/eg/region_t3.in.pod t/eg/region_t3.out.pod t/eg/region_t4.in.pod t/eg/region_t4.out.pod t/eg/version_t1.in.pod t/eg/version_t1.out.pod t/eg/version_t2.in.pod t/eg/version_t2.out.pod t/eg/version_t3.in.pod t/eg/version_t3.out.pod t/eg/version_t4.in.pod t/eg/version_t4.out.pod t/eg/version_t5.in.pod t/eg/version_t5.out.pod t/eg/version_t6-trial.out.pod t/eg/version_t6.in.pod t/eg/version_t6.out.pod t/eg/version_without_package.in.pod t/eg/version_without_package.out.pod t/eg/weaver.ini t/encoding.t t/ini-config.t t/legal_section.t t/region_options.t t/required_region.t t/required_section.t t/version_options.t t/version_without_package.t xt/author/pod-syntax.t xt/release/changes_has_content.t t000755000767000024 013000276322 13101 5ustar00rjbsstaff000000000000Pod-Weaver-4.015basic.t100644000767000024 536113000276322 14514 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/tuse strict; use warnings; use Test::More; use Test::Differences; use PPI; use Pod::Elemental; use Pod::Elemental::Selectors -all; use Pod::Elemental::Transformer::Pod5; use Pod::Elemental::Transformer::Nester; use Pod::Weaver; my $in_pod = do { local $/; open my $fh, '<:raw:bytes', 't/eg/basic.in.pod'; <$fh> }; my $expected = do { local $/; open my $fh, '<:encoding(UTF-8)', 't/eg/basic.out.pod'; <$fh> }; my $document = Pod::Elemental->read_string($in_pod); # wants octets my $perl_document = do { local $/; }; my $ppi_document = PPI::Document->new(\$perl_document); my $weaver = Pod::Weaver->new_with_default_config; require Software::License::Artistic_1_0; my $woven = $weaver->weave_document({ pod_document => $document, ppi_document => $ppi_document, version => '1.012078', authors => [ 'Ricardo Signes ', 'Molly Millions ', ], license => Software::License::Artistic_1_0->new({ holder => 'Ricardo Signes', year => 1999, }), }); # Document # 0 =encoding UTF-8 # 1 =head1 NAME # 0 Pod5::Ordinary # 2 =head1 VERSION # 0 Pod5::Ordinary # 3 Pod5::Ordinary # 4 =head1 SYNOPSIS # 0 Pod5::Ordinary # 5 =head1 DESCRIPTION # 0 Pod5::Ordinary # 1 Pod5::Ordinary # 6 =head1 ATTRIBUTES # 0 =head2 is_awesome # 0 Pod5::Ordinary <(This is true by default.)> # 7 =head1 BE FOREWARNED # 0 Pod5::Ordinary # 1 Pod5::Verbatim < much at all> # 2 Pod5::Ordinary # 8 Pod5::Ordinary # 9 =head1 AUTHORS # 0 =over 4 # 1 =item * # 2 Pod5::Ordinary # 3 =item * # 4 Pod5::Ordinary # 5 =back # 10 =head1 COPYRIGHT AND LICENSE # 0 Pod5::Ordinary is(@{ $woven->children }, 11, "we end up with a 11-paragraph document"); for (qw(1 2 4 5 6 7 9 10)) { my $para = $woven->children->[ $_ ]; isa_ok($para, 'Pod::Elemental::Element::Nested', "element $_"); is($para->command, 'head1', "... and is =head1"); } is( $woven->children->[2]->children->[0]->content, 'version 1.012078', "the version is in the version section", ); # XXX: This test is extremely risky as things change upstream. # -- rjbs, 2009-10-23 eq_or_diff( $woven->as_pod_string, $expected, "exactly the pod string we wanted after weaving!", ); done_testing; __DATA__ package Module::Name; # ABSTRACT: abstract text my $this = 'a test'; META.json100644000767000024 5001613000276322 14441 0ustar00rjbsstaff000000000000Pod-Weaver-4.015{ "abstract" : "weave together a Pod document from an outline", "author" : [ "Ricardo SIGNES " ], "dynamic_config" : 0, "generated_by" : "Dist::Zilla version 6.008, CPAN::Meta::Converter version 2.150005", "license" : [ "perl_5" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : 2 }, "name" : "Pod-Weaver", "prereqs" : { "configure" : { "requires" : { "ExtUtils::MakeMaker" : "0" } }, "develop" : { "requires" : { "Test::More" : "0", "Test::Pod" : "1.41" } }, "runtime" : { "requires" : { "Config::MVP" : "2", "Config::MVP::Assembler" : "0", "Config::MVP::Assembler::WithBundles" : "0", "Config::MVP::Reader::Finder" : "0", "Config::MVP::Reader::INI" : "0", "DateTime" : "0", "File::Spec" : "0", "List::MoreUtils" : "0", "List::Util" : "1.33", "Log::Dispatchouli" : "1.100710", "Mixin::Linewise::Readers" : "0.103", "Module::Runtime" : "0", "Moose" : "0", "Moose::Role" : "0", "Moose::Util::TypeConstraints" : "0", "Params::Util" : "0", "Pod::Elemental" : "0.100220", "Pod::Elemental::Document" : "0", "Pod::Elemental::Element::Nested" : "0", "Pod::Elemental::Element::Pod5::Command" : "0", "Pod::Elemental::Element::Pod5::Ordinary" : "0", "Pod::Elemental::Element::Pod5::Region" : "0", "Pod::Elemental::Element::Pod5::Verbatim" : "0", "Pod::Elemental::Selectors" : "0", "Pod::Elemental::Transformer::Gatherer" : "0", "Pod::Elemental::Transformer::Nester" : "0", "Pod::Elemental::Transformer::Pod5" : "0", "Pod::Elemental::Types" : "0", "String::Flogger" : "1", "String::Formatter" : "0.100680", "String::RewritePrefix" : "0", "Text::Wrap" : "0", "namespace::autoclean" : "0", "strict" : "0", "warnings" : "0" } }, "test" : { "recommends" : { "CPAN::Meta" : "2.120900" }, "requires" : { "ExtUtils::MakeMaker" : "0", "File::Spec" : "0", "PPI" : "0", "Software::License::Artistic_1_0" : "0", "Software::License::Perl_5" : "0", "Test::Differences" : "0", "Test::More" : "0.96", "utf8" : "0" } } }, "release_status" : "stable", "resources" : { "bugtracker" : { "web" : "https://github.com/rjbs/Pod-Weaver/issues" }, "homepage" : "https://github.com/rjbs/Pod-Weaver", "repository" : { "type" : "git", "url" : "https://github.com/rjbs/Pod-Weaver.git", "web" : "https://github.com/rjbs/Pod-Weaver" } }, "version" : "4.015", "x_Dist_Zilla" : { "perl" : { "version" : "5.024000" }, "plugins" : [ { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "runtime", "type" : "requires" } }, "name" : "Prereqs", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::Git::GatherDir", "config" : { "Dist::Zilla::Plugin::GatherDir" : { "exclude_filename" : [], "exclude_match" : [], "follow_symlinks" : 0, "include_dotfiles" : 0, "prefix" : "", "prune_directory" : [], "root" : "." }, "Dist::Zilla::Plugin::Git::GatherDir" : { "include_untracked" : 0 } }, "name" : "@RJBS/Git::GatherDir", "version" : "2.039" }, { "class" : "Dist::Zilla::Plugin::CheckPrereqsIndexed", "name" : "@RJBS/CheckPrereqsIndexed", "version" : "0.020" }, { "class" : "Dist::Zilla::Plugin::CheckExtraTests", "name" : "@RJBS/CheckExtraTests", "version" : "0.029" }, { "class" : "Dist::Zilla::Plugin::PromptIfStale", "config" : { "Dist::Zilla::Plugin::PromptIfStale" : { "check_all_plugins" : 0, "check_all_prereqs" : 0, "modules" : [ "Dist::Zilla::PluginBundle::RJBS" ], "phase" : "build", "run_under_travis" : 0, "skip" : [] } }, "name" : "@RJBS/RJBS-Outdated", "version" : "0.051" }, { "class" : "Dist::Zilla::Plugin::PromptIfStale", "config" : { "Dist::Zilla::Plugin::PromptIfStale" : { "check_all_plugins" : 1, "check_all_prereqs" : 0, "modules" : [], "phase" : "release", "run_under_travis" : 0, "skip" : [] } }, "name" : "@RJBS/CPAN-Outdated", "version" : "0.051" }, { "class" : "Dist::Zilla::Plugin::PruneCruft", "name" : "@RJBS/@Filter/PruneCruft", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::ManifestSkip", "name" : "@RJBS/@Filter/ManifestSkip", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::MetaYAML", "name" : "@RJBS/@Filter/MetaYAML", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::License", "name" : "@RJBS/@Filter/License", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::Readme", "name" : "@RJBS/@Filter/Readme", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::ExecDir", "name" : "@RJBS/@Filter/ExecDir", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::ShareDir", "name" : "@RJBS/@Filter/ShareDir", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::Manifest", "name" : "@RJBS/@Filter/Manifest", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::TestRelease", "name" : "@RJBS/@Filter/TestRelease", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::ConfirmRelease", "name" : "@RJBS/@Filter/ConfirmRelease", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::UploadToCPAN", "name" : "@RJBS/@Filter/UploadToCPAN", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::MakeMaker", "config" : { "Dist::Zilla::Role::TestRunner" : { "default_jobs" : 9 } }, "name" : "@RJBS/MakeMaker", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::AutoPrereqs", "name" : "@RJBS/AutoPrereqs", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::Git::NextVersion", "config" : { "Dist::Zilla::Plugin::Git::NextVersion" : { "first_version" : "0.001", "version_by_branch" : 1, "version_regexp" : "(?^:^([0-9]+\\.[0-9]+)$)" }, "Dist::Zilla::Role::Git::Repo" : { "repo_root" : "." } }, "name" : "@RJBS/Git::NextVersion", "version" : "2.039" }, { "class" : "Dist::Zilla::Plugin::PkgVersion", "name" : "@RJBS/PkgVersion", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::MetaConfig", "name" : "@RJBS/MetaConfig", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::MetaJSON", "name" : "@RJBS/MetaJSON", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::NextRelease", "name" : "@RJBS/NextRelease", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::Test::ChangesHasContent", "name" : "@RJBS/Test::ChangesHasContent", "version" : "0.010" }, { "class" : "Dist::Zilla::Plugin::PodSyntaxTests", "name" : "@RJBS/PodSyntaxTests", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::Test::ReportPrereqs", "name" : "@RJBS/Test::ReportPrereqs", "version" : "0.025" }, { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "test", "type" : "requires" } }, "name" : "@RJBS/TestMoreWithSubtests", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::PodWeaver", "config" : { "Dist::Zilla::Plugin::PodWeaver" : { "config_plugins" : [ "@RJBS" ], "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" : "@RJBS/SingleEncoding", "version" : "4.013" }, { "class" : "Pod::Weaver::Section::Name", "name" : "@RJBS/Name", "version" : "4.013" }, { "class" : "Pod::Weaver::Section::Version", "name" : "@RJBS/Version", "version" : "4.013" }, { "class" : "Pod::Weaver::Section::Region", "name" : "@RJBS/Prelude", "version" : "4.013" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "@RJBS/Synopsis", "version" : "4.013" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "@RJBS/Description", "version" : "4.013" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "@RJBS/Overview", "version" : "4.013" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "@RJBS/Stability", "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::Leftovers", "name" : "@RJBS/Leftovers", "version" : "4.013" }, { "class" : "Pod::Weaver::Section::Region", "name" : "@RJBS/postlude", "version" : "4.013" }, { "class" : "Pod::Weaver::Section::Authors", "name" : "@RJBS/Authors", "version" : "4.013" }, { "class" : "Pod::Weaver::Section::Contributors", "name" : "@RJBS/Contributors", "version" : "0.009" }, { "class" : "Pod::Weaver::Section::Legal", "name" : "@RJBS/Legal", "version" : "4.013" }, { "class" : "Pod::Weaver::Plugin::Transformer", "name" : "@RJBS/List", "version" : "4.013" } ] } }, "name" : "@RJBS/PodWeaver", "version" : "4.008" }, { "class" : "Dist::Zilla::Plugin::GithubMeta", "name" : "@RJBS/GithubMeta", "version" : "0.54" }, { "class" : "Dist::Zilla::Plugin::Git::Check", "config" : { "Dist::Zilla::Plugin::Git::Check" : { "untracked_files" : "die" }, "Dist::Zilla::Role::Git::DirtyFiles" : { "allow_dirty" : [ "Changes", "dist.ini" ], "allow_dirty_match" : [], "changelog" : "Changes" }, "Dist::Zilla::Role::Git::Repo" : { "repo_root" : "." } }, "name" : "@RJBS/@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" : [ "Changes", "dist.ini" ], "allow_dirty_match" : [], "changelog" : "Changes" }, "Dist::Zilla::Role::Git::Repo" : { "repo_root" : "." }, "Dist::Zilla::Role::Git::StringFormatter" : { "time_zone" : "local" } }, "name" : "@RJBS/@Git/Commit", "version" : "2.039" }, { "class" : "Dist::Zilla::Plugin::Git::Tag", "config" : { "Dist::Zilla::Plugin::Git::Tag" : { "branch" : null, "changelog" : "Changes", "signed" : 0, "tag" : "4.015", "tag_format" : "%v", "tag_message" : "v%v" }, "Dist::Zilla::Role::Git::Repo" : { "repo_root" : "." }, "Dist::Zilla::Role::Git::StringFormatter" : { "time_zone" : "local" } }, "name" : "@RJBS/@Git/Tag", "version" : "2.039" }, { "class" : "Dist::Zilla::Plugin::Git::Push", "config" : { "Dist::Zilla::Plugin::Git::Push" : { "push_to" : [ "origin :", "github :" ], "remotes_must_exist" : 0 }, "Dist::Zilla::Role::Git::Repo" : { "repo_root" : "." } }, "name" : "@RJBS/@Git/Push", "version" : "2.039" }, { "class" : "Dist::Zilla::Plugin::Git::Contributors", "config" : { "Dist::Zilla::Plugin::Git::Contributors" : { "git --version" : "2.10.0", "include_authors" : 0, "include_releaser" : 1, "order_by" : "name", "paths" : [] } }, "name" : "@RJBS/Git::Contributors", "version" : "0.029" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":InstallModules", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":IncModules", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":TestFiles", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":ExtraTestFiles", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":ExecFiles", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":PerlExecFiles", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":ShareFiles", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":MainModule", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":AllFiles", "version" : "6.008" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":NoFiles", "version" : "6.008" } ], "zilla" : { "class" : "Dist::Zilla::Dist::Builder", "config" : { "is_trial" : "0" }, "version" : "6.008" } }, "x_contributors" : [ "Alex Peters ", "Apocalypse ", "Blabos de Blebe ", "Caleb Cushing ", "Christian Walde ", "Christopher J. Madsen ", "Chris Weyl ", "Dave Houston ", "Dave Rolsky ", "David E. Wheeler ", "David Golden ", "David Zurborg ", "Doug Bell ", "Florian Ragwitz ", "Jonathan \"Duke\" Leto ", "Joshua Keroes ", "Karen Etheridge ", "Kent Fredric ", "Marcel Gruenauer ", "Randy Stauner ", "Sam Graham ", "Shlomi Fish " ], "x_serialization_backend" : "Cpanel::JSON::XS version 3.0213" } Makefile.PL100644000767000024 722513000276322 14756 0ustar00rjbsstaff000000000000Pod-Weaver-4.015# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v6.008. use strict; use warnings; use ExtUtils::MakeMaker; my %WriteMakefileArgs = ( "ABSTRACT" => "weave together a Pod document from an outline", "AUTHOR" => "Ricardo SIGNES ", "CONFIGURE_REQUIRES" => { "ExtUtils::MakeMaker" => 0 }, "DISTNAME" => "Pod-Weaver", "LICENSE" => "perl", "NAME" => "Pod::Weaver", "PREREQ_PM" => { "Config::MVP" => 2, "Config::MVP::Assembler" => 0, "Config::MVP::Assembler::WithBundles" => 0, "Config::MVP::Reader::Finder" => 0, "Config::MVP::Reader::INI" => 0, "DateTime" => 0, "File::Spec" => 0, "List::MoreUtils" => 0, "List::Util" => "1.33", "Log::Dispatchouli" => "1.100710", "Mixin::Linewise::Readers" => "0.103", "Module::Runtime" => 0, "Moose" => 0, "Moose::Role" => 0, "Moose::Util::TypeConstraints" => 0, "Params::Util" => 0, "Pod::Elemental" => "0.100220", "Pod::Elemental::Document" => 0, "Pod::Elemental::Element::Nested" => 0, "Pod::Elemental::Element::Pod5::Command" => 0, "Pod::Elemental::Element::Pod5::Ordinary" => 0, "Pod::Elemental::Element::Pod5::Region" => 0, "Pod::Elemental::Element::Pod5::Verbatim" => 0, "Pod::Elemental::Selectors" => 0, "Pod::Elemental::Transformer::Gatherer" => 0, "Pod::Elemental::Transformer::Nester" => 0, "Pod::Elemental::Transformer::Pod5" => 0, "Pod::Elemental::Types" => 0, "String::Flogger" => 1, "String::Formatter" => "0.100680", "String::RewritePrefix" => 0, "Text::Wrap" => 0, "namespace::autoclean" => 0, "strict" => 0, "warnings" => 0 }, "TEST_REQUIRES" => { "ExtUtils::MakeMaker" => 0, "File::Spec" => 0, "PPI" => 0, "Software::License::Artistic_1_0" => 0, "Software::License::Perl_5" => 0, "Test::Differences" => 0, "Test::More" => "0.96", "utf8" => 0 }, "VERSION" => "4.015", "test" => { "TESTS" => "t/*.t" } ); my %FallbackPrereqs = ( "Config::MVP" => 2, "Config::MVP::Assembler" => 0, "Config::MVP::Assembler::WithBundles" => 0, "Config::MVP::Reader::Finder" => 0, "Config::MVP::Reader::INI" => 0, "DateTime" => 0, "ExtUtils::MakeMaker" => 0, "File::Spec" => 0, "List::MoreUtils" => 0, "List::Util" => "1.33", "Log::Dispatchouli" => "1.100710", "Mixin::Linewise::Readers" => "0.103", "Module::Runtime" => 0, "Moose" => 0, "Moose::Role" => 0, "Moose::Util::TypeConstraints" => 0, "PPI" => 0, "Params::Util" => 0, "Pod::Elemental" => "0.100220", "Pod::Elemental::Document" => 0, "Pod::Elemental::Element::Nested" => 0, "Pod::Elemental::Element::Pod5::Command" => 0, "Pod::Elemental::Element::Pod5::Ordinary" => 0, "Pod::Elemental::Element::Pod5::Region" => 0, "Pod::Elemental::Element::Pod5::Verbatim" => 0, "Pod::Elemental::Selectors" => 0, "Pod::Elemental::Transformer::Gatherer" => 0, "Pod::Elemental::Transformer::Nester" => 0, "Pod::Elemental::Transformer::Pod5" => 0, "Pod::Elemental::Types" => 0, "Software::License::Artistic_1_0" => 0, "Software::License::Perl_5" => 0, "String::Flogger" => 1, "String::Formatter" => "0.100680", "String::RewritePrefix" => 0, "Test::Differences" => 0, "Test::More" => "0.96", "Text::Wrap" => 0, "namespace::autoclean" => 0, "strict" => 0, "utf8" => 0, "warnings" => 0 ); unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) { delete $WriteMakefileArgs{TEST_REQUIRES}; delete $WriteMakefileArgs{BUILD_REQUIRES}; $WriteMakefileArgs{PREREQ_PM} = \%FallbackPrereqs; } delete $WriteMakefileArgs{CONFIGURE_REQUIRES} unless eval { ExtUtils::MakeMaker->VERSION(6.52) }; WriteMakefile(%WriteMakefileArgs); encoding.t100644000767000024 333013000276322 15213 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/tuse strict; use warnings; use utf8; use Test::More; use Test::Differences; use PPI; use Pod::Elemental; use Pod::Elemental::Selectors -all; use Pod::Elemental::Transformer::Pod5; use Pod::Elemental::Transformer::Nester; use Pod::Weaver; my $in_pod = do { local $/; open my $fh, '<:raw:bytes', 't/eg/encoding.in.pod'; <$fh> }; my $expected = do { local $/; open my $fh, '<:encoding(UTF-8)', 't/eg/encoding.out.pod'; <$fh> }; my $document = Pod::Elemental->read_string($in_pod); my $perl_document = do { local $/; }; my $ppi_document = PPI::Document->new(\$perl_document); my $weaver = Pod::Weaver->new_with_default_config; require Software::License::Artistic_1_0; my $woven = $weaver->weave_document({ pod_document => $document, ppi_document => $ppi_document, version => '1.012078', authors => [ 'Ricardo Signes ', 'Molly Millions ', ], license => Software::License::Artistic_1_0->new({ holder => 'Ricardo Signes', year => 1999, }), }); is(@{ $woven->children }, 11, "we end up with a 11-paragraph document"); for (qw(1 2 4 5 6 7 9 10)) { my $para = $woven->children->[ $_ ]; isa_ok($para, 'Pod::Elemental::Element::Nested', "element $_"); is($para->command, 'head1', "... and is =head1"); } is( $woven->children->[2]->children->[0]->content, 'version 1.012078', "the version is in the version section", ); # XXX: This test is extremely risky as things change upstream. # -- rjbs, 2009-10-23 eq_or_diff( [ split /\n/, $woven->as_pod_string ], [ split /\n/, $expected ], "exactly the pod string we wanted after weaving!", ); done_testing; __DATA__ package Module::Name; # ABSTRACT: abstract text with UTF-8 paçoca my $this = 'a test'; ini-config.t100644000767000024 530213000276322 15450 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/tuse strict; use warnings; use Test::More; use Test::Differences; use PPI; use Pod::Elemental; use Pod::Elemental::Selectors -all; use Pod::Elemental::Transformer::Pod5; use Pod::Elemental::Transformer::Nester; use Pod::Weaver; my $in_pod = do { local $/; open my $fh, '<:raw:bytes', 't/eg/basic.in.pod'; <$fh> }; my $expected = do { local $/; open my $fh, '<:encoding(UTF-8)', 't/eg/basic.out.pod'; <$fh> }; my $document = Pod::Elemental->read_string($in_pod); my $perl_document = do { local $/; }; my $ppi_document = PPI::Document->new(\$perl_document); my $weaver = Pod::Weaver->new_from_config({ root => 't/eg' }); require Software::License::Artistic_1_0; my $woven = $weaver->weave_document({ pod_document => $document, ppi_document => $ppi_document, version => '1.012078', authors => [ 'Ricardo Signes ', 'Molly Millions ', ], license => Software::License::Artistic_1_0->new({ holder => 'Ricardo Signes', year => 1999, }), }); # Document # 0 =encoding UTF-8 # 1 =head1 NAME # 0 Pod5::Ordinary # 2 =head1 VERSION # 0 Pod5::Ordinary # 3 Pod5::Ordinary # 4 =head1 SYNOPSIS # 0 Pod5::Ordinary # 5 =head1 DESCRIPTION # 0 Pod5::Ordinary # 1 Pod5::Ordinary # 6 =head1 ATTRIBUTES # 0 Pod5::Ordinary # 1 =head2 is_awesome # 0 Pod5::Ordinary <(This is true by default.)> # 7 =head1 BE FOREWARNED # 0 Pod5::Ordinary # 1 Pod5::Verbatim < much at all> # 2 Pod5::Ordinary # 8 Pod5::Ordinary # 9 =head1 AUTHORS # 0 Pod5::Verbatim < Ricardo Signe…rs@orbit.tash>> # 10 =head1 COPYRIGHT AND LICENSE # 0 Pod5::Ordinary is(@{ $woven->children }, 11, "we end up with a 11-paragraph document"); for (qw(1 2 4 5 6 7 9 10)) { my $para = $woven->children->[ $_ ]; isa_ok($para, 'Pod::Elemental::Element::Nested', "element $_"); is($para->command, 'head1', "... and is =head1"); } is( $woven->children->[2]->children->[0]->content, 'version 1.012078', "the version is in the version section", ); # XXX: This test is extremely risky as things change upstream. # -- rjbs, 2009-10-23 eq_or_diff( $woven->as_pod_string, $expected, "exactly the pod string we wanted after weaving!", ); done_testing; __DATA__ package Module::Name; # ABSTRACT: abstract text my $this = 'a test'; eg000755000767000024 013000276322 13474 5ustar00rjbsstaff000000000000Pod-Weaver-4.015/tweaver.ini100644000767000024 41513000276322 15606 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg [@CorePrep] [-SingleEncoding] [Name] [Version] [Region / prelude] [Generic / SYNOPSIS] [Generic / DESCRIPTION] [Generic / OVERVIEW] [Collect / ATTRIBUTES] command = attr [Collect / METHODS] command = method [Leftovers] [Region / postlude] [Authors] [Legal] Pod000755000767000024 013000276322 14126 5ustar00rjbsstaff000000000000Pod-Weaver-4.015/libWeaver.pm100644000767000024 2360113000276322 16077 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Podpackage Pod::Weaver; # ABSTRACT: weave together a Pod document from an outline $Pod::Weaver::VERSION = '4.015'; use Moose; use namespace::autoclean; #pod =head1 SYNOPSIS #pod #pod my $weaver = Pod::Weaver->new_with_default_config; #pod #pod my $document = $weaver->weave_document({ #pod pod_document => $pod_elemental_document, #pod ppi_document => $ppi_document, #pod #pod license => $software_license, #pod version => $version_string, #pod authors => \@author_names, #pod }) #pod #pod =head1 DESCRIPTION #pod #pod Pod::Weaver is a system for building Pod documents from templates. It doesn't #pod perform simple text substitution, but instead builds a #pod Pod::Elemental::Document. Its plugins sketch out a series of sections #pod that will be produced based on an existing Pod document or other provided #pod information. #pod #pod =cut use File::Spec; use Log::Dispatchouli 1.100710; # proxy use Pod::Elemental 0.100220; use Pod::Elemental::Document; use Pod::Weaver::Config::Finder; use Pod::Weaver::Role::Plugin; use String::Flogger 1; #pod =attr logger #pod #pod This attribute stores the logger, which must provide a log method. The #pod weaver's log method delegates to the logger's log method. #pod #pod =cut has logger => ( is => 'ro', lazy => 1, default => sub { Log::Dispatchouli->new({ ident => 'Pod::Weaver', to_stdout => 1, log_pid => 0, }); }, handles => [ qw(log log_fatal log_debug) ] ); #pod =attr plugins #pod #pod This attribute is an arrayref of objects that can perform the #pod L role. In general, its contents are found through #pod the C> method. #pod #pod =cut has plugins => ( is => 'ro', isa => 'ArrayRef[Pod::Weaver::Role::Plugin]', required => 1, lazy => 1, init_arg => undef, default => sub { [] }, ); #pod =method plugins_with #pod #pod my $plugins_array_ref = $weaver->plugins_with('-Section'); #pod #pod This method will return an arrayref of plugins that perform the given role, in #pod the order of their registration. If the role name begins with a hyphen, the #pod method will prepend C. #pod #pod =cut sub plugins_with { my ($self, $role) = @_; $role =~ s/^-/Pod::Weaver::Role::/; my @plugins = grep { $_->does($role) } @{ $self->plugins }; return \@plugins; } #pod =method weave_document #pod #pod my $document = $weaver->weave_document(\%input); #pod #pod This is the most important method in Pod::Weaver. Given a set of input #pod parameters, it will weave a new document. Different section plugins will #pod expect different input parameters to be present, but some common ones include: #pod #pod pod_document - a Pod::Elemental::Document for the original Pod document #pod ppi_document - a PPI document for the source of the module being documented #pod license - a Software::License object for the source module's license #pod version - a version (string) to use in produced documentation #pod #pod The C should have gone through a L, and should probably have had #pod its C<=head1> elements L. #pod #pod The method will return a new Pod::Elemental::Document. The input documents may #pod be destructively altered during the weaving process. If they should be #pod untouched, pass in copies. #pod #pod =cut sub weave_document { my ($self, $input) = @_; my $document = Pod::Elemental::Document->new; for (@{ $self->plugins_with(-Preparer) }) { $_->prepare_input($input); } for (@{ $self->plugins_with(-Dialect) }) { $_->translate_dialect($input->{pod_document}); } for (@{ $self->plugins_with(-Transformer) }) { $_->transform_document($input->{pod_document}); } for (@{ $self->plugins_with(-Section) }) { $_->weave_section($document, $input); } for (@{ $self->plugins_with(-Finalizer) }) { $_->finalize_document($document, $input); } return $document; } #pod =method new_with_default_config #pod #pod This method returns a new Pod::Weaver with a stock configuration by using only #pod L. #pod #pod =cut sub new_with_default_config { my ($class, $arg) = @_; my $assembler = Pod::Weaver::Config::Assembler->new; my $root = $assembler->section_class->new({ name => '_' }); $assembler->sequence->add_section($root); $assembler->change_section('@Default'); $assembler->end_section; return $class->new_from_config_sequence($assembler->sequence, $arg); } sub new_from_config { my ($class, $arg, $new_arg) = @_; my $root = $arg->{root} || '.'; my $name = File::Spec->catfile($root, 'weaver'); my ($sequence) = Pod::Weaver::Config::Finder->new->read_config($name); return $class->new_from_config_sequence($sequence, $new_arg); } sub new_from_config_sequence { my ($class, $seq, $arg) = @_; $arg ||= {}; my $merge = $arg->{root_config} || {}; confess("config must be a Config::MVP::Sequence") unless $seq and $seq->isa('Config::MVP::Sequence'); my $core_config = $seq->section_named('_')->payload; my $self = $class->new({ %$merge, %$core_config, }); for my $section ($seq->sections) { next if $section->name eq '_'; my ($name, $plugin_class, $arg) = ( $section->name, $section->package, $section->payload, ); $self->log_debug("initializing plugin $name ($plugin_class)"); confess "arguments attempted to override 'plugin_name'" if defined $arg->{plugin_name}; confess "arguments attempted to override 'weaver'" if defined $arg->{weaver}; push @{ $self->plugins }, $plugin_class->new({ %$arg, plugin_name => $name, weaver => $self, }); } return $self; } __PACKAGE__->meta->make_immutable; 1; __END__ =pod =encoding UTF-8 =head1 NAME Pod::Weaver - weave together a Pod document from an outline =head1 VERSION version 4.015 =head1 SYNOPSIS my $weaver = Pod::Weaver->new_with_default_config; my $document = $weaver->weave_document({ pod_document => $pod_elemental_document, ppi_document => $ppi_document, license => $software_license, version => $version_string, authors => \@author_names, }) =head1 DESCRIPTION Pod::Weaver is a system for building Pod documents from templates. It doesn't perform simple text substitution, but instead builds a Pod::Elemental::Document. Its plugins sketch out a series of sections that will be produced based on an existing Pod document or other provided information. =head1 ATTRIBUTES =head2 logger This attribute stores the logger, which must provide a log method. The weaver's log method delegates to the logger's log method. =head2 plugins This attribute is an arrayref of objects that can perform the L role. In general, its contents are found through the C> method. =head1 METHODS =head2 plugins_with my $plugins_array_ref = $weaver->plugins_with('-Section'); This method will return an arrayref of plugins that perform the given role, in the order of their registration. If the role name begins with a hyphen, the method will prepend C. =head2 weave_document my $document = $weaver->weave_document(\%input); This is the most important method in Pod::Weaver. Given a set of input parameters, it will weave a new document. Different section plugins will expect different input parameters to be present, but some common ones include: pod_document - a Pod::Elemental::Document for the original Pod document ppi_document - a PPI document for the source of the module being documented license - a Software::License object for the source module's license version - a version (string) to use in produced documentation The C should have gone through a L, and should probably have had its C<=head1> elements L. The method will return a new Pod::Elemental::Document. The input documents may be destructively altered during the weaving process. If they should be untouched, pass in copies. =head2 new_with_default_config This method returns a new Pod::Weaver with a stock configuration by using only L. =head1 AUTHOR Ricardo SIGNES =head1 CONTRIBUTORS =for stopwords Alex Peters Apocalypse Blabos de Blebe Caleb Cushing Christian Walde Christopher J. Madsen Chris Weyl Dave Houston Rolsky David E. Wheeler Golden Zurborg Doug Bell Florian Ragwitz Jonathan "Duke" Leto Joshua Keroes Karen Etheridge Kent Fredric Marcel Gruenauer Randy Stauner Sam Graham Shlomi Fish =over 4 =item * Alex Peters =item * Apocalypse =item * Blabos de Blebe =item * Caleb Cushing =item * Christian Walde =item * Christopher J. Madsen =item * Chris Weyl =item * Dave Houston =item * Dave Rolsky =item * David E. Wheeler =item * David Golden =item * David Zurborg =item * Doug Bell =item * Florian Ragwitz =item * Jonathan "Duke" Leto =item * Joshua Keroes =item * Karen Etheridge =item * Kent Fredric =item * Marcel Gruenauer =item * Randy Stauner =item * Sam Graham =item * Shlomi Fish =back =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut basic.in.pod100644000767000024 75613000276322 16016 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =for :prelude Please pay close attention to the following. =for :postlude Thank you for your attention. =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =head1 ATTRIBUTES This is a header that should be above the attributes list. =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =attr is_awesome (This is true by default.) =cut legal_section.t100644000767000024 347413000276322 16246 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/tuse strict; use warnings; use Test::More; use Test::Differences; use PPI; use Pod::Elemental; use Pod::Weaver; use Software::License::Perl_5; # Test various combinations of options for Section::Legal do_weave( configer( ), 'legal_t1' ); do_weave( configer( license_file => 'LICENSE' ), 'legal_t2' ); sub configer { my %opts = @_; # TODO Hmpf, is there an easier way for this? --APOCAL my $assembler = Pod::Weaver::Config::Assembler->new; $assembler->sequence->add_section( $assembler->section_class->new({ name => '_' }) ); $assembler->change_section('@CorePrep'); $assembler->change_section('Name'); $assembler->change_section('Leftovers'); $assembler->change_section('Legal'); foreach my $k ( keys %opts ) { $assembler->add_value( $k => $opts{ $k } ); } return Pod::Weaver->new_from_config_sequence( $assembler->sequence ); } my $perl_document; sub do_weave { my( $weaver, $filename ) = @_; my $in_pod = do { local $/; open my $fh, '<:encoding(UTF-8)', "t/eg/$filename.in.pod"; <$fh> }; my $expected = do { local $/; open my $fh, '<:encoding(UTF-8)', "t/eg/$filename.out.pod"; <$fh> }; my $document = Pod::Elemental->read_string($in_pod); $perl_document = do { local $/; } if ! defined $perl_document; my $ppi_document = PPI::Document->new(\$perl_document); my $woven = $weaver->weave_document({ pod_document => $document, ppi_document => $ppi_document, license => Software::License::Perl_5->new({ holder => 'RJBS', year => '2010', }), }); # XXX: This test is extremely risky as things change upstream. # -- rjbs, 2009-10-23 eq_or_diff( $woven->as_pod_string, $expected, "exactly the pod string we wanted after weaving for $filename!", ); } done_testing; __DATA__ package Module::Name; # ABSTRACT: abstract text my $this = 'a test'; basic.out.pod100644000767000024 150313000276322 16226 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =encoding UTF-8 =head1 NAME Module::Name - abstract text =head1 VERSION version 1.012078 Please pay close attention to the following. =head1 SYNOPSIS This should probably get moved up front. =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =head1 ATTRIBUTES This is a header that should be above the attributes list. =head2 is_awesome (This is true by default.) =head1 BE FOREWARNED This is not supported: much at all Happy hacking! Thank you for your attention. =head1 AUTHORS =over 4 =item * Ricardo Signes =item * Molly Millions =back =head1 COPYRIGHT AND LICENSE This software is Copyright (c) 1999 by Ricardo Signes. This is free software, licensed under: The Artistic License 1.0 =cut region_options.t100644000767000024 470413000276322 16471 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/tuse strict; use warnings; use Test::More; use Test::Differences; use PPI; use Pod::Elemental; use Pod::Weaver; # Test various combinations of options for Section::Region do_weave( configer( allow_nonpod => 1 ), 'region_t1' ); do_weave( configer( allow_nonpod => 0 ), 'region_t1' ); do_weave( configer( allow_nonpod => 1 ), 'region_t2' ); do_weave( configer( allow_nonpod => 0 ), 'region_t2' ); do_weave( configer( flatten => 0 ), 'region_t3' ); do_weave( configer( flatten => 1 ), 'region_t4' ); do_weave( configer( allow_nonpod => 1, flatten => 0 ), 'region_t3' ); do_weave( configer( allow_nonpod => 0, flatten => 0 ), 'region_t3' ); do_weave( configer( allow_nonpod => 1, flatten => 1 ), 'region_t4' ); do_weave( configer( allow_nonpod => 0, flatten => 1 ), 'region_t4' ); sub configer { my %opts = @_; # TODO Hmpf, is there an easier way for this? --APOCAL my $assembler = Pod::Weaver::Config::Assembler->new; $assembler->sequence->add_section( $assembler->section_class->new({ name => '_' }) ); $assembler->change_section('@CorePrep'); $assembler->change_section('Name'); $assembler->change_section('Region', 'FOOBAZ'); foreach my $k ( keys %opts ) { $assembler->add_value( $k => $opts{ $k } ); } $assembler->change_section('Leftovers'); return Pod::Weaver->new_from_config_sequence( $assembler->sequence ); } my $perl_document; sub do_weave { my( $weaver, $filename ) = @_; my $in_pod = do { local $/; open my $fh, '<:encoding(UTF-8)', "t/eg/$filename.in.pod"; <$fh> }; my $expected = do { local $/; open my $fh, '<:encoding(UTF-8)', "t/eg/$filename.out.pod"; <$fh> }; my $document = Pod::Elemental->read_string($in_pod); $perl_document = do { local $/; } if ! defined $perl_document; my $ppi_document = PPI::Document->new(\$perl_document); my $woven = $weaver->weave_document({ pod_document => $document, ppi_document => $ppi_document, }); is(@{ $woven->children }, 5, "we end up with a 5-paragraph document"); for (qw(0 2 3 4)) { my $para = $woven->children->[ $_ ]; isa_ok($para, 'Pod::Elemental::Element::Nested', "element $_"); is($para->command, 'head1', "... and is =head1"); } # XXX: This test is extremely risky as things change upstream. # -- rjbs, 2009-10-23 eq_or_diff( $woven->as_pod_string, $expected, "exactly the pod string we wanted after weaving for $filename!", ); } done_testing; __DATA__ package Module::Name; # ABSTRACT: abstract text my $this = 'a test'; required_region.t100644000767000024 313213000276322 16610 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/tuse strict; use warnings; use Test::More; use PPI; use Pod::Elemental; use Pod::Weaver; is( woven( configer( 0 ) ), 0, "Doesn't throw exception for nonrequired region" ); is( woven( configer( 1 ) ), 1, "Properly throws exception for required region" ); sub configer { my $required = shift; # TODO Hmpf, is there an easier way for this? --APOCAL my $assembler = Pod::Weaver::Config::Assembler->new; $assembler->sequence->add_section( $assembler->section_class->new({ name => '_' }) ); $assembler->change_section('@Default'); $assembler->change_section('Region', 'FOOBAZ'); $assembler->add_value( 'required' => $required ); return Pod::Weaver->new_from_config_sequence( $assembler->sequence ); } my $perl_document; sub woven { my $weaver = shift; my $in_pod = do { local $/; open my $fh, '<:raw:bytes', 't/eg/basic.in.pod'; <$fh> }; my $document = Pod::Elemental->read_string($in_pod); $perl_document = do { local $/; } if ! defined $perl_document; my $ppi_document = PPI::Document->new(\$perl_document); require Software::License::Artistic_1_0; eval { my $woven = $weaver->weave_document({ pod_document => $document, ppi_document => $ppi_document, version => '1.012078', authors => [ 'Ricardo Signes ', 'Molly Millions ', ], license => Software::License::Artistic_1_0->new({ holder => 'Ricardo Signes', year => 1999, }), }); }; return $@ ? 1 : 0; } done_testing; __DATA__ package Module::Name; # ABSTRACT: abstract text my $this = 'a test'; version_options.t100644000767000024 527113000276322 16673 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/tuse strict; use warnings; use Test::More; use Test::Differences; use PPI; use Pod::Elemental; use Pod::Weaver; # Test various combinations of options for Section::Version do_weave( configer( ), 'version_t1' ); do_weave( configer( is_verbatim => 1 ), 'version_t2' ); do_weave( configer( format => "%v FOOBAZ" ), 'version_t3' ); do_weave( configer( format => "%t%v%t-%t%m", is_verbatim => 1 ), 'version_t4' ); # In order to test DateTime, we have to avoid touching the time! Hence UTC and # the weird CLDR here... do_weave( configer( format => "%v - %{ZZZZ G}d", time_zone => 'UTC' ), 'version_t5', ); do_weave( configer( format => ["%v", "FOOBAZ", "", "EXPLANATION"] ), 'version_t6', ); do_weave( configer(format => [ "%v", "FOOBAZ", "", "EXPLANATION", "%T", "%T This is a trial release.", ]), 'version_t6', 'version_t6', ); do_weave( configer(format => [ "%v", "FOOBAZ", "", "EXPLANATION", "%T", "%T This is a trial release.", ]), 'version_t6', 'version_t6-trial', { is_trial => 1 }, ); sub configer { my %opts = @_; # TODO Hmpf, is there an easier way for this? --APOCAL my $assembler = Pod::Weaver::Config::Assembler->new; $assembler->sequence->add_section( $assembler->section_class->new({ name => '_' }) ); $assembler->change_section('@CorePrep'); $assembler->change_section('Name'); $assembler->change_section('Version'); foreach my $k ( keys %opts ) { if (ref $opts{ $k }) { $assembler->add_value( $k => $_ ) for @{ $opts{ $k } }; } else { $assembler->add_value( $k => $opts{ $k } ); } } $assembler->change_section('Leftovers'); return Pod::Weaver->new_from_config_sequence( $assembler->sequence ); } my $perl_document; sub do_weave { my( $weaver, $filename, $expect_fn, $extra ) = @_; $expect_fn ||= $filename; my $in_pod = do { local $/; open my $fh, '<:raw:bytes', "t/eg/$filename.in.pod"; <$fh>; }; my $expected = do { local $/; open my $fh, '<:encoding(UTF-8)', "t/eg/$expect_fn.out.pod"; <$fh>; }; my $document = Pod::Elemental->read_string($in_pod); $perl_document = do { local $/; } if ! defined $perl_document; my $ppi_document = PPI::Document->new(\$perl_document); my $woven = $weaver->weave_document({ pod_document => $document, ppi_document => $ppi_document, version => '1.012078', %{ $extra || {} }, }); # XXX: This test is extremely risky as things change upstream. # -- rjbs, 2009-10-23 eq_or_diff( $woven->as_pod_string, $expected, "exactly the pod string we wanted after weaving for $filename!", ); } done_testing; __DATA__ package Module::Name; # ABSTRACT: abstract text my $this = 'a test'; encoding.in.pod100644000767000024 67613000276322 16524 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =for :prelude Please pay close attention to the following. =for :postlude Thank you for your attention. =head1 DESCRIPTION =encoding utf8 This is a simple document meant to be used in testing Pod::Weaver. Glory to Queensrÿche! =head1 BE FOREWARNED This is not supported: much at all Happy haĉking! =encoding UTF-8 =head1 SYNOPSIS This should probably get moved up front. =attr is_awesome (This is true by default.) =cut legal_t1.in.pod100644000767000024 40613000276322 16415 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =cut legal_t2.in.pod100644000767000024 40613000276322 16416 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =cut required_section.t100644000767000024 313513000276322 16774 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/tuse strict; use warnings; use Test::More; use PPI; use Pod::Elemental; use Pod::Weaver; is( woven( configer( 0 ) ), 0, "Doesn't throw exception for nonrequired section" ); is( woven( configer( 1 ) ), 1, "Properly throws exception for required section" ); sub configer { my $required = shift; # TODO Hmpf, is there an easier way for this? --APOCAL my $assembler = Pod::Weaver::Config::Assembler->new; $assembler->sequence->add_section( $assembler->section_class->new({ name => '_' }) ); $assembler->change_section('@Default'); $assembler->change_section('Generic', 'FOOBAZ'); $assembler->add_value( 'required' => $required ); return Pod::Weaver->new_from_config_sequence( $assembler->sequence ); } my $perl_document; sub woven { my $weaver = shift; my $in_pod = do { local $/; open my $fh, '<:raw:bytes', 't/eg/basic.in.pod'; <$fh> }; my $document = Pod::Elemental->read_string($in_pod); $perl_document = do { local $/; } if ! defined $perl_document; my $ppi_document = PPI::Document->new(\$perl_document); require Software::License::Artistic_1_0; eval { my $woven = $weaver->weave_document({ pod_document => $document, ppi_document => $ppi_document, version => '1.012078', authors => [ 'Ricardo Signes ', 'Molly Millions ', ], license => Software::License::Artistic_1_0->new({ holder => 'Ricardo Signes', year => 1999, }), }); }; return $@ ? 1 : 0; } done_testing; __DATA__ package Module::Name; # ABSTRACT: abstract text my $this = 'a test'; encoding.out.pod100644000767000024 143013000276322 16732 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =encoding UTF-8 =head1 NAME Module::Name - abstract text with UTF-8 paçoca =head1 VERSION version 1.012078 Please pay close attention to the following. =head1 SYNOPSIS This should probably get moved up front. =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. Glory to Queensrÿche! =head1 ATTRIBUTES =head2 is_awesome (This is true by default.) =head1 BE FOREWARNED This is not supported: much at all Happy haĉking! Thank you for your attention. =head1 AUTHORS =over 4 =item * Ricardo Signes =item * Molly Millions =back =head1 COPYRIGHT AND LICENSE This software is Copyright (c) 1999 by Ricardo Signes. This is free software, licensed under: The Artistic License 1.0 =cut legal_t1.out.pod100644000767000024 100513000276322 16632 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =head1 NAME Module::Name - abstract text =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2010 by RJBS. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut legal_t2.out.pod100644000767000024 115013000276322 16634 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =head1 NAME Module::Name - abstract text =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2010 by RJBS. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. The full text of the license can be found in the F file included with this distribution. =cut region_t1.in.pod100644000767000024 47613000276322 16623 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =begin :FOOBAZ Wow, this is the FOOBAZ! =end :FOOBAZ =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =cut region_t2.in.pod100644000767000024 45513000276322 16621 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =for :FOOBAZ Wow, this is the FOOBAZ! =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =cut region_t3.in.pod100644000767000024 47613000276322 16625 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =begin :FOOBAZ Wow, this is the FOOBAZ! =end :FOOBAZ =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =cut region_t4.in.pod100644000767000024 47613000276322 16626 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =begin :FOOBAZ Wow, this is the FOOBAZ! =end :FOOBAZ =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =cut 00-report-prereqs.t100644000767000024 1271413000276322 16662 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t#!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: region_t1.out.pod100644000767000024 51313000276322 17014 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =head1 NAME Module::Name - abstract text Wow, this is the FOOBAZ! =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =cut region_t2.out.pod100644000767000024 51313000276322 17015 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =head1 NAME Module::Name - abstract text Wow, this is the FOOBAZ! =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =cut region_t3.out.pod100644000767000024 53013000276322 17015 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =head1 NAME Module::Name - abstract text =for :FOOBAZ Wow, this is the FOOBAZ! =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =cut region_t4.out.pod100644000767000024 51313000276322 17017 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =head1 NAME Module::Name - abstract text Wow, this is the FOOBAZ! =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =cut version_t1.in.pod100644000767000024 40613000276322 17016 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =cut version_t2.in.pod100644000767000024 40613000276322 17017 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =cut version_t3.in.pod100644000767000024 40613000276322 17020 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =cut version_t4.in.pod100644000767000024 40613000276322 17021 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =cut version_t5.in.pod100644000767000024 40613000276322 17022 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =cut version_t6.in.pod100644000767000024 40613000276322 17023 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =cut author000755000767000024 013000276322 14573 5ustar00rjbsstaff000000000000Pod-Weaver-4.015/xtpod-syntax.t100644000767000024 25213000276322 17205 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/xt/author#!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(); 00-report-prereqs.dd100644000767000024 734413000276322 16771 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/tdo { my $x = { 'configure' => { 'requires' => { 'ExtUtils::MakeMaker' => '0' } }, 'develop' => { 'requires' => { 'Test::More' => '0', 'Test::Pod' => '1.41' } }, 'runtime' => { 'requires' => { 'Config::MVP' => '2', 'Config::MVP::Assembler' => '0', 'Config::MVP::Assembler::WithBundles' => '0', 'Config::MVP::Reader::Finder' => '0', 'Config::MVP::Reader::INI' => '0', 'DateTime' => '0', 'File::Spec' => '0', 'List::MoreUtils' => '0', 'List::Util' => '1.33', 'Log::Dispatchouli' => '1.100710', 'Mixin::Linewise::Readers' => '0.103', 'Module::Runtime' => '0', 'Moose' => '0', 'Moose::Role' => '0', 'Moose::Util::TypeConstraints' => '0', 'Params::Util' => '0', 'Pod::Elemental' => '0.100220', 'Pod::Elemental::Document' => '0', 'Pod::Elemental::Element::Nested' => '0', 'Pod::Elemental::Element::Pod5::Command' => '0', 'Pod::Elemental::Element::Pod5::Ordinary' => '0', 'Pod::Elemental::Element::Pod5::Region' => '0', 'Pod::Elemental::Element::Pod5::Verbatim' => '0', 'Pod::Elemental::Selectors' => '0', 'Pod::Elemental::Transformer::Gatherer' => '0', 'Pod::Elemental::Transformer::Nester' => '0', 'Pod::Elemental::Transformer::Pod5' => '0', 'Pod::Elemental::Types' => '0', 'String::Flogger' => '1', 'String::Formatter' => '0.100680', 'String::RewritePrefix' => '0', 'Text::Wrap' => '0', 'namespace::autoclean' => '0', 'strict' => '0', 'warnings' => '0' } }, 'test' => { 'recommends' => { 'CPAN::Meta' => '2.120900' }, 'requires' => { 'ExtUtils::MakeMaker' => '0', 'File::Spec' => '0', 'PPI' => '0', 'Software::License::Artistic_1_0' => '0', 'Software::License::Perl_5' => '0', 'Test::Differences' => '0', 'Test::More' => '0.96', 'utf8' => '0' } } }; $x; }version_t1.out.pod100644000767000024 52313000276322 17217 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =head1 NAME Module::Name - abstract text =head1 VERSION version 1.012078 =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =cut version_t2.out.pod100644000767000024 52513000276322 17222 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =head1 NAME Module::Name - abstract text =head1 VERSION version 1.012078 =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =cut version_t3.out.pod100644000767000024 52213000276322 17220 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =head1 NAME Module::Name - abstract text =head1 VERSION 1.012078 FOOBAZ =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =cut version_t4.out.pod100644000767000024 53513000276322 17225 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =head1 NAME Module::Name - abstract text =head1 VERSION 1.012078 - Module::Name =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =cut version_t5.out.pod100644000767000024 53113000276322 17222 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =head1 NAME Module::Name - abstract text =head1 VERSION 1.012078 - UTC+0000 AD =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =cut version_t6.out.pod100644000767000024 53713000276322 17231 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =head1 NAME Module::Name - abstract text =head1 VERSION 1.012078 FOOBAZ EXPLANATION =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =cut Weaver000755000767000024 013000276322 15357 5ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/PodConfig.pm100644000767000024 333613000276322 17267 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/Weaverpackage Pod::Weaver::Config; # ABSTRACT: stored configuration loader role $Pod::Weaver::Config::VERSION = '4.015'; use Moose::Role; use Config::MVP 2; use Pod::Weaver::Config::Assembler; use namespace::autoclean; #pod =head1 DESCRIPTION #pod #pod The config role provides some helpers for writing a configuration loader using #pod the L system to load and validate its configuration. #pod #pod =attr assembler #pod #pod The L attribute must be a Config::MVP::Assembler, has a sensible #pod default that will handle the standard needs of a config loader. Namely, it #pod will be pre-loaded with a starting section for root configuration. #pod #pod =cut sub build_assembler { my $assembler = Pod::Weaver::Config::Assembler->new; my $root = $assembler->section_class->new({ name => '_', }); $assembler->sequence->add_section($root); return $assembler; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Pod::Weaver::Config - stored configuration loader role =head1 VERSION version 4.015 =head1 DESCRIPTION The config role provides some helpers for writing a configuration loader using the L system to load and validate its configuration. =head1 ATTRIBUTES =head2 assembler The L attribute must be a Config::MVP::Assembler, has a sensible default that will handle the standard needs of a config loader. Namely, it will be pre-loaded with a starting section for root configuration. =head1 AUTHOR Ricardo SIGNES =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut version_without_package.t100644000767000024 337713000276322 20363 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t# Mostly lifted from version_options.t but with different data section. use strict; use warnings; use Test::More; use Test::Differences; use PPI; use Pod::Elemental; use Pod::Weaver; do_weave( configer( ), 'version_without_package' ); do_weave( configer( format => "%t%v%t-%t%m", is_verbatim => 1 ), 'version_t4'); sub configer { my %opts = @_; # TODO Hmpf, is there an easier way for this? --APOCAL my $assembler = Pod::Weaver::Config::Assembler->new; $assembler->sequence->add_section( $assembler->section_class->new({ name => '_' }) ); $assembler->change_section('@CorePrep'); $assembler->change_section('Name'); $assembler->change_section('Version'); foreach my $k ( keys %opts ) { $assembler->add_value( $k => $opts{ $k } ); } $assembler->change_section('Leftovers'); return Pod::Weaver->new_from_config_sequence( $assembler->sequence ); } my $perl_document; sub do_weave { my( $weaver, $filename ) = @_; my $in_pod = do { local $/; open my $fh, '<:raw:bytes', "t/eg/$filename.in.pod"; <$fh> }; my $expected = do { local $/; open my $fh, '<:encoding(UTF-8)', "t/eg/$filename.out.pod"; <$fh> }; my $document = Pod::Elemental->read_string($in_pod); $perl_document = do { local $/; } if ! defined $perl_document; my $ppi_document = PPI::Document->new(\$perl_document); my $woven = $weaver->weave_document({ pod_document => $document, ppi_document => $ppi_document, version => '1.012078', }); # XXX: This test is extremely risky as things change upstream. # -- rjbs, 2009-10-23 eq_or_diff( $woven->as_pod_string, $expected, "exactly the pod string we wanted after weaving for $filename!", ); } done_testing; __DATA__ # ABSTRACT: abstract text # PODNAME: Module::Name my $this = 'a test'; Role000755000767000024 013000276322 16260 5ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/WeaverPlugin.pm100644000767000024 351713000276322 20222 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/Weaver/Rolepackage Pod::Weaver::Role::Plugin; # ABSTRACT: a Pod::Weaver plugin $Pod::Weaver::Role::Plugin::VERSION = '4.015'; use Moose::Role; use Params::Util qw(_HASHLIKE); use namespace::autoclean; #pod =head1 IMPLEMENTING #pod #pod This is the most basic role that all plugins must perform. #pod #pod =attr plugin_name #pod #pod This name must be unique among all other plugins loaded into a weaver. In #pod general, this will be set up by the configuration reader. #pod #pod =cut has plugin_name => ( is => 'ro', isa => 'Str', required => 1, ); #pod =attr weaver #pod #pod This is the Pod::Weaver object into which the plugin was loaded. In general, #pod this will be set up when the weaver is instantiated from config. #pod #pod =cut has weaver => ( is => 'ro', isa => 'Pod::Weaver', required => 1, weak_ref => 1, ); has logger => ( is => 'ro', lazy => 1, handles => [ qw(log log_debug log_fatal) ], default => sub { $_[0]->weaver->logger->proxy({ proxy_prefix => '[' . $_[0]->plugin_name . '] ', }); }, ); 1; __END__ =pod =encoding UTF-8 =head1 NAME Pod::Weaver::Role::Plugin - a Pod::Weaver plugin =head1 VERSION version 4.015 =head1 ATTRIBUTES =head2 plugin_name This name must be unique among all other plugins loaded into a weaver. In general, this will be set up by the configuration reader. =head2 weaver This is the Pod::Weaver object into which the plugin was loaded. In general, this will be set up when the weaver is instantiated from config. =head1 IMPLEMENTING This is the most basic role that all plugins must perform. =head1 AUTHOR Ricardo SIGNES =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut version_t6-trial.out.pod100644000767000024 57113000276322 20340 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =head1 NAME Module::Name - abstract text =head1 VERSION 1.012078 FOOBAZ EXPLANATION This is a trial release. =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =cut Dialect.pm100644000767000024 253413000276322 20327 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/Weaver/Rolepackage Pod::Weaver::Role::Dialect; # ABSTRACT: something that translates Pod subdialects to standard Pod5 $Pod::Weaver::Role::Dialect::VERSION = '4.015'; use Moose::Role; with 'Pod::Weaver::Role::Plugin'; use namespace::autoclean; #pod =head1 IMPLEMENTING #pod #pod The Dialect role indicates that a plugin will be used to pre-process the input #pod Pod document before weaving begins. The plugin must provide a #pod C method which will be called with the input hashref's #pod C entry. It is expected to modify the document in place. #pod #pod =cut requires 'translate_dialect'; 1; __END__ =pod =encoding UTF-8 =head1 NAME Pod::Weaver::Role::Dialect - something that translates Pod subdialects to standard Pod5 =head1 VERSION version 4.015 =head1 IMPLEMENTING The Dialect role indicates that a plugin will be used to pre-process the input Pod document before weaving begins. The plugin must provide a C method which will be called with the input hashref's C entry. It is expected to modify the document in place. =head1 AUTHOR Ricardo SIGNES =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Section.pm100644000767000024 277713000276322 20377 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/Weaver/Rolepackage Pod::Weaver::Role::Section; # ABSTRACT: a plugin that will get a section into a woven document $Pod::Weaver::Role::Section::VERSION = '4.015'; use Moose::Role; with 'Pod::Weaver::Role::Plugin'; use namespace::autoclean; #pod =head1 IMPLEMENTING #pod #pod This role is used by plugins that will append sections to the output document. #pod They must provide a method, C which will be invoked like this: #pod #pod $section_plugin->weave_section($output_document, \%input); #pod #pod They are expected to append their output to the output document, but they are #pod free to behave differently if it's needed to do something really cool. #pod #pod =cut requires 'weave_section'; 1; __END__ =pod =encoding UTF-8 =head1 NAME Pod::Weaver::Role::Section - a plugin that will get a section into a woven document =head1 VERSION version 4.015 =head1 IMPLEMENTING This role is used by plugins that will append sections to the output document. They must provide a method, C which will be invoked like this: $section_plugin->weave_section($output_document, \%input); They are expected to append their output to the output document, but they are free to behave differently if it's needed to do something really cool. =head1 AUTHOR Ricardo SIGNES =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Section000755000767000024 013000276322 16763 5ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/WeaverBugs.pm100644000767000024 1215513000276322 20405 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/Weaver/Sectionpackage Pod::Weaver::Section::Bugs; # ABSTRACT: a section for bugtracker info $Pod::Weaver::Section::Bugs::VERSION = '4.015'; use Moose; use Text::Wrap (); with 'Pod::Weaver::Role::Section'; #pod =head1 OVERVIEW #pod #pod This section plugin will produce a hunk of Pod giving bug reporting #pod information for the document, like this: #pod #pod =head1 BUGS #pod #pod Please report any bugs or feature requests on the bugtracker website #pod http://rt.cpan.org/Dist/Display.html?Queue=Pod-Weaver #pod #pod When submitting a bug or request, please include a test-file or a #pod patch to an existing test-file that illustrates the bug or desired #pod feature. #pod #pod This plugin requires a C parameter containing a hash reference of #pod L distribution metadata and at least one of one of the #pod parameters C or C defined in #pod C<< $meta->{resources}{bugtracker} >>. #pod #pod =head2 Using Pod::Weaver::Section::Bugs with Dist::Zilla #pod #pod When the PodWeaver plugin is used, the C parameter comes from the #pod dist's distmeta data. Since this section is skipped when no bugtracker data is #pod in the distmeta, you'll need to make sure it's there. A number of plugins set #pod this data up automatically. To manually configure your bugtracker data, you #pod can add something like the following to C: #pod #pod [MetaResources] #pod bugtracker.web = http://rt.cpan.org/NoAuth/Bugs.html?Dist=Pod-Weaver-Example #pod bugtracker.mailto = bug-pod-weaver-example@rt.cpan.org #pod #pod ; Perhaps add repository stuff here: #pod repository.url = #pod repository.web = #pod repository.type = #pod #pod [PodWeaver] #pod #pod =attr header #pod #pod The title of the header to be added. #pod (default: "BUGS") #pod #pod =cut has header => ( is => 'ro', isa => 'Str', default => 'BUGS', ); sub weave_section { my ($self, $document, $input) = @_; unless (exists $input->{distmeta}{resources}{bugtracker}) { $self->log_debug('skipping section because there is no resources.bugtracker'); return; } my $bugtracker = $input->{distmeta}{resources}{bugtracker}; my ($web,$mailto) = @{$bugtracker}{qw/web mailto/}; unless (defined $web || defined $mailto) { $self->log_debug('skipping section because there is no web or mailto key under resources.bugtracker'); return; } my $text = "Please report any bugs or feature requests "; my $name = $self->header; if (defined $web) { $self->log_debug("including $web as bugtracker in $name section"); $text .= "on the bugtracker website L<$web>"; $text .= defined $mailto ? " or " : "\n"; } if (defined $mailto) { $self->log_debug("including $mailto as bugtracker in $name section"); $text .= "by email to L<$mailto|mailto:$mailto>\.\n"; } local $Text::Wrap::huge = 'overflow'; $text = Text::Wrap::wrap(q{}, q{}, $text); $text .= <<'HERE'; When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature. HERE push @{ $document->children }, Pod::Elemental::Element::Nested->new({ command => 'head1', content => $name, children => [ Pod::Elemental::Element::Pod5::Ordinary->new({ content => $text }), ], }); } __PACKAGE__->meta->make_immutable; 1; __END__ =pod =encoding UTF-8 =head1 NAME Pod::Weaver::Section::Bugs - a section for bugtracker info =head1 VERSION version 4.015 =head1 OVERVIEW This section plugin will produce a hunk of Pod giving bug reporting information for the document, like this: =head1 BUGS Please report any bugs or feature requests on the bugtracker website http://rt.cpan.org/Dist/Display.html?Queue=Pod-Weaver When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature. This plugin requires a C parameter containing a hash reference of L distribution metadata and at least one of one of the parameters C or C defined in C<< $meta->{resources}{bugtracker} >>. =head2 Using Pod::Weaver::Section::Bugs with Dist::Zilla When the PodWeaver plugin is used, the C parameter comes from the dist's distmeta data. Since this section is skipped when no bugtracker data is in the distmeta, you'll need to make sure it's there. A number of plugins set this data up automatically. To manually configure your bugtracker data, you can add something like the following to C: [MetaResources] bugtracker.web = http://rt.cpan.org/NoAuth/Bugs.html?Dist=Pod-Weaver-Example bugtracker.mailto = bug-pod-weaver-example@rt.cpan.org ; Perhaps add repository stuff here: repository.url = repository.web = repository.type = [PodWeaver] =head1 ATTRIBUTES =head2 header The title of the header to be added. (default: "BUGS") =head1 AUTHOR Ricardo SIGNES =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Name.pm100644000767000024 763413000276322 20353 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/Weaver/Sectionpackage Pod::Weaver::Section::Name; # ABSTRACT: add a NAME section with abstract (for your Perl module) $Pod::Weaver::Section::Name::VERSION = '4.015'; use Moose; with 'Pod::Weaver::Role::Section'; with 'Pod::Weaver::Role::StringFromComment'; #pod =head1 OVERVIEW #pod #pod This section plugin will produce a hunk of Pod giving the name of the document #pod as well as an abstract, like this: #pod #pod =head1 NAME #pod #pod Some::Document - a document for some #pod #pod It will determine the name and abstract by inspecting the C which #pod must be given. It looks for comments in the form: #pod #pod #pod # ABSTRACT: a document for some #pod # PODNAME: Some::Package::Name #pod #pod If no C comment is present, but a package declaration can be found, #pod the package name will be used as the document name. #pod #pod =attr header #pod #pod The title of the header to be added. #pod (default: "NAME") #pod #pod =cut has header => ( is => 'ro', isa => 'Str', default => 'NAME', ); use Pod::Elemental::Element::Pod5::Command; use Pod::Elemental::Element::Pod5::Ordinary; use Pod::Elemental::Element::Nested; sub _get_docname_via_statement { my ($self, $ppi_document) = @_; my $pkg_node = $ppi_document->find_first('PPI::Statement::Package'); return unless $pkg_node; return $pkg_node->namespace; } sub _get_docname_via_comment { my ($self, $ppi_document) = @_; return $self->_extract_comment_content($ppi_document, 'PODNAME'); } sub _get_docname { my ($self, $input) = @_; my $ppi_document = $input->{ppi_document}; my $docname = $self->_get_docname_via_comment($ppi_document) || $self->_get_docname_via_statement($ppi_document); return $docname; } sub _get_abstract { my ($self, $input) = @_; my $comment = $self->_extract_comment_content($input->{ppi_document}, 'ABSTRACT'); return $comment if $comment; # If that failed, fall back to searching the whole document my ($abstract) = $input->{ppi_document}->serialize =~ /^\s*#+\s*ABSTRACT:\s*(.+)$/m; return $abstract; } sub weave_section { my ($self, $document, $input) = @_; my $filename = $input->{filename} || 'file'; my $docname = $self->_get_docname($input); my $abstract = $self->_get_abstract($input); Carp::croak sprintf "couldn't determine document name for %s\nAdd something like this to %s:\n# PODNAME: bobby_tables.pl", $filename, $filename unless $docname; $self->log([ "couldn't find abstract in %s", $filename ]) unless $abstract; my $name = $docname; $name .= " - $abstract" if $abstract; $self->log_debug(qq{setting NAME to "$name"}); my $name_para = Pod::Elemental::Element::Nested->new({ command => 'head1', content => $self->header, children => [ Pod::Elemental::Element::Pod5::Ordinary->new({ content => $name }), ], }); push @{ $document->children }, $name_para; } __PACKAGE__->meta->make_immutable; 1; __END__ =pod =encoding UTF-8 =head1 NAME Pod::Weaver::Section::Name - add a NAME section with abstract (for your Perl module) =head1 VERSION version 4.015 =head1 OVERVIEW This section plugin will produce a hunk of Pod giving the name of the document as well as an abstract, like this: =head1 NAME Some::Document - a document for some It will determine the name and abstract by inspecting the C which must be given. It looks for comments in the form: # ABSTRACT: a document for some # PODNAME: Some::Package::Name If no C comment is present, but a package declaration can be found, the package name will be used as the document name. =head1 ATTRIBUTES =head2 header The title of the header to be added. (default: "NAME") =head1 AUTHOR Ricardo SIGNES =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Config000755000767000024 013000276322 16564 5ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/WeaverFinder.pm100644000767000024 140313000276322 20467 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/Weaver/Configpackage Pod::Weaver::Config::Finder; # ABSTRACT: the reader for weaver.ini files $Pod::Weaver::Config::Finder::VERSION = '4.015'; use Moose; extends 'Config::MVP::Reader::Finder'; with 'Pod::Weaver::Config'; use namespace::autoclean; sub default_search_path { return qw(Pod::Weaver::Config Config::MVP::Reader); } __PACKAGE__->meta->make_immutable; 1; __END__ =pod =encoding UTF-8 =head1 NAME Pod::Weaver::Config::Finder - the reader for weaver.ini files =head1 VERSION version 4.015 =head1 AUTHOR Ricardo SIGNES =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Preparer.pm100644000767000024 243713000276322 20544 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/Weaver/Rolepackage Pod::Weaver::Role::Preparer; # ABSTRACT: something that mucks about with the input before weaving begins $Pod::Weaver::Role::Preparer::VERSION = '4.015'; use Moose::Role; with 'Pod::Weaver::Role::Plugin'; use namespace::autoclean; #pod =head1 IMPLEMENTING #pod #pod The Preparer role indicates that a plugin will be used to pre-process the input #pod hashref before weaving begins. The plugin must provide a C #pod method which will be called with the input hashref. It is expected to modify #pod the input in place. #pod #pod =cut requires 'prepare_input'; 1; __END__ =pod =encoding UTF-8 =head1 NAME Pod::Weaver::Role::Preparer - something that mucks about with the input before weaving begins =head1 VERSION version 4.015 =head1 IMPLEMENTING The Preparer role indicates that a plugin will be used to pre-process the input hashref before weaving begins. The plugin must provide a C method which will be called with the input hashref. It is expected to modify the input in place. =head1 AUTHOR Ricardo SIGNES =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Legal.pm100644000767000024 611713000276322 20512 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/Weaver/Sectionpackage Pod::Weaver::Section::Legal; # ABSTRACT: a section for the copyright and license $Pod::Weaver::Section::Legal::VERSION = '4.015'; use Moose; with 'Pod::Weaver::Role::Section'; #pod =head1 OVERVIEW #pod #pod This section plugin will produce a hunk of Pod giving the copyright and license #pod information for the document, like this: #pod #pod =head1 COPYRIGHT AND LICENSE #pod #pod This document is copyright (C) 1991, Ricardo Signes. #pod #pod This document is available under the blah blah blah. #pod #pod This plugin will do nothing if no C input parameter is available. The #pod C is expected to be a L object. #pod #pod =cut #pod =attr license_file #pod #pod Specify the name of the license file and an extra line of text will be added #pod telling users to check the file for the full text of the license. #pod #pod Defaults to none. #pod #pod =attr header #pod #pod The title of the header to be added. #pod (default: "COPYRIGHT AND LICENSE") #pod #pod =cut has header => ( is => 'ro', isa => 'Str', default => 'COPYRIGHT AND LICENSE', ); has license_file => ( is => 'ro', isa => 'Str', predicate => '_has_license_file', ); sub weave_section { my ($self, $document, $input) = @_; unless ($input->{license}) { $self->log_debug('no license specified, not adding a ' . $self->header . ' section'); return; } my $notice = $input->{license}->notice; chomp $notice; if ( $self->_has_license_file ) { $notice .= "\n\nThe full text of the license can be found in the\nF<"; $notice .= $self->license_file . "> file included with this distribution."; } $self->log_debug('adding ' . $self->header . ' section'); push @{ $document->children }, Pod::Elemental::Element::Nested->new({ command => 'head1', content => $self->header, children => [ Pod::Elemental::Element::Pod5::Ordinary->new({ content => $notice }), ], }); } __PACKAGE__->meta->make_immutable; 1; __END__ =pod =encoding UTF-8 =head1 NAME Pod::Weaver::Section::Legal - a section for the copyright and license =head1 VERSION version 4.015 =head1 OVERVIEW This section plugin will produce a hunk of Pod giving the copyright and license information for the document, like this: =head1 COPYRIGHT AND LICENSE This document is copyright (C) 1991, Ricardo Signes. This document is available under the blah blah blah. This plugin will do nothing if no C input parameter is available. The C is expected to be a L object. =head1 ATTRIBUTES =head2 license_file Specify the name of the license file and an extra line of text will be added telling users to check the file for the full text of the license. Defaults to none. =head2 header The title of the header to be added. (default: "COPYRIGHT AND LICENSE") =head1 AUTHOR Ricardo SIGNES =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Finalizer.pm100644000767000024 256213000276322 20706 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/Weaver/Rolepackage Pod::Weaver::Role::Finalizer; # ABSTRACT: something that goes back and finishes up after main weaving is over $Pod::Weaver::Role::Finalizer::VERSION = '4.015'; use Moose::Role; with 'Pod::Weaver::Role::Plugin'; use namespace::autoclean; #pod =head1 IMPLEMENTING #pod #pod The Finalizer role indicates that a plugin will be used to post-process the #pod output document hashref after section weaving is completed. The plugin must #pod provide a C method which will be called as follows: #pod #pod $finalizer_plugin->finalize_document($document, \%input); #pod #pod =cut requires 'finalize_document'; 1; __END__ =pod =encoding UTF-8 =head1 NAME Pod::Weaver::Role::Finalizer - something that goes back and finishes up after main weaving is over =head1 VERSION version 4.015 =head1 IMPLEMENTING The Finalizer role indicates that a plugin will be used to post-process the output document hashref after section weaving is completed. The plugin must provide a C method which will be called as follows: $finalizer_plugin->finalize_document($document, \%input); =head1 AUTHOR Ricardo SIGNES =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Region.pm100644000767000024 1334313000276322 20730 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/Weaver/Sectionpackage Pod::Weaver::Section::Region; # ABSTRACT: find a region and put its contents in place where desired $Pod::Weaver::Section::Region::VERSION = '4.015'; use Moose; with 'Pod::Weaver::Role::Section'; #pod =head1 OVERVIEW #pod #pod This section will find and include a located hunk of Pod. In general, it will #pod find a region with the specified name, such as: #pod #pod =begin :myfoo #pod #pod =head1 More Pod Here #pod #pod =end :myfoo #pod #pod In other words, if your configuration include: #pod #pod [Region] #pod region_name = myfoo #pod #pod ...then this weaver will look for "=begin :myfoo" ( and "=for :myfoo" and... ) and include #pod it at the appropriate location in your output. #pod #pod Since you'll probably want to use Region several times, and that will require #pod giving each use a unique name, you can omit C if you provide a #pod plugin name, and it will default to the plugin name. In other words, the #pod configuration above could be specified just as: #pod #pod [Region / myfoo] #pod #pod If the C attribute is given, and true, then an exception will be #pod raised if this region can't be found. #pod #pod =cut use Pod::Elemental::Element::Pod5::Region; use Pod::Elemental::Selectors -all; use Pod::Elemental::Types qw(FormatName); #pod =attr required #pod #pod A boolean value specifying whether this region is required to be present or not. Defaults #pod to false. #pod #pod If it's enabled and the region can't be found an exception will be raised. #pod #pod =cut has required => ( is => 'ro', isa => 'Bool', default => 0, ); #pod =attr region_name #pod #pod The name of this region. Defaults to the plugin name. #pod #pod =cut has region_name => ( is => 'ro', isa => FormatName, lazy => 1, required => 1, default => sub { $_[0]->plugin_name }, ); #pod =attr allow_nonpod #pod #pod A boolean value specifying whether nonpod regions are allowed or not. Defaults to false. #pod #pod C regions are regions I a C<:> prefix as explained in #pod L<< perlpodspec|perlpodspec/About Data Paragraphs and "=begin/=end" Regions >> #pod #pod # region_name = myregion #pod # is_pod = false #pod =begin myregion #pod #pod # region_name = myregion #pod # is_pod = true #pod =begin :myregion #pod #pod =cut has allow_nonpod => ( is => 'ro', isa => 'Bool', default => 0, ); #pod =attr flatten #pod #pod A boolean value specifying whether the region's contents should be flattened or not. Defaults to true. #pod #pod #unflattened #pod =begin :myregion #pod #pod =head1 #pod #pod =end :myregion #pod #pod #flattened #pod =head1 #pod #pod =cut has flatten => ( is => 'ro', isa => 'Bool', default => 1, ); sub weave_section { my ($self, $document, $input) = @_; my @to_insert; my $idc = $input->{pod_document}->children; IDX: for (my $i = 0; $i < @$idc; $i++) { next unless my $para = $idc->[ $i ]; next unless $para->isa('Pod::Elemental::Element::Pod5::Region') and $para->format_name eq $self->region_name; next if !$self->allow_nonpod and !$para->is_pod; if ( $self->flatten ) { push @to_insert, @{ $para->children }; } else { push @to_insert, $para; } splice @$idc, $i, 1; redo IDX; } confess "Couldn't find required Region for " . $self->region_name . " in file " . (defined $input->{filename} ? $input->{filename} : '') if $self->required and not @to_insert; my $verb = $self->flatten ? 'flattening' : 'inserting'; $self->log_debug($verb . q{ } . $self->region_name . ' into pod'); push @{ $document->children }, @to_insert; } __PACKAGE__->meta->make_immutable; 1; __END__ =pod =encoding UTF-8 =head1 NAME Pod::Weaver::Section::Region - find a region and put its contents in place where desired =head1 VERSION version 4.015 =head1 OVERVIEW This section will find and include a located hunk of Pod. In general, it will find a region with the specified name, such as: =begin :myfoo =head1 More Pod Here =end :myfoo In other words, if your configuration include: [Region] region_name = myfoo ...then this weaver will look for "=begin :myfoo" ( and "=for :myfoo" and... ) and include it at the appropriate location in your output. Since you'll probably want to use Region several times, and that will require giving each use a unique name, you can omit C if you provide a plugin name, and it will default to the plugin name. In other words, the configuration above could be specified just as: [Region / myfoo] If the C attribute is given, and true, then an exception will be raised if this region can't be found. =head1 ATTRIBUTES =head2 required A boolean value specifying whether this region is required to be present or not. Defaults to false. If it's enabled and the region can't be found an exception will be raised. =head2 region_name The name of this region. Defaults to the plugin name. =head2 allow_nonpod A boolean value specifying whether nonpod regions are allowed or not. Defaults to false. C regions are regions I a C<:> prefix as explained in L<< perlpodspec|perlpodspec/About Data Paragraphs and "=begin/=end" Regions >> # region_name = myregion # is_pod = false =begin myregion # region_name = myregion # is_pod = true =begin :myregion =head2 flatten A boolean value specifying whether the region's contents should be flattened or not. Defaults to true. #unflattened =begin :myregion =head1 =end :myregion #flattened =head1 =head1 AUTHOR Ricardo SIGNES =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut release000755000767000024 013000276322 14711 5ustar00rjbsstaff000000000000Pod-Weaver-4.015/xtchanges_has_content.t100644000767000024 201113000276322 21225 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/xt/release#!perl use Test::More tests => 2; note 'Checking Changes'; my $changes_file = 'Changes'; my $newver = '4.015'; my $trial_token = '-TRIAL'; SKIP: { ok(-e $changes_file, "$changes_file file exists") or skip 'Changes is missing', 1; ok(_get_changes($newver), "$changes_file has content for $newver"); } done_testing; # _get_changes copied and adapted from Dist::Zilla::Plugin::Git::Commit # by Jerome Quelin sub _get_changes { my $newver = shift; # parse changelog to find commit message open(my $fh, '<', $changes_file) or die "cannot open $changes_file: $!"; my $changelog = join('', <$fh>); close $fh; my @content = grep { /^$newver(?:$trial_token)?(?:\s+|$)/ ... /^\S/ } # from newver to un-indented split /\n/, $changelog; shift @content; # drop the version line # drop unindented last line and trailing blank lines pop @content while ( @content && $content[-1] =~ /^(?:\S|\s*$)/ ); # return number of non-blank lines return scalar @content; } Plugin000755000767000024 013000276322 16615 5ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/WeaverH1Nester.pm100644000767000024 272413000276322 20751 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/Weaver/Pluginpackage Pod::Weaver::Plugin::H1Nester; # ABSTRACT: structure the input pod document into head1-grouped sections $Pod::Weaver::Plugin::H1Nester::VERSION = '4.015'; use Moose; with 'Pod::Weaver::Role::Transformer'; use namespace::autoclean; use Pod::Elemental::Selectors -all; use Pod::Elemental::Transformer::Nester; #pod =head1 OVERVIEW #pod #pod This plugin is very, very simple: it uses the #pod L to restructure the document under its #pod C<=head1> elements. #pod #pod =cut sub transform_document { my ($self, $document) = @_; my $nester = Pod::Elemental::Transformer::Nester->new({ top_selector => s_command([ qw(head1) ]), content_selectors => [ s_flat, s_command( [ qw(head2 head3 head4 over item back) ]), ], }); $nester->transform_node($document); return; } __PACKAGE__->meta->make_immutable; 1; __END__ =pod =encoding UTF-8 =head1 NAME Pod::Weaver::Plugin::H1Nester - structure the input pod document into head1-grouped sections =head1 VERSION version 4.015 =head1 OVERVIEW This plugin is very, very simple: it uses the L to restructure the document under its C<=head1> elements. =head1 AUTHOR Ricardo SIGNES =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Authors.pm100644000767000024 551313000276322 21112 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/Weaver/Sectionpackage Pod::Weaver::Section::Authors; # ABSTRACT: a section listing authors $Pod::Weaver::Section::Authors::VERSION = '4.015'; use Moose; with 'Pod::Weaver::Role::Section'; use Pod::Elemental::Element::Nested; use Pod::Elemental::Element::Pod5::Verbatim; #pod =head1 OVERVIEW #pod #pod This section adds a listing of the documents authors. It expects a C #pod input parameter to be an arrayref of strings. If no C parameter is #pod given, it will do nothing. Otherwise, it produces a hunk like this: #pod #pod =head1 AUTHORS #pod #pod Author One #pod Author Two #pod #pod =attr header #pod #pod The title of the header to be added. #pod (default: "AUTHOR" or "AUTHORS") #pod #pod =cut has header => ( is => 'ro', isa => 'Maybe[Str]', ); sub weave_section { my ($self, $document, $input) = @_; return unless $input->{authors}; my $multiple_authors = @{ $input->{authors} } > 1; # I think I might like to have header be a callback or something, so that you # can get pluralization for your own custom header. -- rjbs, 2015-03-17 my $name = $self->header || ($multiple_authors ? 'AUTHORS' : 'AUTHOR'); $self->log_debug("adding $name section"); $self->log_debug("author = $_") for @{ $input->{authors} }; my $authors = [ map { Pod::Elemental::Element::Pod5::Ordinary->new({ content => $_, }), } @{ $input->{authors} } ]; $authors = [ Pod::Elemental::Element::Pod5::Command->new({ command => 'over', content => '4', }), ( map { Pod::Elemental::Element::Pod5::Command->new({ command => 'item', content => '*', }), $_, } @$authors ), Pod::Elemental::Element::Pod5::Command->new({ command => 'back', content => '', }), ] if $multiple_authors; push @{$document->children }, Pod::Elemental::Element::Nested->new({ type => 'command', command => 'head1', content => $name, children => $authors, }); } __PACKAGE__->meta->make_immutable; 1; __END__ =pod =encoding UTF-8 =head1 NAME Pod::Weaver::Section::Authors - a section listing authors =head1 VERSION version 4.015 =head1 OVERVIEW This section adds a listing of the documents authors. It expects a C input parameter to be an arrayref of strings. If no C parameter is given, it will do nothing. Otherwise, it produces a hunk like this: =head1 AUTHORS Author One Author Two =head1 ATTRIBUTES =head2 header The title of the header to be added. (default: "AUTHOR" or "AUTHORS") =head1 AUTHOR Ricardo SIGNES =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Collect.pm100644000767000024 1212513000276322 21067 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/Weaver/Sectionpackage Pod::Weaver::Section::Collect; # ABSTRACT: a section that gathers up specific commands $Pod::Weaver::Section::Collect::VERSION = '4.015'; use Moose; with 'Pod::Weaver::Role::Section'; with 'Pod::Weaver::Role::Transformer'; #pod =head1 OVERVIEW #pod #pod Given the configuration: #pod #pod [Collect / METHODS] #pod command = method #pod #pod This plugin will start off by gathering and nesting any C<=method> commands #pod found in the C. Those commands, along with their nestable #pod content, will be collected under a C<=head1 METHODS> header and placed in the #pod correct location in the output stream. Their order will be preserved as it was #pod in the source document. #pod #pod =cut use Pod::Elemental::Element::Pod5::Region; use Pod::Elemental::Selectors -all; use List::Util 1.33 'any'; #pod =attr command #pod #pod The command that will be collected (e.g. C or C). #pod (required) #pod #pod =attr new_command #pod #pod The command to be used in the output instead of the collected command. #pod (default: C) #pod #pod =attr header_command #pod #pod The section command for the section to be added. #pod (default: C) #pod #pod =attr header #pod #pod The title of the section to be added. #pod (default: the plugin name) #pod #pod =cut has command => ( is => 'ro', isa => 'Str', required => 1, ); has new_command => ( is => 'ro', isa => 'Str', required => 1, default => 'head2', ); has header_command => ( is => 'ro', isa => 'Str', required => 1, default => 'head1', ); has header => ( is => 'ro', isa => 'Str', lazy => 1, required => 1, default => sub { $_[0]->plugin_name }, ); use Pod::Elemental::Transformer::Gatherer; use Pod::Elemental::Transformer::Nester; has __used_container => (is => 'rw'); sub transform_document { my ($self, $document) = @_; my $command = $self->command; my $selector = s_command($command); my $children = $document->children; unless (any { $selector->($_) } @$children) { $self->log_debug("no $command commands in pod to collect"); return; } $self->log_debug("transforming $command commands into standard pod"); my $nester = Pod::Elemental::Transformer::Nester->new({ top_selector => $selector, content_selectors => [ s_command([ qw(head3 head4 over item back) ]), s_flat, ], }); # try and find array position of suitable host my ( $container_id ) = grep { my $c = $children->[$_]; $c->isa("Pod::Elemental::Element::Nested") and $c->command eq $self->header_command and $c->content eq $self->header; } 0 .. $#$children; my $container = $container_id ? splice @{ $children }, $container_id, 1 # excise host : Pod::Elemental::Element::Nested->new({ # synthesize new host command => $self->header_command, content => $self->header, }); $self->__used_container($container); my $gatherer = Pod::Elemental::Transformer::Gatherer->new({ gather_selector => $selector, container => $container, }); $nester->transform_node($document); my @children = @{$container->children}; # rescue children $gatherer->transform_node($document); # insert host at position of first adopt-child and inject it with adopt-children foreach my $child (@{ $container->children }) { $child->command( $self->new_command ) if $child->command eq $command; } unshift @{$container->children}, @children; # give original children back to host } sub weave_section { my ($self, $document, $input) = @_; return unless $self->__used_container; my $in_node = $input->{pod_document}->children; my @found = grep { my ($i, $para) = ($_, $in_node->[$_]); ($para == $self->__used_container) && @{ $self->__used_container->children }; } (0 .. $#$in_node); push @{ $document->children }, map { splice @$in_node, $_, 1 } reverse @found; } __PACKAGE__->meta->make_immutable; 1; __END__ =pod =encoding UTF-8 =head1 NAME Pod::Weaver::Section::Collect - a section that gathers up specific commands =head1 VERSION version 4.015 =head1 OVERVIEW Given the configuration: [Collect / METHODS] command = method This plugin will start off by gathering and nesting any C<=method> commands found in the C. Those commands, along with their nestable content, will be collected under a C<=head1 METHODS> header and placed in the correct location in the output stream. Their order will be preserved as it was in the source document. =head1 ATTRIBUTES =head2 command The command that will be collected (e.g. C or C). (required) =head2 new_command The command to be used in the output instead of the collected command. (default: C) =head2 header_command The section command for the section to be added. (default: C) =head2 header The title of the section to be added. (default: the plugin name) =head1 AUTHOR Ricardo SIGNES =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Generic.pm100644000767000024 756513000276322 21052 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/Weaver/Sectionpackage Pod::Weaver::Section::Generic; # ABSTRACT: a generic section, found by lifting sections $Pod::Weaver::Section::Generic::VERSION = '4.015'; use Moose; with 'Pod::Weaver::Role::Section'; #pod =head1 OVERVIEW #pod #pod This section will find and include a located hunk of Pod. In general, it will #pod find a C<=head1> command with a content of the plugin's name. #pod #pod In other words, if your configuration include: #pod #pod [Generic] #pod header = OVERVIEW #pod #pod ...then this weaver will look for "=head1 OVERVIEW" and include it at the #pod appropriate location in your output. #pod #pod Since you'll probably want to use Generic several times, and that will require #pod giving each use a unique name, you can omit C
if you provide a #pod plugin name, and it will default to the plugin name. In other words, the #pod configuration above could be specified just as: #pod #pod [Generic / OVERVIEW] #pod #pod If the C attribute is given, and true, then an exception will be #pod raised if this section can't be found. #pod #pod =cut use Pod::Elemental::Element::Pod5::Region; use Pod::Elemental::Selectors -all; #pod =attr required #pod #pod A boolean value specifying whether this section is required to be present or not. Defaults #pod to false. #pod #pod If it's enabled and the section can't be found an exception will be raised. #pod #pod =cut has required => ( is => 'ro', isa => 'Bool', default => 0, ); #pod =attr header #pod #pod The name of this section. Defaults to the plugin name. #pod #pod =cut has header => ( is => 'ro', isa => 'Str', lazy => 1, default => sub { $_[0]->plugin_name }, ); has selector => ( is => 'ro', isa => 'CodeRef', lazy => 1, default => sub { my ($self) = @_; return sub { return unless s_command(head1 => $_[0]); return unless $_[0]->content eq $self->header; }; }, ); sub weave_section { my ($self, $document, $input) = @_; my $in_node = $input->{pod_document}->children; my @found = grep { $self->selector->($in_node->[$_]); } (0 .. $#$in_node); confess "Couldn't find required Generic section for " . $self->header . " in file " . (defined $input->{filename} ? $input->{filename} : '') if $self->required and not @found; $self->log_debug('adding ' . $self->header . ' back into pod'); push @{ $document->children }, map { splice @$in_node, $_, 1 } reverse @found; } __PACKAGE__->meta->make_immutable; 1; __END__ =pod =encoding UTF-8 =head1 NAME Pod::Weaver::Section::Generic - a generic section, found by lifting sections =head1 VERSION version 4.015 =head1 OVERVIEW This section will find and include a located hunk of Pod. In general, it will find a C<=head1> command with a content of the plugin's name. In other words, if your configuration include: [Generic] header = OVERVIEW ...then this weaver will look for "=head1 OVERVIEW" and include it at the appropriate location in your output. Since you'll probably want to use Generic several times, and that will require giving each use a unique name, you can omit C
if you provide a plugin name, and it will default to the plugin name. In other words, the configuration above could be specified just as: [Generic / OVERVIEW] If the C attribute is given, and true, then an exception will be raised if this section can't be found. =head1 ATTRIBUTES =head2 required A boolean value specifying whether this section is required to be present or not. Defaults to false. If it's enabled and the section can't be found an exception will be raised. =head2 header The name of this section. Defaults to the plugin name. =head1 AUTHOR Ricardo SIGNES =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Version.pm100644000767000024 2067613000276322 21141 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/Weaver/Sectionpackage Pod::Weaver::Section::Version; # ABSTRACT: add a VERSION pod section $Pod::Weaver::Section::Version::VERSION = '4.015'; use Moose; with 'Pod::Weaver::Role::Section'; with 'Pod::Weaver::Role::StringFromComment'; use Module::Runtime qw(use_module); use namespace::autoclean; #pod =head1 OVERVIEW #pod #pod This section plugin will produce a hunk of Pod meant to indicate the version of #pod the document being viewed, like this: #pod #pod =head1 VERSION #pod #pod version 1.234 #pod #pod It will do nothing if there is no C entry in the input. #pod #pod =attr header #pod #pod The title of the header to be added. #pod (default: "VERSION") #pod #pod =cut has header => ( is => 'ro', isa => 'Str', default => 'VERSION', ); use DateTime; use Moose::Util::TypeConstraints; my $MARKER; BEGIN { $MARKER = "\x{2316}" } use String::Formatter 0.100680 stringf => { -as => '_format_version', input_processor => 'require_single_input', string_replacer => 'method_replace', codes => { v => sub { $_[0]->{version} }, V => sub { $_[0]->{version} . ($_[0]->{is_trial} ? (defined $_[1] ? $_[1] : '-TRIAL') : '') }, d => sub { use_module( 'DateTime', '0.44' ); # CLDR fixes DateTime->from_epoch(epoch => $^T, time_zone => $_[0]->{self}->time_zone) ->format_cldr($_[1]), }, r => sub { $_[0]->{zilla}->name }, m => sub { return $_[0]->{module} if defined $_[0]->{module}; $_[0]->{self}->log_fatal([ "%%m format used for Version section, but no package declaration found in %s", $_[0]->{filename}, ]); }, T => sub { $MARKER }, n => sub { "\n" }, s => sub { q{ } }, t => sub { "\t" }, }, }; # Needed by Config::MVP. sub mvp_multivalue_args { 'format' } #pod =attr format #pod #pod The string to use when generating the version string. #pod #pod Default: version %v #pod #pod The following variables are available: #pod #pod =begin :list #pod #pod * v - the version #pod #pod * V - the version, suffixed by "-TRIAL" if a trial release #pod #pod * d - the CLDR format for L #pod #pod * n - a newline #pod #pod * t - a tab #pod #pod * s - a space #pod #pod * r - the name of the dist, present only if you use L to generate #pod the POD! #pod #pod * m - the name of the module, present only if L parsed the document and it #pod contained a package declaration! #pod #pod * T - special: at the beginning of the line, followed by any amount of #pod whitespace, indicates that the line should only be included in trial #pod releases; otherwise, results in a fatal error #pod #pod =end :list #pod #pod If multiple strings are supplied as an array ref, a line of POD is #pod produced for each string. Each line will be separated by a newline. #pod This is useful for splitting longer text across multiple lines in a #pod C file, for example: #pod #pod ; weaver.ini #pod [Version] #pod format = version %v #pod format = #pod format = This module's version numbers follow the conventions described at #pod format = L. #pod format = %T #pod format = %T This is a trial release! #pod #pod =cut subtype 'Pod::Weaver::Section::Version::_Format', as 'ArrayRef[Str]'; coerce 'Pod::Weaver::Section::Version::_Format', from 'Str', via { [ $_ ] }; has format => ( is => 'ro', isa => 'Pod::Weaver::Section::Version::_Format', coerce => 1, default => 'version %v', ); #pod =attr is_verbatim #pod #pod A boolean value specifying whether the version paragraph should be verbatim or not. #pod #pod Default: false #pod #pod =cut has is_verbatim => ( is => 'ro', isa => 'Bool', default => 0, ); #pod =attr time_zone #pod #pod The timezone to use when using L for the format. #pod #pod Default: local #pod #pod =cut has time_zone => ( is => 'ro', isa => 'Str', # should be more validated later -- apocal default => 'local', ); #pod =method build_content #pod #pod my @pod_elements = $section->build_content(\%input); #pod #pod This method is passed the same C<\%input> that goes to the C #pod method, and should return a list of pod elements to insert. #pod #pod In almost all cases, this method is used internally, but could be usefully #pod overridden in a subclass. #pod #pod =cut sub build_content { my ($self, $input) = @_; return unless $input->{version}; my %args = ( self => $self, version => $input->{version}, filename => $input->{filename}, ); $args{zilla} = $input->{zilla} if exists $input->{zilla}; $args{is_trial} = exists $input->{is_trial} ? $input->{is_trial} : $args{zilla} ? $args{zilla}->is_trial : undef; if ( exists $input->{ppi_document} ) { my $pkg_node = $input->{ppi_document}->find_first('PPI::Statement::Package'); $args{module} = $pkg_node ? $pkg_node->namespace : $self->_extract_comment_content($input->{ppi_document}, 'PODNAME') ; } my $content = q{}; LINE: for my $format (@{ $self->format }) { my $line = _format_version($format, \%args); next if $line =~ s/^$MARKER\s*// and ! $args{is_trial}; Carp::croak("%T format used inside line") if $line =~ /$MARKER/; $content .= "$line\n"; } if ( $self->is_verbatim ) { $content = Pod::Elemental::Element::Pod5::Verbatim->new({ content => " $content", }); } else { $content = Pod::Elemental::Element::Pod5::Ordinary->new({ content => $content, }); } return ($content); } sub weave_section { my ($self, $document, $input) = @_; return unless $input->{version}; my @content = $self->build_content($input); $self->log_debug('adding ' . $self->header . ' section to pod'); push @{ $document->children }, Pod::Elemental::Element::Nested->new({ command => 'head1', content => $self->header, children => \@content, }); } __PACKAGE__->meta->make_immutable; 1; __END__ =pod =encoding UTF-8 =head1 NAME Pod::Weaver::Section::Version - add a VERSION pod section =head1 VERSION version 4.015 =head1 OVERVIEW This section plugin will produce a hunk of Pod meant to indicate the version of the document being viewed, like this: =head1 VERSION version 1.234 It will do nothing if there is no C entry in the input. =head1 ATTRIBUTES =head2 header The title of the header to be added. (default: "VERSION") =head2 format The string to use when generating the version string. Default: version %v The following variables are available: =over 4 =item * v - the version =item * V - the version, suffixed by "-TRIAL" if a trial release =item * d - the CLDR format for L =item * n - a newline =item * t - a tab =item * s - a space =item * r - the name of the dist, present only if you use L to generate the POD! =item * m - the name of the module, present only if L parsed the document and it contained a package declaration! =item * T - special: at the beginning of the line, followed by any amount of whitespace, indicates that the line should only be included in trial releases; otherwise, results in a fatal error =back If multiple strings are supplied as an array ref, a line of POD is produced for each string. Each line will be separated by a newline. This is useful for splitting longer text across multiple lines in a C file, for example: ; weaver.ini [Version] format = version %v format = format = This module's version numbers follow the conventions described at format = L. format = %T format = %T This is a trial release! =head2 is_verbatim A boolean value specifying whether the version paragraph should be verbatim or not. Default: false =head2 time_zone The timezone to use when using L for the format. Default: local =head1 METHODS =head2 build_content my @pod_elements = $section->build_content(\%input); This method is passed the same C<\%input> that goes to the C method, and should return a list of pod elements to insert. In almost all cases, this method is used internally, but could be usefully overridden in a subclass. =head1 AUTHOR Ricardo SIGNES =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Assembler.pm100644000767000024 202213000276322 21173 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/Weaver/Configpackage Pod::Weaver::Config::Assembler; # ABSTRACT: Pod::Weaver-specific subclass of Config::MVP::Assembler $Pod::Weaver::Config::Assembler::VERSION = '4.015'; use Moose; extends 'Config::MVP::Assembler'; with 'Config::MVP::Assembler::WithBundles'; use String::RewritePrefix; use namespace::autoclean; sub expand_package { my $str = $_[1]; return scalar String::RewritePrefix->rewrite( { '' => 'Pod::Weaver::Section::', '-' => 'Pod::Weaver::Plugin::', '@' => 'Pod::Weaver::PluginBundle::', '=' => '', }, $str, ); } __PACKAGE__->meta->make_immutable; 1; __END__ =pod =encoding UTF-8 =head1 NAME Pod::Weaver::Config::Assembler - Pod::Weaver-specific subclass of Config::MVP::Assembler =head1 VERSION version 4.015 =head1 AUTHOR Ricardo SIGNES =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Transformer.pm100644000767000024 247313000276322 21266 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/Weaver/Rolepackage Pod::Weaver::Role::Transformer; # ABSTRACT: something that restructures a Pod5 document $Pod::Weaver::Role::Transformer::VERSION = '4.015'; use Moose::Role; with 'Pod::Weaver::Role::Plugin'; use namespace::autoclean; #pod =head1 IMPLEMENTING #pod #pod The Transformer role indicates that a plugin will be used to pre-process the input #pod hashref's Pod document before weaving begins. The plugin must provide a #pod C method which will be called with the input Pod document. #pod It is expected to modify the input in place. #pod #pod =cut requires 'transform_document'; 1; __END__ =pod =encoding UTF-8 =head1 NAME Pod::Weaver::Role::Transformer - something that restructures a Pod5 document =head1 VERSION version 4.015 =head1 IMPLEMENTING The Transformer role indicates that a plugin will be used to pre-process the input hashref's Pod document before weaving begins. The plugin must provide a C method which will be called with the input Pod document. It is expected to modify the input in place. =head1 AUTHOR Ricardo SIGNES =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut EnsurePod5.pm100644000767000024 377113000276322 21314 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/Weaver/Pluginpackage Pod::Weaver::Plugin::EnsurePod5; # ABSTRACT: ensure that the Pod5 translator has been run on this document $Pod::Weaver::Plugin::EnsurePod5::VERSION = '4.015'; use Moose; with 'Pod::Weaver::Role::Preparer'; use namespace::autoclean; use Pod::Elemental::Transformer::Pod5; #pod =head1 OVERVIEW #pod #pod This plugin is very, very simple: it runs the Pod5 transformer on the input #pod document and removes any leftover whitespace-only Nonpod elements. If #pod non-whitespace-only Nonpod elements are found, an exception is raised. #pod #pod =cut sub _strip_nonpod { my ($self, $node) = @_; # XXX: This is really stupid. -- rjbs, 2009-10-24 foreach my $i (reverse 0 .. $#{ $node->children }) { my $para = $node->children->[$i]; if ($para->isa('Pod::Elemental::Element::Pod5::Nonpod')) { if ($para->content !~ /\S/) { splice @{ $node->children }, $i, 1 } else { confess "can't cope with a Nonpod element with non-whitespace content"; } } elsif ($para->does('Pod::Elemental::Node')) { $self->_strip_nonpod($para); } } } sub prepare_input { my ($self, $input) = @_; my $pod_document = $input->{pod_document}; Pod::Elemental::Transformer::Pod5->new->transform_node($pod_document); $self->_strip_nonpod($pod_document); return; } __PACKAGE__->meta->make_immutable; 1; __END__ =pod =encoding UTF-8 =head1 NAME Pod::Weaver::Plugin::EnsurePod5 - ensure that the Pod5 translator has been run on this document =head1 VERSION version 4.015 =head1 OVERVIEW This plugin is very, very simple: it runs the Pod5 transformer on the input document and removes any leftover whitespace-only Nonpod elements. If non-whitespace-only Nonpod elements are found, an exception is raised. =head1 AUTHOR Ricardo SIGNES =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Leftovers.pm100644000767000024 511313000276322 21432 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/Weaver/Sectionpackage Pod::Weaver::Section::Leftovers; # ABSTRACT: a place to put everything that nothing else used $Pod::Weaver::Section::Leftovers::VERSION = '4.015'; use Moose; with( 'Pod::Weaver::Role::Section', 'Pod::Weaver::Role::Finalizer', ); #pod =head1 OVERVIEW #pod #pod This section plugin is used to designate where in the output sequence all #pod unused parts of the input C should be placed. #pod #pod Other section plugins are expected to remove from the input Pod document any #pod sections that are consumed. At the end of all section weaving, the Leftovers #pod section will inject any leftover input Pod into its position in the output #pod document. #pod #pod =cut use Pod::Elemental::Element::Pod5::Region; use Pod::Elemental::Types qw(FormatName); has _marker => ( is => 'ro', isa => FormatName, init_arg => undef, default => sub { my ($self) = @_; my $str = sprintf '%s_%s', ref($self), 0+$self; $str =~ s/\W/_/g; return $str; } ); sub weave_section { my ($self, $document, $input) = @_; my $placeholder = Pod::Elemental::Element::Pod5::Region->new({ is_pod => 0, format_name => $self->_marker, content => '', }); push @{ $document->children }, $placeholder; } sub finalize_document { my ($self, $document, $input) = @_; my $children = $input->{pod_document}->children; $input->{pod_document}->children([]); INDEX: for my $i (0 .. @{ $document->children } - 1) { my $para = $document->children->[$i]; next unless $para->isa('Pod::Elemental::Element::Pod5::Region') and $para->format_name eq $self->_marker; $self->log_debug('splicing leftovers back into pod'); splice @{ $document->children }, $i, 1, @$children; last INDEX; } } __PACKAGE__->meta->make_immutable; 1; __END__ =pod =encoding UTF-8 =head1 NAME Pod::Weaver::Section::Leftovers - a place to put everything that nothing else used =head1 VERSION version 4.015 =head1 OVERVIEW This section plugin is used to designate where in the output sequence all unused parts of the input C should be placed. Other section plugins are expected to remove from the input Pod document any sections that are consumed. At the end of all section weaving, the Leftovers section will inject any leftover input Pod into its position in the output document. =head1 AUTHOR Ricardo SIGNES =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut version_without_package.in.pod100644000767000024 40613000276322 21650 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =cut Transformer.pm100644000767000024 526313000276322 21623 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/Weaver/Pluginpackage Pod::Weaver::Plugin::Transformer; # ABSTRACT: apply arbitrary transformers $Pod::Weaver::Plugin::Transformer::VERSION = '4.015'; use Moose; with 'Pod::Weaver::Role::Dialect'; use namespace::autoclean; use Module::Runtime qw(use_module); use List::MoreUtils qw(part); use String::RewritePrefix; #pod =head1 OVERVIEW #pod #pod This plugin acts as a L that applies an arbitrary #pod L to your input document. It is configured like #pod this: #pod #pod [-Transformer / Lists] #pod transformer = List #pod format_name = outline #pod #pod This will end up creating a transformer like this: #pod #pod my $xform = Pod::Elemental::Transformer::List->new({ #pod format_name => 'outline', #pod }); #pod #pod and that transformer will then be handed the entire input Pod document. #pod #pod =cut has transformer => (is => 'ro', required => 1); sub BUILDARGS { my ($class, @arg) = @_; my %copy = ref $arg[0] ? %{$arg[0]} : @arg; my @part = part { /\A\./ ? 0 : 1 } keys %copy; my %class_args = map { s/\A\.//; $_ => $copy{ ".$_" } } @{ $part[0] }; my %xform_args = map { $_ => $copy{ $_ } } @{ $part[1] }; my $xform_class = String::RewritePrefix->rewrite( { '' => 'Pod::Elemental::Transformer::', '=' => '' }, delete $xform_args{transformer}, ); use_module($xform_class); my $plugin_name = delete $xform_args{plugin_name}; my $weaver = delete $xform_args{weaver}; my $xform = $xform_class->new(\%xform_args); return { %class_args, plugin_name => $plugin_name, weaver => $weaver, transformer => $xform, } } sub translate_dialect { my ($self, $pod_document) = @_; $self->log_debug('applying transform'); $self->transformer->transform_node( $pod_document ); } __PACKAGE__->meta->make_immutable; 1; __END__ =pod =encoding UTF-8 =head1 NAME Pod::Weaver::Plugin::Transformer - apply arbitrary transformers =head1 VERSION version 4.015 =head1 OVERVIEW This plugin acts as a L that applies an arbitrary L to your input document. It is configured like this: [-Transformer / Lists] transformer = List format_name = outline This will end up creating a transformer like this: my $xform = Pod::Elemental::Transformer::List->new({ format_name => 'outline', }); and that transformer will then be handed the entire input Pod document. =head1 AUTHOR Ricardo SIGNES =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut version_without_package.out.pod100644000767000024 52313000276322 22051 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/t/eg=pod =head1 NAME Module::Name - abstract text =head1 VERSION version 1.012078 =head1 DESCRIPTION This is a simple document meant to be used in testing Pod::Weaver. It does not do very much. =head1 BE FOREWARNED This is not supported: much at all Happy hacking! =head1 SYNOPSIS This should probably get moved up front. =cut PluginBundle000755000767000024 013000276322 17747 5ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/WeaverDefault.pm100644000767000024 612113000276322 22031 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/Weaver/PluginBundleuse strict; use warnings; package Pod::Weaver::PluginBundle::Default; # ABSTRACT: a bundle for the most commonly-needed prep work for a pod document $Pod::Weaver::PluginBundle::Default::VERSION = '4.015'; #pod =head1 OVERVIEW #pod #pod This is the bundle used by default (specifically by Pod::Weaver's #pod C method). It may change over time, but should remain #pod fairly conservative and straightforward. #pod #pod It is nearly equivalent to the following: #pod #pod [@CorePrep] #pod #pod [-SingleEncoding] #pod #pod [Name] #pod [Version] #pod #pod [Region / prelude] #pod #pod [Generic / SYNOPSIS] #pod [Generic / DESCRIPTION] #pod [Generic / OVERVIEW] #pod #pod [Collect / ATTRIBUTES] #pod command = attr #pod #pod [Collect / METHODS] #pod command = method #pod #pod [Collect / FUNCTIONS] #pod command = func #pod #pod [Leftovers] #pod #pod [Region / postlude] #pod #pod [Authors] #pod [Legal] #pod #pod =cut use namespace::autoclean; use Pod::Weaver::Config::Assembler; sub _exp { Pod::Weaver::Config::Assembler->expand_package($_[0]) } sub mvp_bundle_config { return ( [ '@Default/CorePrep', _exp('@CorePrep'), {} ], [ '@Default/SingleEncoding', _exp('-SingleEncoding'), {} ], [ '@Default/Name', _exp('Name'), {} ], [ '@Default/Version', _exp('Version'), {} ], [ '@Default/prelude', _exp('Region'), { region_name => 'prelude' } ], [ 'SYNOPSIS', _exp('Generic'), {} ], [ 'DESCRIPTION', _exp('Generic'), {} ], [ 'OVERVIEW', _exp('Generic'), {} ], [ 'ATTRIBUTES', _exp('Collect'), { command => 'attr' } ], [ 'METHODS', _exp('Collect'), { command => 'method' } ], [ 'FUNCTIONS', _exp('Collect'), { command => 'func' } ], [ '@Default/Leftovers', _exp('Leftovers'), {} ], [ '@Default/postlude', _exp('Region'), { region_name => 'postlude' } ], [ '@Default/Authors', _exp('Authors'), {} ], [ '@Default/Legal', _exp('Legal'), {} ], ) } 1; __END__ =pod =encoding UTF-8 =head1 NAME Pod::Weaver::PluginBundle::Default - a bundle for the most commonly-needed prep work for a pod document =head1 VERSION version 4.015 =head1 OVERVIEW This is the bundle used by default (specifically by Pod::Weaver's C method). It may change over time, but should remain fairly conservative and straightforward. It is nearly equivalent to the following: [@CorePrep] [-SingleEncoding] [Name] [Version] [Region / prelude] [Generic / SYNOPSIS] [Generic / DESCRIPTION] [Generic / OVERVIEW] [Collect / ATTRIBUTES] command = attr [Collect / METHODS] command = method [Collect / FUNCTIONS] command = func [Leftovers] [Region / postlude] [Authors] [Legal] =head1 AUTHOR Ricardo SIGNES =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut SingleEncoding.pm100644000767000024 725113000276322 22210 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/Weaver/Pluginpackage Pod::Weaver::Plugin::SingleEncoding; # ABSTRACT: ensure that there is exactly one =encoding of known value $Pod::Weaver::Plugin::SingleEncoding::VERSION = '4.015'; use Moose; with( 'Pod::Weaver::Role::Dialect', 'Pod::Weaver::Role::Finalizer', ); use namespace::autoclean; use Pod::Elemental::Selectors -all; #pod =head1 OVERVIEW #pod #pod The SingleEncoding plugin is a Dialect and a Finalizer. #pod #pod During dialect translation, it will look for C<=encoding> directives. If it #pod finds them, it will ensure that they all agree on one encoding and remove them. #pod #pod During document finalization, it will insert an C<=encoding> directive at the #pod top of the output, using the encoding previously detected. If no encoding was #pod detected, the plugin's C attribute will be used instead. That #pod defaults to UTF-8. #pod #pod If you want to reject any C<=encoding> directive that doesn't match your #pod expectations, set the C attribute by hand. #pod #pod No actual validation of the encoding is done. Pod::Weaver, after all, deals in #pod text rather than bytes. #pod #pod =cut has encoding => ( reader => 'encoding', writer => '_set_encoding', isa => 'Str', lazy => 1, default => 'UTF-8', predicate => '_has_encoding', ); sub translate_dialect { my ($self, $document) = @_; my $want; $want = $self->encoding if $self->_has_encoding; if ($want) { $self->log_debug("enforcing encoding of $want in all pod"); } my $childs = $document->children; my $is_enc = s_command([ qw(encoding) ]); for (reverse 0 .. $#$childs) { next unless $is_enc->( $childs->[ $_ ] ); my $have = $childs->[$_]->content; $have =~ s/\s+\z//; if (defined $want) { my $ok = lc $have eq lc $want || lc $have eq 'utf8' && lc $want eq 'utf-8'; confess "expected only $want encoding but found $have" unless $ok; } else { $have = 'UTF-8' if lc $have eq 'utf8'; $self->_set_encoding($have); $want = $have; } splice @$childs, $_, 1; } return; } sub finalize_document { my ($self, $document, $input) = @_; my $encoding = Pod::Elemental::Element::Pod5::Command->new({ command => 'encoding', content => $self->encoding, }); my $childs = $document->children; my $is_pod = s_command([ qw(pod) ]); # ?? for (0 .. $#$childs) { next if $is_pod->( $childs->[ $_ ] ); $self->log_debug('setting =encoding to ' . $self->encoding); splice @$childs, $_, 0, $encoding; last; } return; } __PACKAGE__->meta->make_immutable; 1; __END__ =pod =encoding UTF-8 =head1 NAME Pod::Weaver::Plugin::SingleEncoding - ensure that there is exactly one =encoding of known value =head1 VERSION version 4.015 =head1 OVERVIEW The SingleEncoding plugin is a Dialect and a Finalizer. During dialect translation, it will look for C<=encoding> directives. If it finds them, it will ensure that they all agree on one encoding and remove them. During document finalization, it will insert an C<=encoding> directive at the top of the output, using the encoding previously detected. If no encoding was detected, the plugin's C attribute will be used instead. That defaults to UTF-8. If you want to reject any C<=encoding> directive that doesn't match your expectations, set the C attribute by hand. No actual validation of the encoding is done. Pod::Weaver, after all, deals in text rather than bytes. =head1 AUTHOR Ricardo SIGNES =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut CorePrep.pm100644000767000024 162713000276322 22172 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/Weaver/PluginBundleuse strict; use warnings; package Pod::Weaver::PluginBundle::CorePrep; # ABSTRACT: a bundle for the most commonly-needed prep work for a pod document $Pod::Weaver::PluginBundle::CorePrep::VERSION = '4.015'; use Pod::Weaver::Plugin::H1Nester; sub mvp_bundle_config { return ( [ '@CorePrep/EnsurePod5', 'Pod::Weaver::Plugin::EnsurePod5', {} ], # dialects should run here [ '@CorePrep/H1Nester', 'Pod::Weaver::Plugin::H1Nester', {} ], ); } 1; __END__ =pod =encoding UTF-8 =head1 NAME Pod::Weaver::PluginBundle::CorePrep - a bundle for the most commonly-needed prep work for a pod document =head1 VERSION version 4.015 =head1 AUTHOR Ricardo SIGNES =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut StringFromComment.pm100644000767000024 620513000276322 22376 0ustar00rjbsstaff000000000000Pod-Weaver-4.015/lib/Pod/Weaver/Rolepackage Pod::Weaver::Role::StringFromComment; # ABSTRACT: Extract a string from a specially formatted comment $Pod::Weaver::Role::StringFromComment::VERSION = '4.015'; use Moose::Role; use namespace::autoclean; #pod =head1 OVERVIEW #pod #pod This role assists L by #pod allowing them to pull strings from the source comments formatted like: #pod #pod # KEYNAME: Some string... #pod #pod This is probably the most familiar to people using lines like the following to #pod allow the L to determine a module's #pod abstract: #pod #pod # ABSTRACT: Provides the HypnoToad with mind-control powers #pod #pod It will extract these strings by inspecting the C which #pod must be given. #pod #pod =head1 PRIVATE METHODS #pod #pod This role supplies only methods meant to be used internally by its consumer. #pod #pod =head2 _extract_comment_content($ppi_doc, $key) #pod #pod Given a key, try to find a comment matching C<# $key:> in the C<$ppi_document> #pod and return everything but the prefix. #pod #pod e.g., given a document with a comment in it of the form: #pod #pod # ABSTRACT: Yada yada... #pod #pod ...and this is called... #pod #pod $self->_extract_comment_content($ppi, 'ABSTRACT') #pod #pod ...it returns to us: #pod #pod Yada yada... #pod #pod =cut sub _extract_comment_content { my ($self, $ppi_document, $key) = @_; my $regex = qr/^\s*#+\s*$key:\s*(.+)$/m; my $content; my $finder = sub { my $node = $_[1]; return 0 unless $node->isa('PPI::Token::Comment'); if ( $node->content =~ $regex ) { $content = $1; return 1; } return 0; }; $ppi_document->find_first($finder); return $content; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Pod::Weaver::Role::StringFromComment - Extract a string from a specially formatted comment =head1 VERSION version 4.015 =head1 OVERVIEW This role assists L by allowing them to pull strings from the source comments formatted like: # KEYNAME: Some string... This is probably the most familiar to people using lines like the following to allow the L to determine a module's abstract: # ABSTRACT: Provides the HypnoToad with mind-control powers It will extract these strings by inspecting the C which must be given. =head1 PRIVATE METHODS This role supplies only methods meant to be used internally by its consumer. =head2 _extract_comment_content($ppi_doc, $key) Given a key, try to find a comment matching C<# $key:> in the C<$ppi_document> and return everything but the prefix. e.g., given a document with a comment in it of the form: # ABSTRACT: Yada yada... ...and this is called... $self->_extract_comment_content($ppi, 'ABSTRACT') ...it returns to us: Yada yada... =head1 AUTHOR Ricardo SIGNES =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2016 by Ricardo SIGNES. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut