Как я могу получить информацию только для определенного вида деятельности из API Pivotal Tracker?

Я получаю информацию JSON из API Pivotal Tracker, и мне нужно получить определенную информацию вместо всех необработанных данных. Для этого я использовал JSON.parse() преобразовать JSON в массив хэшей Ruby.

Теперь мне нужно перебрать этот массив и вернуть только соответствующие хеши.

Например, я просто хочу вернуть primary_resources хэш, который имеет вложенный хеш:

"story_type" => "feature"

Для этого я написал этот код (response.body это данные, возвращаемые из запроса GET):

@data = response.body
parsed = JSON.parse(@data)
puts parsed['primary_resources']['story_type']['feature']

Когда я запускаю скрипт, я получаю эту ошибку:

no implicit conversion of String into Integer (TypeError)

Кажется, что он перебирает массив хэшей и ищет целое число в массиве (например, array[3] или же array[0]), но это мне не поможет. Мне нужно вернуть все хэши, которые имеют вложенный хеш :kind => story в хеше первичных ресурсов.

Я также попытался сделать это:

parsed.each do |entry|
  puts entry['primary_resources']['story_Type']['feature']
end

и я получил ту же ошибку.

Вот мой полный код:

require 'json'
require 'net/http'
require 'open-uri'
require 'openssl'
require 'active_support'

prompt = '> '
puts "What is the id of the Project you want to get data from?"
print prompt
project_id = STDIN.gets.chomp()
puts "What is the beginning date you want to return from? ex: 2014-07-02"
print prompt
date1 = STDIN.gets.chomp()
puts "What is the end date you want to return from? ex: 2014-07-16"
print prompt
date2 = STDIN.gets.chomp()



def scope(project_id, date1, date2)
  uri = URI.parse("https://www.pivotaltracker.com/services/v5/projects/#{project_id}/activity?occurred_after=#{date1}T01:00:15Z&occurred_before=#{date2}T01:00:15Z&fields=primary_resources")
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  request = Net::HTTP::Get.new(uri.request_uri)
  request.add_field("X-TrackerToken", "*****************")
  response = http.request(request)
  @data = response.body
  parsed = JSON.parse(@data)
  puts parsed['primary_resources']['story_type']['feature']
  # parsed.each do |entry|
    # puts entry['primary_resources']['kind']['story']
  # end

  # puts parsed['primary_resources'].select { |r| r['story_type'].eql? 'feature' }
end

scope(project_id, date1, date2)

Вот часть ответа JSON без разбора (полный ответ слишком длинный, и на самом деле это тот же ответ, что и для 15 других пользовательских историй):

What is the id of the Project you want to get data from?
> 961142
What is the beginning date you want to return from? ex: 2014-07-02
> 2014-07-02
What is the end date you want to return from? ex: 2014-07-16
> 2014-07-03
[
   {
    "primary_resources": [
      {
        "kind": "story",
        "id": 74313670,
        "name": "User can make an image fit inside the grid when viewing image detail and save it to case template. BUILD 146",
        "story_type": "bug",
        "url": "https://www.pivotaltracker.com/story/show/74313670"
      }
    ],
    "guid": "961142_3419",
    "project_version": 3419
  },

Вот часть ответа JSON после анализа (показ первого рассказа по той же причине, что и выше):

What is the id of the Project you want to get data from?
> 961142
What is the beginning date you want to return from? ex: 2014-07-02
> 2014-07-02
What is the end date you want to return from? ex: 2014-07-16
> 2014-07-03
{"primary_resources"=>[{"kind"=>"story", "id"=>74313670, "name"=>"User can make an image fit inside the grid when viewing image detail and save it to case template. BUILD 146", "story_type"=>"bug", "url"=>"https://www.pivotaltracker.com/story/show/74313670"}], "guid"=>"961142_3419", "project_version"=>3419}

Как я могу перебрать этот массив хэшей и вернуть только те из "story_type"=>"feature"?

1 ответ

Решение

Таким образом, согласно документации API, ваш код получает массив действий (или "ресурсов типа действия"), каждый из которых может содержать подмассив (в "primary_resources") ресурсов, на которые он влияет.

Я предполагаю, что вы хотите получить в качестве выходных данных из вашей программы массив действий, относящихся к истории типа "функция", а не массив самих затронутых историй. Если это правда, попробуйте это:

feature_story_activities = parsed.select do |activity|
  activity.has_key?('primary_resources') &&
    activity['primary_resources'].find do |resource|
    resource['story_type'].eql?('feature')
  end
end

puts feature_story_activities

Это места в feature_story_activities все виды деятельности, которые

  • Укажите список ресурсов, на которые они влияют, и

  • Влияет как минимум на одну историю типа объекта.

Другие вопросы по тегам