App-ModuleBuildTiny

 view release on metacpan or  search on metacpan

Changes  view on Meta::CPAN

          - Allow -j as synonym for --jobs

0.041     2023-04-29 16:31:04+0200
          - Depend on new ExtUtils::Manifest #include behavior
          - Add help subcommand

0.040     2023-04-13 23:40:33+0200
          - Create .gitignore when minting
          - Add -I option to test subcommand
          - Run more release tests on upload
          - Make upload prompt default to false

0.039     2023-04-06 16:08:17+0200
          - Don't autocommit/autobump on partial regenerate

0.038     2023-03-30 17:07:59+0200
          - Add --jobs argument to mbtiny test
          - Also allow module name as mint argument
          - mkdir 't' during mint

0.037     2023-03-24 12:45:52+0100

Changes  view on Meta::CPAN

          - Add documentation for --commit, --tag and --push

0.032     2023-02-03 20:16:39+0100
          - Correctly run author and release tests on upload.
          - Update Changes file on regenerate --bump
          - Add a --commit option to regenerate
          - Add --tag and --push to upload

0.031     Thu Feb  2 02:35:19 PM CET 2023
          - Make configuration optional for minting
          - Add prompt before release
          - Remove VERSION section from template
          - Make "configure all" default to current values
          - Allow for removing configure values

0.030     Mon Jan 16 12:16:05 AM CET 2023
          - Allow for multiple prereq files
          - Add scan command for prereqs
          - Add --bump option to regenerate subcommand
          - Add list action to configure subcommand

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

use JSON::MaybeXS qw/decode_json/;
use Module::Runtime 'require_module';
use Text::Template;

use App::ModuleBuildTiny::Dist;

use Env qw/$AUTHOR_TESTING $RELEASE_TESTING $AUTOMATED_TESTING $EXTENDED_TESTING $NONINTERACTIVE_TESTING $SHELL $HOME $USERPROFILE/;

Getopt::Long::Configure(qw/require_order gnu_compat bundling/);

sub prompt {
	my($mess, $def) = @_;

	my $dispdef = defined $def ? " [$def]" : "";

	local $|=1;
	local $\;
	print "$mess$dispdef ";

	my $ans = <STDIN> // '';
	chomp $ans;
	return $ans ne '' ? decode_utf8($ans) : $def // '';
}

sub prompt_yn {
	my ($description, $default) = @_;
	my $result;
	do {
		$result = prompt("$description [y/n]", $default ? 'y' : 'n');
	} while (length $result and $result !~ /^(y|n|-)/i);
	return lc(substr $result, 0 , 1) eq 'y';
}

sub create_license_for {
	my ($license_name, $author) = @_;
	my $module = "Software::License::$license_name";
	require_module($module);
	return $module->new({ holder => $author });
}

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

			my @changes = $dist->get_changes;
			my $version = 'v' . $dist->version;
			my $message = $opts{message} || ($opts{bump} ? join '', $version, "\n\n", @changes : 'Regenerate');
			$git->commit({ m => $message }, @dirty);
		} else {
			say "No modifications to commit";
		}
	}
}

my %prompt_for = (
	open => \&prompt,
	yn => \&prompt_yn,
);

my @config_items = (
	[ 'author'        , 'What is the author\'s name?', 'open' ],
	[ 'email'         , 'What is the author\'s email?', 'open',  ],
	[ 'license'       , 'What license do you want to use?', 'open', 'Perl_5' ],

	[ 'write_buildpl' , 'Do you want to write your Build.PL file to your filesystem?', 'yn', !!1],
	[ 'write_meta'    , 'Do you want to write your meta files to your filesystem?', 'yn', !!1],
	[ 'write_manifest', 'Do you want to write your manifest files to your filesystem?', 'yn', !!1],

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

	'write_buildpl'  => 'write_build',
	'write_meta'     => 'write_build',
	'write_manifest' => 'write_build',
);

my @delete_config = qw/write_build/;

sub ask {
	my ($config, $item, $local_default) = @_;
	my ($key, $description, $type, $global_default) = @{$item};
	my $value = $prompt_for{$type}->($description, $local_default // $global_default);

	if ($value ne '-') {
		$config->{$key} = $type eq 'open' ? $value : $value ? JSON::MaybeXS::true : JSON::MaybeXS::false;
	}
	else {
		delete $config->{$key};
	}
}

sub show_item {

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

		insert_options(\%opts, get_config);

		my $dist = App::ModuleBuildTiny::Dist->new;
		$dist->preflight_check(%opts);
		local ($AUTHOR_TESTING, $RELEASE_TESTING) = (1, 1);
		my @commands = ([ './Build', 'test' ]);
		my @extra_tests = extra_tests;
		push @commands, [ 'prove', '-br', @extra_tests ] if @extra_tests;
		$dist->run(commands => \@commands, build => 1, verbose => !$opts{silent}) or return 1;

		my $sure = prompt_yn('Do you want to continue the release process?', !!0);
		if ($sure) {
			my $file = $dist->write_tarball($dist->archivename);
			require CPAN::Upload::Tiny;
			CPAN::Upload::Tiny->VERSION('0.009');
			my $uploader = CPAN::Upload::Tiny->new_from_config_or_stdin($opts{config});
			$uploader->upload_file($file);
			print "Successfully uploaded $file\n" if not $opts{silent};

			if ($opts{tag}) {
				require Git::Wrapper;

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

		my %config;
		my @options = qw/version=s abstract=s dirname=s init_git|init-git/;
		for my $config_item (@config_items) {
			my $entry = $config_item->[0] =~ s{^(\w+_\w+)\K$}{ '|' . $1 =~ tr/_/-/r }er;
			push @options, $entry . ($config_item->[2] eq 'yn' ? '!' : '=s');
		}
		GetOptionsFromArray(\@arguments, \%args, @options) or return 2;
		for my $item (@config_items) {
			my ($key, $description, $type, $default) = @{$item};
			if ($type eq 'open') {
				$args{$key} //= prompt($description, $default);
			}
			else {
				$config{$key} = $args{$key} // $settings->{$key} // prompt_yn($description, $default);
			}
		}

		my $license = create_license_for(delete $args{license}, $args{author});

		die "Directory $args{dirname} already exists\n" if -e $args{dirname};
		mkdir $args{dirname};
		chdir $args{dirname};
		$args{module_name} = $distname =~ s/-/::/gr;



( run in 1.798 second using v1.01-cache-2.11-cpan-6aa56a78535 )