App-prepare4release

 view release on metacpan or  search on metacpan

lib/App/prepare4release/Deps.pm  view on Meta::CPAN

use utf8;

use Carp qw(croak);
use File::Find ();
use File::Spec ();

# Optional: used to skip core modules without an explicit minimum version.
sub _have_corelist {
	state $ok = eval { require Module::CoreList; 1 };
	return $ok;
}

sub _perl_numeric_for_corelist {
	my ( $class, $mf_content, $config, $version_from_path ) = @_;
	$config = {} unless ref $config eq 'HASH';

	my $raw = $config->{min_perl_version} // $config->{perl_min};
	if ( defined $raw && length $raw ) {
		return $class->_perl_num_from_any($raw);
	}
	if ( ref $mf_content eq 'SCALAR' || defined $mf_content ) {
		my $s = ref $mf_content eq 'SCALAR' ? $$mf_content : $mf_content;
		if ( $s =~ /MIN_PERL_VERSION\s*=>\s*['"]([^'"]+)['"]/ ) {
			return $class->_perl_num_from_any($1);
		}
	}
	if ( defined $version_from_path && -e $version_from_path ) {
		open my $fh, '<:encoding(UTF-8)', $version_from_path or return '5.010000';
		while ( my $line = <$fh> ) {
			if ( $line =~ /^\s*use\s+v([0-9.]+)\s*;/ ) {
				close $fh;
				return $class->_perl_num_from_any( 'v' . $1 );
			}
			if ( $line =~ /^\s*use\s+([0-9][0-9_\.]+)\s*;/ ) {
				close $fh;
				return $class->_perl_num_from_any($1);
			}
		}
		close $fh;
	}
	return '5.010000';
}

sub _perl_num_from_any {
	my ( $class, $v ) = @_;
	return '5.010000' unless defined $v && length $v;
	require version;
	my $ver = eval { version->parse($v) };
	return '5.010000' unless $ver;
	return $ver->numify;
}

sub _skip_use_module {
	my ( $class, $m ) = @_;
	return 1 unless defined $m && length $m;
	return 1 if $m =~ /^v?5\.\d+/;
	return 1 if $m eq 'perl';
	my %pragma = map { $_ => 1 } qw(
		strict warnings utf8 feature experimental subs mro overload
		vars integer English autodie lib constant deprecate
		open sigtrap sort attrs bytes charnames locale
		namespaces tie filetest indirect
	);
	return 1 if $pragma{$m};
	return 0;
}

sub _strip_pod {
	my ( $class, $text ) = @_;
	$text =~ s{^=[a-z][a-z]*\b.*?^=cut\b}{}gms;
	return $text;
}

sub _scan_line_for_modules {
	my ( $class, $line, $out ) = @_;
	$out = [] unless ref $out eq 'ARRAY';

	# use v5.xx / use 5.xx
	return if $line =~ /^\s*use\s+v?[0-9]/;

	if ( $line =~ /^\s*use\s+parent\s+(.+)/ ) {
		my $rest = $1;
		if ( $rest =~ /qw\s*\(\s*([^)]*)\s*\)/ ) {
			my $inner = $1;
			for my $w ( split /\s+/, $inner ) {
				next unless $w =~ /^[\w:]+$/;
				push @{$out}, [ $w, undef ];
			}
		}
		elsif ( $rest =~ /['"]([\w:]+)['"]/ ) {
			push @{$out}, [ $1, undef ];
		}
		return;
	}

	if ( $line =~ /^\s*use\s+base\s+(.+)/ ) {
		my $rest = $1;
		if ( $rest =~ /qw\s*\(\s*([^)]*)\s*\)/ ) {
			for my $w ( split /\s+/, $1 ) {
				next unless $w =~ /^[\w:]+$/;
				push @{$out}, [ $w, undef ];
			}
		}
		elsif ( $rest =~ /['"]([\w:]+)['"]/ ) {
			push @{$out}, [ $1, undef ];
		}
		return;
	}

	if ( $line =~ /^\s*use\s+([\w:]+)\s+([\d._v]+)\s*;/ ) {
		my ( $m, $v ) = ( $1, $2 );
		return if $class->_skip_use_module($m);
		push @{$out}, [ $m, $v ];
		return;
	}

	if ( $line =~ /^\s*use\s+([\w:]+)\s+qw\s*\(/ ) {
		my $m = $1;
		return if $class->_skip_use_module($m);
		push @{$out}, [ $m, undef ];
		return;



( run in 2.095 seconds using v1.01-cache-2.11-cpan-ceb78f64989 )