如何使用 Ruby 在 octocat 中获取选定的 GitHub 问题列表?
How to get a selected list of GitHub issues in octocat with Ruby?
基本上,我正在使用 octokit 尝试根据 问题编号 添加一组特定的 GitHub 问题到问题列表。
代码总结类似这样:
require 'octokit'
client = Octokit::Client.new(access_token: ENV['GITHUB_OAUTH_TOKEN'], accept: 'application/vnd.github.v3+json')
REPO = 'USERNAME/SOME-GH-REPO'.freeze
#client.issue(REPO, 1) # Returns {}
#client.issues(REPO, :state => 'all') # Returns [{}]
def pull_source_issues
@client.auto_paginate = true
ilist =[1,2,3]
my_array = []
ilist.each do |i|
puts "Adding issue [#]: #{i} \t from: #{REPO}\n"
my_array.push(@client.issue(REPO , "#{i}", :state => 'all')) # works
#@issues.push(@client.issue(REPO , "#{i}", :state => 'all')) # fails!
end
@issues = my_array
puts "Found #{issues.size} issues."
end
但似乎我有使用中间my_array
,因为立即推入@issues
数组,失败了。
缺点
这种方式似乎也很低效,因为我似乎对每个项目都提出了请求,而不是同时获取所有项目,然后 select 需要的项目。此外,它还 select 用于 拉取请求 ,这是不想要的。 (*因为 PR 在 GH 中也是问题。)
我经常看到这样的迭代器:
@issues = @client.issues(@source_repo, :state => 'all')
@issues.each do |source_issue|
print "Processing issue: #{source_issue.number} (#{n}/#{issues.size})\r"
if !source_issue.key?(:pull_request) || source_issue.pull_request.empty?
# Add each issue to (new?) @issues here
end
end
但我也无法让它工作。
我怎样才能 push() 每个问题立即进入 @issues
数组?
(我怎样才能更有效地做到这一点?)
推送@issues 数组中的元素将失败,因为它未初始化 (@issues = []
)。
查看 octokit 文档后,您有两种可能性。
遗憾的是,您不能通过一个请求按编号查询多个问题。
您可以:
@issues = [1,2,3].map{ |issue_number| client.issue(REPO, issue_number, state: 'all') }
.reject(&:pull_request)
或:
@issues = client.issues(REPO).select{ |issue| [1,2,3].include?(issue.number) }
.reject(&:pull_request)
这实际上取决于 repo 中的问题数量和您要查询的问题编号的数量。如果您真的只是查询 3 个问题编号,我会采用第一种方法。否则我会坚持后者。
在处理昂贵的操作时(例如调用 API),创建惰性枚举器也很有用:
[1,2,3].lazy.map{ |issue_number| client.issue(REPO, issue_number, state: 'all') }
这将阻止立即构建数组,如果您只想要前 n 个元素,则不会提取剩余的问题。
另请注意,使用后一种方法时,您需要经历不同的 pages 或禁用分页。
基本上,我正在使用 octokit 尝试根据 问题编号 添加一组特定的 GitHub 问题到问题列表。
代码总结类似这样:
require 'octokit'
client = Octokit::Client.new(access_token: ENV['GITHUB_OAUTH_TOKEN'], accept: 'application/vnd.github.v3+json')
REPO = 'USERNAME/SOME-GH-REPO'.freeze
#client.issue(REPO, 1) # Returns {}
#client.issues(REPO, :state => 'all') # Returns [{}]
def pull_source_issues
@client.auto_paginate = true
ilist =[1,2,3]
my_array = []
ilist.each do |i|
puts "Adding issue [#]: #{i} \t from: #{REPO}\n"
my_array.push(@client.issue(REPO , "#{i}", :state => 'all')) # works
#@issues.push(@client.issue(REPO , "#{i}", :state => 'all')) # fails!
end
@issues = my_array
puts "Found #{issues.size} issues."
end
但似乎我有使用中间my_array
,因为立即推入@issues
数组,失败了。
缺点
这种方式似乎也很低效,因为我似乎对每个项目都提出了请求,而不是同时获取所有项目,然后 select 需要的项目。此外,它还 select 用于 拉取请求 ,这是不想要的。 (*因为 PR 在 GH 中也是问题。)
我经常看到这样的迭代器:
@issues = @client.issues(@source_repo, :state => 'all')
@issues.each do |source_issue|
print "Processing issue: #{source_issue.number} (#{n}/#{issues.size})\r"
if !source_issue.key?(:pull_request) || source_issue.pull_request.empty?
# Add each issue to (new?) @issues here
end
end
但我也无法让它工作。
我怎样才能 push() 每个问题立即进入 @issues
数组?
(我怎样才能更有效地做到这一点?)
推送@issues 数组中的元素将失败,因为它未初始化 (@issues = []
)。
查看 octokit 文档后,您有两种可能性。 遗憾的是,您不能通过一个请求按编号查询多个问题。
您可以:
@issues = [1,2,3].map{ |issue_number| client.issue(REPO, issue_number, state: 'all') }
.reject(&:pull_request)
或:
@issues = client.issues(REPO).select{ |issue| [1,2,3].include?(issue.number) }
.reject(&:pull_request)
这实际上取决于 repo 中的问题数量和您要查询的问题编号的数量。如果您真的只是查询 3 个问题编号,我会采用第一种方法。否则我会坚持后者。
在处理昂贵的操作时(例如调用 API),创建惰性枚举器也很有用:
[1,2,3].lazy.map{ |issue_number| client.issue(REPO, issue_number, state: 'all') }
这将阻止立即构建数组,如果您只想要前 n 个元素,则不会提取剩余的问题。
另请注意,使用后一种方法时,您需要经历不同的 pages 或禁用分页。