App-gqmt
view release on metacpan or search on metacpan
lib/App/gqmt.pm view on Meta::CPAN
# -*- mode: cperl; eval: (follow-mode) -*-
#
package App::gqmt;
use strict;
use warnings;
use diagnostics;
use Data::Printer caller_info => 1, print_escapes => 1, output => 'stdout', class => { expand => 2 },
caller_message => "DEBUG __FILENAME__:__LINE__ ";
use Getopt::Long qw(:config no_ignore_case gnu_getopt auto_help auto_version);
use Pod::Man;
use Pod::Usage qw(pod2usage);
use File::Basename;
use HTTP::Request ();
use LWP::UserAgent;
use JSON;
use Time::Piece;
use Template;
my @PROGARG = ($0, @ARGV);
our $VERSION = '1.02';
sub new {
my $class = shift;
my $self =
bless {
_progname => fileparse($0),
_progargs => [$0, @ARGV],
_option => { d => 0,
colored => 0,
rows_number => 100,
age => 60*60*24*14,
versions_to_hold => 2,
url => 'https://api.github.com/graphql',
single_iteration => 0,
http_timeout => 180,
pkg => {
alpine => 1,
api => 1,
app => 1,
scheduler => 1,
},
re => {
default => '^(?:docker-base-layer|develop|release|master|v[0-9]+\.[0-9]+\.[0-9]+)$',
alpine => '^(?:docker-base-layer|develop|release|master|v[0-9]+\.[0-9]+\.[0-9]+)$',
api => '^(?:docker-base-layer|develop|release|master|v[0-9]+\.[0-9]+\.[0-9]+)$',
app => '^(?:docker-base-layer|develop|qa|release|master|v[0-9]+\.[0-9]+\.[0-9]+)$',
scheduler => '^(?:docker-base-layer|develop|release|master|v[0-9]+\.[0-9]+\.[0-9]+)$',
},
},
}, $class;
GetOptions (
'a|age=i' => \$self->{_option}{age},
'U|url=s' => \$self->{_option}{url},
'u|user=s' => \$self->{_option}{user},
'T|token=s' => \$self->{_option}{token},
'R|repository=s' => \$self->{_option}{repo},
'P|package=s' => \$self->{_option}{package},
'package-regex=s' => \$self->{_option}{package_regex},
'n|dry-run' => \$self->{_option}{dry_run},
'N|rows-number=i' => \$self->{_option}{rows_number},
'versions-to-hold=i' => \$self->{_option}{versions_to_hold},
'http-timeout=i' => \$self->{_option}{http_timeout},
'C|colored' => \$self->{_option}{colored},
'D|delete' => \$self->{_option}{delete},
's|single-iteration' => \$self->{_option}{single_iteration},
't|query-template=s' => \$self->{_option}{query_template},
'v|package-version=s' => \$self->{_option}{v},
'h|help' => sub { pod2usage(-exitval => 0, -verbose => 2); exit 0 },
'd|debug+' => \$self->{_option}{d},
'V|version' => sub { print "$self->{_progname}, version $VERSION\n"; exit 0 },
);
pod2usage(-exitval => 0, -verbose => 2, -msg => "\nERROR: repository owner not provided, option -u\n\n")
if ! $self->{_option}{user};
pod2usage(-exitval => 0, -verbose => 2, -msg => "\nERROR: query template file does not exist, option -t\n\n")
if defined $self->{_option}{query_template} && ! -e $self->{_option}{query_template};
pod2usage(-exitval => 2, -verbose => 2, -msg => "\nERROR: access token is not provided, option -T\n\n" )
if ! $self->{_option}{token};
pod2usage(-exitval => 2, -verbose => 2, -msg => "\nERROR: repository name is not provided, option -R\n\n" )
if ! $self->{_option}{repo};
pod2usage(-exitval => 2, -verbose => 2, -msg => "\nERROR: package name not provided, option -P\n\n")
if ! $self->{_option}{package};
# pod2usage(-exitval => 2, -verbose => 2, -msg => "\nERROR: not supported package\n\n")
# if $self->{_option}{package} && ! exists $self->{_option}{pkg}{$self->{_option}{package}};
pod2usage(-exitval => 2, -verbose => 2, -msg => "\nERROR: requested rows number should be 1..100\n\n")
if $self->{_option}{rows_number} && ( $self->{_option}{rows_number} < 1 || $self->{_option}{rows_number} > 100 );
# pod2usage(-exitval => 0, -verbose => 2, -msg => "\nERROR: -v is mandatory when -D and -s are used together\n\n")
# if $delete && $single_iteration && ! $v;
p $self->{_option} if $self->{_option}{d} > 2;
$self->{_option}{req} = HTTP::Request->new( 'POST',
$self->{_option}{url},
[ 'Authorization' => 'bearer ' . $self->{_option}{token} ] );
return $self;
}
sub progname { shift->{_progname} }
sub progargs { return join(' ', @{shift->{_progargs}}); }
sub option {
my ($self,$opt) = @_;
return $self->{_option}{$opt};
}
sub lwp {
my $self = shift;
my $lwp = LWP::UserAgent->new( agent => "$self->{_progname}/$VERSION ",
timeout => $self->option('http_timeout'), );
return $lwp;
}
sub jso {
my $self = shift;
my $jso = JSON->new->allow_nonref;
return $jso;
}
sub run {
my $self = shift;
my $versions = [];
p ( $self->progargs, colored => $self->option('colored') ) if $self->option('d') > 0;
my $to_delete;
if ( ! $self->option('v') ) {
my $res = $self->get_versions ({ res => $versions });
my $t_now = localtime;
my $t_ver;
# my $i = 0;
my $re;
if ( $self->option('package_regex') ) {
$re = $self->option('package_regex');
} elsif ( exists $self->option('re')->{$self->option('package')} ) {
$re = $self->option('re')->{$self->option('package')}
} else {
$re = $self->option('re')->{default};
}
foreach ( @{$versions} ) {
next if $_->{version} =~ /$re/;
p ($_, caller_message => "VERSION DOES NOT MATCH REGEX ($re) AND IS BEEN PROCESSED: __FILENAME__:__LINE__ ") if $self->option('d') > 2;
if ( defined $_->{files}->{nodes}->[0]->{updatedAt} ) {
$t_ver = Time::Piece->strptime( $_->{files}->{nodes}->[0]->{updatedAt},
"%Y-%m-%dT%H:%M:%SZ" );
next if ($t_ver->epoch + $self->option('age') ) >= $t_now->epoch;
}
( run in 0.619 second using v1.01-cache-2.11-cpan-acf6aa7dc9e )