Ruby
rubygems
NIFTYDay 8

開発が捗る便利なRubyライブラリ

More than 1 year has passed since last update.

この記事は NIFTY Advent Calendar 2017 の8日目の記事です。
7日目は @esu_eichi さんの クレジットカードを使わないでlinebotを作ったときの話 でした。

はじめに

開発ではRubyを使うことが多いのですが、よく使うgemを紹介します。
ここで紹介しているのは有名なものばかりですので、この記事を読んで興味が出た方は
RubyGems.orgThe Ruby Toolbox で探してみるといいでしょう。

Pry

irb の強化版で、同じく対話式でオブジェクトを確認できます。
gem install pry でインストールします。
また、プラグインも豊富で、pry-docpry-byebugrails consolepry で使える pry-rails などもあります。 一緒にインストールしておくと便利です。

インストールしたら pry コマンドで対話モードに入ります。

$ pry
pry(main)>

require でライブラリを読み込んだり

pry(main)> require 'net/http'
=> true

どんなオブジェクトが作成されたか確認できます

pry(main)> uri = URI.parse("https://www.google.co.jp/")
=> #<URI::HTTPS https://www.google.co.jp/>

pry(main)> response = Net::HTTP.get_response(uri)
=> #<Net::HTTPOK 200 OK readbody=true>

pry(main)> response.code
=> "200"

ls コマンドで、定義された変数(上で定義したresponse)や、メソッドが確認できます

pry(main)> ls
self.methods: inspect  to_s
locals: _  __  _dir_  _ex_  _file_  _in_  _out_  _pry_  response

cd コマンドでオブジェクトに移動できます

pry(main)> cd response
pry(#<Net::HTTPOK>):1>

ls で確認してみると... そのオブジェクトのメソッドなどが確認できます

pry(#<Net::HTTPOK>):1> ls
Net::HTTPHeader#methods:
  []              connection_close?       content_type=          each_key    initialize_http_header  range=            size
  []=             connection_keep_alive?  delete                 each_name   key?                    range_length      sub_type
  add_field       content_length          each                   each_value  length                  set_content_type  to_hash
  basic_auth      content_length=         each_capitalized       fetch       main_type               set_form          type_params
  canonical_each  content_range           each_capitalized_name  form_data=  proxy_basic_auth        set_form_data
  chunked?        content_type            each_header            get_fields  range                   set_range
Net::HTTPResponse#methods:
  body   code       decode_content   entity  error_type  http_version  message  read_body    reading_body  uri   value
  body=  code_type  decode_content=  error!  header      inspect       msg      read_header  response      uri=
self.methods: __pry__
instance variables: @body  @body_exist  @code  @decode_content  @header  @http_version  @message  @read  @socket  @uri
locals: _  __  _dir_  _ex_  _file_  _in_  _out_  _pry_

pry-doc をインストールしておくと、show-method で内容を確認できます

pry(#<Net::HTTPOK>):1> show-method header
...

def header   #:nodoc:
  warn "#{caller(1)[0]}: warning: Net::HTTPResponse#header is obsolete" if $VERBOSE
  self
end

他にも edit コマンドでファイルの編集ができます(エディタが起動)

pry(#<Net::HTTPOK>):1> edit header
...
147   def header   #:nodoc:
148     warn "#{caller(1)[0]}: warning: Net::HTTPResponse#header is obsolete" if $VERBOSE
149     self
150   end
...

使いこなすと、開発がスムーズに行えるようになるので、オススメです。

faker

様々なダミーデータを作成できるライブラリです。
サンプルやテストでデータを用意するときに重宝します。

require 'faker'

Faker::Internet.user_name #=> "laria"
Faker::Internet.password  #=> "FeSv8eJoVbYv7"

Faker::DragonBall.character #=> "Super Saiyan 3 Goku"
Faker::Job.title            #=> "Chief Banking Assistant"

# 一部日本語にも対応
Faker::Config.locale = :ja

Faker::Name.last_name #=> "清水"

大量にユーザーを作ったりできます。

users = 1000.times.map do
  name  = Faker::Name.name
  email = Faker::Internet.email
  User.new(name, email)
end

サンプルデータ作るの面倒なので、手軽に作成できてよいです。

ReFe2

日本語ドキュメントで有名な「るりま」を端末で見ることができます。
いちいちブラウザを開く必要がありません。
以下のようインストールします。

$ gem install refe2
$ bitclust setup

refe コマンドが使えるようになりました。 Net::HTTP.get_response のドキュメントを見てみましょう

$ refe Net::HTTP.get_response
require 'net/http'
Net::HTTP.get_response
--- get_response(uri) -> Net::HTTPResponse
--- get_response(host, path = nil, port = nil) -> Net::HTTPResponse
指定した対象に GET リクエストを送り、そのレスポンスを
[[c:Net::HTTPResponse]] として返します。

対象の指定方法は [[c:URI]] で指定するか、
(host, port, path) で指定するかのいずれかです。

@param uri データの取得対象を [[c:URI]] で指定します。
@param host 接続先のホストを文字列で指定します。
@param path データの存在するパスを文字列で指定します。
@param port 接続するポートを整数で指定します。
@see [[m:Net::HTTP#get]]

メソッド名だけでも検索可能

$ refe get_response

クラスなどは説明が長いのでlessなどでみてください。

$ refe String | less

こちらも気軽に確認ができて便利です。

Rubocop

The Ruby Style Guide に沿った
コーディングスタイルをチェックしてくれます。

例えば、以下のようなコードを書いてしまったとして...

bad.rb
# bad
class Person
  def initialize(first_name, last_name)
    @first_name = first_name
    @last_name  = last_name
  end

  def first_name
    @first_name
  end

  def last_name
    @last_name
  end
end

rubocop コマンドを実行すると...

$ rubocop bad.rb
Inspecting 1 file
C

Offenses:

bad.rb:8:3: C: Use attr_reader to define trivial reader methods.
  def first_name
  ^^^
bad.rb:12:3: C: Use attr_reader to define trivial reader methods.
  def last_name
  ^^^

1 file inspected, 2 offenses detected

attr_reader を使え、と怒られます。

以下のよう修正して...

good.rb
# good
class Person
  attr_reader :first_name, :last_name

  def initialize(first_name, last_name)
    @first_name = first_name
    @last_name  = last_name
  end
end

確認すると...

$ rubocop good.rb
Inspecting 1 file
.

1 file inspected, no offenses detected

怒られなくなりました!

しかし、プロジェクトのコーディングスタイルに合わない場合もあると思います。
その場合、調整が可能で .rubocop.yml にルールの設定ができます。
また、meowcop という gem を利用しても調整可能です。

さいごに

簡単にインストールできて試せて、楽しいな〜と思う一方、まだまだ使いこなせてない気がします。
今後も頑張りたいと思います。

明日は @motaHack さんの記事です。お楽しみに。