はじめまして、新卒1年目プログラミング初心者のオオタです!!
社内で主にruby on railsを使っており、自分の中でまだrubyの知識が甘々なので勉強としてgemを作成してみました!今後何かに生かせると思ったので、それの備忘録です。
作成したgemについて
今回作成したgemは、GoogleBooksAPIを利用して書籍検索を行い、それをjson出力してみました。(今後何かに使えればいいなと思います…w)
また、作成したgemは公開までやってないのでご了承ください。
GoogleBooksAPIに関してはこちらの記事を参考にしました。
公式リファレンスはこちら
作成手順
- 開発環境
ruby 2.6.2
Bundler 2.2.4
irb 1.0.0
これらを使用するのでgemなどのインストールが必要です。
- githubの新規レポジトリ
gemはgit依存で動作するらしいので作成します。(どっかの記事に書いてあった)
1. gemを作る
bundlerのコマンドを用いて基盤となるものを作成します。
bundle gem gem_name
で作成できます。
今回は書籍検索なのでbook_searchという安直な名前で作成しました。(json出力だからbook_search_jsonとかでもよかったなーとか後悔してる)
$ bundle gem book_search
これでファイルが自動生成されます。
|--bin
| |--console
| |--setup
|--lib
| |--books_search.rb
| |--books_search
| | |--version.rb
|--.gitignore
|--.rubocop.yml
|--books_search.gemspec
|--CODE_OF_CONDUCT.md
|--Gemfile
|--Gemfile.lock
|--LICENSE.txt
|--README.md
|--Rakefile
(rubocopはgemで元々入っているので気にしないでください;;)
※ 注意事項
gemの名前をつける際に、間に-
をつけるとlib内のディレクトリ構成が変わってくるので注意が必要です。(自分はここで一回ハマりました。)
- 例
$ bundle gem books-search
|--lib
| |--books
| | |--search
| | |--search.rb
| | | |--version.rb
こんな感じになるので注意されたし。
2. gemspecに加筆する
自動生成されたgemspecにTODOでここに書いて!と言われる部分があるのでそこに加筆する。
そのままbundle install
するとエラー吐きます。
自分が変更した部分はこちら
# 概要
spec.summary = "GoogleBooksAPI use."
# 説明
spec.description = "It uses google to search for books."
# 適当に自分のgithubアカウント
spec.homepage = "https://github.com/yuki-ohta0086"
# ここは"https://rubygems.org"でOK
spec.metadata["allowed_push_host"] = "https://rubygems.org"
# "source_code_uri"と"source_code_uri"は作成したgithubのレポジトリのURLを入れる
spec.metadata["source_code_uri"] = "https://github.com/yuki-ohta0086/books_search"
spec.metadata["source_code_uri"] = "https://github.com/yuki-ohta0086/books_search"
TODOの部分はこれでOK。あとは環境に必要なgemを書いていく。
今回必要なのはbundler
とrake
が必要なので追加する。(テストまで書きたいのであればrspecやminitestを追加する。)
spec.add_development_dependency "bundler", "~> 2.2"
spec.add_development_dependency "rake", "~> 13.1"
spec.add_development_dependency "rspec", "~> 3.0"
全て書き終えたらbundle install
する。
$ bundle install
成功したら一応pushしておきます。(念のため)
3. gemの内容を書く
ついに本題です。lib内にあるbooks_search.rbに処理内容を書いていきます!!
今回はキーワードを元にGoogleBooksAPIを用いてjsonを出力するだけなのでその処理を書いていきます。
require 'net/http'
require 'uri'
require 'json'
require_relative 'books_search/version'
module BooksSearch
class Error < StandardError; end
# volume検索のAPIのURL
GOOGLEAPI_URL = 'https://www.googleapis.com/books/v1/volumes?q='
# moduleなのでクラスメソッド作らないと呼び出せないので作成
class << self
def get_book_json(params)
uri = URI.parse(GOOGLEAPI_URL + params)
resources = Net::HTTP.get(uri)
puts resources
end
end
end
getリクエストが欲しいので調べたらnet/http
というライブラリがあったのでそれを使用しました。
処理内容としては
-
GOOGLEAPI_URL + params
で出来た文字列をパースしてuriに変換。 - それをgetリクエストして帰ってきたjsonを出力
これだけです。
もし、ちゃんと利用するのであればこのjsonをrubyオブジェクトに変換していろいろ活用できると思います。
ただ今回はjson出力がみたいだけなのでこのままにしています。
もしやるのであればこんな感じになると思います。
def get_book_json(params)
uri = URI.parse(GOOGLEAPI_URL + params)
resources = Net::HTTP.get(uri)
json = JSON.parse(resources)
end
4. 作成したgemをローカルにインストール
いよいよ自分のgemをインストールできます!!
bundle exec rake install
でローカルにインストールして確認してみます。
$ bundle exec rake install
books_search 0.1.0 built to pkg/books_search-0.1.0.gem.
books_search (0.1.0) installed.
rakeでビルドしてそのままgem install
してます。
完了したらirbで確認します。
$ bundle exec irb
irb(main):001:0> require 'books_search'
=> true
irb(main):002:0> BooksSearch.get_book_json('ruby')
{
"kind": "books#volumes",
"totalItems": 731,
"items": [
{
"kind": "books#volume",
"id": "Dif2bl2KRUYC",
"etag": "pmkr/T2kh1g",
"selfLink": "https://www.googleapis.com/books/v1/volumes/Dif2bl2KRUYC",
"volumeInfo": {
"title": "プログラミングRuby 1.9 言語編",
"authors": [
"Chad Fowler",
"Andy Hunt"
],
~以下略~
自分はこんな感じでできました!
完成したもの
もし実際のアップロードをするのであれば
$ rake release
でできるみたいです。
詳しくはRubygemsにいろいろ書いていあります。(正直ここが一番わかりやすかった)
GoogleBooksAPIででてきた出力ではimageのサムネイルだったりを出せるのでとても便利かなと思います。ただ、欠点として1日1000件までしか出せないようなので注意です。
感想
今回gemを初めて作ったのですが、意外と簡単に作れました!
また、rubyの仕組みや新しい知見もより増えたのでとてもよかったと思います。
いろいろなことを自分で試してみて力をつけて行けたらなと思います!!
参考
- [Google Books APIの使い方~その4~]
(https://qiita.com/stella0270/items/8fdd2efcdd9db96a5c4d) - 【Ruby】gemの作り方から公開まで