GoogleBooksAPIを用いた書籍検索の結果をjson出力するRuby gemを作成してみた

はじめまして、新卒１年目プログラミング初心者のオオタです！！
社内で主にruby on railsを使っており、自分の中でまだrubyの知識が甘々なので勉強としてgemを作成してみました！今後何かに生かせると思ったので、それの備忘録です。

# 作成したgemについて
今回作成したgemは、GoogleBooksAPIを利用して書籍検索を行い、それをjson出力してみました。（今後何かに使えればいいなと思います…w）
また、作成したgemは公開までやってないのでご了承ください。

GoogleBooksAPIに関してはこちらの[記事](https://qiita.com/stella0270/items/8fdd2efcdd9db96a5c4d)を参考にしました。
公式リファレンスは[こちら](https://developers.google.com/books/docs/v1/using)



# 作成手順

- 開発環境

```
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とかでもよかったなーとか後悔してる）

```console
$ 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`するとエラー吐きます。

自分が変更した部分はこちら

```books_search.gemspec
  # 概要
  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を追加する。）

```books_search.gemspec
  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を出力するだけなのでその処理を書いていきます。



```books_search.rb
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出力がみたいだけなのでこのままにしています。
もしやるのであればこんな感じになると思います。

```books_search.rb
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`でローカルにインストールして確認してみます。

```console
$ 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で確認します。

```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"
        ],
~以下略~
```

自分はこんな感じでできました！

完成したもの

- https://github.com/yuki-ohta0086/books_search 


もし実際のアップロードをするのであれば

```
$ rake release
```
でできるみたいです。
詳しくは[Rubygems](https://rubygems.org/)にいろいろ書いていあります。（正直ここが一番わかりやすかった）

GoogleBooksAPIででてきた出力ではimageのサムネイルだったりを出せるのでとても便利かなと思います。ただ、欠点として1日１０００件までしか出せないようなので注意です。


## 感想
今回gemを初めて作ったのですが、意外と簡単に作れました！
また、rubyの仕組みや新しい知見もより増えたのでとてもよかったと思います。

いろいろなことを自分で試してみて力をつけて行けたらなと思います！！

## 参考

- [Google Books APIの使い方~その４~]
(https://qiita.com/stella0270/items/8fdd2efcdd9db96a5c4d)
- [【Ruby】gemの作り方から公開まで](https://qiita.com/9sako6/items/72994b8b1c00af4e61fe)