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 => /^(?[^:]+):(?.*?)(\[(?[^\]]+)\])?$/, }, 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';