diff options
author | David Golden <dagolden@cpan.org> | 2011-01-24 23:06:38 -0500 |
---|---|---|
committer | David Golden <dagolden@cpan.org> | 2011-01-24 23:41:45 -0500 |
commit | 7cf8bfc08bba55cf85781cc2cdb8d5ace99245ec (patch) | |
tree | 708c8bbcc6060f3955178daa2f60ab83bac7f336 /cpan/Module-Build/lib/Module/Build/ModuleInfo.pm | |
parent | 313ce23f886218e9cbc159ce0f8dfdff84e48128 (diff) | |
download | perl-7cf8bfc08bba55cf85781cc2cdb8d5ace99245ec.tar.gz |
Update Module::Build to CPAN version 0.3622
[DELTA]
0.3622 - Mon Jan 24 21:06:50 EST 2011
- No changes from 0.36_21
0.36_21 - Fri Jan 21 11:01:28 EST 2011
- Changed YAML::Tiny references to the new CPAN::Meta::YAML module
instead, which is the YAML-variant that is going into the Perl core
0.36_20 - Fri Dec 10 15:36:03 EST 2010
*** DEPRECATIONS ***
- Module::Build::Version has been deprecated. Module::Build now depends
directly upon version.pm. A pure-perl version has been bundled in inc/
solely for bootstrapping in case configure_requires is not supported.
M::B::Version remains as a wrapper around version.pm.
- Module::Build::ModuleInfo has been deprecated. Module::Build now
depends directly upon Module::Metadata (which is an extraction of
M::B::ModuleInfo intended for general reuse). A pure-perl version has
been bundled in inc/ solely for bootstrapping in case
configure_requires is not supported. M::B::ModuleInfo remains as a
wrapper around Module::Metadata.
- Module::Build::YAML has been deprecated. Module::Build now depends
directly upon YAML::Tiny. M::B::YAML remains as a subclass wrapper.
The YAML_support feature has been removed, as YAML is now an ordinary
dependency.
0.36_19 - Tue Dec 7 13:43:42 EST 2010
Bug fixes:
- Perl::OSType is declared as a 'configure_requires' dependency, but is
also bundled in inc (and loaded if needed) [David Golden]
0.36_18 - Mon Dec 6 16:46:49 EST 2010
Changes:
- Added dependency on Perl::OSType to refactor and centralize
management of OS type mapping [David Golden]
- When parsing a version number out of a file, any trailing alphabetical
characters will be dropped to avoid fatal errors when comparing version
numbers. These would have been dropped (with a warning) anyway during
an ordinary numeric comparison. (RT#56071) [David Golden]
Bug fixes:
- A Perl interpreter mismatch between running Build.PL and running Build
is now a fatal error, not a warning (RT#55183) [David Golden]
- Bundled Module::Build::Version updated to bring into sync with CPAN
version.pm 0.86 [David Golden]
- No longer uses fake user 'foo' in t/tilde (RT#61793) [David Golden]
- Won't fail tests if an ancient Tie::IxHash is installed
[Christopher J. Madsen]
- Correctly report missing metafile field names [David Golden]
- Suppress uninitialized value errors during Pod creation
on ActiveState Perl [David Golden]
- Return to starting directory after install action; this is
an attempt to fix an install.t heisenbug (RT#63003) [David Golden]
- A broken version.pm load won't cause Module::Build::Version to
die trying to install itself as a mock version (RT#59499)
[Eric Wilhelm and David Golden]
- PERL_DL_NONLAZY is now always set when tests are run
(RT#56055) [Dmitry Karasik]
- 'fakeinstall' will use .modulebuildrc actions for 'install' if
no specific 'fakeinstall' options are provided (RT#57279)
[David Golden]
- Add install*script to search path for installdeps client
and search site, then vendor, then core paths
- Skip noexec tmpdir check on Windows (RT#55667) [Jan Dubois]
- Arguments with key value pairs may now have keys with "-" in them
(RT#53050) [David Golden]
- Add quotemeta to t/tilde.t test to fix Cygwin fails
[Chris Williams and David Golden]
- Build script now checks that M::B is at least the same version
of M::B as provided in 'configure_requires' in META
(RT#54954) [David Golden]
0.36_17 - Wed Oct 27 18:08:36 EDT 2010
Enhancements:
- Added 'distinstall' action to run 'Build install' inside the
generated distribution directory [Jeff Thalhammer]
0.36_16 - Thu Aug 26 12:44:07 EDT 2010
Bug fixes:
- Better error message in case package declaration is not found
when searching for version. [Alexandr Ciornii]
- Skips 'release_status' tests on perl < 5.8.1 due to buggy
treatment of dotted-decimal version numbers [David Golden]
0.36_15 - Wed Aug 25 10:41:28 EDT 2010
Bug fixes:
- Added a mock Software::License to prevent t/properties/license.t
from failing.
0.36_14 - Sun Aug 22 22:56:50 EDT 2010
Enhancements:
- Adds 'release_status' and 'dist_suffix' properties in preparation
for adding CPAN Meta Spec 2 support. 'dist_suffix' will be set
to 'TRIAL' automatically when necessary. [David Golden]
- Makes 'license' more liberal. You can now specify either a license
key from the approved list (c.f. Module::Build::API) or just a
Software::License subclass name (e.g. 'Perl_5'). This should
provide better support for custom or proprietary licenses.
[David Golden]
0.36_13 - Wed Jul 28 22:40:25 EDT 2010
Bug-fixes:
- Bundled Module::Build::Version updated to bring into sync with CPAN
version.pm 0.82 [David Golden]
0.36_12 - Tue Jul 27 00:08:51 EDT 2010
Enhancements:
- Module::Build::Compat will now convert dotted-decimal prereqs into
decimal rather than dying (and will warn about this). [Apocalypse]
Bug fixes:
- Caches case-sensitivity checks to boost performance, fixes
RT#55162 and RT#56513 [Reini Urban]
- Won't try to use ActivePerl doc generation tools without confirming
that they are indeed installed. [David Golden]
- Sets temporary $ENV{HOME} in testing to an absolute path, which fixes
some issues when tested as part of the Perl core [Nicholas Clark]
- Module::Build::ModuleInfo now warns instead of dying when a module
has an invalid version. ->version now just returns undef
(RT#59593) [David Golden]
Changes:
- When authors do not specify Module::Build in configure_requires and
Module::Build is automatically added, a warning will be issued
showing the added prerequisite [David Golden]
- Moved automatic configure_requires generation into get_metadata()
and added an 'auto' argument to toggle it (on for META and off
for MYMETA) [David Golden]
0.36_11 - Thu May 27 09:41:23 EDT 2010
Bug fixes:
- Handle META/MYMETA reading and writing within Module::Build to ensure
utf8 mode on filehandles. Now passes/gets only strings to YAML::Tiny
or Module::Build::YAML
0.36_10 - Wed May 19 18:36:06 EDT 2010
Bug fixes:
- Fix failing t/manifypods.t on Windows from 0.36_09 changes [Klaus
Eichner]
0.36_09 - Tue May 11 09:19:12 EDT 2010
Bug fixes:
- Improve HTML documentation generation on ActivePerl (RT#53478)
[Scott Renner and Klaus Eichner]
0.36_08 - Mon Apr 26 08:00:15 EDT 2010
Enhancements:
- Give a list of valid licenses when given one we don't recognize
(RT#55951) [Yanick Champoux]
- Added 'Build manifest_skip' action to generate a default MANIFEST.SKIP
[David Golden]
Changes:
- When temporarily generating a MANIFEST.SKIP when none exists, it will
be removed on exit instead of hanging around until 'Build clean'. This
is less surprising/confusing and the 'Build manifest_skip' action
is now available instead to bootstrap the file [David Golden]
Bug fixes:
- Fixed runtime error on cygwin when searching for an executable command
during installdeps testing [David Golden]
Diffstat (limited to 'cpan/Module-Build/lib/Module/Build/ModuleInfo.pm')
-rw-r--r-- | cpan/Module-Build/lib/Module/Build/ModuleInfo.pm | 473 |
1 files changed, 8 insertions, 465 deletions
diff --git a/cpan/Module-Build/lib/Module/Build/ModuleInfo.pm b/cpan/Module-Build/lib/Module/Build/ModuleInfo.pm index 531d13b241..2ee9faee7c 100644 --- a/cpan/Module-Build/lib/Module/Build/ModuleInfo.pm +++ b/cpan/Module-Build/lib/Module/Build/ModuleInfo.pm @@ -2,390 +2,13 @@ # vim:ts=8:sw=2:et:sta:sts=2 package Module::Build::ModuleInfo; -# This module provides routines to gather information about -# perl modules (assuming this may be expanded in the distant -# parrot future to look at other types of modules). - use strict; use vars qw($VERSION); -$VERSION = '0.3607'; +$VERSION = '0.3622'; $VERSION = eval $VERSION; -use File::Spec; -use IO::File; -use Module::Build::Version; - -my $V_NUM_REGEXP = qr{v?[0-9._]+}; # crudely, a v-string or decimal - -my $PKG_REGEXP = qr{ # match a package declaration - ^[\s\{;]* # intro chars on a line - package # the word 'package' - \s+ # whitespace - ([\w:]+) # a package name - \s* # optional whitespace - ($V_NUM_REGEXP)? # optional version number - \s* # optional whitesapce - ; # semicolon line terminator -}x; - -my $VARNAME_REGEXP = qr{ # match fully-qualified VERSION name - ([\$*]) # sigil - $ or * - ( - ( # optional leading package name - (?:::|\')? # possibly starting like just :: (Ì la $::VERSION) - (?:\w+(?:::|\'))* # Foo::Bar:: ... - )? - VERSION - )\b -}x; - -my $VERS_REGEXP = qr{ # match a VERSION definition - (?: - \(\s*$VARNAME_REGEXP\s*\) # with parens - | - $VARNAME_REGEXP # without parens - ) - \s* - =[^=~] # = but not ==, nor =~ -}x; - - -sub new_from_file { - my $class = shift; - my $filename = File::Spec->rel2abs( shift ); - - return undef unless defined( $filename ) && -f $filename; - return $class->_init(undef, $filename, @_); -} - -sub new_from_module { - my $class = shift; - my $module = shift; - my %props = @_; - - $props{inc} ||= \@INC; - my $filename = $class->find_module_by_name( $module, $props{inc} ); - return undef unless defined( $filename ) && -f $filename; - return $class->_init($module, $filename, %props); -} - -sub _init { - my $class = shift; - my $module = shift; - my $filename = shift; - my %props = @_; - - my( %valid_props, @valid_props ); - @valid_props = qw( collect_pod inc ); - @valid_props{@valid_props} = delete( @props{@valid_props} ); - warn "Unknown properties: @{[keys %props]}\n" if scalar( %props ); - - my %data = ( - module => $module, - filename => $filename, - version => undef, - packages => [], - versions => {}, - pod => {}, - pod_headings => [], - collect_pod => 0, - - %valid_props, - ); - - my $self = bless(\%data, $class); - - $self->_parse_file(); - - unless($self->{module} and length($self->{module})) { - my ($v, $d, $f) = File::Spec->splitpath($self->{filename}); - if($f =~ /\.pm$/) { - $f =~ s/\..+$//; - my @candidates = grep /$f$/, @{$self->{packages}}; - $self->{module} = shift(@candidates); # punt - } - else { - if(grep /main/, @{$self->{packages}}) { - $self->{module} = 'main'; - } - else { - $self->{module} = $self->{packages}[0] || ''; - } - } - } - - $self->{version} = $self->{versions}{$self->{module}} - if defined( $self->{module} ); - - return $self; -} - -# class method -sub _do_find_module { - my $class = shift; - my $module = shift || die 'find_module_by_name() requires a package name'; - my $dirs = shift || \@INC; - - my $file = File::Spec->catfile(split( /::/, $module)); - foreach my $dir ( @$dirs ) { - my $testfile = File::Spec->catfile($dir, $file); - return [ File::Spec->rel2abs( $testfile ), $dir ] - if -e $testfile and !-d _; # For stuff like ExtUtils::xsubpp - return [ File::Spec->rel2abs( "$testfile.pm" ), $dir ] - if -e "$testfile.pm"; - } - return; -} - -# class method -sub find_module_by_name { - my $found = shift()->_do_find_module(@_) or return; - return $found->[0]; -} - -# class method -sub find_module_dir_by_name { - my $found = shift()->_do_find_module(@_) or return; - return $found->[1]; -} - - -# given a line of perl code, attempt to parse it if it looks like a -# $VERSION assignment, returning sigil, full name, & package name -sub _parse_version_expression { - my $self = shift; - my $line = shift; - - my( $sig, $var, $pkg ); - if ( $line =~ $VERS_REGEXP ) { - ( $sig, $var, $pkg ) = $2 ? ( $1, $2, $3 ) : ( $4, $5, $6 ); - if ( $pkg ) { - $pkg = ($pkg eq '::') ? 'main' : $pkg; - $pkg =~ s/::$//; - } - } - - return ( $sig, $var, $pkg ); -} - -sub _parse_file { - my $self = shift; - - my $filename = $self->{filename}; - my $fh = IO::File->new( $filename ) - or die( "Can't open '$filename': $!" ); - - $self->_parse_fh($fh); -} - -sub _parse_fh { - my ($self, $fh) = @_; - - my( $in_pod, $seen_end, $need_vers ) = ( 0, 0, 0 ); - my( @pkgs, %vers, %pod, @pod ); - my $pkg = 'main'; - my $pod_sect = ''; - my $pod_data = ''; - - while (defined( my $line = <$fh> )) { - my $line_num = $.; - - chomp( $line ); - next if $line =~ /^\s*#/; - - $in_pod = ($line =~ /^=(?!cut)/) ? 1 : ($line =~ /^=cut/) ? 0 : $in_pod; - - # Would be nice if we could also check $in_string or something too - last if !$in_pod && $line =~ /^__(?:DATA|END)__$/; - - if ( $in_pod || $line =~ /^=cut/ ) { - - if ( $line =~ /^=head\d\s+(.+)\s*$/ ) { - push( @pod, $1 ); - if ( $self->{collect_pod} && length( $pod_data ) ) { - $pod{$pod_sect} = $pod_data; - $pod_data = ''; - } - $pod_sect = $1; - - - } elsif ( $self->{collect_pod} ) { - $pod_data .= "$line\n"; - - } - - } else { - - $pod_sect = ''; - $pod_data = ''; - - # parse $line to see if it's a $VERSION declaration - my( $vers_sig, $vers_fullname, $vers_pkg ) = - $self->_parse_version_expression( $line ); - - if ( $line =~ $PKG_REGEXP ) { - $pkg = $1; - push( @pkgs, $pkg ) unless grep( $pkg eq $_, @pkgs ); - $vers{$pkg} = (defined $2 ? $2 : undef) unless exists( $vers{$pkg} ); - $need_vers = defined $2 ? 0 : 1; - - # VERSION defined with full package spec, i.e. $Module::VERSION - } elsif ( $vers_fullname && $vers_pkg ) { - push( @pkgs, $vers_pkg ) unless grep( $vers_pkg eq $_, @pkgs ); - $need_vers = 0 if $vers_pkg eq $pkg; - - unless ( defined $vers{$vers_pkg} && length $vers{$vers_pkg} ) { - $vers{$vers_pkg} = - $self->_evaluate_version_line( $vers_sig, $vers_fullname, $line ); - } else { - # Warn unless the user is using the "$VERSION = eval - # $VERSION" idiom (though there are probably other idioms - # that we should watch out for...) - warn <<"EOM" unless $line =~ /=\s*eval/; -Package '$vers_pkg' already declared with version '$vers{$vers_pkg}', -ignoring subsequent declaration on line $line_num. -EOM - } - - # first non-comment line in undeclared package main is VERSION - } elsif ( !exists($vers{main}) && $pkg eq 'main' && $vers_fullname ) { - $need_vers = 0; - my $v = - $self->_evaluate_version_line( $vers_sig, $vers_fullname, $line ); - $vers{$pkg} = $v; - push( @pkgs, 'main' ); - - # first non-comment line in undeclared package defines package main - } elsif ( !exists($vers{main}) && $pkg eq 'main' && $line =~ /\w+/ ) { - $need_vers = 1; - $vers{main} = ''; - push( @pkgs, 'main' ); - - # only keep if this is the first $VERSION seen - } elsif ( $vers_fullname && $need_vers ) { - $need_vers = 0; - my $v = - $self->_evaluate_version_line( $vers_sig, $vers_fullname, $line ); - - - unless ( defined $vers{$pkg} && length $vers{$pkg} ) { - $vers{$pkg} = $v; - } else { - warn <<"EOM"; -Package '$pkg' already declared with version '$vers{$pkg}' -ignoring new version '$v' on line $line_num. -EOM - } - - } - - } - - } - - if ( $self->{collect_pod} && length($pod_data) ) { - $pod{$pod_sect} = $pod_data; - } - - $self->{versions} = \%vers; - $self->{packages} = \@pkgs; - $self->{pod} = \%pod; - $self->{pod_headings} = \@pod; -} - -{ -my $pn = 0; -sub _evaluate_version_line { - my $self = shift; - my( $sigil, $var, $line ) = @_; - - # Some of this code came from the ExtUtils:: hierarchy. - - # We compile into $vsub because 'use version' would cause - # compiletime/runtime issues with local() - my $vsub; - $pn++; # everybody gets their own package - my $eval = qq{BEGIN { q# Hide from _packages_inside() - #; package Module::Build::ModuleInfo::_version::p$pn; - use Module::Build::Version; - no strict; - - local $sigil$var; - \$$var=undef; - \$vsub = sub { - $line; - \$$var - }; - }}; - - local $^W; - # Try to get the $VERSION - eval $eval; - # some modules say $VERSION = $Foo::Bar::VERSION, but Foo::Bar isn't - # installed, so we need to hunt in ./lib for it - if ( $@ =~ /Can't locate/ && -d 'lib' ) { - local @INC = ('lib',@INC); - eval $eval; - } - warn "Error evaling version line '$eval' in $self->{filename}: $@\n" - if $@; - (ref($vsub) eq 'CODE') or - die "failed to build version sub for $self->{filename}"; - my $result = eval { $vsub->() }; - die "Could not get version from $self->{filename} by executing:\n$eval\n\nThe fatal error was: $@\n" - if $@; - - # Activestate apparently creates custom versions like '1.23_45_01', which - # cause M::B::Version to think it's an invalid alpha. So check for that - # and strip them - my $num_dots = () = $result =~ m{\.}g; - my $num_unders = () = $result =~ m{_}g; - if ( substr($result,0,1) ne 'v' && $num_dots < 2 && $num_unders > 1 ) { - $result =~ s{_}{}g; - } - - # Bless it into our own version class - eval { $result = Module::Build::Version->new($result) }; - die "Version '$result' from $self->{filename} does not appear to be valid:\n$eval\n\nThe fatal error was: $@\n" - if $@; - - return $result; -} -} - - -############################################################ - -# accessors -sub name { $_[0]->{module} } - -sub filename { $_[0]->{filename} } -sub packages_inside { @{$_[0]->{packages}} } -sub pod_inside { @{$_[0]->{pod_headings}} } -sub contains_pod { $#{$_[0]->{pod_headings}} } - -sub version { - my $self = shift; - my $mod = shift || $self->{module}; - my $vers; - if ( defined( $mod ) && length( $mod ) && - exists( $self->{versions}{$mod} ) ) { - return $self->{versions}{$mod}; - } else { - return undef; - } -} - -sub pod { - my $self = shift; - my $sect = shift; - if ( defined( $sect ) && length( $sect ) && - exists( $self->{pod}{$sect} ) ) { - return $self->{pod}{$sect}; - } else { - return undef; - } -} +require Module::Metadata; +our @ISA = qw/Module::Metadata/; 1; @@ -395,97 +18,17 @@ __END__ =head1 NAME -ModuleInfo - Gather package and POD information from a perl module file - +Module::Build::ModuleInfo - DEPRECATED =head1 DESCRIPTION -=over 4 - -=item new_from_file($filename, collect_pod => 1) - -Construct a C<ModuleInfo> object given the path to a file. Takes an optional -argument C<collect_pod> which is a boolean that determines whether -POD data is collected and stored for reference. POD data is not -collected by default. POD headings are always collected. - -=item new_from_module($module, collect_pod => 1, inc => \@dirs) - -Construct a C<ModuleInfo> object given a module or package name. In addition -to accepting the C<collect_pod> argument as described above, this -method accepts a C<inc> argument which is a reference to an array of -of directories to search for the module. If none are given, the -default is @INC. - -=item name() - -Returns the name of the package represented by this module. If there -are more than one packages, it makes a best guess based on the -filename. If it's a script (i.e. not a *.pm) the package name is -'main'. - -=item version($package) - -Returns the version as defined by the $VERSION variable for the -package as returned by the C<name> method if no arguments are -given. If given the name of a package it will attempt to return the -version of that package if it is specified in the file. - -=item filename() - -Returns the absolute path to the file. - -=item packages_inside() - -Returns a list of packages. - -=item pod_inside() - -Returns a list of POD sections. - -=item contains_pod() - -Returns true if there is any POD in the file. - -=item pod($section) - -Returns the POD data in the given section. - -=item find_module_by_name($module, \@dirs) - -Returns the path to a module given the module or package name. A list -of directories can be passed in as an optional parameter, otherwise -@INC is searched. - -Can be called as either an object or a class method. - -=item find_module_dir_by_name($module, \@dirs) - -Returns the entry in C<@dirs> (or C<@INC> by default) that contains -the module C<$module>. A list of directories can be passed in as an -optional parameter, otherwise @INC is searched. - -Can be called as either an object or a class method. - -=back - - -=head1 AUTHOR - -Ken Williams <kwilliams@cpan.org>, Randy W. Sims <RandyS@ThePierianSpring.org> - - -=head1 COPYRIGHT - -Copyright (c) 2001-2006 Ken Williams. All rights reserved. - -This library is free software; you can redistribute it and/or -modify it under the same terms as Perl itself. - +This module has been extracted into a separate distribution and renamed +L<Module::Metadata>. This module is kept as a subclass wrapper for +compatibility. =head1 SEE ALSO -perl(1), L<Module::Build>(3) +perl(1), L<Module::Build>, L<Module::Metadata> =cut |