
jesse at bestpractical
Feb 26, 2006, 5:51 PM
Post #1 of 1
(173 views)
Permalink
|
|
r4582 - in rtir/branches/1.9-EXPERIMENTAL: . inc/Module inc/Module/Install/RTx
|
|
Author: jesse Date: Sun Feb 26 20:51:06 2006 New Revision: 4582 Added: rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install/AutoInstall.pm rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install/Include.pm Modified: rtir/branches/1.9-EXPERIMENTAL/ (props changed) rtir/branches/1.9-EXPERIMENTAL/META.yml rtir/branches/1.9-EXPERIMENTAL/Makefile.PL rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install.pm rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install/Base.pm rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install/Makefile.pm rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install/Metadata.pm rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install/RTx.pm rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install/RTx/Factory.pm Log: r24525[at]truegrounds: jesse | 2006-02-23 18:53:51 -0500 * Autoinstall dependencies for easier user installation Modified: rtir/branches/1.9-EXPERIMENTAL/META.yml ============================================================================== --- rtir/branches/1.9-EXPERIMENTAL/META.yml (original) +++ rtir/branches/1.9-EXPERIMENTAL/META.yml Sun Feb 26 20:51:06 2006 @@ -1,16 +1,17 @@ -name: RT-IR -version: 1.9.HEAD abstract: RT IR Extension -author: Best Practical Solutions <sales[at]bestpractical.com> -license: GPL Version 2 +author: 'Best Practical Solutions <sales[at]bestpractical.com>' distribution_type: module -requires: - Business::Hours: 0 - Business::SLA: 0 - Net::Whois::RIPE: 0 +generated_by: Module::Install version 0.52 +license: GPL Version 2 +name: RT-IR no_index: directory: - etc - html - inc -generated_by: Module::Install version 0.37 + - t +requires: + Business::Hours: 0 + Business::SLA: 0 + Net::Whois::RIPE: 0 +version: 1.9.HEAD Modified: rtir/branches/1.9-EXPERIMENTAL/Makefile.PL ============================================================================== --- rtir/branches/1.9-EXPERIMENTAL/Makefile.PL (original) +++ rtir/branches/1.9-EXPERIMENTAL/Makefile.PL Sun Feb 26 20:51:06 2006 @@ -9,5 +9,5 @@ requires('Business::Hours'); requires('Business::SLA'); requires('Net::Whois::RIPE'); - +&auto_install; &WriteAll; Modified: rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install.pm ============================================================================== --- rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install.pm (original) +++ rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install.pm Sun Feb 26 20:51:06 2006 @@ -1,8 +1,17 @@ -#line 1 "inc/Module/Install.pm - /usr/lib/perl5/vendor_perl/5.8.7/Module/Install.pm" +#line 1 "/home/jesse/svk/rtir-1.9/inc/Module/Install.pm - /usr/local/share/perl/5.8.7/Module/Install.pm" package Module::Install; -$VERSION = '0.37'; -die << "." unless $INC{join('/', inc => split(/::/, __PACKAGE__)).'.pm'}; +use 5.004; +use strict 'vars'; +use vars qw{$VERSION}; +BEGIN { + # Don't forget to update Module::Install::Admin too! + $VERSION = '0.52'; +} + +# inc::Module::Install must be loaded first +unless ( $INC{join('/', inc => split(/::/, __PACKAGE__)).'.pm'} ) { + die <<"END_DIE"; Please invoke ${\__PACKAGE__} with: use inc::${\__PACKAGE__}; @@ -11,23 +20,40 @@ use ${\__PACKAGE__}; -. +END_DIE +} -use strict 'vars'; -use Cwd (); +use Cwd (); +use FindBin; use File::Find (); use File::Path (); -[at]inc::Module::Install::ISA = 'Module::Install'; *inc::Module::Install::VERSION = *VERSION; +@inc::Module::Install::ISA = 'Module::Install'; -#line 129 +sub autoload { + my $self = shift; + my $caller = $self->_caller; + my $cwd = Cwd::cwd(); + my $sym = "$caller\::AUTOLOAD"; + + $sym->{$cwd} = sub { + my $pwd = Cwd::cwd(); + if ( my $code = $sym->{$pwd} ) { + # delegate back to parent dirs + goto &$code unless $cwd eq $pwd; + } + $$sym =~ /([^:]+)$/ or die "Cannot autoload $caller - $sym"; + unshift @_, ($self, $1); + goto &{$self->can('call')} unless uc($1) eq $1; + }; +} sub import { my $class = shift; - my $self = $class->new(@_); + my $self = $class->new(@_); - if (not -f $self->{file}) { + unless ( -f $self->{file} ) { require "$self->{path}/$self->{dispatch}.pm"; File::Path::mkpath("$self->{prefix}/$self->{author}"); $self->{admin} = @@ -37,44 +63,64 @@ goto &{"$self->{name}::import"}; } - *{caller(0) . "::AUTOLOAD"} = $self->autoload; + *{$self->_caller . "::AUTOLOAD"} = $self->autoload; + $self->preload; # Unregister loader and worker packages so subdirs can use them again delete $INC{"$self->{file}"}; delete $INC{"$self->{path}.pm"}; } -#line 156 +sub preload { + my ($self) = @_; -sub autoload { - my $self = shift; - my $caller = caller; + unless ( $self->{extentions} ) { + $self->load_extensions( + "$self->{prefix}/$self->{path}", $self + ); + } - my $cwd = Cwd::cwd(); - my $sym = "$caller\::AUTOLOAD"; + my @exts = @{$self->{extensions}}; + unless ( @exts ) { + my $admin = $self->{admin}; + @exts = $admin->load_all_extensions; + } - $sym->{$cwd} = sub { - my $pwd = Cwd::cwd(); - if (my $code = $sym->{$pwd}) { - goto &$code unless $cwd eq $pwd; # delegate back to parent dirs + my %seen_method; + foreach my $obj ( @exts ) { + while (my ($method, $glob) = each %{ref($obj) . '::'}) { + next unless defined *{$glob}{CODE}; + next if $method =~ /^_/; + next if $method eq uc($method); + $seen_method{$method}++; } - $$sym =~ /([^:]+)$/ or die "Cannot autoload $caller"; - unshift @_, ($self, $1); - goto &{$self->can('call')} unless uc($1) eq $1; - }; -} + } -#line 181 + my $caller = $self->_caller; + foreach my $name (sort keys %seen_method) { + *{"${caller}::$name"} = sub { + ${"${caller}::AUTOLOAD"} = "${caller}::$name"; + goto &{"${caller}::AUTOLOAD"}; + }; + } +} sub new { my ($class, %args) = @_; + # ignore the prefix on extension modules built from top level. + my $base_path = Cwd::abs_path($FindBin::Bin); + unless ( Cwd::abs_path(Cwd::cwd()) eq $base_path ) { + delete $args{prefix}; + } + return $args{_self} if $args{_self}; $args{dispatch} ||= 'Admin'; $args{prefix} ||= 'inc'; $args{author} ||= '.author'; $args{bundle} ||= 'inc/BUNDLES'; + $args{base} ||= $base_path; $class =~ s/^\Q$args{prefix}\E:://; $args{name} ||= $class; @@ -84,24 +130,20 @@ $args{path} = $args{name}; $args{path} =~ s!::!/!g; } - $args{file} ||= "$args{prefix}/$args{path}.pm"; + $args{file} ||= "$args{base}/$args{prefix}/$args{path}.pm"; bless(\%args, $class); } -#line 210 - sub call { my $self = shift; my $method = shift; - my $obj = $self->load($method) or return; + my $obj = $self->load($method) or return; unshift @_, $obj; goto &{$obj->can($method)}; } -#line 225 - sub load { my ($self, $method) = @_; @@ -113,10 +155,10 @@ return $obj if $obj->can($method); } - my $admin = $self->{admin} or die << "END"; + my $admin = $self->{admin} or die <<"END_DIE"; The '$method' method does not exist in the '$self->{prefix}' path! Please remove the '$self->{prefix}' directory and run $0 again to load it. -END +END_DIE my $obj = $admin->load($method, 1); push @{$self->{extensions}}, $obj; @@ -124,8 +166,6 @@ $obj; } -#line 255 - sub load_extensions { my ($self, $path, $top_obj) = @_; @@ -137,33 +177,46 @@ my ($file, $pkg) = @{$rv}; next if $self->{pathnames}{$pkg}; - eval { require $file; 1 } or (warn($@), next); + local $@; + my $new = eval { require $file; $pkg->can('new') }; + unless ( $new ) { + warn $@ if $@; + next; + } $self->{pathnames}{$pkg} = delete $INC{$file}; - push @{$self->{extensions}}, $pkg->new( _top => $top_obj ); + push @{$self->{extensions}}, &{$new}($pkg, _top => $top_obj ); } -} -#line 279 + $self->{extensions} ||= []; +} sub find_extensions { my ($self, $path) = @_; - my @found; - File::Find::find(sub { + my @found; + File::Find::find( sub { my $file = $File::Find::name; return unless $file =~ m!^\Q$path\E/(.+)\.pm\Z!is; return if $1 eq $self->{dispatch}; $file = "$self->{path}/$1.pm"; my $pkg = "$self->{name}::$1"; $pkg =~ s!/!::!g; - push @found, [$file, $pkg]; - }, $path) if -d $path; + push @found, [ $file, $pkg ]; + }, $path ) if -d $path; @found; } -1; +sub _caller { + my $depth = 0; + my $caller = caller($depth); + + while ($caller eq __PACKAGE__) { + $depth++; + $caller = caller($depth); + } -__END__ + $caller; +} -#line 617 +1; Added: rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install/AutoInstall.pm ============================================================================== --- (empty file) +++ rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install/AutoInstall.pm Sun Feb 26 20:51:06 2006 @@ -0,0 +1,52 @@ +#line 1 "inc/Module/Install/AutoInstall.pm - /usr/local/share/perl/5.8.7/Module/Install/AutoInstall.pm" +package Module::Install::AutoInstall; +use Module::Install::Base; @ISA = qw(Module::Install::Base); + +sub AutoInstall { $_[0] } + +sub run { + my $self = shift; + $self->auto_install_now(@_); +} + +sub write { + my $self = shift; + $self->auto_install(@_); +} + +sub auto_install { + my $self = shift; + return if $self->{done}++; + + # Flatten array of arrays into a single array + my @core = map @$_, map @$_, grep ref, + $self->build_requires, $self->requires; + + my @config = @_; + + # We'll need Module::AutoInstall + $self->include('Module::AutoInstall'); + require Module::AutoInstall; + + Module::AutoInstall->import( + (@config ? (-config => \@config) : ()), + (@core ? (-core => \@core) : ()), + $self->features, + ); + + $self->makemaker_args( Module::AutoInstall::_make_args() ); + + my $class = ref($self); + $self->postamble( + "# --- $class section:\n" . + Module::AutoInstall::postamble() + ); +} + +sub auto_install_now { + my $self = shift; + $self->auto_install(@_); + Module::AutoInstall::do_install(); +} + +1; Modified: rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install/Base.pm ============================================================================== --- rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install/Base.pm (original) +++ rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install/Base.pm Sun Feb 26 20:51:06 2006 @@ -1,7 +1,10 @@ -#line 1 "inc/Module/Install/Base.pm - /usr/lib/perl5/vendor_perl/5.8.7/Module/Install/Base.pm" +#line 1 "inc/Module/Install/Base.pm - /usr/local/share/perl/5.8.7/Module/Install/Base.pm" package Module::Install::Base; -#line 28 +# Suspend handler for "redefined" warnings +BEGIN { my $w = $SIG{__WARN__}; $SIG{__WARN__} = sub { $w } }; + +#line 30 sub new { my ($class, %args) = @_; @@ -15,18 +18,21 @@ bless(\%args, $class); } -#line 46 +#line 48 sub AUTOLOAD { my $self = shift; - goto &{$self->_top->autoload}; + + local $@; + my $autoload = eval { $self->_top->autoload } or return; + goto &$autoload; } -#line 57 +#line 62 sub _top { $_[0]->{_top} } -#line 68 +#line 73 sub admin { my $self = shift; @@ -49,6 +55,9 @@ 1; +# Restore warning handler +BEGIN { $SIG{__WARN__} = $SIG{__WARN__}->() }; + __END__ -#line 112 +#line 120 Added: rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install/Include.pm ============================================================================== --- (empty file) +++ rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install/Include.pm Sun Feb 26 20:51:06 2006 @@ -0,0 +1,10 @@ +#line 1 "inc/Module/Install/Include.pm - /usr/local/share/perl/5.8.7/Module/Install/Include.pm" +package Module::Install::Include; +use Module::Install::Base; @ISA = qw(Module::Install::Base); + +sub include { +shift->admin->include(@_) }; +sub include_deps { +shift->admin->include_deps(@_) }; +sub auto_include { +shift->admin->auto_include(@_) }; +sub auto_include_deps { +shift->admin->auto_include_deps(@_) }; +sub auto_include_dependent_dists { +shift->admin->auto_include_dependent_dists(@_) } +1; Modified: rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install/Makefile.pm ============================================================================== --- rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install/Makefile.pm (original) +++ rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install/Makefile.pm Sun Feb 26 20:51:06 2006 @@ -1,4 +1,4 @@ -#line 1 "inc/Module/Install/Makefile.pm - /usr/local/share/perl/5.8.4/Module/Install/Makefile.pm" +#line 1 "inc/Module/Install/Makefile.pm - /usr/local/share/perl/5.8.7/Module/Install/Makefile.pm" package Module::Install::Makefile; use Module::Install::Base; @ISA = qw(Module::Install::Base); @@ -23,6 +23,14 @@ $args; } +sub build_subdirs { + my $self = shift; + my $subdirs = $self->makemaker_args->{DIR} ||= []; + for my $subdir (@_) { + push @$subdirs, $subdir; + } +} + sub clean_files { my $self = shift; my $clean = $self->makemaker_args->{clean} ||= {}; @@ -54,15 +62,17 @@ $args->{VERSION} = $self->version || $self->determine_VERSION($args); $args->{NAME} =~ s/-/::/g; + $args->{test} = {TESTS => $self->tests} if $self->tests; + if ($] >= 5.005) { - $args->{ABSTRACT} = $self->abstract; - $args->{AUTHOR} = $self->author; + $args->{ABSTRACT} = $self->abstract; + $args->{AUTHOR} = $self->author; } if ( eval($ExtUtils::MakeMaker::VERSION) >= 6.10 ) { $args->{NO_META} = 1; } if ( eval($ExtUtils::MakeMaker::VERSION) > 6.17 ) { - $args->{SIGN} = 1 if $self->sign; + $args->{SIGN} = 1 if $self->sign; } delete $args->{SIGN} unless $self->is_admin; @@ -72,10 +82,13 @@ ($self->build_requires, $self->requires) ); # merge both kinds of requires into prereq_pm - my $dir = ($args->{DIR} ||= []); + my $subdirs = ($args->{DIR} ||= []); if ($self->bundles) { - push @$dir, map "$_->[1]", @{$self->bundles}; - delete $prereq->{$_->[0]} for @{$self->bundles}; + foreach my $bundle (@{ $self->bundles }) { + my ($file, $dir) = @$bundle; + push @$subdirs, $dir if -d $dir; + delete $prereq->{$file}; + } } if (my $perl_version = $self->perl_version) { @@ -106,6 +119,7 @@ my $postamble = "# Postamble by $top_class $top_version\n" . ($self->postamble || ''); + local *MAKEFILE; open MAKEFILE, '< Makefile' or die $!; my $makefile = do { local $/; <MAKEFILE> }; close MAKEFILE; @@ -140,4 +154,4 @@ __END__ -#line 273 +#line 286 Modified: rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install/Metadata.pm ============================================================================== --- rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install/Metadata.pm (original) +++ rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install/Metadata.pm Sun Feb 26 20:51:06 2006 @@ -1,25 +1,33 @@ -#line 1 "inc/Module/Install/Metadata.pm - /usr/local/share/perl/5.8.4/Module/Install/Metadata.pm" +#line 1 "inc/Module/Install/Metadata.pm - /usr/local/share/perl/5.8.7/Module/Install/Metadata.pm" package Module::Install::Metadata; -use Module::Install::Base; @ISA = qw(Module::Install::Base); - -$VERSION = '0.04'; use strict 'vars'; -use vars qw($VERSION); +use Module::Install::Base; -sub Meta { shift } +use vars qw($VERSION @ISA); +BEGIN { + $VERSION = '0.06'; + @ISA = 'Module::Install::Base'; +} -my @scalar_keys = qw( - name module_name version abstract author license - distribution_type sign perl_version -); -my @tuple_keys = qw(build_requires requires recommends bundles); +my @scalar_keys = qw{ + name module_name abstract author version license + distribution_type perl_version tests +}; + +my @tuple_keys = qw{ + build_requires requires recommends bundles +}; + +sub Meta { shift } +sub Meta_ScalarKeys { @scalar_keys } +sub Meta_TupleKeys { @tuple_keys } foreach my $key (@scalar_keys) { *$key = sub { my $self = shift; - return $self->{'values'}{$key} unless @_; - $self->{'values'}{$key} = shift; + return $self->{values}{$key} if defined wantarray and !@_; + $self->{values}{$key} = shift; return $self; }; } @@ -27,122 +35,152 @@ foreach my $key (@tuple_keys) { *$key = sub { my $self = shift; - return $self->{'values'}{$key} unless @_; + return $self->{values}{$key} unless @_; + my @rv; while (@_) { - my $module = shift or last; + my $module = shift or last; my $version = shift || 0; - if ($module eq 'perl') { + if ( $module eq 'perl' ) { $version =~ s{^(\d+)\.(\d+)\.(\d+)} {$1 + $2/1_000 + $3/1_000_000}e; $self->perl_version($version); next; } - my $rv = [$module, $version]; - push @{$self->{'values'}{$key}}, $rv; + my $rv = [ $module, $version ]; push @rv, $rv; } - return @rv; + push @{ $self->{values}{$key} }, @rv; + @rv; }; } -sub features { +sub sign { my $self = shift; - while (my ($name, $mods) = splice(@_, 0, 2)) { - my $count = 0; - push @{$self->{'values'}{'features'}}, ($name => [. - map { (++$count % 2 and ref($_) and ($count += $#$_)) ? @$_ : $_ } @$mods - ] ); + return $self->{'values'}{'sign'} if defined wantarray and !@_; + $self->{'values'}{'sign'} = ( @_ ? $_[0] : 1 ); + return $self; +} + +sub all_from { + my ( $self, $file ) = @_; + + unless ( defined($file) ) { + my $name = $self->name + or die "all_from called with no args without setting name() first"; + $file = join('/', 'lib', split(/-/, $name)) . '.pm'; + $file =~ s{.*/}{} unless -e $file; + die "all_from: cannot find $file from $name" unless -e $file; } - return @{$self->{'values'}{'features'}}; + + $self->version_from($file) unless $self->version; + $self->perl_version_from($file) unless $self->perl_version; + + # The remaining probes read from POD sections; if the file + # has an accompanying .pod, use that instead + my $pod = $file; + if ( $pod =~ s/\.pm$/.pod/i and -e $pod ) { + $file = $pod; + } + + $self->author_from($file) unless $self->author; + $self->license_from($file) unless $self->license; + $self->abstract_from($file) unless $self->abstract; } -sub no_index { - my $self = shift; - my $type = shift; - push @{$self->{'values'}{'no_index'}{$type}}, @_ if $type; - return $self->{'values'}{'no_index'}; +sub provides { + my $self = shift; + my $provides = ( $self->{values}{provides} ||= {} ); + %$provides = (%$provides, @_) if @_; + return $provides; } -sub _dump { +sub auto_provides { my $self = shift; - my $package = ref($self->_top); - my $version = $self->_top->VERSION; - my %values = %{$self->{'values'}}; - - delete $values{sign}; - if (my $perl_version = delete $values{perl_version}) { - # Always canonical to three-dot version - $perl_version =~ s{^(\d+)\.(\d\d\d)(\d*)}{join('.', $1, int($2), int($3))}e - if $perl_version >= 5.006; - $values{requires} = [ - [perl => $perl_version], - @{$values{requires}||[]}, - ]; - } - - warn "No license specified, setting license = 'unknown'\n" - unless $values{license}; - - $values{license} ||= 'unknown'; - $values{distribution_type} ||= 'module'; - $values{name} ||= do { - my $name = $values{module_name}; - $name =~ s/::/-/g; - $name; - } if $values{module_name}; - - if ($values{name} =~ /::/) { - my $name = $values{name}; - $name =~ s/::/-/g; - die "Error in name(): '$values{name}' should be '$name'!\n"; - } - - my $dump = ''; - foreach my $key (@scalar_keys) { - $dump .= "$key: $values{$key}\n" if exists $values{$key}; - } - foreach my $key (@tuple_keys) { - next unless exists $values{$key}; - $dump .= "$key:\n"; - foreach (@{$values{$key}}) { - $dump .= " $_->[0]: $_->[1]\n"; - } + return $self unless $self->is_admin; + + unless (-e 'MANIFEST') { + warn "Cannot deduce auto_provides without a MANIFEST, skipping\n"; + return $self; } - if (my $no_index = $values{no_index}) { - push @{$no_index->{'directory'}}, 'inc'; - require YAML; - local $YAML::UseHeader = 0; - $dump .= YAML::Dump({ no_index => $no_index}); + # Avoid spurious warnings as we are not checking manifest here. + + local $SIG{__WARN__} = sub {1}; + require ExtUtils::Manifest; + local *ExtUtils::Manifest::manicheck = sub { return }; + + require Module::Build; + my $build = Module::Build->new( + dist_name => $self->{name}, + dist_version => $self->{version}, + license => $self->{license}, + ); + $self->provides(%{ $build->find_dist_packages || {} }); +} + +sub feature { + my $self = shift; + my $name = shift; + my $features = ( $self->{values}{features} ||= [] ); + + my $mods; + + if ( @_ == 1 and ref( $_[0] ) ) { + # The user used ->feature like ->features by passing in the second + # argument as a reference. Accomodate for that. + $mods = $_[0]; } else { - $dump .= << "META"; -no_index: - directory: - - inc -META - } - - $dump .= "generated_by: $package version $version\n"; - return $dump; + $mods = \@_; + } + + my $count = 0; + push @$features, ( + $name => [. + map { + ref($_) ? ( ref($_) eq 'HASH' ) ? %$_ + : @$_ + : $_ + } @$mods + ] + ); + + return @$features; +} + +sub features { + my $self = shift; + while ( my ( $name, $mods ) = splice( @_, 0, 2 ) ) { + $self->feature( $name, @$mods ); + } + return @{ $self->{values}{features} }; +} + +sub no_index { + my $self = shift; + my $type = shift; + push @{ $self->{values}{no_index}{$type} }, @_ if $type; + return $self->{values}{no_index}; } sub read { my $self = shift; $self->include_deps( 'YAML', 0 ); + require YAML; - my $data = YAML::LoadFile( 'META.yml' ); + my $data = YAML::LoadFile('META.yml'); + # Call methods explicitly in case user has already set some values. - while ( my ($key, $value) = each %$data ) { - next unless $self->can( $key ); - if (ref $value eq 'HASH') { - while (my ($module, $version) = each %$value) { - $self->$key( $module => $version ); + while ( my ( $key, $value ) = each %$data ) { + next unless $self->can($key); + if ( ref $value eq 'HASH' ) { + while ( my ( $module, $version ) = each %$value ) { + $self->can($key)->($self, $module => $version ); } } else { - $self->$key( $value ); + $self->can($key)->($self, $value); } } return $self; @@ -151,37 +189,113 @@ sub write { my $self = shift; return $self unless $self->is_admin; - - META_NOT_OURS: { - local *FH; - if (open FH, "META.yml") { - while (<FH>) { - last META_NOT_OURS if /^generated_by: Module::Install\b/; - } - return $self if -s FH; - } - } - - warn "Writing META.yml\n"; - open META, "> META.yml" or warn "Cannot write to META.yml: $!"; - print META $self->_dump; - close META; + $self->admin->write_meta; return $self; } sub version_from { - my ($self, $version_from) = @_; + my ( $self, $file ) = @_; require ExtUtils::MM_Unix; - $self->version(ExtUtils::MM_Unix->parse_version($version_from)); + $self->version( ExtUtils::MM_Unix->parse_version($file) ); } sub abstract_from { - my ($self, $abstract_from) = @_; + my ( $self, $file ) = @_; require ExtUtils::MM_Unix; $self->abstract( - bless( { DISTNAME => $self->name }, 'ExtUtils::MM_Unix') - ->parse_abstract($abstract_from) - ); + bless( + { DISTNAME => $self->name }, + 'ExtUtils::MM_Unix' + )->parse_abstract($file) + ); +} + +sub _slurp { + my ( $self, $file ) = @_; + + local *FH; + open FH, "< $file" or die "Cannot open $file.pod: $!"; + do { local $/; <FH> }; +} + +sub perl_version_from { + my ( $self, $file ) = @_; + + if ( + $self->_slurp($file) =~ m/ + ^ + use \s* + v? + ([\d\.]+) + \s* ; + /ixms + ) + { + $self->perl_version($1); + } + else { + warn "Cannot determine perl version info from $file\n"; + return; + } +} + +sub author_from { + my ( $self, $file ) = @_; + my $content = $self->_slurp($file); + if ($content =~ m/ + =head \d \s+ (?:authors?)\b \s* + ([^\n]*) + | + =head \d \s+ (?:licen[cs]e|licensing|copyright|legal)\b \s* + .*? copyright .*? \d\d\d[\d.]+ \s* (?:\bby\b)? \s* + ([^\n]*) + /ixms) { + my $author = $1 || $2; + $author =~ s{E<lt>}{<}g; + $author =~ s{E<gt>}{>}g; + $self->author($author); + } + else { + warn "Cannot determine author info from $file\n"; + } +} + +sub license_from { + my ( $self, $file ) = @_; + + if ( + $self->_slurp($file) =~ m/ + =head \d \s+ + (?:licen[cs]e|licensing|copyright|legal)\b + (.*?) + (=head\\d.*|=cut.*|) + \z + /ixms + ) + { + my $license_text = $1; + my @phrases = ( + 'under the same (?:terms|license) as perl itself' => 'perl', + 'GNU public license' => 'gpl', + 'GNU lesser public license' => 'gpl', + 'BSD license' => 'bsd', + 'Artistic license' => 'artistic', + 'GPL' => 'gpl', + 'LGPL' => 'lgpl', + 'BSD' => 'bsd', + 'Artistic' => 'artistic', + ); + while ( my ( $pattern, $license ) = splice( @phrases, 0, 2 ) ) { + $pattern =~ s{\s+}{\\s+}g; + if ( $license_text =~ /\b$pattern\b/i ) { + $self->license($license); + return 1; + } + } + } + + warn "Cannot determine license info from $file\n"; + return 'unknown'; } 1; Modified: rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install/RTx.pm ============================================================================== --- rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install/RTx.pm (original) +++ rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install/RTx.pm Sun Feb 26 20:51:06 2006 @@ -1,8 +1,8 @@ -#line 1 "inc/Module/Install/RTx.pm - /usr/local/share/perl/5.8.4/Module/Install/RTx.pm" +#line 1 "inc/Module/Install/RTx.pm - /usr/local/share/perl/5.8.7/Module/Install/RTx.pm" package Module::Install::RTx; use Module::Install::Base; @ISA = qw(Module::Install::Base); -$Module::Install::RTx::VERSION = '0.10'; +$Module::Install::RTx::VERSION = '0.11'; use strict; use FindBin; @@ -153,6 +153,6 @@ __END__ -#line 221 +#line 220 -#line 242 +#line 241 Modified: rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install/RTx/Factory.pm ============================================================================== --- rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install/RTx/Factory.pm (original) +++ rtir/branches/1.9-EXPERIMENTAL/inc/Module/Install/RTx/Factory.pm Sun Feb 26 20:51:06 2006 @@ -1,4 +1,4 @@ -#line 1 "inc/Module/Install/RTx/Factory.pm - /usr/lib/perl5/vendor_perl/5.8.6/Module/Install/RTx/Factory.pm" +#line 1 "inc/Module/Install/RTx/Factory.pm - /usr/local/share/perl/5.8.7/Module/Install/RTx/Factory.pm" package Module::Install::RTx::Factory; use Module::Install::Base; @ISA = qw(Module::Install::Base); _______________________________________________ Rt-commit mailing list Rt-commit[at]lists.bestpractical.com http://lists.bestpractical.com/cgi-bin/mailman/listinfo/rt-commit
|