どぼじょのIT学習ブログ

高専卒土木女子がIT業界を目指してお勉強。

独自gem作成その2 / Gemの作成, RSpecテスト, rubocop

本日は具体的に gem を作っていきます!

目次

1.gemのアイデア

作る gem のアイデアですが、いろいろと考えた結果、数値を英語に変換してみようと思います!
例えば1oneに変換するやつです。
gem の名前はconv_num_wordsにします!

2.実際に作ってみる

2-1. gemテンプレートの作成

まずは以下のコマンドで gem のテンプレートを作ります。

$ bundler gem conv_num_words

作る場所はどこでも良いのですが、私はホームディレクトリにしました!
f:id:mistyrinth:20181213112058p:plain
この時点で自動的に gem に必要な沢山のファイルが作成されます。
gem は沢山のファイルによって構成されているため、IDE統合開発環境)でgem のルートディレクトリを開いたほうが作業しやすいです✨
わたしの場合は Visual Studio Code を使っています🙂
IDEを使うと、いちいちメモ帳のようなエディタを開いて編集しなくても、ディレクトリの中のファイルをツリーで確認しながら、ファイル間を行ったり来たりできるようになります!
細かくて見にくいですが、以下が IDEVisual Studio Code)の編集画面です。
f:id:mistyrinth:20181213112208p:plain
ざっくり分類分けすると、左側に gem を構成するディレクトリ、メイン部分がコードエディタ、下部にターミナルがあります👀
この画面は、次に編集するgemspecを開いているところです😊

2-2. gemspecの修正

先程の操作で自動的に作成されたファイルのうち、gemspecというファイルを編集します💪
TODO:で始まるところがダミーなので、そこに自分の情報に置き換えます。
とは言っても description などは作っているうちに変わりそうなので、とりあえず今はTODO:を取り外したり、ソースコードURLをコメントアウトにして、後で編集し直すことにします🤗

2-3. 実際のコードを記述

テンプレート作りが終わったので、今度は実際にコードを書いていきます。
数値を英文字に変換するという同じ発想の方がいらっしゃったので、かなり参考にさせていただきました!

d.hatena.ne.jp

コードを書くのはlib/conv_num_words.rbの中です。
f:id:mistyrinth:20181217192721p:plain
Numericクラスを拡張していく形で変換前後を定義していきます。
21以上の数は大変なので、桁(hundred, thousand)ごとに計算式を書きます✍️
f:id:mistyrinth:20181217192901p:plain

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

f:id:mistyrinth:20181214143746p:plain
このあたり参考にしたページのリンクを載せておきます👏
qiita.com

続いて、gemをインストールします!

$ gem install pkg/conv_num_words-0.1.0.gem

f:id:mistyrinth:20181214144114p:plain

ここで確認のため、 irb を起動してrequire'gem名'を実行してtrue`になると良いです👌
エラーが出たら修正して、再ビルドして再インストールです😊😊
私は修正したきり再ビルドせずに irb を繰り返して何度も同じエラーを見ていながら、修正が反映されないことに気づくのが遅かったです笑

2-6. テスト

次に、spec/conv_num_words_spec.rbを編集します。
RSpecを使ってテストを行います。
f:id:mistyrinth:20181217200217p:plain
上のキャプチャは、conv_num_wordsのNumericクラスに対して、to_wを使ったときに予測できる変換前後を述べています。
テスト名(テストが成功したときに表示される名前)をconvert number into wordsにしています。
一応全ての通りの組み合わせがテストできるように書いてみたつもりですが、見落としがあったらご指摘ください😶
テストを書いたら、ターミナルで以下のコマンドを実行します👆

$ bundler exec rspec spec

※コマンドがbundlerだったりbundleだったりぶれてしまい申し訳ありません。どちらでも良いようです笑
f:id:mistyrinth:20181217201248p:plain
テスト完了です!
ここで予測した答えと実際の答えが一致しないと、以下のように丁寧に教えてくれます。
f:id:mistyrinth:20181217201453p:plain

2-7. rubocopで検証

ここまできたらもうパッケージ化して公開ですが、その前にひとつ確認しておくことがあります🤨
それは Ruby のコードはスタイルガイドに則っているか?ということです。
コードが正しくても、インデントがめちゃくちゃだと見にくいので、Rubyのスタイルガイドに合わせて書き直す必要があります。

github.com
このスタイルガイドに則って書けているか確認する rubocop というものを試してみます。
rubocop が未インストールの場合は以下のコマンドでインストールします。

$ gem install rubocop

使い方は簡単で、チェックしたいコードが書かれているファイルがあるディレクトリに移動し、rubocopを実行するだけです。
私の場合はホームディレクトリに作っているconv_num_wordsというディレクトリに移動してrubocopを実行します☀️
ただし、はじめはrails本家の設定にするために一手間加えます🙂
まずは対象のディレクトリに移動し、.rubocop.ymlというファイルを作成します。
f:id:mistyrinth:20181217202705p:plain
とりあえずtouchで作成しました!ls -aで作成できたことが確認できますね〜🌝
もちろん、IDEのほうでも確認できます。というかIDEで編集します。
rails本家のrubocop.ymlファイルが公開されているので、これを作成したファイルの中身に反映させます✨

github.com

こんな感じになります。
f:id:mistyrinth:20181217203154p:plain
いよいよターミナルで以下のコマンドを実行してみます!

$ rubocop

すると、長々とメッセージが現れます。
f:id:mistyrinth:20181217203722p:plain
黄色のCの文字が目立ちますね👀
このアルファベットは、見つかった違反の種類を指しています。
違反の重要度が重い順にFatal, Error, Warning, Conventionがあります。
メッセージに現れるCは一番軽い違反を教えてくれています。 最後の1行には、8 files inspected, 26 offenses detectedと書かれており、26個の違反が見つかったことが分かります🙄
f:id:mistyrinth:20181217203905p:plain
これを修正してから、パッケージ化をして公開、という手順を踏んでいきます。

さて、これをひとつひとつ確認して修正していくのは次回で!笑