App-Changelord/lib/App/Changelord/Command/Init.pm
2022-07-25 10:44:25 -04:00

67 lines
1.6 KiB
Perl

package App::Changelord::Command::Init;
use 5.36.0;
use Moo;
use CLI::Osprey desc => 'initialize new changelog source file';
use Path::Tiny;
use JSON;
use YAML qw/ Bless /;
use List::AllUtils qw/ first min uniq /;
use Version::Dotted::Semantic;
with 'App::Changelord::Role::ChangeTypes';
has changelog => ( is => 'lazy' );
with 'App::Changelord::Role::Versions';
sub _build_changelog ($self) { $self->parent_command->changelog }
sub serialize_changelog($self, $changelog = undef) {
$changelog //= $self->changelog;
Bless($changelog)->keys(
[ uniq qw/
project releases change_types
/, sort keys %$changelog
] );
Bless( $changelog->{project} )->keys(
[ uniq qw/
name homepage
/, sort keys $changelog->{project}->%*
] );
for ( grep { ref } $changelog->{releases}->@* ) {
Bless($_)->keys( [ uniq qw/ version date changes /, sort keys %$_ ] );
}
return YAML::Dump($changelog);
}
sub run ($self) {
my $src = $self->parent_command->source;
die "file '$src' already exists, aborting\n" if -f $src;
my $change = {
project => {
name => undef,
homepage => undef,
with_stats => 'true',
ticket_url => undef,
commit_regex => /^(?<type>[^:]+):(?<desc>.*?)(\[(?<ticket>[^\]]+)\])?$/,
},
change_types => $self->change_types,
releases => [
{ version => 'NEXT', changes => [] }
]
};
path($src)->spew( $self->serialize_changelog($change) );
say "file '$src' created, enjoy!";
}
'end of App::Changelog::Command::Init';