如何使用 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 或禁用分页。