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