Thor と Qiita API を使用して Qiita コマンドが使える gem を作る

かなり [ここ](http://qiita.com/sawanoboly/items/ede7715c605e5822ad22) を参考にさせてもらいましたが、メモとして記載

# gem プロジェクトの作成

* 以下のコマンドを入力すると "qiita_cmd" という名前の gem を作るためのリポジトリが作成される

```bash
$ bundle gem qiita_cmd

# 上記コマンド実行後にできるツリー構成
.
├── Gemfile
├── LICENSE.txt
├── README.md
├── Rakefile
├── lib
│   ├── qiita_cmd
│   │   └── version.rb
│   └── qiita_cmd.rb
└── qiita_cmd.gemspec
```

* qiita_cmd.gemspec を開き、今回必要となる gem ファイルを追記するための編集をおこなう
    * 今回追加する gem は Thor, json, faraday の 3 つ

```rb:qiita_cmd.gemspec
# coding: utf-8
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'qiita_cmd/version'

Gem::Specification.new do |spec|
  spec.name          = "qiita_cmd"
  spec.version       = QiitaCmd::VERSION
  spec.authors       = ["Wataru.Kasahara"]
  spec.email         = ["xxxx@gmail.com"]
  spec.summary       = %q{TODO: Write a short summary. Required.}
  spec.description   = %q{TODO: Write a longer description. Optional.}
  spec.homepage      = ""
  spec.license       = "MIT"

# インデックスにキャッシュされているファイル一覧
  spec.files         = `git ls-files -z`.split("\x0")
# spec.files の中で bin/ 下にあるファイルを実行コマンドとする
  spec.executables   = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
  spec.test_files    = spec.files.grep(%r{^(test|spec|features)/})
# Gem パッケージを使用する際に require するファイルのあるディレクトリを指定
  spec.require_paths = ["lib"]

  spec.add_development_dependency "bundler", "~> 1.5"
  spec.add_development_dependency "rake"

########## 今回の実装用に追加
  spec.add_runtime_dependency "faraday"
  spec.add_runtime_dependency "json"
  spec.add_runtime_dependency "thor"
##########
end
```

# 実行コマンドを作る
bin/qiita_cmd

```rb:qiita_cmd
puts "Hello, QiitaCmd"
```

# 動かしてみる

```bash
$ rake -vT
$ rake build
$ sudo gem install pkg/qiita_cmd-0.0.1.gem 
$ bundle install
$ bundle exec qiita_cmd
```

* bin/qiita_cmd が実行され、下記の表示される

```
Hello, QiitaCmd
```

# ユーザ情報を取得するコマンドを作成
## get_user_info

### input
* USERNAME

## 編集ファイル
Qiita API のドキュメントは[こちら](https://qiita.com/docs)

* 今回は Username を指定することで、指定した User の情報を表示するコマンドを実装

```rb:bin/qiita_cmd
require 'qiita_cmd'
QiitaCmd::Command.start
```

```rb:lib/qiita_cmd.rb
require "qiita_cmd/version"
require "qiita_cmd/command"

module QiitaCmd
  # Your code goes here...
end
```

## 新規作成ファイル
```rb:lib/qiita_cmd/command.rb
require "qiita_cmd"
require "thor"
require "qiita_cmd/command/get_user_info"

module QiitaCmd
  class Command < Thor
  end
end
```

```rb:lib/qiita_cmd/command/get_user_info.rb
require "qiita_cmd/command"
require 'json'
require 'faraday'

module QiitaCmd
  class Command < Thor
    desc "get_user_info USERNAME", "get_user_info of USERNAME"
    def get_user_info(username)
      conn = Faraday::Connection.new(:url => 'https://qiita.com') do |builder|
        builder.adapter Faraday.default_adapter
      end

      puts "-------------------------------------"
      puts "#{username} の基本情報取得"
      response = conn.get do |req|
        req.url "/api/v1/users/#{username}"
      end
      parsed_output_data = JSON.parse(response.body)
      puts "------------------------------"
      puts parsed_output_data["url_name"]
      puts parsed_output_data["description"]
      puts "------------------------------"
    end
  end
end
```

## 実行
```bash
# 下記のように実行すると qiita_cmd として使用できるコマンド一覧が表示される

$ bundle exec qiita_cmd
Commands:
  qiita_cmd get_user_info USERNAME  # get_user_info of USERNAME
  qiita_cmd help [COMMAND]          # Describe available commands or one specific command
```

```bash
# get_user_info コマンドを指定して実行すると
# lib/qiita_cmd/command/get_user_info.rb で実装したコマンドが実行される

$ bundle exec qiita_cmd get_user_info kasaharu
-------------------------------------
kasaharu の基本情報取得
------------------------------
kasaharu
ソフトウェアエンジニア。

Android / Ruby / RoR / DevOps
------------------------------
```

# 参考ページ
* [Thor](http://whatisthor.com/)
* [Qiita API document](https://qiita.com/docs#5)
* [君がOpsでもRubyで書いたライブラリはGemで配ろう](http://qiita.com/sawanoboly/items/ede7715c605e5822ad22)


* [完成したソース](https://github.com/kasaharu/qiita_cmd)