🌊
RubyとGitHub Actionsにこんにちは
Ruby はあまり書いたことがなかったのですが、興味があったので Fizz buzz を書いたり GitHub Actions でテストや Lint Check を回してみました。特に誰が嬉しいわけではないと思いますが、参考までにメモを残しておきます。
Fizz buzz
まずは Fizz buzz を書きます。頑張って短くしてみました。人類に理解可能な範囲でもっと短くできる方法があれば教えてください。
# main.rb
require_relative './fizzbuzz'
(1..100).each do |n|
puts fizzbuzz n
end
# fizzbuzz.rb
def fizzbuzz n
s = ''
s << 'Fizz' if n % 3 < 1
s << 'Buzz' if n % 5 < 1
"#{s != '' ? s : n}"
end
-
if n % 3 < 1
のところは、if n % 3 == 1
と書くより 1 文字短いです。 - 3 で割り切れる時は
s
にFizz
、5 で割り切れる時はs
にBuzz
を加えます。 - 3 項演算子と文字列フォーマットを使って、
s
が空文字でなければs
を、s
が空文字ならn
を返します。
Ruby の言語機能を調べながら頑張って短く書いてみました。楽しいですね。
minitest
最近の Ruby には同梱されているという minitest を使ってテストを書きました。簡単に書けて良かったです。
# fizzbuzz_test.rb
require 'minitest/autorun'
require_relative './fizzbuzz'
class FizzBuzzTest < Minitest::Test
def test_fizzbuzz_1
assert_equal '1', fizzbuzz(1)
end
def test_fizzbuzz_3
assert_equal 'Fizz', fizzbuzz(3)
end
def test_fizzbuzz_5
assert_equal 'Buzz', fizzbuzz(5)
end
def test_fizzbuzz_15
assert_equal 'FizzBuzz', fizzbuzz(15)
end
def test_fizzbuzz_98
assert_equal '98', fizzbuzz(98)
end
def test_fizzbuzz_100
assert_equal 'Buzz', fizzbuzz(100)
end
end
GitHub Actions
Fizz buzz を実行
特にどうということはないです。Ruby のバージョンは .ruby-version
に書いてあって、バージョンは 3.0.2
です。
name: FizzBuzz
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
fizzbuzz:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: ruby/setup-ruby@v1
- name: fizz buzz
run: ruby main.rb
テスト実行
なんかもっといい方法がありそうな気がしますが、単純に ruby fizzbuzz_test.rb
でテストを実行してます。何かもっと良い方法があれば教えてください。
name: Test
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: ruby/setup-ruby@v1
- name: run test
run: ruby fizzbuzz_test.rb
Lint Check 実行
reviewdog と rubocop で Lint Check を実行します。 reviewdog/action-rubocop
を使えば一発でした。
name: Lint Check
on:
pull_request:
types: [opened, synchronize, reopened]
jobs:
rubocop:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: ruby/setup-ruby@v1
- name: rubocop
uses: reviewdog/action-rubocop@v2
with:
rubocop_version: gemfile
github_token: ${{ secrets.GITHUB_TOKEN }}
reporter: github-pr-review
Gemfile はこんな感じで書いておきました。
# frozen_string_literal: true
source 'https://rubygems.org'
gem 'rubocop', require: false
実行結果
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
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz
まとめ
楽しかったです。
Discussion