App-ModuleBuildTiny

 view release on metacpan or  search on metacpan

lib/App/ModuleBuildTiny/Dist.pm  view on Meta::CPAN

sub mbt_version {
	return -f 'dynamic-prereqs.yml' ? '0.048' : '0.044';
}

sub prereqs_for {
	my ($meta, $phase, $type, $module, $default) = @_;
	return $meta->effective_prereqs->requirements_for($phase, $type)->requirements_for_module($module) // $default // 0;
}

sub uptodate {
	my ($destination, @source) = @_;
	return if not -e $destination;
	for my $source (grep { defined && -e } @source) {
		return if -M $destination > -M $source;
	}
	return 1;
}

sub distfilename {
	my $distname = shift;
	return catfile('lib', split /-/, $distname) . '.pm';
}

sub generate_readme {
	my $distname = shift;
	my $filename = distfilename($distname);
	die "Main module file $filename doesn't exist\n" if not -f $filename;
	my $parser = Pod::Simple::Text->new;
	$parser->output_string( \my $content );
	$parser->parse_characters(1);
	$parser->parse_file($filename);
	return decode_utf8($content);
}

sub load_jsonyaml {
	my $file = shift;
	require Parse::CPAN::Meta;
	return Parse::CPAN::Meta->load_file($file);
}

sub load_mergedata {
	my $mergefile = shift;
	if (defined $mergefile and -r $mergefile) {
		return load_jsonyaml($mergefile);
	}
	return;
}

sub distname {
	my $extra = shift;
	return delete $extra->{name} if defined $extra->{name};
	return basename(rel2abs('.')) =~ s/ (?: ^ (?: perl|p5 ) - | [\-\.]pm $ )//xr;
}

sub detect_license {
	my ($data, $filename, $authors, $mergedata) = @_;
	if ($mergedata->{license} && @{$mergedata->{license}} == 1) {
		require Software::LicenseUtils;
		Software::LicenseUtils->VERSION(0.103014);
		my $spec_version = $mergedata->{'meta-spec'} && $mergedata->{'meta-spec'}{version} ? $mergedata->{'meta-spec'}{version} : 2;
		my @guess = Software::LicenseUtils->guess_license_from_meta_key($mergedata->{license}[0], $spec_version);
		die "Couldn't parse license from metamerge: @guess\n" if @guess > 1;
		if (@guess) {
			my $class = $guess[0];
			require_module($class);
			return $class->new({holder => join(', ', @{$authors})});
		}
	}
	my (@license_sections) = grep { /licen[cs]e|licensing|copyright|legal|authors?\b/i } $data->pod_inside;
	for my $license_section (@license_sections) {
		next unless defined ( my $license_pod = $data->pod($license_section) );
		require Software::LicenseUtils;
		Software::LicenseUtils->VERSION(0.103014);
		my $content = "=head1 LICENSE\n" . $license_pod;
		my @guess = Software::LicenseUtils->guess_license_from_pod($content);
		next if not @guess;
		die "Couldn't parse license from $license_section in $filename: @guess\n" if @guess != 1;
		my $class = $guess[0];
		my ($year) = $license_pod =~ /.*? copyright .*? ([\d\-]+)/;
		require_module($class);
		return $class->new({holder => join(', ', @{$authors}), year => $year});
	}
	die "No license found in $filename\n";
}

sub get_changes {
	my $self = shift;
	my $version = quotemeta $self->meta->version;
	open my $changes, '<:raw', 'Changes' or die "Couldn't open Changes file";
	my (undef, @content) = grep { / ^ $version (?:-TRIAL)? (?:\s+|$) /x ... /^\S/ } <$changes>;
	pop @content while @content && $content[-1] =~ / ^ (?: \S | \s* $ ) /x;
	return @content;
}

sub preflight_check {
	my ($self, %opts) = @_;

	die "Changes appears to be empty\n" if not $self->get_changes;

	my $meta_version = $self->{meta}->version;
	die "Version is still zero\n" if $meta_version eq '0.000';

	die "Abstract is not set\n" if $self->{meta}->abstract eq 'INSERT YOUR ABSTRACT HERE';

	if ($opts{tag}) {
		require Git::Wrapper;
		my $git = Git::Wrapper->new('.');

		die "Dirty state in repository\n" if $git->status->is_dirty;
		die "Tag v$meta_version already exists\n" if eval { $git->rev_parse({ quiet => 1, verify => 1}, "v$meta_version") };
	}

	my $module_name = $self->{meta}->name =~ s/-/::/gr;
	my $detected_version = $self->{data}->version($module_name);
	die sprintf "Version mismatch between module and meta, did you forgot to run regenerate? (%s versus %s)\n", $detected_version, $meta_version if $detected_version != $meta_version;
}

sub scan_files {
	my ($files, $omit, %extra_args) = @_;
	my $combined = CPAN::Meta::Requirements->new;
	require Perl::PrereqScanner;
	my $scanner = Perl::PrereqScanner->new(\%extra_args);
	for my $file (@{$files}) {
		my $prereqs = $scanner->scan_file($file);
		$combined->add_requirements($prereqs);
	}
	$combined->clear_requirement($_) for @{$omit};
	return $combined
}

sub _scan_prereqs {
	my ($omit, %opts) = @_;
	my (@runtime_files, @test_files, @planner_files);
	File::Find::find(sub { push @runtime_files, $File::Find::name if -f && /\.pm$/ }, 'lib') if -d 'lib';
	File::Find::find(sub { push @runtime_files, $File::Find::name if -f }, 'script') if -d 'script';
	File::Find::find(sub { push @test_files, $File::Find::name if -f && /\.(t|pm)$/ }, 't') if -d 't';

	my $runtime = scan_files(\@runtime_files, $omit);



( run in 2.272 seconds using v1.01-cache-2.11-cpan-97f6503c9c8 )