
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に置いてあります