代码之家  ›  专栏  ›  技术社区  ›  not2qubit

如何使用Ruby在octocat中获得GitHub问题的选定列表?

  •  0
  • not2qubit  · 技术社区  · 4 年前

    基本上我正在使用 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 数组立即失败。

    缺点

    这种方式似乎也非常低效,因为我似乎对每个项目都提出了请求,而不是同时获取所有项目,然后选择所需的项目。此外,它还选择 pull请求 ,这是不需要的。(*因为公关也是 问题 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() 每个问题 @问题 立即数组?
    (我怎样才能更有效地做到这一点?)

    0 回复  |  直到 4 年前
        1
  •  2
  •   dario    4 年前

    在@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)
    

    这实际上取决于回购中的发行数量和您想要查询的发行数量。如果你真的只是查询3个问题编号,我会选择第一种方法。否则我会坚持后者。

    当使用昂贵的操作(例如对API进行调用)时,创建惰性枚举器也很有用:

    [1,2,3].lazy.map{ |issue_number| client.issue(REPO, issue_number, state: 'all') }
    

    这将阻止数组立即构建,如果您只想要前n个元素,则不会解决剩余的问题。

    还要注意,当使用后一种方法时,你需要经历不同的 pages 或禁用分页。

    推荐文章