5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PORTAdvent Calendar 2020

Day 24

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

Last updated at Posted at 2021-01-03

はじめまして、新卒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するとエラー吐きます。

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

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を書いていく。
今回必要なのはbundlerrakeが必要なので追加する。(テストまで書きたいのであれば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でローカルにインストールして確認してみます。

$ 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の仕組みや新しい知見もより増えたのでとてもよかったと思います。

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

参考

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?