Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Initial work on Dist::Source base class and GitHub dist source
  • Loading branch information
zoffixznet committed Nov 21, 2015
1 parent 4ec675f commit 107e84a
Show file tree
Hide file tree
Showing 5 changed files with 151 additions and 5 deletions.
4 changes: 4 additions & 0 deletions Build.PL
Expand Up @@ -11,6 +11,10 @@ my $build = Module::Build->new(

# and now the list of perl module dependencies
requires => {
## Optional deps used by some modules
'Module::Runtime' => '0.014', # Module::Pluggable
'Module::Require' => '0.05', # Module::Pluggable
'IO::Socket::SSL' => '2.020', # Mojo::UserAgent

## Required by the Mojo app:
'Carp' => 0,
Expand Down
19 changes: 15 additions & 4 deletions web/lib/DbBuilder.pm
Expand Up @@ -68,12 +68,23 @@ sub run {
my $build_id = Data::GUID->new->as_base64;
log info => "Starting build $build_id";

my $m = ModulesPerl6::Model::Dists->new( db_file => $self->db_file );
$m->add(
DbBuilder::Dist->new( meta_url => $_, build_id => $build_id )->as_hash
) for $self->_meta_list;
my $dists_m
= ModulesPerl6::Model::Dists->new( db_file => $self->db_file )->deploy;

my @metas = $self->_meta_list;
for ( 0 .. $#metas ) {
log info => 'Processing dist ' . ($_+1) . ' of ' . @metas;
$dists_m->add(
DbBuilder::Dist->new(
meta_url => $metas[$_],
build_id => $build_id,
logos_dir => $self->_logos_dir,
)->info
);
);

if ( $self->_restart_app ) {
log info => 'Restarting app ' . $self->_app;
system $^O eq 'MSWin32'
? $self->_app => 'daemon' # hypnotoad is not supported on Win32
: hypnotoad => $self->_app;
Expand Down
54 changes: 53 additions & 1 deletion web/lib/DbBuilder/Dist.pm
Expand Up @@ -2,7 +2,12 @@ package DbBuilder::Dist;

use strictures 2;

use Types::Standard qw/Str/;
use Module::Pluggable search_path => ['DbBuilder::Dist::Source'],
sub_name => '_sources',
require => 1;
use Types::Standard qw/Ref Maybe Str/;

use DbBuilder::Log;

use Moo;
use namespace::clean;
Expand All @@ -14,11 +19,58 @@ has _build_id => (
required => 1,
);

has _logos_dir => (
init_arg => 'logos_dir',
is => 'ro',
isa => Str,
required => 1,
);

has _meta_url => (
init_arg => 'meta_url',
is => 'ro',
isa => Str,
required => 1,
);

#########################

sub info {
my $self = shift;
my $info = $self->_load_info
or return;

return $info;
}

#########################

sub _load_info {
my $self = shift;

my $dist = $self->_load_from_source
or return;

$dist->{build_id} = $self->_build_id;
}

sub _load_from_source {
my $self = shift;

my $url = $self->_meta_url;
for my $source ( $self->_sources ) {
next unless $url =~ $source->re;
log info => "Using $source to load $url";
return $source->new(
meta_url => $url,
logos_dir => $self->_logos_dir
)->load;
}
log error => "Could not find a source module that could handle dist URL "
. "[$url]\nHere are all the source modules currently available:\n"
. join "\n", map "$_ looks for " . $_->re, $self->_sources;

return;
}

1;
63 changes: 63 additions & 0 deletions web/lib/DbBuilder/Dist/Source.pm
@@ -0,0 +1,63 @@
package DbBuilder::Dist::Source;

use strictures 2;

use JSON::Meth qw/$json/;
use Mojo::UserAgent;
use Try::Tiny;
use Types::Standard qw/Str/;

use DbBuilder::Log;

use Moo;
use namespace::clean;

has _logos_dir => (
init_arg => 'logos_dir',
is => 'ro',
isa => Str,
required => 1,
);

has _meta_url => (
init_arg => 'meta_url',
is => 'ro',
isa => Str,
required => 1,
);

sub _download_meta {
my $self = shift;
my $url = $self->_meta_url;

log info => "Downloading META file from $url";
my $tx = Mojo::UserAgent->new( max_redirects => 10 )->get( $url );

if ( $tx->success ) { return $tx->res->body }
else {
my $err = $tx->error;
log error => "$err->{code} response: $err->{message}"
if $err->{code};
log error => "Connection error: $err->{message}";
}

return;
}

sub _parse_meta {
my ( $self, $data ) = @_;

log info => 'Parsing META file';
eval { $data or die "No data to parse\n"; $data->$json };
if ( $@ ) { log error => "Failed to parse: JSON error: $@"; return; }

length $json->{ $_ } or log warn => "Required `$_` field is missing"
for qw/perl name version description provides/;

return $json;
}

sub load { ... }
sub re { ... }

1;
16 changes: 16 additions & 0 deletions web/lib/DbBuilder/Dist/Source/GitHub.pm
@@ -0,0 +1,16 @@
package DbBuilder::Dist::Source::GitHub;

use strictures 2;
use base 'DbBuilder::Dist::Source';

use DbBuilder::Log;

use Moo;
use namespace::clean;

sub re { qr{^https?://\Qraw.githubusercontent.com\Q}i }
sub load {
my $self = shift;

my $dist = $self->_parse_meta( $self->_download_meta );
}

0 comments on commit 107e84a

Please sign in to comment.