Básicamente, estoy usando octokit tratando de agregar un conjunto particular de problemas de GitHub, según su número de problema, a una lista de problemas.
El resumen del código es similar a este:
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 Pero parece que tengo que usar el intermedio my_array , ya que falla inmediatamente al ingresar a la matriz @issues .
Retirarse
De esta manera también parece muy ineficiente, ya que parezco hacer una solicitud para cada elemento, en lugar de buscarlos todos al mismo tiempo y luego seleccionar los que se necesitan. Además, también selecciona solicitudes de extracción , lo que no se desea. (*Porque las relaciones públicas también son problemas en GH).
A menudo veo el iterador con este aspecto:
@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 endPero tampoco puedo hacer que funcione.
¿Cómo puedo insertar () cada problema en la matriz @issues inmediatamente?
(¿Y cómo puedo hacerlo de manera más eficiente?)
La inserción de elementos en la matriz @issues fallará porque no está inicializada ( @issues = [] ).
Después de echar un vistazo a la documentación de octokit tienes 2 posibilidades. Desafortunadamente, no puede consultar varios problemas por sus números con una sola solicitud.
Puedes hacer:
@issues = [1,2,3].map{ |issue_number| client.issue(REPO, issue_number, state: 'all') } .reject(&:pull_request)o:
@issues = client.issues(REPO).select{ |issue| [1,2,3].include?(issue.number) } .reject(&:pull_request)Realmente depende de la cantidad de problemas en el repositorio y la cantidad de números de problemas que desea consultar. Si realmente solo está consultando 3 números de problemas, iría con el primer enfoque. De lo contrario, me quedaría con lo último.
Cuando se trabaja con operaciones costosas (como hacer llamadas a una API) también es útil crear un enumerador perezoso:
[1,2,3].lazy.map{ |issue_number| client.issue(REPO, issue_number, state: 'all') }Esto evitará que la matriz se construya de inmediato y si solo desea los primeros n elementos, los problemas restantes no se eliminarán.
También tenga en cuenta que al usar el último enfoque, deberá pasar por las diferentes páginas o deshabilitar la paginación.