RubyとGitHub Actionsにこんにちは

Rubyはあまり書いたことがなかったのですが、興味があったのでFizz buzzを書いたりGitHub ActionsでテストやLint Checkを回してみました。GitHubのリポジトリはこちらです。

特に誰が嬉しいわけではないと思いますが、参考までにメモを残しておきます。

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

まとめ

楽しかったです。

筆者

茨城県つくば市在住のソフトウェアエンジニアです。得意領域はAndroidとFlutterです。「Jetpack ComposeによるAndroid MVVMアーキテクチャ入門」の著者です。

👉もっと詳しく