package App::DuckPAN; BEGIN { $App::DuckPAN::AUTHORITY = 'cpan:GETTY'; } { $App::DuckPAN::VERSION = '0.001'; } # ABSTRACT: The DuckDuckGo DuckPAN client use Moo; use MooX::Cmd; use MooX::Options; use App::DuckPAN::Config; use App::DuckPAN::Help; use File::Which; use Class::Load ':all'; use HTTP::Request::Common qw( GET POST ); use HTTP::Status; use LWP::UserAgent; use LWP::Simple; use Parse::CPAN::Packages::Fast; use File::Temp qw/ :POSIX /; use Class::Load ':all'; use Term::UI; use Term::ReadLine; our $VERSION ||= '0.000'; option dukgo_login => ( is => 'ro', lazy => 1, default => sub { 'https://dukgo.com/my/login' } ); option no_check => ( is => 'ro', lazy => 1, default => sub { 0 } ); option duckpan_packages => ( is => 'ro', lazy => 1, default => sub { shift->duckpan.'/modules/02packages.details.txt.gz' } ); option duckpan => ( is => 'ro', lazy => 1, default => sub { 'http://duckpan.org/' } ); sub _ua_string { my ($self) = @_; my $class = ref $self || $self; my $version = $class->VERSION; return "$class/$version"; } option http_proxy => ( is => 'ro', predicate => 'has_http_proxy', ); has term => ( is => 'ro', lazy => 1, builder => '_build_term', ); sub _build_term { Term::ReadLine->new('duckpan') } has http => ( is => 'ro', builder => '_build_http', lazy => 1, ); sub _build_http { my ( $self ) = @_; my $agent = LWP::UserAgent->new; $agent->agent($self->_ua_string); $agent->env_proxy; $agent->proxy( http => $self->http_proxy ) if $self->has_http_proxy; return $agent; } has config => ( is => 'ro', builder => '_build_config', lazy => 1, handles => [qw( config_path config_file set_config get_config )] ); sub _build_config { App::DuckPAN::Config->new } has help => ( is => 'ro', builder => '_build_help', lazy => 1, ); sub _build_help { App::DuckPAN::Help->new( version => $VERSION ) } has perl => ( is => 'ro', builder => '_build_perl', lazy => 1, ); sub _build_perl { load_class('App::DuckPAN::Perl'); App::DuckPAN::Perl->new( app => shift ); } sub execute { my ( $self, $args, $chain ) = @_; my @arr_args = @{$args}; if (@arr_args) { my @modules; my @left_args; for (@arr_args) { if ($_ =~ /^ddg/i) { push @modules, $_; } else { push @left_args, $_; } } return $self->perl->duckpan_install(@modules) unless @left_args; } print $self->help->help; exit 0; } sub check_requirements { my ( $self ) = @_; my $fail = 0; print "\nChecking your environment for the DuckPAN requirements\n\n"; #$fail = 1 unless $self->check_locallib; $fail = 1 unless $self->check_ddg; $fail = 1 unless $self->check_git; $fail = 1 unless $self->check_wget; if ($fail) { print "[ERROR] Requirements fails\n"; return 1; } return 0; } sub check_git { my ( $self ) = @_; my $ok = 1; print "Checking for git... "; if (my $git = which('git')) { my $version_string = `$git --version`; if ($version_string =~ m/git version (\d+)\.(\d+)\.(\d+)\.(\d+)/) { if ($1 <= 1 && $2 < 7) { print "require minimum 1.7"; $ok = 0; } else { print $git; } } else { print "Unknown version!"; $ok = 0; } } else { print "No!"; $ok = 0; } print "\n"; return $ok; } sub check_wget { my ( $self ) = @_; my $ok = 1; print "Checking for wget... "; if (my $wget = which('wget')) { print $wget; } else { print "No!"; $ok = 0; } print "\n"; return $ok; } sub get_local_ddg_version { my $installed_version; eval { load_class('DDG'); $installed_version = $DDG::VERSION; }; return $installed_version; } sub check_ddg { my ( $self ) = @_; my $ok = 1; print "Checking for latest DDG Perl package... "; my $tempfile = tmpnam; if (is_success(getstore($self->duckpan_packages,$tempfile))) { my $packages = Parse::CPAN::Packages::Fast->new($tempfile); my $module = $packages->package('DDG'); my $latest = $self->duckpan.'authors/id/'.$module->distribution->pathname; my $installed_version = $self->get_local_ddg_version; if ($installed_version && version->parse($installed_version) == version->parse($module->version)) { print $module->version; } else { print "You got ".$installed_version.", latest is ".$module->version."!\n"; print "[ERROR] Please install latest DDG with: cpanm ".$latest; $ok = 0; } } else { print "[ERROR] Can't download ".$self->duckpan_packages; $ok = 0; } print "\n"; return $ok; } # sub check_locallib { # my ( $self ) = @_; # my $ok = 1; # print "Checking for local::lib installation... "; # if (my $perl5lib = $ENV{PERL5LIB}) { # my @paths = split(/:/,$perl5lib); # print "Yes"; # } else { # print "No!"; $ok = 1; # } # print "\n"; # return $ok; # } sub checking_dukgo_user { my ( $self, $user, $pass ) = @_; my $response = $self->http->request(POST($self->dukgo_login, Content => { username => $user, password => $pass, })); $response->code == 302 ? 1 : 0; # workaround, need something in dukgo } 1; __END__ =pod =head1 NAME App::DuckPAN - The DuckDuckGo DuckPAN client =head1 VERSION version 0.001 =head1 AUTHOR Torsten Raudssus <torsten@raudss.us> =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2011 by DuckDuckGo, Inc. L<http://duckduckgo.com/>. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut