package App::Changelord::Command::Version; # SYNOPSIS: output the latest / next version use 5.36.0; use Moo; use CLI::Osprey desc => 'output the latest/next version'; use Path::Tiny; use JSON; use YAML::XS; use List::AllUtils qw/ first min /; use Version::Dotted::Semantic; with 'App::Changelord::Role::ChangeTypes'; has changelog => ( is => 'lazy' ); sub _build_changelog($self){ $self->parent_command->changelog } sub latest_version($self){ first { $_ } grep { $_ ne 'NEXT' } map { eval { $_->{version} } } $self->changelog->{releases}->@*; } sub next_version($self) { my $version = Version::Dotted::Semantic->new($self->latest_version // '0.0.0'); my $upcoming = $self->changelog->{releases}[0]; if( $upcoming->{version} and $upcoming->{version} ne 'NEXT') { $upcoming = { changes => [] }; } my %mapping = map { my $level = $_->{level}; map { $_ => $level } $_->{keywords}->@* } $self->change_types->@*; my $bump =min 2, map { $_ eq 'major' ? 0 : $_ eq 'minor' ? 1 : 2 } map { $mapping{$_->{type}} || 'patch' } $upcoming->{changes}->@*; $version->bump($bump); return $version->normal; } sub run($self) { my $param = shift @ARGV; die "invalid parameter '$param', needs to be nothing, 'next' or 'latest'\n" if $param and not grep { $param eq $_ } qw/ next latest /; if(!$param) { say "latest version: ", $self->latest_version; say "next version: ", $self->next_version; } elsif( $param eq 'next' ) { say $self->next_version; } else { say $self->latest_version; } } 'end of App::Changelog::Command::Version';