App-karr
view release on metacpan or search on metacpan
lib/App/karr/ActivityLog.pm view on Meta::CPAN
sub entries {
my ($self) = @_;
my $content = $self->git->read_ref($self->_ref);
if ((!defined $content || !length $content) && $self->role eq 'user') {
$content = $self->git->read_ref($self->_legacy_ref);
}
return () unless defined $content && length $content;
my @entries;
for my $line (split /\n/, $content) {
next unless length $line;
my $decoded = eval { decode_json($line) };
push @entries, $decoded if $decoded;
}
return @entries;
}
sub last_entry {
my ($self) = @_;
my @entries = $self->entries;
return @entries ? $entries[-1] : undef;
}
lib/App/karr/ActivityLog.pm view on Meta::CPAN
Writes a JSON log line to the per-identity ref. The ref path is
C<refs/karr/log/E<lt>roleE<gt>/E<lt>sanitized_emailE<gt>>.
Returns the result of L<Git/write_ref>.
=head2 entries
my @entries = $log->entries;
Returns the decoded log entries for this identity, oldest first. For the
C<user> role, falls back to the legacy bare-email ref when the role-qualified
ref does not yet exist.
=head2 last_entry
my $entry = $log->last_entry;
The most recent decoded log entry for this identity, or C<undef> if none.
=head1 SUPPORT
=head2 Issues
Please report bugs and feature requests on GitHub at
L<https://github.com/Getty/karr/issues>.
=head2 IRC
t/49-config-skill-options-first.t view on Meta::CPAN
# positional (the action). `skill --agent NAME check` needs the real parser
# because --agent (format=s) swallows its value -- a naive dash-filter would
# read the agent value as the action.
#
# These subtests drive the real bin/karr via a subprocess, so they exercise the
# actual MooX::Cmd protect_argv argv echo that causes the bug (same harness as
# the #11/#13 regressions in t/43 and t/45). RED before the fix: every
# "options-first" subtest died with "Unknown action: --<flag>"; the surplus-arg
# subtests did not reject (config) / had no arity guard (skill).
#
# JSON equality is checked against the *decoded* structure, not raw bytes:
# print_json is not canonical, so two separate processes can emit the same
# config with different hash key order.
my $ROOT = abs_path('.');
my $BIN = "$ROOT/bin/karr";
sub _run_karr {
my ( $cwd, @argv ) = @_;
my $old = getcwd();
chdir $cwd or die "chdir $cwd: $!";
t/51-json-output.t view on Meta::CPAN
my $cmd = App::karr::Cmd::Move->new( store => $store );
my ( $err, $out ) = _run_execute( $cmd, '1', 'done' );
is( $err, '', 'move without --json does not die' );
like( $out, qr/Moved task 1/, 'human-readable line printed' );
# A removed guard would leak the results object/array into plain output; the
# human line itself carries no braces, so any brace means JSON leaked through.
unlike( $out, qr/[{}]/, 'no JSON emitted when --json is absent' );
my $decoded = eval { decode_json($out) };
ok( !defined $decoded, 'plain output is not JSON-decodable' );
};
subtest 'edit --json: single id is a bare object with id and title' => sub {
my $store = _fresh_store();
_save( $store, id => 1, title => 'Old title', status => 'todo' );
my $cmd = App::karr::Cmd::Edit->new(
store => $store,
json => 1,
title => 'New title',
( run in 2.333 seconds using v1.01-cache-2.11-cpan-c966e8aa7e8 )