App-karr
view release on metacpan or search on metacpan
lib/App/karr/Cmd/List.pm view on Meta::CPAN
format => 's',
doc => 'Filter by assignee',
);
option tag => (
is => 'ro',
format => 's',
doc => 'Filter by tag',
);
option search => (
is => 'ro',
format => 's',
short => 's',
doc => 'Search tasks by title, body, or tags',
);
option claimed_by => (
is => 'ro',
format => 's',
doc => 'Filter by claim owner',
);
option sort => (
is => 'ro',
format => 's',
default => sub { 'id' },
doc => 'Sort by: id, status, priority, created, updated, due',
);
option reverse => (
is => 'ro',
short => 'r',
doc => 'Reverse sort order',
);
sub execute {
my ($self, $args_ref, $chain_ref) = @_;
my @tasks = $self->_load_tasks;
@tasks = $self->_filter(\@tasks);
@tasks = $self->_sort(\@tasks);
if ($self->json) {
$self->print_json([map { $_->to_frontmatter } @tasks]);
return;
}
if ($self->compact) {
for my $t (@tasks) {
printf "#%-4u %10s %s\n", $t->id, $t->status, $t->title;
}
return;
}
printf "%-5s %10s %s\n", 'ID', 'STATUS', 'TITLE';
printf "%s\n", '-' x 72;
for my $t (@tasks) {
my @meta;
push @meta, $t->priority if defined $t->priority && length $t->priority;
push @meta, '@' . $t->assignee if $t->has_assignee;
push @meta, 'blocked' if $t->has_blocked;
my $title = $t->title;
$title .= ' [' . join(', ', @meta) . ']' if @meta;
printf "#%-4u %10s %s\n",
$t->id,
$t->status,
$title;
}
printf "\n%d task(s)\n", scalar @tasks;
}
sub _load_tasks {
my ($self) = @_;
return $self->load_tasks;
}
sub _filter {
my ($self, $tasks) = @_;
my @filtered = @$tasks;
# Exclude archived by default
@filtered = grep { !App::karr::Config->is_terminal_status($_->status) } @filtered;
if ($self->status) {
my %statuses = map { $_ => 1 } split /,/, $self->status;
@filtered = grep { $statuses{$_->status} } @filtered;
}
if ($self->priority) {
my %priorities = map { $_ => 1 } split /,/, $self->priority;
@filtered = grep { $priorities{$_->priority} } @filtered;
}
if ($self->assignee) {
@filtered = grep { $_->has_assignee && $_->assignee eq $self->assignee } @filtered;
}
if ($self->tag) {
@filtered = grep {
my $t = $_;
grep { $_ eq $self->tag } @{$t->tags};
} @filtered;
}
if ($self->claimed_by) {
@filtered = grep { $_->has_claimed_by && $_->claimed_by eq $self->claimed_by } @filtered;
}
if ($self->search) {
my $q = lc($self->search);
@filtered = grep {
index(lc($_->title), $q) >= 0
|| index(lc($_->body), $q) >= 0
|| grep { index(lc($_), $q) >= 0 } @{$_->tags}
} @filtered;
}
return @filtered;
}
sub _sort {
my ($self, $tasks) = @_;
my $field = $self->sort;
my @sorted;
if ($field eq 'id') {
@sorted = sort { $a->id <=> $b->id } @$tasks;
( run in 1.280 second using v1.01-cache-2.11-cpan-2398b32b56e )