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 . SOURCE Source repository is at . 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 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 . 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 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.