GitLab API | gitlab gem で Issueの一覧を取得する
概要
gitlab gem で Issueの一覧を取得します
サンプル
require 'gitlab'
Gitlab.configure do |config|
config.endpoint = 'http://some_path/api/v3'
config.private_token = 'your token'
end
issues = Gitlab.issues # => 全プロジェクトの Issue を取得
# issues = Gitlab.issues 0 # => 0を指定しても同じ
# issues = Gitlab.issues 5 # => プロジェクトIDで絞り込み
# issues = Gitlab.issues 5, per_page: 100 # => プロジェクトIDで絞り込みつつ、1ページの取得件数を100件にする。(デフォルトは20件)
# issues = Gitlab.issues 0, per_page: 100 # => 全プロジェクトの Issue を取得しつつ、1ページの取得件数を100件にする。(デフォルトは20件)
# issues = Gitlab.issues 0, page: 2, per_page: 10 # => 全プロジェクトの Issue を取得しつつ、1ページの取得件数は10件にして2ページ目を取得する。
issue = issues[0]
puts "id = #{issue.id}"
puts "project_id = #{issue.project_id}"
puts "title = #{issue.title}"
puts "description = #{issue.description}"
puts "state = #{issue.state}"
puts "assignee.id = #{issue.assignee.id}"
puts "author.id = #{issue.author.id}"
出力
id = 1
project_id = 1
title = Issue Title
description = Issue Description
state = closed
assignee.id = 2
author.id = 2
補足
GitLab gem の APIドキュメントのサンプルコードには下記のようにある。
Gitlab.issues
Gitlab.issues(5)
Gitlab.issues(:per_page => 40)
しかし、第1引数・第2引数ともにオプショナルになっているため
issues(project = nil, options = {})
第2引数のみを指定したつもりでも、第1引数として扱われるため
per_page のみを設定した設定例を試すと下記のエラーが発生する
`issues': undefined method `to_i' for {:per_page=>40}:Hash (NoMethodError)
一度別件でプルリクを投げたのですが、的外れのものを送ってしまい、
お手間を取らせてしまったので今回は様子見してみます。
以下、検証コード
require 'tbpgr_utils'
def some_method(first = nil, options = {})
puts
bulk_puts_eval binding, <<-EOS
first.class
first
options.class
EOS
end
some_method
some_method(5) # => 想定通り first として扱われる
some_method(per_page: 40) # => options として扱って欲しかったが first として扱われる
__END__
下記はTbpgrUtils gemの機能
bulk_puts_eval
https://rubygems.org/gems/tbpgr_utils
https://github.com/tbpgr/tbpgr_utils
検証コード出力
first.class # => NilClass
first # => nil
options.class # => Hash
first.class # => Fixnum
first # => 5
options.class # => Hash
first.class # => Hash
first # => {:per_page=>40}
options.class # => Hash
[Finished in 1.0s]
直すなら
公開APIにつき、インターフェースは変えられない。と言う前提を元に直す場合にどう直すか?
APIドキュメントのみを直す
無難ですね。
シグネチャに影響を与えずに値を引数をノーマライズする
# 元のコード
# def issues(project = nil, options = {})
# if project.to_i.zero?
# get("/issues", :query => options)
# else
# get("/projects/#{project}/issues", :query => options)
# end
# end
def issues_fix(project = nil, options = {})
# 特殊ケースのnormalize。第1引数がHashになっていたら、optionsのみを指定したものとして扱う
if project.is_a?(Hash)
project = nil
options = project
end
if project.to_i.zero?
get("/issues", :query => options)
else
get("/projects/#{project}/issues", :query => options)
end
end
とかぐらいが選択肢だろうか?
参照
GitLab gem RubyGems
https://rubygems.org/gems/gitlabGitLab gem GitHub
https://github.com/NARKOZ/gitlab