[public] / misc / pmsetup  

View of /misc/pmsetup

Parent Directory | Revision Log
Revision: 2953 - (download)
Wed Apr 20 22:59:46 2011 UTC (2 years, 1 month ago) by miyagawa
File size: 4277 byte(s)
more MYMETA
#!/usr/bin/env perl
use strict;
use warnings;
use ExtUtils::MakeMaker qw(prompt);
use File::Basename;
use File::Path;
use File::Spec;
use Template;
use YAML;

my $path   = File::Spec->catfile($ENV{HOME}, "/.pmsetuprc");
my $config = eval { YAML::LoadFile($path) } || {};

my $save;
while (! $config->{author}) {
    $config->{author} = prompt("Your name: ", '');
    $save++;
}

while (! $config->{email}) {
    $config->{email} = prompt("Your email: ", '');
    $save++;
}

my $modname = shift @ARGV or die "Usage: $0 module\n";
   $modname =~ s/-/::/g;

write_plugin_files($modname, $config);

END {
    YAML::DumpFile($path, $config) if $save;
}

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, year => (localtime)[5] + 1900 };

    for my $tmpl (@template) {
        my $file = $tmpl->{file};
           $file =~ s/(\$\w+)/$1/eeg;
        write_file($file, $tmpl->{template}, $vars);
    }

    !system "perl Makefile.PL NO_MYMETA=1" or die $?;
    !system 'make manifest' or die $?;
    !system 'make test' or die $?;
    !system 'make distclean' 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;
}

__DATA__
---
file: Makefile.PL
template: |
  use inc::Module::Install;
  all_from 'lib/[% path %]';
  readme_from('lib/[% path %]');
  build_requires 'Test::More', 0.88;
  test_requires 'Test::Requires';
  auto_set_repository();
  WriteAll;

---
file: t/00_compile.t
template: |
  use strict;
  use Test::More tests => 1;

  BEGIN { use_ok '[% module %]' }
---
file: xt/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: Changes
template: |
  Revision history for Perl extension [% module %]

  0.01  [% localtime %]
          - original version
---
file: lib/$path
template: |
  package [% module %];

  use strict;
  use 5.008_001;
  our $VERSION = '0.01';

  1;
  __END__

  =encoding utf-8

  =for stopwords

  =head1 NAME

  [% module %] -

  =head1 SYNOPSIS

    use [% module %];

  =head1 DESCRIPTION

  [% module %] is

  =head1 AUTHOR

  [% config.author %] E<lt>[% config.email %]E<gt>

  =head1 COPYRIGHT

  Copyright [% year %]- [% config.author %]

  =head1 LICENSE

  This library is free software; you can redistribute it and/or modify
  it under the same terms as Perl itself.

  =head1 SEE ALSO

  =cut
---
file: MANIFEST.SKIP
template: |
  \bRCS\b
  \bCVS\b
  \.svn/
  \.git/
  ^MANIFEST\.
  ^Makefile$
  ~$
  \.old$
  ^blib/
  ^pm_to_blib
  ^MakeMaker-\d
  \.gz$
  \.cvsignore
  \.shipit
  MYMETA
---
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
template: |
  steps = FindVersion, ChangeVersion, CheckChangeLog, DistTest, Commit, Tag, MakeDist, UploadCPAN
  git.push_to = origin
---
file: .gitignore
template: |
  MYMETA.*
  META.yml
  Makefile
  inc/
  pm_to_blib
  *~

Tatsuhiko Miyagawa

Powered by ViewCVS 1.0-dev

ViewCVS and CVS Help