Tengで使うschemaクラスの雛形を作るスクリプトを作ってみた
Teng のパッケージにある Teng::Schema::Dumper を使うことで schema クラスを作れるのは知ってるのですがこれを利用してモジュールの雛形まで作るスクリプトを作ってみた。 いわゆる pmsetup とか Module::Setup みたいなやつです。
よく見るとやっつけ仕事な感じですね。
■利用方法
$ mk_teng_schema.pl [MODEL NAME] [DSN] [USER_NAME] [PASSWORD] $ mk_teng_schema.pl MyApp::Model DBI:mysql:database=database_name username password
上記のように実行すると MyApp-Model のディレクトリが掘られて中にMyApp::Modelモジュールインストールに必要な Makefile.PLなどのファイル群がよしなに作られます。
■mk_teng_schema.pl
#!/usr/bin/env perl use strict; use warnings; use Pod::Usage; use Getopt::Long; use File::Path qw/mkpath/; use DBI; use Teng::Schema::Dumper; use Cwd; # use Data::Dumper; our $module; GetOptions( 'help' => \my $help, ) or pod2usage(0); pod2usage(1) if $help; sub _src_tmpl { my ($module, $path) = @_; my $module_lc = lc $module; my $current_dir = getcwd(); my $confsrc = <<"..."; -- lib/$path.pm package $module; use parent 'Teng'; our \$VERSION = '0.01'; 1; __END__ =head1 NAME $module - Application Model Class. =head1 SYNOPSIS use $module; my \$teng = $module->new( {connect_info => ['DBI:mysql:database=your_db_name', 'user', 'pass', {mysql_enable_utf8 => 1, pg_enable_utf8 => 1, sqlite_unicode => 1} ]}); =head1 DESCRIPTION Teng schema class. =head1 LICENCE AND COPYRIGHT Copyright (c) 2011, foo bar C<< >>. All rights reserved. This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See L. -- lib/$path/Schema.pm __SCHEMA__ __END__ -- t/00_compile.t use strict; use Test::More; BEGIN { use_ok "$module" } my \$teng = $module->new( {connect_info => ['$ARGV[0]', '$ARGV[1]', '$ARGV[2]', {mysql_enable_utf8 => 1, pg_enable_utf8 => 1, sqlite_unicode => 1}]}); isa_ok \$teng, "$module"; done_testing; -- Makefile.PL use inc::Module::Install; all_from 'lib/$path.pm'; readme_from('lib/$path.pm'); build_requires 'Test::More', 0.88; test_requires 'Test::Requires'; auto_set_repository(); WriteAll; -- MANIFEST.SKIP \\bRCS\\b \\bCVS\\b \\.svn/ \\.git/ ^MANIFEST\\. ^Makefile\$ ~\$ \\.old\$ ^blib/ ^pm_to_blib ^MakeMaker-\\d \\.gz\$ \\.cvsignore \\.shipit -- META.yml --- abstract: ~ author: ~ build_requires: Test::More: 0.88 Test::Requires: 0 distribution_type: module generated_by: 'Module::Install version 0.77' license: unknown meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: 1.4 module_name: $module name: $module no_index: directory: - inc - t version: 0.01 -- README 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. -- .gitignore META.yml Makefile inc/ pm_to_blib *~ -- .shipit steps = FindVersion, ChangeVersion, CheckChangeLog, DistTest, Commit, Tag, MakeDist, UploadCPAN git.push_to = origin -- Changes Revision history for Perl extension $module 0.01 Tue Apr 19 13:08:34 2011 - original version -- MANIFEST .gitignore Changes inc/Module/Install.pm inc/Module/Install/Base.pm inc/Module/Install/Can.pm inc/Module/Install/Fetch.pm inc/Module/Install/Makefile.pm inc/Module/Install/Metadata.pm inc/Module/Install/Repository.pm inc/Module/Install/Win32.pm inc/Module/Install/WriteAll.pm lib/$path.pm Makefile.PL MANIFEST META.yml README t/00_compile.t xt/pod.t -- xt/pod.t 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(); ... $confsrc; } &main;exit; sub _mkpath { my $path = shift || "PPP"; print "make path: $path\n"; mkpath $path; } sub main { $module = shift @ARGV or pod2usage(0); my $dbh = DBI->connect(@ARGV) or die "could not connect DBI"; $module =~ s{-}{::}g; my @pkg = split /::/, $module; my $dist = join "-", @pkg; my $path = join "/", @pkg; mkdir $dist or die "Could not mkdir at " . $dist; chdir $dist or die "Could not chdir at " . $dist; map {_mkpath $_ } qw(t lib xt); _mkpath "lib/$path"; _mkpath "lib/$path/Row"; my $schema_class = Teng::Schema::Dumper->dump(dbh => $dbh, namespace => $module); my $src = _src_tmpl($module, $path); $src =~ s{__SCHEMA__}{$schema_class}; my $conf = _parse_conf($src); while ( my ($file, $src ) = each %$conf ) { open my $fh, ">", $file or die "Could not Write File: ", $file; print $fh $src; close $fh; } } sub _parse_conf { my $filename; my $res; for my $line (split "\n", shift) { if ( $line =~ m{^--\s+(.+)$} ) { $filename = $1; } else { $filename or die "missing filename for first content"; $res->{$filename} .= "$line\n"; } } return $res; } __END__ =head1 NAME mk_teng_schema.pl - this is Teng Schema template generate script =head1 SYNOPSIS create template Teng Schema class. $ perl mk_teng_schema.pl [Model Name] [DSN] [USER] [PASS] ex) $ mk_teng_schema.pl TEST::Model DBI:mysql:database=your_db_name user pass =head1 LICENCE AND COPYRIGHT Copyright (c) 2011, tooru midorikawa C<< >>. All rights reserved. This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See L.
created: