bar_1

contents_map

2018年12月21日金曜日

Thor アクション Actions

アクション Actions

Thorには, スクリプトやジェネレータといったタスクに役立つ, 5,6個のアクションがある. いくつかはRailsのテンプレートとしてあるので, あなたはそれらに親しんでいるかもしれない. 列挙すると: say, ask, yes?, no?, add_file, remove_file, copy_file, template, directory, inside, run, inject_into_file や, その他にも2,3ある.
Thor comes with several actions that help with script and generator tasks. You might be familiar with them since some came from Rails Templates. They are: say, ask, yes?, no?, add_file, remove_file, copy_file, template, directory, inside, run, inject_into_file and a couple more.
これらを使うには, あなたのThorクラスたちの中で Thor::Actions をincludeするだけだ:
To use them, you just need to include Thor::Actions in your Thor classes:
class App < Thor
  include Thor::Actions
  # tasks
end
ファイルをコピーするアクションなどように, アクションによっては source_root と呼ばれる, クラスメソッドがひとつ必要となるアクションもある. このクラスメソッドはあなたのテンプレートたちが配置されているべきディレクトリだ. Thor::ActionsThor::Shell::Basic のドキュメントを確認すること. たとえば:
Some actions like copy file require that a class method called source_root be defined in your class. This is the directory where your templates should be placed. Be sure to check the documentation on Thor::Actions and Thor::Shell::Basic. For instance:
class App < Thor
  include Thor::Actions

  def self.source_root
    File.dirname(__FILE__)
  end
end

Thor グループ Groups

グループ Groups

Thorには Thor::Group という特別なクラスがある. ひとつの Thor::Group に 定義されたもろもろのタスクはすべて, それらが定義された順に, ひとつのシーケンスとして実行される. [[実行 Invocations]] で使った例は Thor::Group を使って, このように書ける:
Thor has a special class called Thor::Group. All of the tasks defined in a Thor::Group are invoked together as a sequence, in the order that they were defined. The example from [[Invocations]] could be rewritten using
Thor::Group as:
myawesomegem/lib/mycounter_file.rb
require 'thor/group'

module MyAwesomeGem                 # 訳注: 名前空間のためのmodule
  class MyCounter < Thor::Group     # 訳注: ThorではなくThor::Group
    desc "Prints 1 2 3"

    def one
      puts 1
    end

    def two
      puts 2
    end

    def three
      puts 3
    end
  end
end
実行すると:
When invoked:
thor my_awesome_gem:my_counter
# prints "1 2 3"

実行ファイルexecutableのコマンド・リストに, サブクラスThor::Groupを追加するためには, 一番最初に, あなたはこの登録をしなければならないという点に, 注意すること.
Note that in order to add the Thor::Group subclass to the commands list of your executable, you have to register it first.
実行ファイルを利用するには, 説明が [[実行ファイルの作成 Making An Executable]] にあり, たとえばこのようなファイルがあるとする:
Building on the executables explanation found in [[Making An Executable]], let’s say that you have a file:
myawesomegem/bin/command
#!/usr/bin/env ruby
require File.expand_path('lib/command', Dir.pwd)
MyAwesomeGem::MyCommand.start
そうして, コマンドの実装を含むファイルは以下:
And then, the file containing the actual command:
myawesomegem/lib/command.rb
require "thor"
module MyAwesomeGem
  class MyCommand < Thor
    desc "foo", "Prints foo"
    def foo
      puts "foo"
    end
  end
end
実行ファイルをテストする:
Test executable file:
cd myawesomegem
chmod a+x bin/command # make permission
bin/command foo
クラス MyCounterサブコマンドとして 使えるようにするには, Thor.registerメソッド をコールする必要がある:
To make MyCounter available as a subcommand, you need to call the register method:
myawesomegem/lib/command.rb
require "thor"
require File.expand_path("lib/mycounter_file", Dir.pwd)
module MyAwesomeGem
  class MyCommand < Thor
    desc "foo", "Prints foo"
    def foo
      puts "foo"
    end

    # register(class_name, subcommand_alias, usage_list_string, description_string)
    register(MyAwesomeGem::MyCounter, "counter", "counter", "Prints some numbers in sequence")
  end
end
今, クラス MyAwesomeGem::MyCounter < Thor::Group は, mycommand の中のサブタスクとして現れ, そのエイリアスは counter となり, 使い方は:
Now the class MyCounter < Thor::Group will appear as a sub-task within mycommand with the alias counter, usage:
bin/command
# Commands:
#  command counter         # Prints numbers in sequence
#  command foo             # Prints foo

bin/command counter
#=> 1 2 3

注意: Thor::Group を使う場合は, あなたが (descメソッドで) 用意した説明書きは, それぞれのタスク毎にひとつの説明が用意されるのではなく, クラスそのものの説明書きとなる.
Note: when using Thor::Group, the description you provide (using the method desc) is for the entire class, as opposed to providing a description for each task.
また, Thor::Group はもろもろの引数 arguments とオプションをThorのタスクとしてパースできる:
Also, Thor::Group can parse arguments and options as Thor tasks:
class Counter < Thor::Group
  # number will be available as attr_accessor
  argument :number, :type => :numeric, :desc => "The number to start counting"
  desc "Prints the 'number' given upto 'number+2'"

  def one
    puts number + 0
  end

  def two
    puts number + 1
  end

  def three
    puts number + 2
  end
end
上記counterはひとつのパラメータを期待するものであり, 下記のような出力が得られる:
The counter above expects one parameter and has the following outputs:
thor counter 5
# Prints "5 6 7"

thor counter 11
# Prints "11 12 13"
あなたはまた, もろもろのオプションを Thor::Group に与えることができるが, method_optionmethod_options の代わりに, class_optionclass_options を使ってもいい. argument メソッドと class_optionsメソッドは両方とも, Thorクラスにも使用可能だ.
You can also give options to Thor::Group, but instead of using method_option
and method_options, you should use class_option and class_options.
Both argument and class_options methods are available to Thor class as well.
Thor::Group は, 定義された順に実行される5,6個のステップで定義できるので, ジェネレータを作るのにすぐれたツールのひとつだ (Thor::Group は Rails 4.x のジェネレータに使われているツールだ. 訳注: Rails 5.xでもジェネレータとして使われている痕跡が残っている)
Thor::Group is a great tool to create generators, since you can define several steps which are invoked in the order they are defined (Thor::Group is the tool used for generators in Rails 4.x).

Thor 実行 Invocations

実行 Invocations

Thorにはまた実行依存性システムinvocation-dependency systemもあり, この仕組みで, タスクの発動を一度だけにすることもできる. たとえば:
Thor comes with an invocation-dependency system as well, that allows a task to be invoked only once. For example:
class Counter < Thor
  desc "one", "Prints 1 2 3"
  def one
    puts 1
    invoke :two     # 訳注: タスクtwoの中のthreeは実行されない!
    invoke :three
  end

  desc "two", "Prints 2 3"
  def two
    puts 2
    invoke :three
  end

  desc "three", "Prints 3"
  def three
    puts 3
  end
end
タスクoneを実行すると:
When invoking the task one:
thor counter:one
その出力は
The output is
1
2
3
となり, これはつまり, タスク three一度だけ実行されるということだ. 他のクラスからでも, この機能を使ったタスクの実行はできるので, Thorクラスについて ドキュメント を確認すること.
which means that the three task was invoked only once.
You can even invoke tasks from another class, so be sure to check the
documentation for the Thor class.
もろもろの実行invocationsは, 同一のオブジェクトを共有しないことに気づくだろう. すなわち, Thorはタスク one を実行するために Counter を一度インスタンス化し, その次に, タスク two の実行にもうひとつ, タスク three を実行するためにまたひとつ Counter をインスタンス化する. このことはもろもろのオプションと引数を, もう一度パースし直すことができるということだ. たとえば, もし twothree がそれぞれ異なったもろもろのオプションを持ち, 両方のオプション群がコマンドラインに与えられたような場合, invoke をコールすることで, それぞれのタスクに従って, タスク毎に毎回それらがパースされ, 使用される.
Notice invocations do not share the same object. i.e, Thor will instantiate Counter once to invoke the task one, then, it instantiates another to invoke the task two and another for task three. This allows options and arguments to be parsed again. For example, if two and three have different options and both of them were given to the command line, calling invoke enables them to be parsed each time and used accordingly by each task.

Thor メソッドオプション Method Options

メソッドオプション Method Options

Thorでは, タスクにいろいろなオプションを指定できる; これには, もろもろのオプションのHash変数を与える method_options を使うか, 個別のオプションについてより詳しく指定する method_option を使う. これらのメソッドの結果にはHash変数 options 経由でアクセスできる.
Thor allows you to specify options for its tasks, using method_options to supply a hash of options, or method_option to provide more detail about an individual option. You can access these options via the options hash.

可能なオプション Available Options

  • :aliases
    指定しようとしているオプションのエイリアスのリスト. 通常, オプションの省略形を与えるのに使うことになるだろう.
    A list of aliases for this option. Typically, you would use aliases to provide short versions of the option.
  • :banner
    これはオプションの短い説明で, 使い方の説明を表示する際に表示される. デフォルトでは, これはフラグの大文字バージョンである (from=FROM).
    The short description of the option, printed out in the usage description. By default, this is the upcase version of the flag (from=FROM).
  • :default
    設定しようとしているオプションが指定されなかった場合の, デフォルト値. :defaultをもつオプションは, :requiredは指定できない (訳注: 「デフォルト値 Default Values」の節に矛盾した記述がある. また、両方指定したときエラーとはならないようだ).
    The default value of this option if it is not provided. An option cannot be both :required and have a :default.
  • :lazy_default
    CLIオプションが値なしに渡された場合だけに使われるデフォルト値.
    A default that is only passed if the cli option is passed without a value.
  • :desc
    オプションの説明. CLIの help hello を使って, コマンドの使い方を全部表示させたときに, この説明がオプションの隣に表示される.
    A description for the option. When printing out full usage for a command using cli help hello, this description will appear next to the option.
  • :required
    必須オプションであることを示す.
    Indicates that an option is required
  • :type
    :string, :hash, :array, :numeric, もしくは :boolean (詳しくは後述)
    :string, :hash, :array, :numeric, or :boolean (see below for more details)
  • :enum
    オプションに許される値のリスト.
    A list of allowed values for this option.

method_options のタイプ Types for method_options

  • :boolean--option or --option=true としてパースされる
  • :string--option=VALUE としてパースされる
  • :numeric--option=N としてパースされる
  • :array--option=one two three としてパースされる
  • :hash--option=name:string age:integer としてパースされる
  • :boolean is parsed as --option or --option=true
  • :string is parsed as --option=VALUE
  • :numeric is parsed as --option=N
  • :array is parsed as --option=one two three
  • :hash is parsed as --option=name:string age:integer

デフォルト値 Default Values

method_option はデフォルト値を指定できる. たとえば:
method_option allows a default value to be given. Example:
method_option :value, :default => "some value"
#=> Creates a string option with a default value of "some value"
#=> デフォルト値が "some value" であるような 文字列タイプのオプション: --valueを作る.
また, (訳注: methodoption_sメソッドを使って, )オプション名に対してある値をデフォルトとして指定できる. たとえば:
You can also specify the default as a value to the option name. Examples:
# 訳注: 以下の例は, method_option*S*であることに注意.

method_options :force => false
#=> デフォルト値がfalseであるbooleanタイプのオプション: --forceを作る
#=> Creates a boolean option with default value false

method_options :aliases => "bar"
#=> エイリアス'bar'を設定する
#=> Creates an alias 'bar'

method_options :threshold => 3.0
#=> デフォルト値が3.0である数値タイプのオプション: --thresholdを作る
#=> Creates a numeric option with default value 3.0
あなたは(訳注: method_optionSを使っている場合) :option => :required を与えることで, オプション —option を必須のものとして設定することができる. このときのオプションのタイプは文字列とみなされる. (訳注: このときは—optionが必須のものであるという設定しかできないが)もし, オプションとして, 必須であり, かつデフォルト値をもったHash変数がほしい場合は, method_option を使った, より宣言的なスタイルを使うことができる (訳注: 下記のコードは期待した動作をしない. :required=>trueは無視されthor app nameは—attributes無しでもエラーなしで実行される. thor version 0.19.4で確認):
You can also supply :option => :required to mark an option as required. The
type is assumed to be string. If you want a required hash with default values
as option, you can use method_option which uses a more declarative style:
method_option :attributes, :type => :hash, :default => {}, :required => true
すべての引数argumentsは, no- もしくは skip- の変形引数を与えることで, nilに セットできる (必須の引数を除く). たとえば:
All arguments can be set to nil (except required arguments), by supplying a no- or
skip-variant. For example:
thor app name --no-attributes
以前のバージョンではオプションのエイリアスは自動で生成されたが, 今は, それらは明示的でなければならない. 下記のように, method_optionSを使った簡略スタイルでもmethod_optionを使った宣言的なスタイルでも, どちらででも与えることが出来る:
In previous versions, aliases for options were created automatically, but now
they should be explicit. You can supply aliases in both short and declarative
styles:
method_options %w( force -f ) => :boolean
または:
Or:
method_option :force, :type => :boolean, :aliases => "-f"
エイリアスはお望みの通りいくつでも与えることができる.
You can supply as many aliases as you want.
注意: Thorは1ダッシュ-1文字のオプション群という ひとつの 規則 に従う. よって “-something”のようなエイリアスはパースされない; “—something” もしくは “-s” を代わりに使うこと.
Note: Thor follows a convention of one-dash-one-letter options. Thus aliases like “-something” wont be parsed; use either “\—something” or “-s” instead.
注意: Thor 0.9.0 にあった:optionalタイプは不許可になった. 代わりに :string もしくは :boolean を使うこと.
NOTE: Type :optional available in Thor 0.9.0 was deprecated. Use :string or :boolean instead.