Changeset 1925

Show
Ignore:
Timestamp:
08/24/06 20:17:16
Author:
miyagawa
Message:

refactored pmsetup to use Template

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • misc/pmsetup

    r1922 r1925  
    33use warnings; 
    44use ExtUtils::MakeMaker qw(prompt); 
    5 use FileHandle; 
    6 use File::Copy; 
     5use File::Basename; 
    76use File::Path; 
    87use File::Spec; 
     8use Template; 
    99use YAML; 
    1010 
     
    2424 
    2525my $modname = shift @ARGV or die "Usage: $0 module\n"; 
    26 my @pkg = split /::/, $modname
     26   $modname =~ s/-/::/g
    2727 
    28 mkdir_chdir(@pkg); 
    29 mk_makefile_pl($modname, @pkg); 
    30 my $libdir = mk_libdir_t_dir(@pkg); 
    31 mk_test_suite($modname); 
    32 mk_changes($modname); 
    33 mk_module_template($libdir, $modname, @pkg); 
    34 mk_readme($modname); 
    35 mk_manifest(); 
    36 prepare_make(); 
     28write_plugin_files($modname, $config); 
    3729 
    3830END { 
     
    4032} 
    4133 
    42 sub mkdir_chdir { 
    43     my @pkg = @_; 
    44     # mkdir Foo-Bar 
    45     my $moddir = join('-', @pkg); 
    46     mkdir $moddir, 0777; 
    47     chdir $moddir; 
    48 
     34sub write_plugin_files { 
     35    my($module, $config) = @_; 
    4936 
    50 sub mk_makefile_pl { 
    51     my($modname, @pkg) = @_; 
     37    # $module = "Foo::Bar" 
     38    # $dist   = "Foo-Bar" 
     39    # $path   = "Foo/Bar.pm" 
     40    my @pkg  = split /::/, $module; 
     41    my $dist = join "-", @pkg; 
     42    my $path = join("/", @pkg) . ".pm"; 
    5243 
    53     # Makefile.PL 
    54     my $dist = join('-', @pkg); 
    55     my $path = join('/', @pkg). '.pm'; 
    56     my $mk = FileHandle->new('>Makefile.PL') or die $!; 
    57     $mk->print(<<MK); 
    58 use inc::Module::Install; 
    59 name '$dist'; 
    60 all_from 'lib/$path'; 
     44    mkdir $dist, 0777; 
     45    chdir $dist; 
    6146 
    62 build_requires 'Test::More'; 
    63 auto_include; 
    64 WriteAll; 
    65 MK 
    66 
     47    my @template = YAML::Load(join '', <DATA>); 
     48    my $vars = { module => $module, dist => $dist, path => $path, 
     49                 config => $config, localtime => scalar localtime }; 
    6750 
    68 sub mk_libdir_t_dir { 
    69     my @pkg = @_; 
     51    for my $tmpl (@template) { 
     52        my $file = $tmpl->{file}; 
     53           $file =~ s/(\$\w+)/$1/eeg; 
     54        write_file($file, $tmpl->{template}, $vars); 
     55    } 
    7056 
    71     # lib/Foo/ & t/ 
    72     my $libdir = 'lib/' . join '/', @pkg[0..$#pkg-1]; 
    73     mkpath([ $libdir, 't' ], 1, 0777); 
    74     return $libdir; 
    75 } 
    76  
    77 sub mk_test_suite { 
    78     my $modname = shift; 
    79  
    80     # test suite 
    81     my $test = FileHandle->new(">t/00_compile.t") or die $!; 
    82     $test->print(<<TEST); 
    83 use strict; 
    84 use Test::More tests => 1; 
    85  
    86 BEGIN { use_ok '$modname' } 
    87 TEST 
    88     ; 
    89  
    90     $test = FileHandle->new(">t/99_pod.t") or die $!; 
    91     $test->print(<<'TEST'); 
    92 use Test::More; 
    93 eval "use Test::Pod 1.00"; 
    94 plan skip_all => "Test::Pod 1.00 required for testing POD" if $@; 
    95 all_pod_files_ok(); 
    96 TEST 
    97     ; 
    98 } 
    99  
    100 sub mk_changes { 
    101     my $modname = shift; 
    102  
    103     my $localtime = localtime; 
    104     my $changes = FileHandle->new("> Changes") or die $!; 
    105     $changes->print(<<CHANGES); 
    106 Revision history for Perl extension $modname 
    107  
    108 0.01  $localtime 
    109         - original version 
    110 CHANGES 
    111     ; 
    112 } 
    113  
    114 sub mk_module_template { 
    115     my($libdir, $modname, @pkg) = @_; 
    116     my $module = FileHandle->new(">$libdir/$pkg[$#pkg].pm") or die $!; 
    117     $module->print(<<MODULE); 
    118 package $modname; 
    119  
    120 use strict; 
    121 use 5.8.0; 
    122 our \$VERSION = '0.01'; 
    123  
    124 1; 
    125 __END__ 
    126  
    127 =head1 NAME 
    128  
    129 $modname - 
    130  
    131 =head1 SYNOPSIS 
    132  
    133   use $modname; 
    134  
    135 =head1 DESCRIPTION 
    136  
    137 $modname is 
    138  
    139 =head1 AUTHOR 
    140  
    141 $config->{author} E<lt>$config->{email}E<gt> 
    142  
    143 =head1 LICENSE 
    144  
    145 This library is free software; you can redistribute it and/or modify 
    146 it under the same terms as Perl itself. 
    147  
    148 =head1 SEE ALSO 
    149  
    150 =cut 
    151 MODULE 
    152     ; 
    153 } 
    154  
    155 sub mk_manifest { 
    156     my $mani = FileHandle->new(">MANIFEST.SKIP") or die $!; 
    157     $mani->print(<<'MANI'); 
    158 \bRCS\b 
    159 \bCVS\b 
    160 ^MANIFEST\. 
    161 ^Makefile$ 
    162 ~$ 
    163 \.old$ 
    164 ^blib/ 
    165 ^pm_to_blib 
    166 ^MakeMaker-\d 
    167 \.gz$ 
    168 \.cvsignore 
    169 MANI 
    170     ; 
    171 } 
    172  
    173 sub mk_readme { 
    174     my $mod  = shift; 
    175     my $file = FileHandle->new(">README") or die $!; 
    176     $file->print(<<EOF); 
    177 This is Perl module $mod. 
    178  
    179 INSTALLATION 
    180  
    181 $mod installation is straightforward. If your CPAN shell is set up, 
    182 you should just be able to do 
    183  
    184     % cpan $mod 
    185  
    186 Download it, unpack it, then build it as per the usual: 
    187  
    188     % perl Makefile.PL 
    189     % make && make test 
    190  
    191 Then install it: 
    192  
    193     % make install 
    194  
    195 DOCUMENTATION 
    196  
    197 $mod documentation is available as in POD. So you can do: 
    198  
    199     % perldoc $mod 
    200  
    201 to read the documentation online with your favorite pager. 
    202  
    203 $config->{author} 
    204 EOF 
    205 } 
    206  
    207 sub prepare_make { 
    20857    !system "perl Makefile.PL" or die $?; 
    20958    !system 'make test' or die $?; 
     
    21160    !system 'make distclean' or die $?; 
    21261} 
     62 
     63sub write_file { 
     64    my($path, $template, $vars) = @_; 
     65 
     66    if (-e $path) { 
     67        my $ans = prompt("$path exists. Override? [yN] ", 'n'); 
     68        return if $ans !~ /[Yy]/; 
     69    } 
     70 
     71    my $dir = File::Basename::dirname($path); 
     72    unless (-e $dir) { 
     73        warn "Creating directory $dir\n"; 
     74        File::Path::mkpath($dir, 1, 0777); 
     75    } 
     76 
     77    my $tt = Template->new; 
     78    $tt->process(\$template, $vars, \my $content); 
     79 
     80    warn "Creating $path\n"; 
     81    open my $out, ">", $path or die "$path: $!"; 
     82    print $out $content; 
     83    close $out; 
     84} 
     85 
     86__DATA__ 
     87--- 
     88file: Makefile.PL 
     89template: | 
     90  use inc::Module::Install; 
     91  name '[% dist %]'; 
     92  all_from 'lib/[% path %]'; 
     93 
     94  build_requires 'Test::More'; 
     95  auto_include; 
     96  WriteAll; 
     97 
     98--- 
     99file: t/00_compile.t 
     100template: | 
     101  use strict; 
     102  use Test::More tests => 1; 
     103 
     104  BEGIN { use_ok '[% module %]' } 
     105--- 
     106file: t/99_pod.t 
     107template: | 
     108  use Test::More; 
     109  eval "use Test::Pod 1.00"; 
     110  plan skip_all => "Test::Pod 1.00 required for testing POD" if $@; 
     111  all_pod_files_ok(); 
     112--- 
     113file: Changes 
     114template: | 
     115  Revision history for Perl extension [% module %] 
     116   
     117    0.01  [% localtime %] 
     118          - original version 
     119--- 
     120file: lib/$path 
     121template: | 
     122  package [% module %]; 
     123   
     124  use strict; 
     125  our $VERSION = '0.01'; 
     126   
     127  1; 
     128  __END__ 
     129   
     130  =head1 NAME 
     131   
     132  [% module %] - 
     133   
     134  =head1 SYNOPSIS 
     135   
     136    use [% module %]; 
     137   
     138  =head1 DESCRIPTION 
     139   
     140  [% module %] is 
     141   
     142  =head1 AUTHOR 
     143   
     144  [% config.author %] E<lt>[% config.email %]E<gt> 
     145   
     146  =head1 LICENSE 
     147   
     148  This library is free software; you can redistribute it and/or modify 
     149  it under the same terms as Perl itself. 
     150   
     151  =head1 SEE ALSO 
     152   
     153  =cut 
     154--- 
     155file: MANIFEST.SKIP 
     156template: | 
     157  \bRCS\b 
     158  \bCVS\b 
     159  ^MANIFEST\. 
     160  ^Makefile$ 
     161  ~$ 
     162  \.old$ 
     163  ^blib/ 
     164  ^pm_to_blib 
     165  ^MakeMaker-\d 
     166  \.gz$ 
     167  \.cvsignore 
     168--- 
     169file: README 
     170template: | 
     171  This is Perl module [% module %]. 
     172   
     173  INSTALLATION 
     174   
     175  [% module %] installation is straightforward. If your CPAN shell is set up, 
     176  you should just be able to do 
     177   
     178      % cpan [% module %] 
     179   
     180  Download it, unpack it, then build it as per the usual: 
     181   
     182      % perl Makefile.PL 
     183      % make && make test 
     184   
     185  Then install it: 
     186   
     187      % make install 
     188   
     189  DOCUMENTATION 
     190   
     191  [% module %] documentation is available as in POD. So you can do: 
     192   
     193      % perldoc [% module %] 
     194   
     195  to read the documentation online with your favorite pager. 
     196   
     197  [% config.author %]