App-TimeTracker
view release on metacpan or search on metacpan
"Carp" => 0,
"Data::Dumper" => 0,
"DateTime" => 0,
"DateTime::Format::Duration" => 0,
"DateTime::Format::ISO8601" => 0,
"Exporter" => 0,
"File::Copy" => 0,
"File::Find::Rule" => 0,
"File::HomeDir" => 0,
"Hash::Merge" => 0,
"JSON::XS" => 0,
"Moose" => 0,
"Moose::Role" => 0,
"Moose::Util::TypeConstraints" => 0,
"MooseX::Getopt" => 0,
"MooseX::Storage" => 0,
"MooseX::Storage::Format::JSONpm" => 0,
"MooseX::Types::Path::Class" => 0,
"Path::Class" => 0,
"Path::Class::Iterator" => 0,
"Scalar::Util" => 0,
"Carp" : "0",
"Data::Dumper" : "0",
"DateTime" : "0",
"DateTime::Format::Duration" : "0",
"DateTime::Format::ISO8601" : "0",
"Exporter" : "0",
"File::Copy" : "0",
"File::Find::Rule" : "0",
"File::HomeDir" : "0",
"Hash::Merge" : "0",
"JSON::XS" : "0",
"Moose" : "0",
"Moose::Role" : "0",
"Moose::Util::TypeConstraints" : "0",
"MooseX::Getopt" : "0",
"MooseX::Storage" : "0",
"MooseX::Storage::Format::JSONpm" : "0",
"MooseX::Types::Path::Class" : "0",
"Path::Class" : "0",
"Path::Class::Iterator" : "0",
"Scalar::Util" : "0",
},
"homepage" : "http://timetracker.plix.at/",
"repository" : {
"type" : "git",
"url" : "https://github.com/domm/App-TimeTracker.git",
"web" : "https://github.com/domm/App-TimeTracker"
}
},
"version" : "3.010",
"x_generated_by_perl" : "v5.34.0",
"x_serialization_backend" : "Cpanel::JSON::XS version 4.26",
"x_spdx_expression" : "Artistic-1.0-Perl OR GPL-1.0-or-later"
}
requires "Carp" => "0";
requires "Data::Dumper" => "0";
requires "DateTime" => "0";
requires "DateTime::Format::Duration" => "0";
requires "DateTime::Format::ISO8601" => "0";
requires "Exporter" => "0";
requires "File::Copy" => "0";
requires "File::Find::Rule" => "0";
requires "File::HomeDir" => "0";
requires "Hash::Merge" => "0";
requires "JSON::XS" => "0";
requires "Moose" => "0";
requires "Moose::Role" => "0";
requires "Moose::Util::TypeConstraints" => "0";
requires "MooseX::Getopt" => "0";
requires "MooseX::Storage" => "0";
requires "MooseX::Storage::Format::JSONpm" => "0";
requires "MooseX::Types::Path::Class" => "0";
requires "Path::Class" => "0";
requires "Path::Class::Iterator" => "0";
requires "Scalar::Util" => "0";
helper/convert_2_003_to_2_004.pl view on Meta::CPAN
use warnings;
use 5.010;
use File::Find::Rule;
use Data::Dumper;
use App::TimeTracker::Data::Task;
use App::TimeTracker::Proto;
use DateTime;
use Path::Class;
use Try::Tiny;
use JSON::XS;
use Path::Class;
$|=1;
my $app = App::TimeTracker::Proto->new;
my @files = File::Find::Rule->file()->name(qr/\.trc$/)
->in( $app->home );
foreach my $old (@files) {
print '.';
my $json_old = Path::Class::File->new($old)->slurp;
lib/App/TimeTracker.pm view on Meta::CPAN
use warnings;
use 5.010;
use App::TimeTracker::Data::Task;
use DateTime;
use Moose;
use Moose::Util::TypeConstraints;
use Path::Class qw();
use Path::Class::Iterator;
use MooseX::Storage::Format::JSONpm;
use JSON::XS;
our $HOUR_RE = qr/(?<hour>[012]?\d)/;
our $MINUTE_RE = qr/(?<minute>[0-5]?\d)/;
our $DAY_RE = qr/(?<day>[0123]?\d)/;
our $MONTH_RE = qr/(?<month>[01]?\d)/;
our $YEAR_RE = qr/(?<year>2\d{3})/;
with qw(
MooseX::Getopt
);
lib/App/TimeTracker.pm view on Meta::CPAN
push( @found, $file );
}
return sort @found;
}
sub project_tree {
my $self = shift;
my $file = $self->home->file('projects.json');
return unless -e $file && -s $file;
my $decoder = JSON::XS->new->utf8->pretty->relaxed;
my $projects = $decoder->decode( scalar $file->slurp );
my %tree;
my $depth;
while ( my ( $project, $location ) = each %$projects ) {
$tree{$project} //= { parent => undef, children => {} };
# check config file for parent
if ( -e $location ) {
my $this_config = $decoder->decode(
scalar Path::Class::file($location)->slurp );
lib/App/TimeTracker/Command/Core.pm view on Meta::CPAN
$project = $dirs[-1];
}
my $fh = $cwd->file('.tracker.json')->openw;
say $fh <<EOCONFIG;
{
"project":"$project"
}
EOCONFIG
my $projects_file = $self->home->file('projects.json');
my $coder = JSON::XS->new->utf8->pretty->canonical->relaxed;
if ( -e $projects_file ) {
my $projects = $coder->decode( scalar $projects_file->slurp );
$projects->{$project} =
$cwd->file('.tracker.json')->absolute->stringify;
$projects_file->spew( $coder->encode($projects) );
}
say "Set up this directory for time-tracking via file .tracker.json";
}
lib/App/TimeTracker/Proto.pm view on Meta::CPAN
use strict;
use warnings;
use 5.010;
use App::TimeTracker::Utils qw(error_message);
use Moose;
use MooseX::Types::Path::Class;
use File::HomeDir ();
use Path::Class;
use Hash::Merge qw(merge);
use JSON::XS;
use Carp;
use Try::Tiny;
use App::TimeTracker::Data::Task;
use App::TimeTracker::Constants qw(MISSING_PROJECT_HELP_MSG);
has 'home' => (
is => 'ro',
isa => 'Path::Class::Dir',
lazy_build => 1,
);
lib/App/TimeTracker/Proto.pm view on Meta::CPAN
};
return $decoded_json;
}
else {
return {};
}
}
has 'project' => ( is => 'rw', isa => 'Str', predicate => 'has_project' );
has 'json_decoder' => ( is => 'ro', isa => 'JSON::XS', lazy_build => 1 );
sub _build_json_decoder {
my $self = shift;
return JSON::XS->new->utf8->pretty->canonical->relaxed;
}
sub run {
my $self = shift;
try {
my $config = $self->load_config;
my $class = $self->setup_class($config);
$class->name->new_with_options( {
home => $self->home,
( run in 0.879 second using v1.01-cache-2.11-cpan-fd5d4e115d8 )