LoginSignup
16
16

More than 5 years have passed since last update.

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

Posted at

かなり ここ を参考にさせてもらいましたが、メモとして記載

gem プロジェクトの作成

  • 以下のコマンドを入力すると "qiita_cmd" という名前の gem を作るためのリポジトリが作成される
$ 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 つ
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

qiita_cmd
puts "Hello, QiitaCmd"

動かしてみる

$ 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 のドキュメントはこちら

  • 今回は Username を指定することで、指定した User の情報を表示するコマンドを実装
bin/qiita_cmd
require 'qiita_cmd'
QiitaCmd::Command.start
lib/qiita_cmd.rb
require "qiita_cmd/version"
require "qiita_cmd/command"

module QiitaCmd
  # Your code goes here...
end

新規作成ファイル

lib/qiita_cmd/command.rb
require "qiita_cmd"
require "thor"
require "qiita_cmd/command/get_user_info"

module QiitaCmd
  class Command < Thor
  end
end
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

実行

# 下記のように実行すると 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
# 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
------------------------------

参考ページ

16
16
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
16
16