Skip to content
This repository has been archived by the owner on Mar 7, 2019. It is now read-only.

Commit

Permalink
Moved Repository class selection handling to A::B::MB, this allows fo…
Browse files Browse the repository at this point in the history
…r proper constructor interitance for A::B::MB::R and subclasses
  • Loading branch information
jberger committed Mar 7, 2012
1 parent e637d98 commit d3435ce
Show file tree
Hide file tree
Showing 8 changed files with 59 additions and 45 deletions.
17 changes: 16 additions & 1 deletion MANIFEST
@@ -1,25 +1,40 @@
Build.PL Build.PL
examples/Alien-DontPanic/Build.PL
examples/Alien-DontPanic/inc/dontpanic-1.01.tar.gz
examples/Alien-DontPanic/lib/Alien/DontPanic.pm
examples/Alien-DontPanic/MANIFEST
examples/Alien-GSL/Build.PL examples/Alien-GSL/Build.PL
examples/Alien-GSL/lib/Alien/GSL.pm examples/Alien-GSL/lib/Alien/GSL.pm
examples/Alien-GSL/MANIFEST examples/Alien-GSL/MANIFEST
examples/Ford-Prefect/Build.PL
examples/Ford-Prefect/lib/Ford/Prefect.pm
examples/Ford-Prefect/lib/Ford/Prefect.xs
examples/Ford-Prefect/MANIFEST
lib/Alien/Base.pm lib/Alien/Base.pm
lib/Alien/Base/Authoring.pod
lib/Alien/Base/ModuleBuild.pm lib/Alien/Base/ModuleBuild.pm
lib/Alien/Base/ModuleBuild/Cabinet.pm lib/Alien/Base/ModuleBuild/Cabinet.pm
lib/Alien/Base/ModuleBuild/File.pm lib/Alien/Base/ModuleBuild/File.pm
lib/Alien/Base/ModuleBuild/Repository.pm lib/Alien/Base/ModuleBuild/Repository.pm
lib/Alien/Base/ModuleBuild/Repository/FTP.pm lib/Alien/Base/ModuleBuild/Repository/FTP.pm
lib/Alien/Base/ModuleBuild/Repository/HTTP.pm lib/Alien/Base/ModuleBuild/Repository/HTTP.pm
lib/Alien/Base/ModuleBuild/Repository/TEST.pm lib/Alien/Base/ModuleBuild/Repository/Local.pm
lib/Alien/Base/ModuleBuild/Repository/Test.pm
lib/Alien/Base/ModuleBuild/Utils.pm lib/Alien/Base/ModuleBuild/Utils.pm
lib/Alien/Base/PkgConfig.pm
MANIFEST This list of files MANIFEST This list of files
README README
t/cabinet.t t/cabinet.t
t/file.t t/file.t
t/http.t t/http.t
t/interpolate.t t/interpolate.t
t/local_repo.t
t/pkgconfig.t
t/pkgconfig/gsl.pc t/pkgconfig/gsl.pc
t/pkgconfig/test.pc
t/repository.t t/repository.t
t/utils.t t/utils.t
t/validation.t t/validation.t
t/version.t t/version.t
t/zz-example.t
TODO TODO
2 changes: 1 addition & 1 deletion lib/Alien/Base/Authoring.pod
Expand Up @@ -16,7 +16,7 @@ L<Alien::Base::ModuleBuild> provides a base class, utility methods and configura


# file: Alien-MyLibrary/Build.PL # file: Alien-MyLibrary/Build.PL
use Alien::Base::ModuleBuild; use Alien::Base::ModuleBuild;
my $builder = Alien::Base::ModuleBuild->new({...}); my $builder = Alien::Base::ModuleBuild->new(...);
$builder->create_build_script; $builder->create_build_script;


This is just like you would do for L<Module::Build>, except that there will be a few additional configuration parameters (see L<Alien::Base::ModuleBuild::API>). This is just like you would do for L<Module::Build>, except that there will be a few additional configuration parameters (see L<Alien::Base::ModuleBuild::API>).
Expand Down
32 changes: 28 additions & 4 deletions lib/Alien/Base/ModuleBuild.pm
Expand Up @@ -11,10 +11,25 @@ use File::Spec;
use Carp; use Carp;
use Archive::Extract; use Archive::Extract;


use Alien::Base::ModuleBuild::Repository; use Alien::Base::PkgConfig;
use Alien::Base::ModuleBuild::Cabinet; use Alien::Base::ModuleBuild::Cabinet;
use Alien::Base::ModuleBuild::Repository;


use Alien::Base::PkgConfig; use Alien::Base::ModuleBuild::Repository::HTTP;
use Alien::Base::ModuleBuild::Repository::FTP;
use Alien::Base::ModuleBuild::Repository::Test;
use Alien::Base::ModuleBuild::Repository::Local;

# setup protocol specific classes
# Alien:: author can override these defaults using alien_repository_class property
our %Repository_Class;
my %default_repository_class = (
default => 'Alien::Base::ModuleBuild::Repository',
http => 'Alien::Base::ModuleBuild::Repository::HTTP',
ftp => 'Alien::Base::ModuleBuild::Repository::FTP',
test => 'Alien::Base::ModuleBuild::Repository::Test',
local => 'Alien::Base::ModuleBuild::Repository::Local',
);


our $VERSION = 0.01; our $VERSION = 0.01;
$VERSION = eval $VERSION; $VERSION = eval $VERSION;
Expand Down Expand Up @@ -65,8 +80,10 @@ __PACKAGE__->add_property( 'alien_provides_libs' );
# |-- [platform]*: hashref of above keys for specific case (overrides defaults) # |-- [platform]*: hashref of above keys for specific case (overrides defaults)
# | # |
# |-- (non-api) connection: holder for Net::FTP-like object (needs cwd, ls, and get methods) # |-- (non-api) connection: holder for Net::FTP-like object (needs cwd, ls, and get methods)
__PACKAGE__->add_property( 'alien_repository' => {} );
__PACKAGE__->add_property( 'alien_repository_default' => {} ); __PACKAGE__->add_property( 'alien_repository_default' => {} );
__PACKAGE__->add_property( 'alien_repository' ); __PACKAGE__->add_property( 'alien_repository_class' => {} );



################ ################
# ConfigData # # ConfigData #
Expand All @@ -86,6 +103,12 @@ sub new {
my $install_dir = $args{alien_share_dir} || '_install'; my $install_dir = $args{alien_share_dir} || '_install';
my $cleanup_install_dir = 0; my $cleanup_install_dir = 0;


# merge default and user-defined repository classes
foreach my $protocol (keys %default_repository_class) {
next if defined $args{alien_repository_class}{$protocol};
$args{alien_repository_class}{$protocol} = $default_repository_class{$protocol};
}

# initialize M::B property share_dir # initialize M::B property share_dir
if (! defined $args{share_dir}) { if (! defined $args{share_dir}) {
# no share_dir property # no share_dir property
Expand Down Expand Up @@ -138,8 +161,9 @@ sub alien_create_repositories {
} }


$repo->{platform} = 'src' unless defined $repo->{platform}; $repo->{platform} = 'src' unless defined $repo->{platform};
my $protocol = $repo->{protocol} || 'default';


push @repos, Alien::Base::ModuleBuild::Repository->new( $repo ); push @repos, $self->alien_repository_class($protocol)->new( $repo );
} }


# check validation, including c compiler for src type # check validation, including c compiler for src type
Expand Down
30 changes: 2 additions & 28 deletions lib/Alien/Base/ModuleBuild/Repository.pm
Expand Up @@ -10,37 +10,11 @@ use Module::Loaded qw/is_loaded/;
use Alien::Base::ModuleBuild::File; use Alien::Base::ModuleBuild::File;
use Alien::Base::ModuleBuild::Utils qw/pattern_has_capture_groups/; use Alien::Base::ModuleBuild::Utils qw/pattern_has_capture_groups/;


use Alien::Base::ModuleBuild::Repository::HTTP;
use Alien::Base::ModuleBuild::Repository::FTP;
use Alien::Base::ModuleBuild::Repository::TEST;
use Alien::Base::ModuleBuild::Repository::LOCAL;

# setup protocol specific classes
# Alien:: author can override these defaults using package variable
our %Repository_Class;
my %default_repository_class = (
HTTP => 'Alien::Base::ModuleBuild::Repository::HTTP',
FTP => 'Alien::Base::ModuleBuild::Repository::FTP',
TEST => 'Alien::Base::ModuleBuild::Repository::TEST',
LOCAL => 'Alien::Base::ModuleBuild::Repository::LOCAL',
);
foreach my $type (keys %default_repository_class) {
$Repository_Class{$type} ||= $default_repository_class{$type};
}

sub new { sub new {
my $class = shift; my $class = shift;
my ($self) = @_; my (%self) = ref $_[0] ? %{ shift() } : @_;

my $protocol = $self->{protocol} = uc $self->{protocol};
croak "Unsupported protocol: $protocol"
unless exists $Repository_Class{$protocol};


my $obj = bless $self, $Repository_Class{$protocol}; my $obj = bless \%self, $class;

if ($obj->can('init')) {
$obj->init;
}


return $obj; return $obj;
} }
Expand Down
@@ -1,4 +1,4 @@
package Alien::Base::ModuleBuild::Repository::LOCAL; package Alien::Base::ModuleBuild::Repository::Local;


use strict; use strict;
use warnings; use warnings;
Expand All @@ -10,8 +10,10 @@ use File::Spec;


use parent 'Alien::Base::ModuleBuild::Repository'; use parent 'Alien::Base::ModuleBuild::Repository';


sub init { sub new {
my $self = shift; my $class = shift;

my $self = $class->SUPER::new(@_);


# make location absolute # make location absolute
local $CWD = $self->location; local $CWD = $self->location;
Expand Down
@@ -1,4 +1,4 @@
package Alien::Base::ModuleBuild::Repository::TEST; package Alien::Base::ModuleBuild::Repository::Test;


use strict; use strict;
use warnings; use warnings;
Expand Down
5 changes: 2 additions & 3 deletions t/local_repo.t
Expand Up @@ -7,10 +7,9 @@ use File::Basename qw/fileparse/;
use File::Temp; use File::Temp;
use File::chdir; use File::chdir;


use Alien::Base::ModuleBuild::Repository::LOCAL; use Alien::Base::ModuleBuild::Repository::Local;


my $repo = bless { location => 't' }, 'Alien::Base::ModuleBuild::Repository::LOCAL'; my $repo = Alien::Base::ModuleBuild::Repository::Local->new({ location => 't' });
$repo->init; # this hack fixes the internal representation of location, usually called by Repository->new


my @files = $repo->list_files; my @files = $repo->list_files;
my $this_file = fileparse __FILE__; my $this_file = fileparse __FILE__;
Expand Down
8 changes: 4 additions & 4 deletions t/repository.t
Expand Up @@ -2,7 +2,7 @@ use strict;
use warnings; use warnings;


use Test::More; use Test::More;
use_ok( 'Alien::Base::ModuleBuild::Repository' ); use Alien::Base::ModuleBuild::Repository::Test;


my $default = { my $default = {
protocol => 'test', protocol => 'test',
Expand All @@ -11,7 +11,7 @@ my $default = {
}; };


{ {
my $repo = Alien::Base::ModuleBuild::Repository->new($default); my $repo = Alien::Base::ModuleBuild::Repository::Test->new($default);


my @filenames = $repo->list_files; my @filenames = $repo->list_files;


Expand All @@ -24,7 +24,7 @@ my $default = {
{ {
my $pattern = qr/^gsl-[\d\.]+\.tar\.gz$/; my $pattern = qr/^gsl-[\d\.]+\.tar\.gz$/;
local $default->{pattern} = $pattern; local $default->{pattern} = $pattern;
my $repo = Alien::Base::ModuleBuild::Repository->new($default); my $repo = Alien::Base::ModuleBuild::Repository::Test->new($default);


my @filenames = grep { $_ =~ $pattern } $repo->list_files; my @filenames = grep { $_ =~ $pattern } $repo->list_files;


Expand All @@ -38,7 +38,7 @@ my $default = {
{ {
my $pattern = qr/^gsl-([\d\.]+)\.tar\.gz$/; my $pattern = qr/^gsl-([\d\.]+)\.tar\.gz$/;
local $default->{pattern} = $pattern; local $default->{pattern} = $pattern;
my $repo = Alien::Base::ModuleBuild::Repository->new($default); my $repo = Alien::Base::ModuleBuild::Repository::Test->new($default);


my @filenames = grep { $_ =~ $pattern } $repo->list_files; my @filenames = grep { $_ =~ $pattern } $repo->list_files;


Expand Down

0 comments on commit d3435ce

Please sign in to comment.