App-FormatCPANChanges-PERLANCAR

 view release on metacpan or  search on metacpan

lib/App/FormatCPANChanges/PERLANCAR.pm  view on Meta::CPAN

package App::FormatCPANChanges::PERLANCAR;

our $DATE = '2017-02-17'; # DATE
our $VERSION = '0.002'; # VERSION

use 5.010001;
use strict;
use warnings;

use List::Util qw(max);
use Sort::Sub qw(changes_group_ala_perlancar);

our %SPEC;

$SPEC{format_cpan_changes_perlancar} = {
    v => 1.1,
    summary => 'Format CPAN Changes a la PERLANCAR',
    description => <<'_',

* No preamble.

* Each change is formatted as a separate paragraph (or set of paragraphs).

_
    args => {
        file => {
            schema => 'str*',
            summary => 'If not specified, will look for a file called '.
                'Changes/ChangeLog in current directory',
            pos => 0,
        },
    },
};
sub format_cpan_changes_perlancar {
    require App::ParseCPANChanges;
    #require DateTime::Format::Alami::EN;
    require Text::Wrap;

    my %args = @_;

    my $res = App::ParseCPANChanges::parse_cpan_changes(file => $args{file});
    return $res unless $res->[0] == 200;

    # parse dates and sort releases
    my @rels;
    for my $v (keys %{ $res->[2]{releases} }) {
        my $rel = $res->[2]{releases}{$v};
        # $rel->{_parsed_date} = # assume _parsed_date is already YYYY-MM-DD
        push @rels, $rel;
    }
    @rels = sort { $b->{_parsed_date} cmp $a->{_parsed_date} } @rels;

    # determine the width for version
    my @versions = sort keys %{ $res->[2]{releases} };
    my $v_width = 1 + max map { length } @versions;
    $v_width = 8 if $v_width < 8;

    my $chgs = "";

    # render
    local $Text::Wrap::columns = 80;
    for my $rel (@rels) {
        $chgs .= "\n" if $chgs;

        $chgs .= sprintf "%-${v_width}s%s%s\n\n",
            $rel->{version}, $rel->{_parsed_date}, $rel->{note} ? " $rel->{note}" : "";
        for my $heading (sort {changes_group_ala_perlancar($a,$b)} keys %{ $rel->{changes} }) {
            $chgs .= sprintf "%s%s\n\n", (" " x $v_width), "[$heading]"
                if $heading;
            my $group_changes = $rel->{changes}{$heading};
            for my $ch (@{ $group_changes->{changes} }) {
                $ch .= "." unless $ch =~ /\.$/;
                $chgs .= Text::Wrap::wrap(
                    (" " x $v_width) . "- ",
                    (" " x ($v_width+2)),
                    "$ch\n",
                ) . "\n";
            }
        }
    }

    [200, "OK", $chgs];
}

1;
# ABSTRACT: Format CPAN Changes a la PERLANCAR

__END__

=pod

=encoding UTF-8

=head1 NAME

App::FormatCPANChanges::PERLANCAR - Format CPAN Changes a la PERLANCAR



( run in 1.152 second using v1.01-cache-2.11-cpan-39bf76dae61 )