どぼじょのIT学習ブログ

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

独自gem作成その1 / bundler

本日からは、独自の gem を作ることを目標にいろいろ学習を進めていきます!
gem についてはこちらの記事で少し触れていますのでご参照ください✨

目次

1.gem 作成前の下準備

独自の gem はまだ思いついていないので、まずはRubyGemsの公式ページを読んでみます。

Guides - RubyGems Guides

目次の順番に読んでいき、MAKE YOUR OWN GEMを読み始めてみると、bundler で gem を作るというリンクがあります💡
ちょっと寄り道してリンク先の bundler のページを見てみると、bundler 1.13で gem を作る解説ページに飛びます👀
私のパソコンにインストールされている bundler のバージョンは 1.17.1 なので、1.17の解説ページを読むことにしました😊

Bundler: How to create a Ruby gem with Bundler

私のパソコンには bundler がいつの間にかインストールされています。というか、過去にインストールした記憶はあるのですが、なぜだったか思い出せません笑
なのでインストール手順は飛ばして、以下のコマンドでバージョンの確認をします。

$ bundler -v

f:id:mistyrinth:20181204102428p:plain
バージョンは 1.17.1 です💡
ちなみに bundler 未インストールの場合、以下のコマンドでインストールできます。

$ gem install bundler

2.bundler で gem を作る練習

2-1. Getting Started

先程の bundler のサイトに gem を作る例が載っているので、まずはそれに従ってやってみます。
bundler で新しく gem を作るには、まず以下のコマンドを実行します。

$ bundler gem 作りたいgem名

ここではfoodieという名前の gem を作ってみます!

We call our gem foodie because this gem is going to do a couple of things around food, such as portraying them as either “Delicious!” or “Gross!”. Stay tuned.

どうやら food に対してDilicious!Gross! のどちらか反応をするための gem っぽいですね🙂

bundler gem foodieを実行すると、3つの質問をされます。
f:id:mistyrinth:20181204110643p:plain

どれも今は正直分からないので、テストファイルはよく見かけるほうのrspecにしておいて、それ以外はyesとしておきます。

無事にfoodieという gem が作れたみたいです!
f:id:mistyrinth:20181204113109p:plain
ホームディレクトリにfoodieというファイルができたみたいです!これが gem ですね😊
f:id:mistyrinth:20181204113436p:plain
foodieの中にも様々なファイルが作成されています。
ターミナル操作は大変になってくるので、ここからは必要に応じてVSCodeで作業します😗

2-2. Testing our gem

VSCodefoodieを開いてみると、ファイルが作成されているのがより分かりやすくなります。
次のキャプチャはfoodieの中のfoodie.gemspecを開いている様子です。authors や homepage などダミーの文字列が入っていますが、正しく入力しないと進めないので、適当に入力して、飛ばしたいところはコメントアウトしていきます😐笑
f:id:mistyrinth:20181204142135p:plain

次にbundle installを実行します。ここでエラーがあると、先程のダミーがまだどこかに残っている可能性があります💀
エラー文が丁寧に教えてくれるので、読んだとおりに対処すれば解決は難しくないと思います。
f:id:mistyrinth:20181204162436p:plain

bundlerのページを読み進めていくと、foodie_spec.rbに書く内容が載っているので、コピペしてみます。
f:id:mistyrinth:20181204161528p:plain
foodie_spec.rbには元々何か書かれているのでそれはそのままにして、# added by sayaka以下がコピペ文章になります。
ちなみにコピペそのままだと 17行目でdescribeが Object に定義されていないというエラーが起きてしまうので、ここは元々書いてあるコードの真似をして冒頭にRSpec.を付け足しています⛄️
コードを見ると、どうやらブロッコリーが不味いみたいですね😂笑
bundler exec rspec specを実行します。
f:id:mistyrinth:20181204162727p:plain
テスト成功です🎉🎉

2-3. Using other gems

続いて、自分の gem から Active Support のpluralizeメソッドを使うとのことですが、なんのこっちゃという感じですね〜🙃
解説を読んだところ、activesupportという gem を指しているのだと思いますが、pluralizeは今のところ謎です。
それっぽいリンクは見つかりました!笑

Method: String#pluralize — Documentation for activesupport (5.2.1)

今は言われるがままに進めてみましょう💪💪
他の gem を使うには、foodie.gemspecに使いたい gem を関連付けます。
activesupportへの紐付けをfoodie.gemspecの44行目に書いてみました。
f:id:mistyrinth:20181204181718p:plain
次に、再びbundle installを行います。これでactivesupportという gem がインストールされるはずです✨
実行画面では分からなかったので、gem listコマンドを実行し、インストール済みの gem 一覧を見てみました。
f:id:mistyrinth:20181204180103p:plain
activesupportが正しくインストールされていることが確認できました🙂
次はfood_spec.rbdescribe Foodie::Foodブロック内にpluralizeのテストを作成します。
f:id:mistyrinth:20181204180735p:plain
上のキャプチャでいう26〜28行目です!
最後に、doof.rbの先頭にrequire 'active_support/inflector'を追加し、foodクラスの中にpluralizeメソッド(14〜16行目)を定義します。
以上で Active Support のpluralizeメソッドが使えるようになったはずなので、テストしてみます!
f:id:mistyrinth:20181204182344p:plain
テストは成功…っぽいですが、pluralizes a wordという出力で合っているんでしょうか…笑
てっきりfoodie.spec.rbで設定したtomatoesが出力されると思っていたのですが😐
仕組みがまだ分からない以上なんとも言えませんが、とりあえず本日はここまで!