Skip to content

Instantly share code, notes, and snippets.

@dann
Created September 27, 2008 21:09
Show Gist options
  • Save dann/13374 to your computer and use it in GitHub Desktop.
Save dann/13374 to your computer and use it in GitHub Desktop.
pmsetup
#!/usr/bin/perl
use strict;
use warnings;
use ExtUtils::MakeMaker qw(prompt);
use File::Basename;
use File::Path;
use File::Spec;
use Template;
use YAML;
use Config::Pit;
my $config = pit_get(
"pmsetup",
require => {
author => "your username",
email => "your email",
workdir => "$ENV{HOME}/tmp",
}
);
$config->{author}
|| $config->{email}
|| $config->{workdir}
|| die("no settings");
-e $config->{workdir} || mkdir $config->{workdir}, 0777;
my $modname = shift @ARGV or die "Usage: $0 module¥n";
$modname =‾ s/-/::/g;
write_plugin_files( $modname, $config );
sub write_plugin_files {
my ( $module, $config ) = @_;
# $module = "Foo::Bar"
# $dist = "Foo-Bar"
# $path = "Foo/Bar.pm"
my @pkg = split /::/, $module;
my $dist = join "-", @pkg;
my $path = join( "/", @pkg ) . ".pm";
mkdir $dist, 0777;
chdir $dist;
my @template = YAML::Load( join '', <DATA> );
my $vars = {
module => $module,
dist => $dist,
path => $path,
config => $config,
localtime => scalar localtime
};
for my $tmpl (@template) {
my $file = $tmpl->{file};
$file =‾ s/(¥$¥w+)/$1/eeg;
write_file( $file, $tmpl->{template}, $vars );
chmod oct( $tmpl->{chmod} ), $tmpl->{file} if $tmpl->{chmod};
}
!system "perl Makefile.PL" or die $?;
!system 'make test' or die $?;
!system 'make manifest' or die $?;
!system 'make distclean' or die $?;
init_git_repo();
}
sub init_git_repo {
!system 'git init' or die $?;
!system 'git add *.*' or die $?;
!system 'git add README' or die $?;
!system 'git add Changes' or die $?;
!system 'git add .gitignore' or die $?;
!system 'git add .shipit' or die $?;
!system 'git add lib' or die $?;
!system 'git add t' or die $?;
!system 'git add t/author' or die $?;
!system 'git commit -m "initial commit"' or die $?;
}
sub write_file {
my ( $path, $template, $vars ) = @_;
if ( -e $path ) {
my $ans = prompt( "$path exists. Override? [yN] ", 'n' );
return if $ans !‾ /[Yy]/;
}
my $dir = File::Basename::dirname($path);
unless ( -e $dir ) {
warn "Creating directory $dir¥n";
File::Path::mkpath( $dir, 1, 0777 );
}
my $tt = Template->new;
$tt->process( ¥$template, $vars, ¥my $content );
warn "Creating $path¥n";
open my $out, ">", $path or die "$path: $!";
print $out $content;
close $out;
}
=pod
original L<http://svn.bulknews.net/repos/public/misc/pmsetup>
original L<http://coderepos.org/share/browser/lang/perl/misc/pmsetup/yappo-pmsetup>
=cut
__DATA__
---
file: Makefile.PL
template: |
use inc::Module::Install;
name '[% dist %]';
all_from 'lib/[% path %]';
requires $_ for (qw/ /);
build_requires 'Test::More';
use_test_base;
auto_include;
WriteAll;
---
file: t/00_compile.t
template: |
use strict;
use Test::More tests => 1;
BEGIN { use_ok '[% module %]' }
---
file: t/author/dependency.t
template: |
use Test::Dependencies
exclude => [qw/Test::Dependencies Test::Base Test::Perl::Critic [% module %]/],
style => 'light';
ok_dependencies();
file: t/author/podspell.t
template: |
use Test::More;
eval q{ use Test::Spelling };
plan skip_all => "Test::Spelling is not installed." if $@;
add_stopwords(map { split /[¥s¥:¥-]/ } <DATA>);
$ENV{LANG} = 'C';
set_spell_cmd("aspell list");
all_pod_files_spelling_ok('lib');
__DATA__
[% config.author %]
[% module %]
---
file: t/author/perlcritic.t
template: |
use strict;
use Test::More;
eval { use Test::Perl::Critic -profile => 't/author/perlcriticrc' };
plan skip_all => "Test::Perl::Critic is not installed." if $@;
all_critic_ok('lib');
---
file: t/author/pod.t
template: |
use Test::More;
eval "use Test::Pod 1.00";
plan skip_all => "Test::Pod 1.00 required for testing POD" if $@;
all_pod_files_ok();
---
file: t/perlcriticrc
template: |
[TestingAndDebugging::ProhibitNoStrict]
allow=refs
---
file: Changes
template: |
Revision history for Perl extension [% module %]
0.01 [% localtime %]
* original version
---
file: lib/$path
template: |
package [% module %];
use strict;
use warnings;
our $VERSION = '0.01';
1;
__END__
=head1 NAME
[% module %] -
=head1 SYNOPSIS
use [% module %];
=head1 DESCRIPTION
[% module %] is
=head1 AUTHOR
[% config.author %] E<lt>[% config.email %]E<gt>
=head1 SEE ALSO
=head1 LICENSE
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
=cut
---
file: MANIFEST.SKIP
template: |
¥bRCS¥b
¥bCVS¥b
^MANIFEST¥.
^Makefile$
‾$
^#
¥.old$
^blib/
^pm_to_blib
^MakeMaker-¥d
¥.gz$
¥.cvsignore
^t/9¥d_.*¥.t
^t/perlcritic
^xt/
^tools/
¥.svn/
¥.git/
^[^/]+¥.yaml$
^[^/]+¥.pl$
^¥.shipit$
---
file: README
template: |
This is Perl module [% module %].
INSTALLATION
[% module %] installation is straightforward. If your CPAN shell is set up,
you should just be able to do
% cpan [% module %]
Download it, unpack it, then build it as per the usual:
% perl Makefile.PL
% make && make test
Then install it:
% make install
DOCUMENTATION
[% module %] documentation is available as in POD. So you can do:
% perldoc [% module %]
to read the documentation online with your favorite pager.
[% config.author %]
---
file: .shipit
chmod: 0644
template: |
steps = FindVersion, ChangeVersion, CheckChangeLog, DistTest, Commit, Tag, MakeDist, UploadCPAN
git.tagpattern = release-%v
git.push_to = origin
---
file: .gitignore
template: |
cover_db
META.yml
Makefile
blib
inc
pm_to_blib
MANIFEST
Makefile.old
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment