Hatena::Groupcatalyst

dann@catalyst このページをアンテナに追加 RSSフィード

2008-03-16

Catalyst用のCLI作成

| 14:11 |  Catalyst用のCLI作成 - dann@catalyst を含むブックマーク はてなブックマーク -  Catalyst用のCLI作成 - dann@catalyst  Catalyst用のCLI作成 - dann@catalyst のブックマークコメント

昨日のエントリのtomyheroさんのCatApp::CLIをベースに、

  • Catalystに依存しないでConfigを読む仕組み
  • CLIのスクリプトのコマンドを拡張する仕組み
  • CLIのコマンドからSchemaを参照する仕組み

を用意してみた。

Catalystに依存しないで使えるので、Catalyst外でも使えるし、App::CmdベースでCLIのコマンドそのもののテストができる。大分、テスタビリティも高いし、いいかなと。

これで、starterで一通りクラスを生成すれば、CLIを拡張していくときには、新規にMyApp::CLI::Commandを拡張していくだけになりました。

  • 簡単にコマンドが追加できること
  • コマンド中からSchemaとconfigを参照できること
  • Catalystに依存せずにCLIを作れること

という用件をひとまずは満たしたので、一応満足。

Schemaを直接参照ではなくて、ここでCというクラスを参照という形にするのがBetterなんだけれど、その仕組みを用意するには、ちと幾つか足りないのでまた今度。

コマンドライン用の管理スクリプト admin.pl

#!/usr/bin/env perl

use MyApp::CLI;
MyApp::CLI->new->run;

使うときは、

script/admin.pl list --open

など。

コマンドラインのコマンドの実装

CLIクラス
package MyApp::CLI;
use base qw(App::Cmd);

1;
コマンドのベースクラス

全てのコマンドでyamlschemaが参照できるようにする。コマンドラインのコマンドのベースクラス。

package MyApp::CLI::Command;
use base qw/App::Cmd::Command/;
use MyApp::ConfigLoader;
use MyApp::Schema;

sub config {
    my $self = shift;
    $self->{config} ||= MyApp::ConfigLoader->new->config;
    return $self->{config};
}

sub schema {
    my $self = shift;
    $app->{schema}  = MyApp::Schema->connect( @{ $self->config->{'Model::DBIC'}{'connect_info'} } );
}

1;
コマンドのクラス

後は、上記のベースクラスを継承して、実装を追加すればコマンドラインオプションが追加できる。

package MyApp::CLI::Command::List;
use base qw/MyApp::CLI::Command/;

=head1 NAME
MyApp::CLI::Command::List - list events
=cut

sub opt_desk {
    return (
        ["open", "only unfinished events"],
    );
}

sub validate_args {
    my ($self, $opt, $args) = @_;
    # we need at least one argument beyond the options
    die $self->usage->text unless @$args;
}

sub run {
    my ($self, $opt, $args) = @_;
    use Data::Dumper;
    warn Dumper $self->schema;
    warn Dumper $self->config;
}

1;

lcipavlcipav2011/03/24 10:164IGWLn <a href="http://glbzfqoqlaox.com/">glbzfqoqlaox</a>, [url=http://ikimzilitduw.com/]ikimzilitduw[/url], [link=http://koddoycduxbb.com/]koddoycduxbb[/link], http://licjkrlymalo.com/

トラックバック - http://catalyst.g.hatena.ne.jp/dann/20080316

2008-03-15

Catalyst appでCLI

| 04:08 |  Catalyst appでCLI - dann@catalyst を含むブックマーク はてなブックマーク -  Catalyst appでCLI - dann@catalyst  Catalyst appでCLI - dann@catalyst のブックマークコメント

tomyhero++

http://d.hatena.ne.jp/tomyhero/20080315/1205598628

Catalyst::Utilsへの依存を切って、後は自分の構成にあわせれば殆どそのまんま使えそう! App::Cmdと組み合わせてベースクラスを作ろうかな。tomyheroさんのやつをCommandのベースクラスに押し込んでしまえばいい気がする。後で作って、starterに組み込む!

App::Cmdは、以下のスライドが分かりやすい。http://www.slideshare.net/rjbs/writing-modular-commandline-apps-with-appcmd/

トラックバック - http://catalyst.g.hatena.ne.jp/dann/20080315