Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

CrystalでFizzBuzzコマンドラインツールを作成する

f:id:tbpg:20151007223510j:plain

CrystalでFizzBuzzコマンドラインツールを作成する

仕様

標準入力から x を与えると1からxまでのFizzBuzzを出力する。
FizzBuzzの仕様については下記を参照

手順

プロジェクトテンプレートの生成

$ crystal init app fizzbuzz
      create  fizzbuzz/.gitignore
      create  fizzbuzz/LICENSE
      create  fizzbuzz/README.md
      create  fizzbuzz/.travis.yml
      create  fizzbuzz/shard.yml
      create  fizzbuzz/src/fizzbuzz.cr
      create  fizzbuzz/src/fizzbuzz/version.cr
      create  fizzbuzz/spec/spec_helper.cr
      create  fizzbuzz/spec/fizzbuzz_spec.cr

shard.ymlを記述する

name: fizzbuzz
version: 0.1.0

authors:
  - tbpgr <tbpgr@tbpgr.jp>

license: MIT

テストコードを実装

require "./spec_helper"

describe Fizzbuzz do
  describe Fizzbuzz::Executor do
    describe "fizzbuzz" do
      it "works" do
        actual = Fizzbuzz::Executor.new(15).fizzbuzz
        actual.should eq(["1", "2", "Fizz", "4", "Buzz", "Fizz", "7", "8", "Fizz", "Buzz", "11", "Fizz", "13", "14", "FizzBuzz"])
      end
    end
  end
end

プロダクトコードを実装

require "./fizzbuzz/*"

module Fizzbuzz
  class Executor
    def initialize(@limit)
    end

    def fizzbuzz
      ary = Array(String).new
      @limit.times {|i|
        i+=1
        ary << case
        when i%15==0 then "FizzBuzz"
        when i%5==0 then "Buzz"
        when i%3==0 then "Fizz"
        else i.to_s
        end
      }
      ary
    end
  end
end
  • 実装が終わったらbuildします
$ crystal build ./src/fizzbuzz.cr
  • testが通ったことを確認します
$ crystal spec
.

Finished in 0.38 milliseconds
1 examples, 0 failures, 0 errors, 0 pending

CLI部分を実装

require "../src/fizzbuzz"
require "option_parser"

begin
  OptionParser.parse! do |parser|
    parser.banner = "Usage: fizzbuzz limit"
    parser.on("-v", "--version", "Show version") { puts Fizzbuzz::VERSION; exit 0 }
    parser.on("-h", "--help", "Show this help") { puts parser; exit 0 }
  end

  ARGV.first?.try do |arg|
    STDOUT << Fizzbuzz::Executor.new(arg.to_i).fizzbuzz.join(",") + "\n"
  end
rescue e
  STDERR.puts e
  exit 1
end
  • 実装が終わったらbuildします
$ crystal build --release ./bin/fizzbuzz.cr

動作確認

$ fizzbuzz -h
Usage: fizzbuzz limit
    -v, --version                    Show version
    -h, --help                       Show this help
$ fizzbuzz -v
0.1.0
$ fizzbuzz 10
1,2,Fizz,4,Buzz,Fizz,7,8,Fizz,Buzz
$ fizzbuzz 30
1,2,Fizz,4,Buzz,Fizz,7,8,Fizz,Buzz,11,Fizz,13,14,FizzBuzz,16,17,Fizz,19,Buzz,Fizz,22,23,Fizz,Buzz,26,Fizz,28,29,FizzBuzz

GitHub

作成したプロジェクトはGitHubに置いてあります

外部資料