暇人じゃない
——  Technology

jp_prefecture v1.2.0 をリリースした

2026/08/11 に jp_prefecture v1.2.0 をリリースした。

Gem の利用者に影響がある変更点は以下。

  • 複数の都道府県を検索する where メソッドを追加
  • find メソッドに未対応の引数を指定した場合に警告を表示
  • zip_mapping_data をカスタマイズしたときに code_for_zip メソッドの範囲検索が正常に動かない問題を修正

複数の都道府県を検索する where メソッドを追加

where メソッドで複数の都道府県を検索できるようにした。名前の検索には前方一致を使っている。

JpPrefecture::Prefecture.where(name: "山").map(&:name)
# => ["山形県", "山梨県", "山口県"]
JpPrefecture::Prefecture.where(name_e: "o").map(&:name)
# => ["大阪府", "岡山県", "大分県", "沖縄県"]

部分一致にするかは迷ったけれど、具体的な用途が思い浮かばなかった。 ユースケースがあれば Issue で教えてほしい。

find メソッドに未対応の引数を指定した場合に警告を表示

これまでは find メソッドに未対応の引数を指定しても nil が返るため、誤りに気付きにくかった。 nil を返すとともに非推奨の警告を表示するようにした。

JpPrefecture::Prefecture.find(foo: "山")
# [jp_prefecture] DEPRECATION WARNING: unsupported field: :foo (supported: name, name_e, name_r, name_h, name_k, code, zip, all_fields). This will raise ArgumentError in jp_prefecture 2.0.0.
# => nil

v2.0.0 では、未対応の引数を指定すると ArgumentError が発生する予定。 今回追加した where メソッドでは、すでに同じ条件で ArgumentError が発生する。

zip_mapping_data をカスタマイズしたときに code_for_zip メソッドの範囲検索が正常に動かない問題を修正

都道府県とその都道府県に対応する郵便番号の範囲を定義した zip.yml を Gem に同梱している。code_for_zip メソッドで郵便番号に対応する都道府県コードを検索することができる。

JpPrefecture::ZipMapping.code_for_zip(1000001)
# => 13

config.zip_mapping_data に自前のデータを指定することもできるが、指定した場合に限り、範囲検索にバグが存在していた。

例えば、東京都 (都道府県コード 13) に対応する範囲として 10000002080035 を指定した場合、両端を除く 10000012080034 では nil が返っていた。 今回の修正で、範囲内の郵便番号から正しく都道府県コードを取得できるようにした。

メンテナンス性の改善

Gem のメンテナンスについても改善した。

  • Gem リリースの自動化
  • zip_mapping_data の定期更新

Gem リリースの自動化

GitHub Actions で Gem をリリースできるようにした。

RubyGems には Trusted Publishing という仕組みがあり、GitHub Actions で発行した ID トークンから RubyGems の API トークンを取得し、その API トークンで Gem をリリースできる。

これまでは自分の PC から Gem をリリースしており、API キーを手元に保管し、多要素認証を行う必要があった。API キーの漏洩によるサプライチェーン攻撃のリスクに加え、手作業でリリース手順を間違える可能性もあった。GitHub Actions でリリースすることによってセキュリティのリスクが軽減され、手順がシンプルになったのが嬉しい。

zip_mapping_data の定期更新

先述の zip.yml は日本郵便の郵便番号データ (KEN_ALL.csv) から生成している。

これを毎月 1 日に定期更新するようにした。 これまでは時々自分の環境で Rake タスクを実行して、差分が発生したら取り込むという運用になっていたので、更新に気付かない可能性があった。定期更新することによって実行忘れの心配がなくなった。

(余談) 1 つの郵便番号が複数の都道府県にまたがる場合がある

今回の zip_mapping_data 関連の作業を行っていて、1 つの郵便番号が複数の都道府県にまたがる場合があることを知った。

例えば 618-0000 は「京都府乙訓郡大山崎町」と「大阪府三島郡島本町」にまたがっている。 基本的には 618-0001 など、町域レベルの郵便番号が利用されるが、探している町域が郵便番号一覧に見つからない場合に使う番号として 618-0000 が掲載されている。

この Gem の code_for_zip メソッドの挙動はどうなっているかというと、都道府県コードの昇順で最初の 1 件を返す実装になっている。したがって現状は京都府 (都道府県コード 26) が取得される。

JpPrefecture::ZipMapping.code_for_zip(6180000)
# => 26

データ上は京都府と大阪府の両方が対応するため、複数の都道府県コードを返す方法も検討したい。


他にも CHANGELOG を Keep a Changelog 形式に変更したり、ローカル環境でコンソールを起動できるように bin/console を追加したり と改善を行った。

今回は大部分を Claude Code で実装した。

大規模な OSS では AI Slop な Issue や Pull Request に悩まされるケースが多いと聞くが、自分がメンテナンスしているこの Gem では、今のところそうしたことに悩まされることはなく、コーディングエージェントに助けられている面が大きい。特に自動化は自分で 1 から書くことになると、どうしても腰が重くなるのでとても助かった。


備考

1 つの郵便番号が複数の都道府県にまたがる件については、以下のブログで解説されている。