FactoryBot 6.0 から enum の traits が自動生成されるようになった

はじめに

2020 年 6 月にリリースされていた FactoryBot バージョン 6.0.0 から ActiveModel の enum の列挙子ごとに traits が自動で作られるようになっていました。これについて技術記事があまりなかったので書いてみることにしました。

例えば以下のような status という enum のカラムをもつ Task モデルがあるとします。

# app/models/task.rb

class Task < ActiveRecord::Base
  enum status: {queued: 0, started: 1, finished: 2}
end

v6.0以前では traits を書く必要があった

6.0 以前では factory の定義に自分で traits を書く必要があるので面倒です。

# spec/factories/tasks.rb

FactoryBot.define do
  factory :task do
    trait :queued do
      status { :queued }
    end

    trait :started do
      status { :started }
    end

    trait :finished do
      status { :finished }
    end
  end
end

v6.0 以降では traits を書く必要がなくなった

Added: automatic definition of traits for Active Record enum attributes, enabled by default

github.com

6.0 以降で factory の定義だけを書きます。

FactoryBot.define do
  factory :task do
  end
end

これだけで enum の traits が使えるようになります。

task = FactoryBot.build(:task, :started)
task.status
#=> "started"

詳しくは GETTING_STARTEDPRをご覧ください。

おわりに

とても便利な機能なのでまだ FactoryBot 6.0 未満を使っている方はバージョンアップすることをオススメします。

Ruby 3.0 で Hash のキーを別のキーに置換する方法

例えば {foo: 1, bar: 2, baz: 3} という Hash のキーのうち、 :baz:foobar に置換して {foo: 1, bar: 2, foobar: 3} にしたいとします。

Ruby 2.7 以前の場合

Ruby 2.7 以前だと Hash#transform_keys のブロックの中で条件分岐させたりと少し面倒です。

# 2.7.2

hash = {foo: 1, bar: 2, baz: 3}

hash.transform_keys { |key| key == :baz ? :foobar : key }
#=> {:foo=>1, :bar=>2, :foobar=>3}

Hash#transform_keys (Ruby 3.0.0 リファレンスマニュアル)

他には Hash#delete を使って元の Hash を破壊してしまう方法もあります。

# 2.7.2

hash = {foo: 1, bar: 2, baz: 3}

hash[:foobar] = hash.delete(:baz)
hash
#=> {:foo=>1, :bar=>2, :foobar=>3}

Hash#delete (Ruby 3.0.0 リファレンスマニュアル)

Ruby 3.0 の場合

Ruby 3.0 では Hash#transform_keys の引数に {置換前のキー => 置換後のキー} の Hash を渡すことで簡単に置換できます。

# 3.0.0-preview2

hash = {foo: 1, bar: 2, baz: 3}

hash.transform_keys(baz: :foobar)
#=> {:foo=>1, :bar=>2, :foobar=>3}

参考

bugs.ruby-lang.org

stackoverflow.com

Ruby で使われる OpenSSL のバージョンを更新する

先日 OpenSSL 1.1.1i がリリースされ、それを反映した ruby-build のバージョンがリリースされていました。

その際にローカルにインストールしている Ruby で使われる OpenSSL のバージョンを最新に更新したので、その方法を書きます。これがベストかわかりませんが自分はこうしたという方法です。

試した環境

MacOS 10.15.7

Rubyruby-build + rbenv で管理しています。 今回は Ruby 2.7.2 を使います。

方法

方法は単純でただ Ruby を再インストールしただけです。

まず最初の状態です。以下のようにすることで OpenSSL 1.1.1h が使われてることが確認できます。

$ ruby -r openssl -e 'p OpenSSL::OPENSSL_LIBRARY_VERSION'
"OpenSSL 1.1.1h  22 Sep 2020"

次に最新の ruby-build を取得、さらに更新したい Ruby をアンインストールして再度インストールします。

$ brew upgrade ruby-build
$ rbenv uninstall 2.7.2
$ rbenv install 2.7.2

再度確認すると OpenSSL 1.1.1i (2020/12/10 時点で最新バージョン)が使われています!

$ ruby -r openssl -e 'p OpenSSL::OPENSSL_LIBRARY_VERSION'
"OpenSSL 1.1.1i  8 Dec 2020"

他の Ruby バージョンも更新するには、また同じように Ruby を再インストールする必要があると思います。

参考

blog.manabusakai.com

masutaka.net

ターミナルと VS Code から GitHub のリポジトリのページをすぐに開く方法

開発をしていると、PR を開きたかったり PR のレビューをしたいなどで、GitHubリポジトリのページをブラウザで開きたいことが多々あります。 そんな時にすぐに開くことができる方法を2つ紹介します。

※この記事はMacの開発環境を想定しています。

ターミナルから開く方法

GitHub が公式に開発している gh コマンドを使うのが便利です。

github.com

Mac であれば Homebrew から簡単にインストールして使えます。

$ brew install gh

gh コマンドには GitHub のページを開くコマンドが提供されています。

gh repo | GitHub CLI

cd で対象のリポジトリディレクトリに移動して以下のコマンドを実行してください。すると GitHubリポジトリのページが自動的にブラウザで開きます。

$ gh repo view --web

私は頻繁に使うのでエイリアスに登録しています。

alias repo='gh repo view --web'

gh にはこれ以外にも便利なコマンドがあるようなので使ってみます。

VS Code から開く方法

拡張機能GitLens を使います。 GitLens はコードの blame を見たりするのに便利で使っているのですが、他の機能もあります。

marketplace.visualstudio.com

インストールしたら Command + Shift + p でコマンドパレットを開いて、GitLens: Open Respository on Remote のコマンドを検索し実行してください。

f:id:wai-doi:20201207233648p:plain

するとブラウザが起動し自動的にリポジトリのページが開いてくれます。これを頻繁に使うのであればショートカットも設定するのもよいでしょう。