Gemを作ってみた!

SORAの開発

  • バックエンド・バッチの開発
    • Ruby / Ruby on Railsがメイン
    • 約3年?利用している
    • Lambda で Ruby2.5(2018年11月頃〜) or Ruby2.7(2020年2月頃〜)
      をサポートしている

課題

バックエンドとバッチで同じロジックを使いまわす

 

同じお題の開発していそうだなー?

ライブラリ作ってみるか!

ライブラリってどう作り始めるの?

初めてGemを作る時

まずは慣れてみる!

1. 動くロジック・テスト・ドキュメント

https://guides.rubygems.org/make-your-own-gem/
 

2. RubyGemsに公開

https://guides.rubygems.org/publishing/

命名規則のオススメもある!

1. アンダースコア(_) クラスやモジュールに複数の単語がある場合

2. ダッシュ(-) 他のgemに機能を追加する場合

① + ②

何をライブラリにしようか?

社外でも社内でも活かせるライブラリ

  • スタートアップとして、社外に向けてだけ開発ができる余裕はなかなかない
    (共通プラットフォーム開発のチームを持っている場合は、別ですが、、、)
  • たまたま、住所から緯度経度の取得開発を行うことがあり、
    緯度経度を取得するAPIを2種類扱っていた
  • 緯度経度を引けなかったとき「Next API」的なものは存在していなかった

今回作ったGemは「sora_geocoding」なので

① + ②

命名規則①を採用しています

ライブラリの仕様は・・・

  1. Geocoding APIYahoo!ジオコーダ API を利用して、住所から緯度経度を取得
     
  2. Yahoo!ジオコーダ API を利用して、
    緯度経度が取得できない場合は
    Geocoding APIからも取得する
     
  3. Geocoding APIが取得できなければ、自動的に終了

ライブラリ作成Tips

既存ライブラリを参考にして開発してみる!

スター🎖が多くついていて、

利用目的が近そうなライブラリが良いかもしれないです

全体仕様検討参考 >>

Geohashロジック参考 >>

guard-rspec gem 

・ロジックやテストが変更された時に自動で実行して開発

・先に最終結果だけのテストを書いて、実行しながら開発ができる
(TDD的な開発スタイル)

// Guardfile
guard :rspec, cmd: 'bundle exec rspec' do
  watch(%r{^spec/.+_spec\.rb$})
  watch(%r{^lib/sora_geocoding/(.+)\.rb$}) { |m| "spec/unit/#{m[1]}_spec.rb" }
  watch(%r{^lib/(.+)\.rb$})     { |m| "spec/unit/#{m[1]}_spec.rb" }
  watch('spec/spec_helper.rb')  { 'spec' }
end
SoraGeocoding
  .search
    when 200 status on Geocoding API
      is returned "geocoding" site.
      is returned latitude and longitude and google_maps tags.
    when 200 status on Yahoo Geocoder API
      is returned "yahoo" site.
      is returned Status and Coordinates tags.
  .coodinates
    when 200 status on Geocoding API
      is returned "geocoding" site.
      is returned latitude and longitude.
    when 200 status on Yahoo Geocoder API
      is returned "yahoo" site.
      is returned latitude and longitude.
  .geohash
    when latitude 33.333333333 and longitude 133.3333333
      is returned "wvyvdh4kezeh".

Finished in 1.11 seconds (files took 0.98608 seconds to load)
9 examples, 0 failures

Coverage report generated for RSpec to /Users/hironori/work/sora_geocoding_hirontan/coverage. 75 / 78 LOC (96.15%) covered.

Faker gem 

・都市名や食べ物などダミーデータを用意してくれているライブラリ

・ダミーデータをCSV生成やデータベース格納したい場合に活用できるかも

// 都市名をクエリとして扱ってます
let!(:query) { Faker::Address.city }

・あまり想定していなかった空白文字のエラーを発見できました。

(San Franciscoなど)

simplecov gem 

・コードカバレッジを計測してくれる

Finished in 0.93592 seconds (files took 0.5433 seconds to load)
38 examples, 0 failures

Coverage report generated for RSpec to /Users/hironori/work/sora_geocoding_hirontan/coverage. 266 / 266 LOC (100.0%) covered.

次回は・・・Rust関連かなー

Gemを作ってみた!

By hirontan

Gemを作ってみた!

  • 337