The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

App::CPANChangesUtils - Parse CPAN Changes file

VERSION

This document describes version 0.077 of App::CPANChangesUtils (from Perl distribution App-CPANChangesUtils), released on 2022-06-13.

DESCRIPTION

This distribution provides some CLI utilities related to CPAN Changes

FUNCTIONS

format_cpan_changes

Usage:

 format_cpan_changes(%args) -> [$status_code, $reason, $payload, \%result_meta]

Format CPAN Changes.

This utility is a simple wrapper to CPAN::Changes. It will parse your CPAN Changes file into data structure, then use serialize() to format it back to text form.

This function is not exported.

Arguments ('*' denotes required arguments):

  • class => perl::modname (default: "CPAN::Changes")

  • file => filename

    If not specified, will look for file called Changes/ChangeLog in current directory.

Returns an enveloped result (an array).

First element ($status_code) is an integer containing HTTP-like status code (200 means OK, 4xx caller error, 5xx function error). Second element ($reason) is a string containing error message, or something like "OK" if status is 200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth element (%result_meta) is called result metadata and is optional, a hash that contains extra information, much like how HTTP response headers provide additional metadata.

Return value: (any)

parse_cpan_changes

Usage:

 parse_cpan_changes(%args) -> [$status_code, $reason, $payload, \%result_meta]

Parse CPAN Changes file.

Examples:

  • Parse with default settings:

     parse_cpan_changes();

    Result:

     [
       200,
       "OK",
       {
         months   => {
                       Apr => 4,
                       Aug => 8,
                       Dec => 12,
                       Feb => 2,
                       Jan => 1,
                       Jul => 7,
                       Jun => 6,
                       Mar => 3,
                       May => 5,
                       Nov => 11,
                       Oct => 10,
                       Sep => 9,
                     },
         preamble => "",
         releases => {
                       "0.01"  => {
                                    _parsed_date => "2013-08-05",
                                    changes      => { "" => { changes => ["First version."], name => "" } },
                                    date         => "2013-08-05",
                                    metadata     => { "released-by" => "SHARYANTO" },
                                    note         => "Released-By: SHARYANTO",
                                    version      => 0.01,
                                  },
                       "0.02"  => {
                                    _parsed_date => "2013-08-06",
                                    changes      => {
                                                      "" => {
                                                              changes => ["No functional changes. Add missing dep [CT]."],
                                                              name => "",
                                                            },
                                                    },
                                    date         => "2013-08-06",
                                    metadata     => { "released-by" => "SHARYANTO" },
                                    note         => "Released-By: SHARYANTO",
                                    version      => 0.02,
                                  },
                       "0.03"  => {
                                    _parsed_date => "2013-11-01",
                                    changes      => {
                                                      "" => {
                                                              changes => [
                                                                "No functional changes. Mention some other modules and the rationale for the script.",
                                                              ],
                                                              name => "",
                                                            },
                                                    },
                                    date         => "2013-11-01",
                                    metadata     => { "released-by" => "SHARYANTO" },
                                    note         => "Released-By: SHARYANTO",
                                    version      => 0.03,
                                  },
                       "0.04"  => {
                                    _parsed_date => "2014-07-22",
                                    changes      => {
                                                      "" => {
                                                              changes => [
                                                                "No functional changes.",
                                                                "Switch CLI scripts from using Perinci::CmdLine to Perinci::CmdLine::Any to reduce size of dependencies.",
                                                              ],
                                                              name => "",
                                                            },
                                                    },
                                    date         => "2014-07-22",
                                    metadata     => { "released-by" => "SHARYANTO" },
                                    note         => "Released-By: SHARYANTO",
                                    version      => 0.04,
                                  },
                       "0.05"  => {
                                    _parsed_date => "2015-09-03",
                                    changes      => {
                                                      "" => {
                                                              changes => [
                                                                "No functional changes.",
                                                                "[dist] Move spec prereqs from RuntimeRequires to DevelopRecommends to reduce deps but still allow indicating spec requirement.",
                                                              ],
                                                              name => "",
                                                            },
                                                    },
                                    date         => "2015-09-03",
                                    metadata     => { "released-by" => "PERLANCAR" },
                                    note         => "Released-By: PERLANCAR",
                                    version      => 0.05,
                                  },
                       "0.06"  => {
                                    _parsed_date => "2016-01-18",
                                    changes      => {
                                                      "" => {
                                                              changes => [
                                                                "No functional changes.",
                                                                "[build] Rebuild to fix POD section ordering.",
                                                              ],
                                                              name => "",
                                                            },
                                                    },
                                    date         => "2016-01-18",
                                    metadata     => { "released-by" => "PERLANCAR" },
                                    note         => "Released-By: PERLANCAR",
                                    version      => 0.06,
                                  },
                       "0.070" => {
                                    _parsed_date => "2019-07-03",
                                    changes      => {
                                                      "" => {
                                                              changes => ["Add option --class to customize parser class."],
                                                              name => "",
                                                            },
                                                    },
                                    date         => "2019-07-03",
                                    metadata     => { "released-by" => "PERLANCAR", "urgency" => "medium" },
                                    note         => "Released-By: PERLANCAR; Urgency: medium",
                                    version      => "0.070",
                                  },
                       "0.071" => {
                                    _parsed_date => "2020-10-06",
                                    changes      => { "" => { changes => ["Add option --no-unbless."], name => "" } },
                                    date         => "2020-10-06",
                                    metadata     => { "released-by" => "PERLANCAR", "urgency" => "medium" },
                                    note         => "Released-By: PERLANCAR; Urgency: medium",
                                    version      => 0.071,
                                  },
                       "0.072" => {
                                    _parsed_date => "2021-05-25",
                                    changes      => {
                                                      "" => {
                                                              changes => [
                                                                "[build] Rebuild to update Sah coercion module names (old Sah coercion modules have been purged from CPAN).",
                                                              ],
                                                              name => "",
                                                            },
                                                    },
                                    date         => "2021-05-25",
                                    metadata     => { "released-by" => "PERLANCAR", "urgency" => "high" },
                                    note         => "Released-By: PERLANCAR; Urgency: high",
                                    version      => 0.072,
                                  },
                       "0.073" => {
                                    _parsed_date => "2021-10-17",
                                    changes      => {
                                                      "" => {
                                                              changes => [
                                                                "Rename module/dist App-ParseCPANChanges -> App-CPANChangesUtils. - Add CLI format-cpan-changes.",
                                                              ],
                                                              name => "",
                                                            },
                                                    },
                                    date         => "2021-10-17",
                                    metadata     => { "released-by" => "PERLANCAR", "urgency" => "medium" },
                                    note         => "Released-By: PERLANCAR; Urgency: medium",
                                    version      => 0.073,
                                  },
                       "0.075" => {
                                    _parsed_date => "2022-06-10",
                                    changes      => {
                                                      "" => {
                                                              changes => [
                                                                "[utility parse-cpan-changes] Add option parse_release_metadata (defaults to true) to parse 'key: value' metadata in the release note.",
                                                              ],
                                                              name => "",
                                                            },
                                                    },
                                    date         => "2022-06-10",
                                    metadata     => { "released-by" => "PERLANCAR", "urgency" => "medium" },
                                    note         => "Released-By: PERLANCAR; Urgency: medium",
                                    version      => 0.075,
                                  },
                       "0.076" => {
                                    _parsed_date => "2022-06-10",
                                    changes      => {
                                                      "" => {
                                                              changes => ["No functional changes.", "[ux] Add an example."],
                                                              name => "",
                                                            },
                                                    },
                                    date         => "2022-06-10",
                                    metadata     => { "released-by" => "PERLANCAR", "urgency" => "low" },
                                    note         => "Released-By: PERLANCAR; Urgency: low",
                                    version      => 0.076,
                                  },
                       "0.077" => {
                                    _parsed_date => "2022-06-13",
                                    changes      => {
                                                      "" => {
                                                              changes => [
                                                                "No functional changes.",
                                                                "[ux] Show content of Changes file in example.",
                                                              ],
                                                              name => "",
                                                            },
                                                    },
                                    date         => "2022-06-13",
                                    metadata     => { "released-by" => "PERLANCAR", "urgency" => "low" },
                                    note         => "Released-By: PERLANCAR; Urgency: low",
                                    version      => 0.077,
                                  },
                     },
       },
       {},
     ]

    Content of Changes file:

     0.076   2022-06-10  Released-By: PERLANCAR; Urgency: low
     
             - No functional changes.
     
             - [ux] Add an example.
     
     
     0.075   2022-06-10  Released-By: PERLANCAR; Urgency: medium
     
             - [utility parse-cpan-changes] Add option parse_release_metadata
               (defaults to true) to parse 'key: value' metadata in the release
               note.
     
     
     0.073   2021-10-17  Released-By: PERLANCAR; Urgency: medium
     
         - Rename module/dist App-ParseCPANChanges -> App-CPANChangesUtils.
     
             - Add CLI format-cpan-changes.
     
     
     0.072   2021-05-25  Released-By: PERLANCAR; Urgency: high
     
         - [build] Rebuild to update Sah coercion module names (old Sah coercion
               modules have been purged from CPAN).
     
     
     0.071   2020-10-06  Released-By: PERLANCAR; Urgency: medium
     
         - Add option --no-unbless.
     
     
     0.070   2019-07-03  Released-By: PERLANCAR; Urgency: medium
     
         - Add option --class to customize parser class.
     
     
     0.06    2016-01-18  Released-By: PERLANCAR
     
             - No functional changes.
     
             - [build] Rebuild to fix POD section ordering.
     
     
     0.05    2015-09-03  Released-By: PERLANCAR
     
         - No functional changes.
     
         - [dist] Move spec prereqs from RuntimeRequires to
           DevelopRecommends to reduce deps but still allow indicating spec
           requirement.
     
     
     0.04     2014-07-22  Released-By: SHARYANTO
     
              - No functional changes.
     
              - Switch CLI scripts from using Perinci::CmdLine to
                Perinci::CmdLine::Any to reduce size of dependencies.
     
     
     0.03    2013-11-01  Released-By: SHARYANTO
     
             - No functional changes. Mention some other modules and the rationale
               for the script.
     
     
     0.02    2013-08-06  Released-By: SHARYANTO
     
             - No functional changes. Add missing dep [CT].
     
     
     0.01    2013-08-05  Released-By: SHARYANTO
     
             - First version.

This utility is a simple wrapper for CPAN::Changes.

This function is not exported.

Arguments ('*' denotes required arguments):

  • class => perl::modname (default: "CPAN::Changes")

  • file => filename

    If not specified, will look for file called Changes/ChangeLog in current directory.

  • parse_release_metadata => bool (default: 1)

    Whether to parse release metadata in release note.

    If set to true (the default), the utility will attempt to parse release metadata in the release note. The release note is the text after the version and date in the first line of a release entry:

     0.001 - 2022-06-10 THIS IS THE RELEASE NOTE AND CAN BE ANY TEXT

    One convention I use is for the release note to be semicolon-separated of metadata entries, where each metadata is in the form of HTTP-header-like "Name: Value" text where Name is dash-separated words and Value is any text that does not contain newline or semicolon. Example:

     0.001 - 2022-06-10  Urgency: high; Backward-Incompatible: yes

    Note that Debian changelog also supports "key=value" in the release line.

    This option, when enabled, will first check if the release note is indeed in the form of semicolon-separated metadata. If yes, will create a key called metadata in the release result structure containing a hash of metadata:

     { "urgency" => "high", "backward-incompatible" => "yes" }

    Note that the metadata names are converted to lowercase.

  • unbless => bool (default: 1)

    Whether to return Perl objects as unblessed refs.

    If you set this to false, you'll need to use an output format that can handle serializing Perl objects, e.g. on the CLI using --format=perl.

Returns an enveloped result (an array).

First element ($status_code) is an integer containing HTTP-like status code (200 means OK, 4xx caller error, 5xx function error). Second element ($reason) is a string containing error message, or something like "OK" if status is 200. Third element ($payload) is the actual result, but usually not present when enveloped result is an error response ($status_code is not 2xx). Fourth element (%result_meta) is called result metadata and is optional, a hash that contains extra information, much like how HTTP response headers provide additional metadata.

Return value: (any)

HOMEPAGE

Please visit the project's homepage at https://metacpan.org/release/App-CPANChangesUtils.

SOURCE

Source repository is at https://github.com/perlancar/perl-App-CPANChangesUtils.

SEE ALSO

CPAN::Changes

CPAN::Changes::Spec

An alternative way to manage your Changes using INI master format: Module::Metadata::Changes.

Dist::Zilla plugin to check your Changes before build: Dist::Zilla::Plugin::CheckChangesHasContent, Dist::Zilla::Plugin::CheckChangeLog.

AUTHOR

perlancar <perlancar@cpan.org>

CONTRIBUTING

To contribute, you can send patches by email/via RT, or send pull requests on GitHub.

Most of the time, you don't need to build the distribution yourself. You can simply modify the code, then test via:

 % prove -l

If you want to build the distribution (e.g. to try to install it locally on your system), you can install Dist::Zilla, Dist::Zilla::PluginBundle::Author::PERLANCAR, and sometimes one or two other Dist::Zilla plugin and/or Pod::Weaver::Plugin. Any additional steps required beyond that are considered a bug and can be reported to me.

COPYRIGHT AND LICENSE

This software is copyright (c) 2022, 2021 by perlancar <perlancar@cpan.org>.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.

BUGS

Please report any bugs or feature requests on the bugtracker website https://rt.cpan.org/Public/Dist/Display.html?Name=App-CPANChangesUtils

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.