🌊

RubyとGitHub Actionsにこんにちは

2021/10/08に公開

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 で割り切れる時は sFizz 、5 で割り切れる時は sBuzz を加えます。
  • 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