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.