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

この記事は NIFTY Advent Calendar 2017 の8日目の記事です。
7日目は @esu_eichi さんの [クレジットカードを使わないでlinebotを作ったときの話](https://qiita.com/esu_eichi/items/3077a6b809015c1b3d30) でした。

# はじめに
開発ではRubyを使うことが多いのですが、よく使うgemを紹介します。
ここで紹介しているのは有名なものばかりですので、この記事を読んで興味が出た方は
[RubyGems.org](https://rubygems.org/) や [The Ruby Toolbox](https://www.ruby-toolbox.com/) で探してみるといいでしょう。

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

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

```shell-session
$ pry
pry(main)>
```

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

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

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

```ruby
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)や、メソッドが確認できます

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

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

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

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

```ruby
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` で内容を確認できます

```ruby
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` コマンドでファイルの編集ができます(エディタが起動)

```ruby
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
様々なダミーデータを作成できるライブラリです。
サンプルやテストでデータを用意するときに重宝します。


```ruby
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 #=> "清水"
```

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

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

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


## ReFe2
日本語ドキュメントで有名な「[るりま](https://docs.ruby-lang.org/ja/search/)」を端末で見ることができます。
いちいちブラウザを開く必要がありません。
以下のようインストールします。

```shell-session
$ gem install refe2
$ bitclust setup
```

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

```shell-session
$ 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]]
```

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

```shell-session
$ refe get_response
```

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

```shell-session
$ refe String | less
```

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

## Rubocop
[The Ruby Style Guide](https://github.com/bbatsov/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` コマンドを実行すると...

```shell-session
$ 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
```

確認すると...

```shell-session
$ rubocop good.rb
Inspecting 1 file
.

1 file inspected, no offenses detected
```

怒られなくなりました！

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


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

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