Tbpgr Blog

Organization Development Engineer tbpgr(てぃーびー) のブログ

Dslable | Dslableで作るコマンドラインツール形式 gemの作成手順 A to Z

概要

Dslableで作るコマンドラインツール形式 gemの作成手順 A to Z

詳細

Dslableで作るコマンドラインツール形式 gemの作成手順 A to Zを説明します。

前提

Ruby1.9以降の開発環境を用意しておいてください。
・gitをインストールしておいてください。
・dslable gemをインストールしておいてください。

gem install dslable

※またはbundlerでinstall

※下記は、公開を前提とする場合のみ必要です
GitHubのユーザー登録を済ませておいてください
RubyGemsのユーザー登録を済ませておいてください

仕様

三角形の面積計算ツールを作成します
・入力は内部DSLで行う。height, widthをHashで設定する
・gem名はtriangle_calc
・bin名はtrianglecalc
・trianglecalc initで内部DSLのひな形を生成
・trianglecalc executeで計算を実行

※この仕様自体にあまり意味はないですが、内部DSL形式の設定ファイルを利用した
簡単な内容のgemを説明するために上記の仕様にしています。
内部DSL形式の設定ファイルとはGemfileのように、Rubyのための設定ファイルが
RubyDSLとして記述されているものです。

手順

設定ファイルの生成

下記コマンドで設定ファイルを生成

dslable i

下記内容でDsldefineファイルが出力されます

# encoding: utf-8

# set your gem name. this is use in rb-filename and class-name
gem_name "TODO: set your gem_name"

# set your bin name
bin_name "TODO: set your bin_name"

# set your dsl filed
field :field_name1 do |f|
  # set your field description
  f.desc "field1 description"
  f.args :args_name do |a|
    # set your args description
    a.desc "args description"
    # you can use String, Array, Hash and :Boolean
    a.klass String
    # if you want not required, comment out following line
    a.required
    # if you comment out following line, default => nil
    a.default_value "args_value2"
  end
end

# field :field_name2 do |f|
#   f.desc "field2 description"
#   f.args :args_name do |a|
#     a.desc "args description"
#     a.klass String
#     a.required
#     a.default_value "args_value2"
#   end
# end

引き続きDSLファイル内の設定内容について説明します。

設定ファイルの項目説明 gem名

下記にgem名を設定します。小文字のスネークケース推奨。(アンダースコア区切り)
ここに設定した内容がRubyGemsに登録する際のgem名になります。

# set your gem name. this is use in rb-filename and class-name
gem_name "TODO: set your gem_name"
設定ファイルの項目説明 bin名

下記にbin名を設定します。短い名前にしたほうが利用時の利便性が高いです。

# set your bin name
bin_name "TODO: set your bin_name"
設定ファイルの項目説明 フィールド

必要になるフィールド名、フィールドの説明、引数を設定する。
説明は自動生成されるコードのコメントに利用される。
引数はフィールドに設定する引数。詳細については続く引数の説明内容を参照。
フィールドは複数作成可能。

# set your dsl filed
field :field_name1 do |f|
  # set your field description
  f.desc "field1 description"
  f.args :args_name do |a|
  # :
設定ファイルの項目説明 引数

下記の項目を設定できる
引数名
引数の説明
引数のクラス(String, Symbol, Array, Hash, :Boolean[trueかfalse]を利用可能)
必須かどうか(設定を省略した場合は必須ではなくなる)
デフォルト値(設定を省略した場合はデータ型に応じた初期値が設定される基本はemptyに相当する値)

引数は1つしか設定できないので、1つのフィールドで複数の値を取得したい場合はArrayかHashを利用すること。
Hashでデフォルトを指定する場合はブレースは付けないで指定すること。

# set your dsl filed
field :field_name1 do |f|
  # set your field description
  f.desc "field1 description"
  f.args :args_name do |a|
    # set your args description
    a.desc "args description"
    # you can use String, Array, Hash and :Boolean
    a.klass String
    # if you want not required, comment out following line
    a.required
    # if you comment out following line, default => nil
    a.default_value "args_value2"
  end
end
設定ファイルを編集する

では三角形面積計算の仕様にしたがって編集します。

# encoding: utf-8
gem_name "triangle_calc"
bin_name "trianglecalc"
field :triangle do |f|
  f.desc "triangle"
  f.args :h_w do |a|
    a.desc "height width setting"
    a.klass Hash
    a.required
    a.default_value height: 4, width: 2
  end
end
gemのテンプレートを生成

下記コマンドでgemのひな形を生成します

dslable g
gemテンプレートの出力確認 構成

下記構成でファイルが出力されます。
※.gitの中身は省略

└─triangle_calc
    │  .gitignore
    │  .rspec
    │  Gemfile
    │  LICENSE.txt
    │  Rakefile
    │  README.md
    │  Trianglecalcfile
    │  triangle_calc.gemspec
    │
    ├─.git
    ├─bin
    │      trianglecalc
    │
    ├─lib
    │  │  triangle_calc_core.rb
    │  │  triangle_calc_dsl.rb
    │  │  triangle_calc_dsl_model.rb
    │  │
    │  └─triangle_calc
    │          version.rb
    │
    ├─spec
    │      spec_helper.rb
    │      triangle_calc_core_spec.rb
    │
    └─tudu
            doings
            dones
            todos

引き続き、生成された内容について説明します

出力確認 Gemfile

rspec: テスト用
・thor: CLI機能用に利用
・simplecov: カバレッジ計測(実際に利用する場合はspec_helper.rbに利用の指定をしてください。)
activesupport: ActiveSupport::Concernsやcapitalizeなどを利用します
・activemodel: ActiveModel::Modelを利用します
・tudu: gem作成のために必要になるタスク管理用

source 'https://rubygems.org'

gemspec
gem "rspec", "~> 2.14.1"
gem "thor", "~> 0.18.1"
gem "simplecov", "~> 0.8.2"
gem "activesupport", "~> 4.0.1"
gem "activemodel", "~> 4.0.2"
gem "tudu", "~> 0.0.4"
出力確認 Core Class

・内部DSLのファイル名定数が設定済み(TRIANGLE_CALC_FILE)
・内部DSL用のテンプレートが設定済み(TRIANGLE_CALC_TEMPLATE)
・initメソッド実装済
・executeメソッドは内部DSLから値を取得する部分まで実装済
・後は取得した値を利用して実行するロジックを手動で記述するだけです。

# encoding: utf-8
require 'triangle_calc_dsl'

module TriangleCalc
  #  TriangleCalc Core
  class Core
    TRIANGLE_CALC_FILE = "Trianglecalcfile"
    TRIANGLE_CALC_TEMPLATE =<<-EOS
# encoding: utf-8

# triangle
# h_w is required
# h_w allow only Hash
# h_w's default value => :height=>4, :width=>2
triangle :height=>4, :width=>2

    EOS

    #== generate Trianglecalcfile to current directory.
    def init
      File.open(TRIANGLE_CALC_FILE, "w") {|f|f.puts TRIANGLE_CALC_TEMPLATE}
    end

    #== TODO: write your gem's specific contents
    def execute
      src = read_dsl
      dsl = TriangleCalc::Dsl.new
      dsl.instance_eval src

      # TODO: implement your gem's specific logic

    end

    private
    def read_dsl
      File.open(TRIANGLE_CALC_FILE) {|f|f.read}
    end
  end
end
出力確認 Dsl Class

・内部DSLを管理するためのクラス。
・モデルをフィールドとして保持。
・モデルへの初期値設定処理が定義されている。
・一切編集する必要がありません。

# encoding: utf-8
require 'triangle_calc_dsl_model'

module TriangleCalc
  class Dsl
    attr_accessor :triangle_calc

    # String Define
    [].each do |f|
      define_method f do |value|
        eval "@triangle_calc.#{f.to_s} = '#{value}'", binding
      end
    end

    # Array/Hash/Boolean Define
    [:triangle].each do |f|
      define_method f do |value|
        eval "@triangle_calc.#{f.to_s} = #{value}", binding
      end
    end

    def initialize
      @triangle_calc = TriangleCalc::DslModel.new
      @triangle_calc.triangle = {:height=>4, :width=>2}
    end
  end
end
出力確認 DslModel Class

・内部DSLの内容をモデルとして保持するクラス。
RailsのActiveModel::Modelをincludeしている。
・内部DSLで行った必須の設定はここで反映される。
※実際に必須のチェックをする場合はCoreクラスでモデルのvalidation機能を呼び出す
・一切編集する必要がありません。

# encoding: utf-8
require 'active_model'

module TriangleCalc
  class DslModel
    include ActiveModel::Model

    # triangle
    attr_accessor :triangle
    validates :triangle, :presence => true

  end
end
出力確認 bin

CLIツールとしての機能を実装するクラス。
・基本的にはコマンドラインのサブコマンドやオプションの制御や、コマンドが増えた場合のメンテナンスが主な役割。
・実処理はCore側に持たせる想定。

今回はTODOになっているヘルプ用のコメント部の編集とCoreから受け取った値を標準出力させる処理のみ実装します。

#!/usr/bin/env ruby
# encoding: utf-8

require "triangle_calc_core"
require "triangle_calc/version"
require "thor"

module TriangleCalc
  #= TriangleCalc CLI
  class CLI < Thor
    class_option :help, :type => :boolean, :aliases => '-h', :desc => 'help message.'
    class_option :version, :type => :boolean, :desc => 'version'

    desc "execute", "TODO: write your desc"
    def execute
      TriangleCalc::Core.new.execute
    end

    desc "init", "generate Trianglecalcfile"
    def init
      TriangleCalc::Core.new.init
    end

    desc "version", "version"
    def version
      p TriangleCalc::VERSION
    end
  end
end

TriangleCalc::CLI.start(ARGV)
出力確認 Core Spec

Coreクラスのexecuteメソッド用のテストクラスのひな形が生成されています。
(内部的にRSpecPiccolo gemを利用して生成されています)

# encoding: utf-8
require "spec_helper"
require "triangle_calc_core"

describe TriangleCalc::Core do

  context :execute do
    cases = [
      {
        case_no: 1,
        case_title: "case_title",
        expected: "expected",
      },
    ]

    cases.each do |c|
      it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
        begin
          case_before c

          # -- given --
          triangle_calc_core = TriangleCalc::Core.new

          # -- when --
          # TODO: implement execute code
          # actual = triangle_calc_core.execute

          # -- then --
          # TODO: implement assertion code
          # expect(actual).to eq(c[:expected])
        ensure
          case_after c
        end
      end

      def case_before(c)
        # implement each case before
      end

      def case_after(c)
        # implement each case after
      end
    end
  end
end
出力確認 tudu

tuduディレクトリ配下の各種ファイルはtudu gemをインストールした状態で、
プロジェクトルートでコマンドを実行することで確認可能です。
今回の場合はtriangle_calcディレクトリ直下でコマンドを実行する。

tuduの利用方法について

簡単なヘルプの確認は

$tudu h
Commands:
  tudu add             # add tasks to todos file
  tudu choose          # choose tasks from todos to doings file
  tudu doings          # search tasks from doings file. no args => get all ta...
  tudu done            # done tasks from doings to dones file. and choose tas...
  tudu dones           # search tasks from dones file. no args => get all tas...
  tudu help [COMMAND]  # Describe available commands or one specific command
  tudu init            # generate todos,doings,dones files
  tudu now             # search tasks from doings file. no args => get all ta...
  tudu progress        # display tasks progress
  tudu remove          # remove tasks from todos,doings,dones file
  tudu tasks           # search tasks from todos,doings,dones file. no args =...
  tudu todos           # search tasks from todos file. no args => get all tas...
  tudu version         # version

Options:
  -h, [--help]     # help message.
      [--version]  # version

詳細についてはGitHub参照
https://github.com/tbpgr/tudu

tuduの中身はただのテキストファイルのため操作に誤った場合は
手動で各テキストを編集することも可能です。

tuduの確認

タスクの一覧を確認します。

tudu tasks -c

現在のタスクがDOINGSに表示されます。
coreのテストの実装が最初のタスクです。

$tudu tasks -c
========TODOS========
implement 'triangle_calc_core.rb' your main logic. pass rspec all specs.
implement bin 'bin/trianglecalc'.
edit 'triangle_calc.gemspec'.
edit 'README.md'.
edit 'LICENSE.txt'.
git add, commit.
rake install.
check gem(test using).
gem uninstall triangle_calc.
rake release.
gem install triangle_calc.
after release check.

========DOINGS========
implement 'triangle_calc_core_spec.rb'.

========DONES========

ではtuduの現在のタスクに従い、coreのspecを作成します。

TDDでCoreSpecのexecuteのテストを実装

テストクラス(triangle_calc_core_spec.rb)のexecuteのテストを実装します。
今回はdslの内容を取得した結果として三角形の面積を文字列として返却します。
標準出力についてはbin側の責務とします。
テストケースは高さ10、幅20の三角形の面積が100になることを確認します。

# encoding: utf-8
require "spec_helper"
require "triangle_calc_core"

describe TriangleCalc::Core do

  context :execute do
    OUTPUT_TRIANGLE_TMP_DIR = 'tmp_templatable'
    TRIANGLE_CASE1 =<<-EOF
# encoding: utf-8

triangle :height=>10, :width=>20
    EOF

    cases = [
      {
        case_no: 1,
        case_title: "height 10, width 20 case",
        output_file: "sample_use.rb",
        templatablefile: TRIANGLE_CASE1,
        expected: 100,
      },
    ]

    cases.each do |c|
      it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
        begin
          case_before c

          # -- given --
          triangle_calc_core = TriangleCalc::Core.new

          # -- when --
          actual = triangle_calc_core.execute

          # -- then --
          expect(actual).to eq(c[:expected])
        ensure
          case_after c
        end
      end

      def case_before(c)
        Dir.mkdir(OUTPUT_TRIANGLE_TMP_DIR) unless Dir.exists? OUTPUT_TRIANGLE_TMP_DIR
        Dir.chdir(OUTPUT_TRIANGLE_TMP_DIR)
        File.open(TriangleCalc::Core::TRIANGLE_CALC_FILE, 'w') { |f|f.print c[:templatablefile] }
      end

      def case_after(c)
        Dir.chdir('../')
        FileUtils.rm_rf(OUTPUT_TRIANGLE_TMP_DIR) if Dir.exists? OUTPUT_TRIANGLE_TMP_DIR
      end
    end
  end
end

テストを実行し、失敗することを確認(Coreのexecuteをまだ実装していないため)

$rspec
Run options: include {:focus=>true}

All examples were filtered out; ignoring {:focus=>true}
F

Failures:

  1) TriangleCalc::Core execute |case_no=1|case_title=height 10, width 20 case
     Failure/Error: expect(actual).to eq(c[:expected])

       expected: 100
            got: {:height=>10, :width=>20}

       (compared using ==)
     # ./spec/triangle_calc_core_spec.rb:37:in `block (4 levels) in <top (required)>'

Finished in 0.009 seconds
1 example, 1 failure

Failed examples:

rspec ./spec/triangle_calc_core_spec.rb:26 # TriangleCalc::Core execute |case_no=1|case_title=height 10, width 20 case

Randomized with seed 60601
Coreのテスト実装完了をtuduに反映

下記のコマンドをコンソールで実行して1つ目のタスクを完了します。

$tudu done -p
1/13|>          |8%

タスクの一覧を確認します。

$tudu tasks -c
========TODOS========
implement bin 'bin/trianglecalc'.
edit 'triangle_calc.gemspec'.
edit 'README.md'.
edit 'LICENSE.txt'.
git add, commit.
rake install.
check gem(test using).
gem uninstall triangle_calc.
rake release.
gem install triangle_calc.
after release check.

========DOINGS========
implement 'triangle_calc_core.rb' your main logic. pass rspec all specs.

========DONES========
implement 'triangle_calc_core_spec.rb'.

続いて新たなタスクであるcoreクラスの実装を行います。

TDDでCoreのexecuteを実装

底辺×高さ÷2になるように処理を実装します。

下記で編集しているのは
「#== calc triangle」というコメントと
dsl.triangle_calc.triangle[:height] * dsl.triangle_calc.triangle[:width] / 2.0」
という行のみです。
dslインスタンスからtriangle_calcを呼び出すとDslModelの内容を取得できます。
triangle_calcの部分はgem名と同じものが変数名として自動で設定されています。
DslModelは内部DSLで設定した名称で値を保持しています。

今回はフィールド名triangleでheightとwidthをハッシュで渡す仕様にしているため
上記のような記述で値を取得できます。

# encoding: utf-8
require 'triangle_calc_dsl'

module TriangleCalc
  #  TriangleCalc Core
  class Core
    TRIANGLE_CALC_FILE = "Trianglecalcfile"
    TRIANGLE_CALC_TEMPLATE =<<-EOS
# encoding: utf-8

# triangle
# h_w is required
# h_w allow only Hash
# h_w's default value => :height=>4, :width=>2
triangle :height=>4, :width=>2

    EOS

    #== generate Trianglecalcfile to current directory.
    def init
      File.open(TRIANGLE_CALC_FILE, "w") {|f|f.puts TRIANGLE_CALC_TEMPLATE}
    end

    #== calc triangle
    def execute
      src = read_dsl
      dsl = TriangleCalc::Dsl.new
      dsl.instance_eval src
      dsl.triangle_calc.triangle[:height] * dsl.triangle_calc.triangle[:width] / 2.0
    end

    private
    def read_dsl
      File.open(TRIANGLE_CALC_FILE) {|f|f.read}
    end
  end
end

テストを実行し、成功することを確認します。

$rspec
Run options: include {:focus=>true}

All examples were filtered out; ignoring {:focus=>true}
.

Finished in 0.0085 seconds
1 example, 0 failures

Randomized with seed 8323
Coreの実装完了をtuduに反映
$tudu done -p
2/13|=>         |15%

タスクの一覧を確認します。

$tudu tasks -c
========TODOS========
edit 'triangle_calc.gemspec'.
edit 'README.md'.
edit 'LICENSE.txt'.
git add, commit.
rake install.
check gem(test using).
gem uninstall triangle_calc.
rake release.
gem install triangle_calc.
after release check.

========DOINGS========
implement bin 'bin/trianglecalc'.

========DONES========
implement 'triangle_calc_core_spec.rb'.
implement 'triangle_calc_core.rb' your main logic. pass rspec all specs.

tuduに従いbinの作成に着手します。

binの作成

binを作成します。
Coreクラスの呼び出しコードは自動生成済みなので、
標準出力する処理とexecuteコマンドのコメントのみ編集します。
コメントの内容はCUIのヘルプに表示される内容です。

#!/usr/bin/env ruby
# encoding: utf-8

require "triangle_calc_core"
require "triangle_calc/version"
require "thor"

module TriangleCalc
  #= TriangleCalc CLI
  class CLI < Thor
    class_option :help, :type => :boolean, :aliases => '-h', :desc => 'help message.'
    class_option :version, :type => :boolean, :desc => 'version'

    desc "execute", "calc triangle"
    def execute
      puts TriangleCalc::Core.new.execute
    end

    desc "init", "generate Trianglecalcfile"
    def init
      TriangleCalc::Core.new.init
    end

    desc "version", "version"
    def version
      p TriangleCalc::VERSION
    end
  end
end

TriangleCalc::CLI.start(ARGV)
binの実装完了をtuduに反映
$tudu done -p
3/13|==>        |23%

タスクの一覧を確認します。

$tudu tasks -c
========TODOS========
edit 'README.md'.
edit 'LICENSE.txt'.
git add, commit.
rake install.
check gem(test using).
gem uninstall triangle_calc.
rake release.
gem install triangle_calc.
after release check.

========DOINGS========
edit 'triangle_calc.gemspec'.

========DONES========
implement 'triangle_calc_core_spec.rb'.
implement 'triangle_calc_core.rb' your main logic. pass rspec all specs.
implement bin 'bin/trianglecalc'.

tuduに従いgemspecを編集します。

triangle_calc.gemspecを編集

・gemspecを編集します。
・spec.authors:あなたのユーザー名
・spec.email:あなたのメールアドレス
・spec.description:gemの説明
・spec.summary:gemの要約
・spec.homepage:gem用のページがあるなら指定。よくあるパターンはGitHubリポジトリURLを指定すること。
・spec.add_runtime_dependency:実行時依存のgemを必要なだけ指定しておくこと
・spec.add_development_dependency:開発依存のgemを必要なだけ指定しておくこと

# coding: utf-8
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'triangle_calc/version'

Gem::Specification.new do |spec|
  spec.name          = "triangle_calc"
  spec.version       = TriangleCalc::VERSION
  spec.authors       = ["your_name"]
  spec.email         = ["your_email]
  spec.description   = %q{TODO: Write a gem description}
  spec.summary       = %q{TODO: Write a gem summary}
  spec.homepage      = ""
  spec.license       = "MIT"

  spec.files         = `git ls-files`.split($/)
  spec.executables   = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
  spec.test_files    = spec.files.grep(%r{^(test|spec|features)/})
  spec.require_paths = ["lib"]

  spec.add_runtime_dependency "thor", "~> 0.18.1"
  spec.add_runtime_dependency "activesupport", "~> 4.0.1"
  spec.add_runtime_dependency "activemodel", "~> 4.0.2"

  spec.add_development_dependency "bundler", "~> 1.3"
  spec.add_development_dependency "rake"
  spec.add_development_dependency "simplecov", "~> 0.8.2"
  spec.add_development_dependency "rspec", "~> 2.14.1"
end
gemspecの記述完了をtuduに反映
$tudu done -p
4/13|===>       |31%

タスクの一覧を確認します。

$tudu tasks -c
========TODOS========
edit 'LICENSE.txt'.
git add, commit.
rake install.
check gem(test using).
gem uninstall triangle_calc.
rake release.
gem install triangle_calc.
after release check.

========DOINGS========
edit 'README.md'.

========DONES========
implement 'triangle_calc_core_spec.rb'.
implement 'triangle_calc_core.rb' your main logic. pass rspec all specs.
implement bin 'bin/trianglecalc'.
edit 'triangle_calc.gemspec'.

tuduに従いREADME.mdを編集します。

README.mdを編集

README.mdを編集します。
GitHubリポジトリのトップページに表示される内容です。
ユーザーが迷わないように内容を記述します。

# TriangleCalc

Triangle Calculator

## Installation

Add this line to your application's Gemfile:

    gem 'triangle_calc'

And then execute:

    $ bundle

Or install it yourself as:

    $ gem install triangle_calc

## Usage

### init
~~~bash
trianglecalc init
~~~

Trianglecalcfile
~~~ruby
# encoding: utf-8

# triangle
# h_w is required
# h_w allow only Hash
# h_w's default value => :height=>4, :width=>2
triangle :height=>4, :width=>2

~~~

### edit Trianglecalcfile manually
~~~bash
# encoding: utf-8

triangle :height=>10, :width=>20
~~~

### execute
~~~bash
$ trianglecalc execute
100.0
~~~

## Contributing

1. Fork it
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create new Pull Request
READMEの記述完了をtuduに反映
$tudu done -p
5/13|===>       |38%

タスクの一覧を確認します。

$tudu tasks -c
========TODOS========
git add, commit.
rake install.
check gem(test using).
gem uninstall triangle_calc.
rake release.
gem install triangle_calc.
after release check.

========DOINGS========
edit 'LICENSE.txt'.

========DONES========
implement 'triangle_calc_core_spec.rb'.
implement 'triangle_calc_core.rb' your main logic. pass rspec all specs.
implement bin 'bin/trianglecalc'.
edit 'triangle_calc.gemspec'.
edit 'README.md'.

tuduに従いLICENSE.txtを編集します。

LICENSE.txtを編集

MITライセンスでよければユーザー名のみ自分のものに変更します。

Copyright (c) 2014 yoru_name

MIT License

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
gemspecの記述完了をtuduに反映
$tudu done -p
6/13|====>      |46%

タスクの一覧を確認します。

$tudu tasks -c
========TODOS========
rake install.
check gem(test using).
gem uninstall triangle_calc.
rake release.
gem install triangle_calc.
after release check.

========DOINGS========
git add, commit.

========DONES========
implement 'triangle_calc_core_spec.rb'.
implement 'triangle_calc_core.rb' your main logic. pass rspec all specs.
implement bin 'bin/trianglecalc'.
edit 'triangle_calc.gemspec'.
edit 'README.md'.
edit 'LICENSE.txt'.

tuduに従いgitに現状の編集内容を登録します。

gitに登録する
git add -A
git add -u
git add commit -m "first commit"
git push origin master

※git push origin masterの部分は予めGitHubリポジトリを作成し、
remoteリポジトリの登録を行っておくこと

gemspecの記述完了をtuduに反映
$tudu done -p
7/13|=====>     |54%

タスクの一覧を確認します。

$tudu tasks -c
========TODOS========
check gem(test using).
gem uninstall triangle_calc.
rake release.
gem install triangle_calc.
after release check.

========DOINGS========
rake install.

========DONES========
implement 'triangle_calc_core_spec.rb'.
implement 'triangle_calc_core.rb' your main logic. pass rspec all specs.
implement bin 'bin/trianglecalc'.
edit 'triangle_calc.gemspec'.
edit 'README.md'.
edit 'LICENSE.txt'.
git add, commit.

tuduに従いrake installをします。

rake install

rake installでgemを動作確認用にインストールします。

$rake install
triangle_calc 0.0.1 built to pkg/triangle_calc-0.0.1.gem.
triangle_calc (0.0.1) installed.
gemspecの記述完了をtuduに反映
$tudu done -p
8/13|======>    |62%

タスクの一覧を確認します。

$tudu tasks -c
========TODOS========
gem uninstall triangle_calc.
rake release.
gem install triangle_calc.
after release check.

========DOINGS========
check gem(test using).

========DONES========
implement 'triangle_calc_core_spec.rb'.
implement 'triangle_calc_core.rb' your main logic. pass rspec all specs.
implement bin 'bin/trianglecalc'.
edit 'triangle_calc.gemspec'.
edit 'README.md'.
edit 'LICENSE.txt'.
git add, commit.
rake install.

tuduに従いgemの動作確認をします。

gemの動作確認

trianglecalcの内部DSL生成の確認

$trianglecalc i
$cat Trianglecalcfile
# encoding: utf-8

# triangle
# h_w is required
# h_w allow only Hash
# h_w's default value => :height=>4, :width=>2
triangle :height=>4, :width=>2

内部DSLの設定ファイルを編集します。
底辺20、高さ10に設定します。

# encoding: utf-8

# triangle
# h_w is required
# h_w allow only Hash
# h_w's default value => :height=>4, :width=>2
triangle :height=>10, :width=>20

計算を実行します。

$trianglecalc e
100.0

結果が問題ないため次に進みます。

gemspecの記述完了をtuduに反映
$tudu done -p
9/13|======>    |69%

タスクの一覧を確認します。

$tudu tasks -c
========TODOS========
rake release.
gem install triangle_calc.
after release check.

========DOINGS========
gem uninstall triangle_calc.

========DONES========
implement 'triangle_calc_core_spec.rb'.
implement 'triangle_calc_core.rb' your main logic. pass rspec all specs.
implement bin 'bin/trianglecalc'.
edit 'triangle_calc.gemspec'.
edit 'README.md'.
edit 'LICENSE.txt'.
git add, commit.
rake install.
check gem(test using).
動作確認用にinstallしたgemをuninstallしておきます
$gem uninstall triangle_calc
Removing trianglecalc
Successfully uninstalled triangle_calc-0.0.1
gemspecの記述完了をtuduに反映
$tudu done -p
10/13|=======>   |77%

タスクの一覧を確認します。

$tudu tasks -c
========TODOS========
gem install triangle_calc.
after release check.

========DOINGS========
rake release.

========DONES========
implement 'triangle_calc_core_spec.rb'.
implement 'triangle_calc_core.rb' your main logic. pass rspec all specs.
implement bin 'bin/trianglecalc'.
edit 'triangle_calc.gemspec'.
edit 'README.md'.
edit 'LICENSE.txt'.
git add, commit.
rake install.
check gem(test using).
gem uninstall triangle_calc.

tuduに従いgemをリリースします。
※外部公開しない場合は、ここまでの手順で作業完了です。

gemのリリース

まずGitHubにリリースします。
リモートリポジトリはoriginで作成され、ブランチはmasterを利用する前提とします。

git push origin master

RubyGemsにリリースします

rake release
gemspecの記述完了をtuduに反映
$tudu done -p
11/13|========>  |85%

タスクの一覧を確認します。

$tudu tasks -c
========TODOS========
after release check.

========DOINGS========
gem install triangle_calc.

========DONES========
implement 'triangle_calc_core_spec.rb'.
implement 'triangle_calc_core.rb' your main logic. pass rspec all specs.
implement bin 'bin/trianglecalc'.
edit 'triangle_calc.gemspec'.
edit 'README.md'.
edit 'LICENSE.txt'.
git add, commit.
rake install.
check gem(test using).
gem uninstall triangle_calc.
rake release.
リリースしたgemをインストールします
$ gem install triangle_calc
gemspecの記述完了をtuduに反映
$tudu done -p
12/13|=========> |92%

タスクの一覧を確認します。

$tudu tasks -c
========TODOS========


========DOINGS========
after release check.

========DONES========
implement 'triangle_calc_core_spec.rb'.
implement 'triangle_calc_core.rb' your main logic. pass rspec all specs.
implement bin 'bin/trianglecalc'.
edit 'triangle_calc.gemspec'.
edit 'README.md'.
edit 'LICENSE.txt'.
git add, commit.
rake install.
check gem(test using).
gem uninstall triangle_calc.
rake release.
gem install triangle_calc.

最後のタスクとしてinstallしたgemを動作確認します。
問題が無ければ最後のtuduを反映します。

gemspecの記述完了をtuduに反映
$tudu done -p
All Tasks Finish!!
13/13|==========>|100%
最後に

これでgemの作成から公開まで完了です。
ぜひdslableでコマンドライン形式のgemデビューをしてみてください!