独自gem作成その2 / Gemの作成, RSpecテスト, rubocop
本日は具体的に gem を作っていきます!
目次
1.gemのアイデア
作る gem のアイデアですが、いろいろと考えた結果、数値を英語に変換してみようと思います!
例えば1
をone
に変換するやつです。
gem の名前はconv_num_words
にします!
2.実際に作ってみる
2-1. gemテンプレートの作成
まずは以下のコマンドで gem のテンプレートを作ります。
$ bundler gem conv_num_words
作る場所はどこでも良いのですが、私はホームディレクトリにしました!
この時点で自動的に gem に必要な沢山のファイルが作成されます。
gem は沢山のファイルによって構成されているため、IDE(統合開発環境)でgem のルートディレクトリを開いたほうが作業しやすいです✨
わたしの場合は Visual Studio Code を使っています🙂
IDEを使うと、いちいちメモ帳のようなエディタを開いて編集しなくても、ディレクトリの中のファイルをツリーで確認しながら、ファイル間を行ったり来たりできるようになります!
細かくて見にくいですが、以下が IDE(Visual Studio Code)の編集画面です。
ざっくり分類分けすると、左側に gem を構成するディレクトリ、メイン部分がコードエディタ、下部にターミナルがあります👀
この画面は、次に編集するgemspec
を開いているところです😊
2-2. gemspecの修正
先程の操作で自動的に作成されたファイルのうち、gemspec
というファイルを編集します💪
TODO:
で始まるところがダミーなので、そこに自分の情報に置き換えます。
とは言っても description などは作っているうちに変わりそうなので、とりあえず今はTODO:
を取り外したり、ソースコードURLをコメントアウトにして、後で編集し直すことにします🤗
2-3. 実際のコードを記述
テンプレート作りが終わったので、今度は実際にコードを書いていきます。
数値を英文字に変換するという同じ発想の方がいらっしゃったので、かなり参考にさせていただきました!
コードを書くのはlib/conv_num_words.rb
の中です。
Numericクラスを拡張していく形で変換前後を定義していきます。
21以上の数は大変なので、桁(hundred, thousand)ごとに計算式を書きます✍️
2-4. ビルドして実行
コードが書けたら、ビルドしてみます!
ビルドのためにまずexe
ファイルを作成する必要があります。
gemのルートディレクトリで以下のコマンドを実行します。
$ mkdir exe
$ touch exe/conv_num_words
$ chmod +x exe/conv_num_words
この一連の流れは、1行目でexe
ディレクトリを作り、2行目でその中にconv_num_words
というファイルを作り、3行目でconv_num_words
の実行権限を付与しています💡
次に、以下のコマンドを実行してビルドします。
$ bundle exec rake build
このあたり参考にしたページのリンクを載せておきます👏
qiita.com
続いて、gemをインストールします!
$ gem install pkg/conv_num_words-0.1.0.gem
ここで確認のため、 irb を起動してrequire
'gem名'を実行して
true`になると良いです👌
エラーが出たら修正して、再ビルドして再インストールです😊😊
私は修正したきり再ビルドせずに irb を繰り返して何度も同じエラーを見ていながら、修正が反映されないことに気づくのが遅かったです笑
2-6. テスト
次に、spec/conv_num_words_spec.rb
を編集します。
RSpecを使ってテストを行います。
上のキャプチャは、conv_num_words
のNumericクラスに対して、to_w
を使ったときに予測できる変換前後を述べています。
テスト名(テストが成功したときに表示される名前)をconvert number into words
にしています。
一応全ての通りの組み合わせがテストできるように書いてみたつもりですが、見落としがあったらご指摘ください😶
テストを書いたら、ターミナルで以下のコマンドを実行します👆
$ bundler exec rspec spec
※コマンドがbundler
だったりbundle
だったりぶれてしまい申し訳ありません。どちらでも良いようです笑
テスト完了です!
ここで予測した答えと実際の答えが一致しないと、以下のように丁寧に教えてくれます。
2-7. rubocopで検証
ここまできたらもうパッケージ化して公開ですが、その前にひとつ確認しておくことがあります🤨
それは Ruby のコードはスタイルガイドに則っているか?ということです。
コードが正しくても、インデントがめちゃくちゃだと見にくいので、Rubyのスタイルガイドに合わせて書き直す必要があります。
github.com
このスタイルガイドに則って書けているか確認する rubocop というものを試してみます。
rubocop が未インストールの場合は以下のコマンドでインストールします。
$ gem install rubocop
使い方は簡単で、チェックしたいコードが書かれているファイルがあるディレクトリに移動し、rubocop
を実行するだけです。
私の場合はホームディレクトリに作っているconv_num_words
というディレクトリに移動してrubocop
を実行します☀️
ただし、はじめはrails本家の設定にするために一手間加えます🙂
まずは対象のディレクトリに移動し、.rubocop.yml
というファイルを作成します。
とりあえずtouch
で作成しました!ls -a
で作成できたことが確認できますね〜🌝
もちろん、IDEのほうでも確認できます。というかIDEで編集します。
rails本家のrubocop.yml
ファイルが公開されているので、これを作成したファイルの中身に反映させます✨
こんな感じになります。
いよいよターミナルで以下のコマンドを実行してみます!
$ rubocop
すると、長々とメッセージが現れます。
黄色のC
の文字が目立ちますね👀
このアルファベットは、見つかった違反の種類を指しています。
違反の重要度が重い順にFatal
, Error
, Warning
, Convention
があります。
メッセージに現れるC
は一番軽い違反を教えてくれています。
最後の1行には、8 files inspected, 26 offenses detected
と書かれており、26個の違反が見つかったことが分かります🙄
これを修正してから、パッケージ化をして公開、という手順を踏んでいきます。
さて、これをひとつひとつ確認して修正していくのは次回で!笑