octokit.rbを使って、githubの情報を見てみた

octokit.rb とは

Ruby toolkit for the GitHub API.

rubyからGithub APIを使う仕組みを提供してくれます。


自分のGithub戦闘力(戦闘力54..)を測った際に興味が湧いたので、いじってみました。

■使用例) ユーザのリポジトリの情報を取得、出力する

github_scouter/github_scouter.rb at master · eiel/github_scouter · GitHub
を参考にして書いてみました。

事前準備

対象環境にoctokitをインストールします。

gem install octokit

コード

require 'octokit'

# github user name
@name = "kazuhirosaji"

options = {
  auto_paginate: true,
  access_token: nil, # 必要に応じて入力する
}

# Clientオブジェクトを生成
@client = Octokit::Client.new(options)

# Repositories情報を取得
repos = @client.repositories(@name)

# リポジトリ情報の出力
repos.each do |repo|
  puts "name: #{repo.name}, language: #{repo.language}"
  puts "url: #{repo.url}"
# puts "repository info = #{repo.attrs}"
  puts ""
end

これで、kazuhirosajiアカウントが持っているリポジトリの名前、使用言語と、URLの一覧が表示されます。

■repositories()で取得したデータについて

上記コードの

repos = @client.repositories(@name)

にて、reposにはリポジトリの情報配列が入ります。


Octokitのドキュメントによるとrepositories()は

- (Array<Sawyer::Resource>) repositories(user = nil, options = {}) 
(also: #list_repositories, #list_repos, #repos)
List user repositories.

となっており、配列の中身は "Sawyer::Resource" クラスのオブジェクトが入っています。この"Sawyer::Resource"はユーザ情報等を取得した際にも使用されているようです。

取得したreposにはどんなデータが入っているか?

ここからが今回悩んだポイント。url(リポジトリのURL)やlanguage(リポジトリの言語情報)の他には何が入っているのでしょうか?Octokitのドキュメントを見ただけではわからず、、ちょっと調べてみたのでまとめます。

結論

先に結論から。GitHub API v3に対象データの情報もまとめられていました。
Repositoriesの情報はこちらからurl, language情報の他にfork数等も取得できることがわかります。ちなみに、Usersの情報だったらこちらから。

Github APIページを見つけるまでの話

以下はGithub APIのページに情報があることに気づくまでの四苦八苦の話。

先に書いた通り、配列の中身は"Sawyer::Resource"オブジェクトとなっているようなのでSawyer::Rsourceのソースを覗いてみました。
。。。よくわかりませんでしたが、Class Resourceの中に、

attr_reader :attrs

と記載があったので、こちらが属性一覧に違いない!使ってみたところ、url、languageを含めたデータの中身の一覧を見れました。先の例のコードのrepos.each の箇所を変更することで、repoの属性一覧を閲覧できます。

repos.each do |repo|
  puts "name: #{repo.name}, language: #{repo.language}"
  puts "url: #{repo.url}"
  puts "repository info = #{repo.attrs}"  # 有効にする!
  puts ""
end

実行結果(一部抜粋)

.
.
url: https://api.github.com/repos/kazuhirosaji/testapp
repository info = {:id=>12173584, :name=>"testapp", :full_name=>"kazuhirosaji/testapp", :owner=>{:login=>"kazuhirosaji"....

さらにOctokit内で、Sawyerを生成している箇所を調べたところ、どうやらjson形式で受けとったデータをSawyerオブジェクトに格納しているようであることがわかり、ようやく、Github APIに欲しい情報があることに気づけました。


情報の見方はわかったので、次はoctokit使って何かおもしろいもの作りたいなと思います。