LoginSignup
8
9

More than 5 years have passed since last update.

GitLab API | gitlab gem で Issueの一覧を取得する

Posted at

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

とかぐらいが選択肢だろうか?

参照

8
9
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
8
9