tracker_api 0.2.9 → 0.2.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/README.md +1 -0
  4. data/lib/core_ext/object/blank.rb +132 -0
  5. data/lib/tracker_api/client.rb +1 -1
  6. data/lib/tracker_api/endpoints/comments.rb +1 -1
  7. data/lib/tracker_api/endpoints/epic.rb +2 -2
  8. data/lib/tracker_api/endpoints/labels.rb +26 -0
  9. data/lib/tracker_api/endpoints/memberships.rb +6 -0
  10. data/lib/tracker_api/endpoints/story.rb +4 -4
  11. data/lib/tracker_api/endpoints/task.rb +16 -0
  12. data/lib/tracker_api/endpoints/tasks.rb +1 -1
  13. data/lib/tracker_api/resources/account.rb +1 -2
  14. data/lib/tracker_api/resources/activity.rb +6 -4
  15. data/lib/tracker_api/resources/base.rb +5 -60
  16. data/lib/tracker_api/resources/change.rb +1 -2
  17. data/lib/tracker_api/resources/comment.rb +1 -2
  18. data/lib/tracker_api/resources/epic.rb +1 -2
  19. data/lib/tracker_api/resources/iteration.rb +2 -0
  20. data/lib/tracker_api/resources/label.rb +8 -2
  21. data/lib/tracker_api/resources/me.rb +1 -2
  22. data/lib/tracker_api/resources/membership_summary.rb +1 -2
  23. data/lib/tracker_api/resources/notification.rb +1 -2
  24. data/lib/tracker_api/resources/person.rb +1 -2
  25. data/lib/tracker_api/resources/primary_resource.rb +1 -2
  26. data/lib/tracker_api/resources/project.rb +45 -8
  27. data/lib/tracker_api/resources/project_membership.rb +1 -2
  28. data/lib/tracker_api/resources/story.rb +36 -10
  29. data/lib/tracker_api/resources/task.rb +1 -2
  30. data/lib/tracker_api/version.rb +1 -1
  31. data/lib/tracker_api.rb +8 -2
  32. data/test/project_test.rb +29 -1
  33. data/test/story_test.rb +56 -1
  34. data/test/vcr/cassettes/client_done_iterations_with_pagination.json +1 -1
  35. data/test/vcr/cassettes/client_get_all_stories_with_pagination.json +1 -1
  36. data/test/vcr/cassettes/client_get_limited_stories_with_no_pagination.json +1 -1
  37. data/test/vcr/cassettes/client_get_single_story_by_story_id.json +1 -1
  38. data/test/vcr/cassettes/create_story.json +1 -1
  39. data/test/vcr/cassettes/create_story_with_lengthy_params.json +1 -1
  40. data/test/vcr/cassettes/create_task.json +1 -0
  41. data/test/vcr/cassettes/get_all_projects.json +1 -1
  42. data/test/vcr/cassettes/get_another_story.json +1 -0
  43. data/test/vcr/cassettes/get_current_iteration.json +1 -1
  44. data/test/vcr/cassettes/get_done_iterations.json +1 -1
  45. data/test/vcr/cassettes/get_epics.json +1 -1
  46. data/test/vcr/cassettes/get_iteration_by_number.json +1 -1
  47. data/test/vcr/cassettes/get_labels.json +1 -0
  48. data/test/vcr/cassettes/get_me.json +1 -46
  49. data/test/vcr/cassettes/get_my_activities.json +1 -1
  50. data/test/vcr/cassettes/get_project.json +1 -1
  51. data/test/vcr/cassettes/get_project_activity.json +1 -1
  52. data/test/vcr/cassettes/get_project_with_epics.json +1 -1
  53. data/test/vcr/cassettes/get_project_with_labels.json +1 -0
  54. data/test/vcr/cassettes/get_story.json +1 -1
  55. data/test/vcr/cassettes/get_story_activity.json +1 -1
  56. data/test/vcr/cassettes/get_story_with_tasks.json +1 -0
  57. data/test/vcr/cassettes/get_tasks.json +1 -1
  58. data/test/vcr/cassettes/get_tasks_for_story.json +1 -0
  59. data/test/vcr/cassettes/get_tasks_when_stories_filtered.json +1 -1
  60. data/test/vcr/cassettes/get_unscheduled_stories.json +1 -1
  61. data/test/vcr/cassettes/get_unscheduled_story.json +1 -1
  62. data/test/vcr/cassettes/save_story.json +1 -1
  63. data/test/vcr/cassettes/save_story_with_multiple_changes.json +1 -1
  64. data/test/vcr/cassettes/save_story_with_new_label.json +1 -0
  65. data/test/vcr/cassettes/update_story_to_create_activity.json +1 -1
  66. data/tracker_api.gemspec +3 -2
  67. metadata +35 -6
  68. data/test/vcr/cassettes/get_activity.json +0 -148
@@ -1,13 +1,13 @@
1
1
  module TrackerApi
2
2
  module Resources
3
3
  class Story
4
- include TrackerApi::Resources::Base
4
+ include Resources::Base
5
5
 
6
6
  attribute :client
7
7
 
8
8
  attribute :accepted_at, DateTime
9
9
  attribute :comment_ids, Array[Integer]
10
- attribute :comments, Array[TrackerApi::Resources::Comment]
10
+ attribute :comments, Array[Resources::Comment]
11
11
  attribute :created_at, DateTime
12
12
  attribute :current_state, String # (accepted, delivered, finished, started, rejected, planned, unstarted, unscheduled)
13
13
  attribute :deadline, DateTime
@@ -18,20 +18,40 @@ module TrackerApi
18
18
  attribute :integration_id, Integer
19
19
  attribute :kind, String
20
20
  attribute :label_ids, Array[Integer]
21
- attribute :labels, Array[TrackerApi::Resources::Label]
21
+ attribute :labels, Array[Resources::Label]
22
22
  attribute :name, String
23
23
  attribute :owned_by_id, Integer # deprecated!
24
24
  attribute :owner_ids, Array[Integer]
25
- attribute :owners, Array[TrackerApi::Resources::Person]
25
+ attribute :owners, Array[Resources::Person]
26
26
  attribute :planned_iteration_number, Integer
27
27
  attribute :project_id, Integer
28
+ attribute :requested_by, Person
28
29
  attribute :requested_by_id, Integer
29
30
  attribute :story_type, String # (feature, bug, chore, release)
30
31
  attribute :task_ids, Array[Integer]
31
- attribute :tasks, Array[TrackerApi::Resources::Task]
32
+ attribute :tasks, Array[Resources::Task]
32
33
  attribute :updated_at, DateTime
33
34
  attribute :url, String
34
35
 
36
+
37
+ class UpdateRepresenter < Representable::Decorator
38
+ include Representable::JSON
39
+
40
+ property :follower_ids
41
+ property :name
42
+ property :description
43
+ property :story_type
44
+ property :current_state
45
+ property :estimate
46
+ property :accepted_at
47
+ property :deadline
48
+ property :requested_by_id
49
+ property :owner_ids
50
+ collection :labels, class: Resources::Label, decorator: Resources::Label::UpdateRepresenter, render_empty: true
51
+ property :integration_id
52
+ property :external_id
53
+ end
54
+
35
55
  # @return [String] Comma separated list of labels.
36
56
  def label_list
37
57
  @label_list ||= labels.collect(&:name).join(',')
@@ -50,30 +70,36 @@ module TrackerApi
50
70
  # @param [Hash] params
51
71
  # @return [Array[Comment]]
52
72
  def comments(params = {})
53
- if @comments.any?
73
+ if @comments && @comments.any?
54
74
  @comments
55
75
  else
56
76
  @comments = Endpoints::Comments.new(client).get(project_id, id, params)
57
77
  end
58
78
  end
59
79
 
80
+ # Provides a list of all the tasks on the story.
81
+ #
60
82
  # @param [Hash] params
61
83
  # @return [Array[Task]]
62
84
  def tasks(params = {})
63
- if @tasks.any?
85
+ if @tasks && @tasks.any?
64
86
  @tasks
65
87
  else
66
88
  @tasks = Endpoints::Tasks.new(client).get(project_id, id, params)
67
89
  end
68
90
  end
69
91
 
92
+ # @param [Hash] params attributes to create the task with
93
+ # @return [Task] newly created Task
94
+ def create_task(params)
95
+ Endpoints::Task.new(client).create(project_id, id, params)
96
+ end
97
+
70
98
  # Save changes to an existing Story.
71
99
  def save
72
100
  raise ArgumentError, 'Can not update a story with an unknown project_id.' if project_id.nil?
73
101
 
74
- Endpoints::Story.new(client).update(self, just_changes)
75
-
76
- changes_applied
102
+ Endpoints::Story.new(client).update(self, UpdateRepresenter.new(self))
77
103
  end
78
104
  end
79
105
  end
@@ -1,9 +1,8 @@
1
1
  module TrackerApi
2
2
  module Resources
3
3
  class Task
4
- include Virtus.model
4
+ include Resources::Base
5
5
 
6
- attribute :id, Integer
7
6
  attribute :story_id, Integer
8
7
  attribute :description, String
9
8
  attribute :complete, Boolean
@@ -1,3 +1,3 @@
1
1
  module TrackerApi
2
- VERSION = '0.2.9'
2
+ VERSION = '0.2.10'
3
3
  end
data/lib/tracker_api.rb CHANGED
@@ -4,14 +4,18 @@ require 'tracker_api/version'
4
4
  require 'virtus'
5
5
  require 'faraday'
6
6
  require 'faraday_middleware'
7
- require 'active_support'
8
- require 'active_support/core_ext'
7
+ require 'core_ext/object/blank'
8
+ require 'equalizer'
9
+ require 'representable/json'
10
+ require 'oj'
9
11
 
10
12
  # stdlib
11
13
  require 'addressable/uri'
12
14
  require 'forwardable'
13
15
  require 'logger'
14
16
 
17
+ Oj.default_options = {:mode => :compat }
18
+
15
19
  module TrackerApi
16
20
  autoload :Error, 'tracker_api/error'
17
21
  autoload :Client, 'tracker_api/client'
@@ -26,6 +30,7 @@ module TrackerApi
26
30
  autoload :Epic, 'tracker_api/endpoints/epic'
27
31
  autoload :Epics, 'tracker_api/endpoints/epics'
28
32
  autoload :Iterations, 'tracker_api/endpoints/iterations'
33
+ autoload :Labels, 'tracker_api/endpoints/labels'
29
34
  autoload :Me, 'tracker_api/endpoints/me'
30
35
  autoload :Memberships, 'tracker_api/endpoints/memberships'
31
36
  autoload :Notifications, 'tracker_api/endpoints/notifications'
@@ -33,6 +38,7 @@ module TrackerApi
33
38
  autoload :Projects, 'tracker_api/endpoints/projects'
34
39
  autoload :Stories, 'tracker_api/endpoints/stories'
35
40
  autoload :Story, 'tracker_api/endpoints/story'
41
+ autoload :Task, 'tracker_api/endpoints/task'
36
42
  autoload :Tasks, 'tracker_api/endpoints/tasks'
37
43
  autoload :Comments, 'tracker_api/endpoints/comments'
38
44
  end
data/test/project_test.rb CHANGED
@@ -35,6 +35,34 @@ describe TrackerApi::Resources::Project do
35
35
  end
36
36
  end
37
37
 
38
+ describe '.labels' do
39
+ describe 'with eager loading' do
40
+ let(:project_with_labels) do
41
+ VCR.use_cassette('get project with labels') do
42
+ client.project(project_id, fields: ':default,labels')
43
+ end
44
+ end
45
+
46
+ it 'gets all labels for this project' do
47
+ labels = project_with_labels.labels
48
+
49
+ labels.wont_be_empty
50
+ label = labels.first
51
+ label.must_be_instance_of TrackerApi::Resources::Label
52
+ end
53
+ end
54
+
55
+ it 'gets all labels for this project' do
56
+ VCR.use_cassette('get labels', record: :new_episodes) do
57
+ labels = project.labels
58
+
59
+ labels.wont_be_empty
60
+ label = labels.first
61
+ label.must_be_instance_of TrackerApi::Resources::Label
62
+ end
63
+ end
64
+ end
65
+
38
66
  describe '.iterations' do
39
67
  it 'can get only done iterations' do
40
68
  VCR.use_cassette('get done iterations', record: :new_episodes) do
@@ -86,7 +114,7 @@ describe TrackerApi::Resources::Project do
86
114
 
87
115
  it 'requires an iteration number > 0' do
88
116
  VCR.use_cassette('get iteration by number', record: :new_episodes) do
89
- -> { project.iterations(number: 0) }.must_raise(ArgumentError, /> 0/)
117
+ -> { project.iterations(number: 0) }.must_raise(ArgumentError, /> 0/)
90
118
  -> { project.iterations(number: -1) }.must_raise(ArgumentError, /> 0/)
91
119
  end
92
120
  end
data/test/story_test.rb CHANGED
@@ -6,6 +6,7 @@ describe TrackerApi::Resources::Story do
6
6
  let(:project_id) { pt_user[:project_id] }
7
7
  let(:project) { VCR.use_cassette('get project') { client.project(project_id) } }
8
8
  let(:story_id) { '66728004' }
9
+ let(:another_story_id) { '66728000' }
9
10
  let(:story) { VCR.use_cassette('get story') { project.story(story_id) } }
10
11
 
11
12
 
@@ -34,10 +35,53 @@ describe TrackerApi::Resources::Story do
34
35
  story.description.must_equal new_desc
35
36
  end
36
37
 
38
+ it 'can add new labels to an existing story' do
39
+ new_label_name = 'super-special-label'
40
+
41
+ story.labels.map(&:name).wont_include new_label_name
42
+
43
+ new_label = TrackerApi::Resources::Label.new(name: new_label_name)
44
+ story.labels << new_label
45
+
46
+ VCR.use_cassette('save story with new label', record: :new_episodes) do
47
+ story.save
48
+ end
49
+
50
+ story.labels.wont_be_empty
51
+ story.labels.map(&:name).must_include new_label_name
52
+ end
53
+
54
+ it 'objects are equal based on id' do
55
+ story_a = story
56
+ story_b = VCR.use_cassette('get story') { project.story(story_id) }
57
+ story_c = VCR.use_cassette('get another story') { project.story(another_story_id) }
58
+
59
+ story_a.must_equal story_b
60
+ story_a.hash.must_equal story_b.hash
61
+ story_a.eql?(story_b).must_equal true
62
+ story_a.equal?(story_b).must_equal false
63
+
64
+ story_a.wont_equal story_c
65
+ story_a.hash.wont_equal story_c.hash
66
+ story_a.eql?(story_c).must_equal false
67
+ story_a.equal?(story_c).must_equal false
68
+ end
69
+
37
70
  describe '.tasks' do
71
+ it 'gets all tasks for this story with eager loading' do
72
+ VCR.use_cassette('get story with tasks', record: :new_episodes) do
73
+ tasks = project.story(story_id, fields: ':default,tasks').tasks
74
+
75
+ tasks.wont_be_empty
76
+ task = tasks.first
77
+ task.must_be_instance_of TrackerApi::Resources::Task
78
+ end
79
+ end
80
+
38
81
  it 'gets all tasks for this story' do
39
82
  VCR.use_cassette('get tasks', record: :new_episodes) do
40
- tasks = project.story(story_id).tasks
83
+ story = project.story(story_id)
84
+ tasks = VCR.use_cassette('get tasks for story') { story.tasks }
41
85
 
42
86
  tasks.wont_be_empty
43
87
  task = tasks.first
@@ -57,6 +101,17 @@ describe TrackerApi::Resources::Story do
57
101
  end
58
102
  end
59
103
  end
104
+
105
+ it 'can create task' do
106
+ VCR.use_cassette('create task') do
107
+ task = project.story(story_id).create_task(description: 'Test task')
108
+
109
+ task.must_be_instance_of TrackerApi::Resources::Task
110
+ task.id.wont_be_nil
111
+ task.id.must_be :>, 0
112
+ task.description.must_equal 'Test task'
113
+ end
114
+ end
60
115
  end
61
116
 
62
117
  describe '.activity' do
@@ -1 +1 @@
1
- {"http_interactions":[{"request":{"method":"get","uri":"https://www.pivotaltracker.com/services/v5/projects/1027488","body":{"encoding":"US-ASCII","string":""},"headers":{"User-Agent":["Ruby/2.0.0 (x86_64-darwin13.0.2; ruby) TrackerApi/0.2.1 Faraday/0.8.9"],"X-TrackerToken":["d55c3bc1f74346b843ca84ba340b29bf"]}},"response":{"status":{"code":200,"message":null},"headers":{"content-type":["application/json; charset=utf-8"],"transfer-encoding":["chunked"],"connection":["close"],"status":["200 OK"],"x-tracker-project-version":["3"],"x-ua-compatible":["IE=Edge,chrome=1"],"cache-control":["max-age=0, private, must-revalidate"],"x-request-id":["fea1c6d82465ee66e556be01724ff161"],"x-runtime":["0.065154"],"date":["Wed, 07 May 2014 04:50:06 GMT"],"x-rack-cache":["miss"],"x-powered-by":["Phusion Passenger 4.0.41"],"server":["nginx/1.6.0 + Phusion Passenger 4.0.41"],"access-control-allow-origin":["*"],"access-control-allow-credentials":["false"],"access-control-allow-methods":["GET, POST, PUT, DELETE, OPTIONS"],"access-control-allow-headers":["X-TrackerToken,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Tracker-Warn-Unless-Project-Version-Is"]},"body":{"encoding":"UTF-8","string":"{\n \"id\": 1027488,\n \"kind\": \"project\",\n \"name\": \"My Sample Project\",\n \"version\": 3,\n \"iteration_length\": 1,\n \"week_start_day\": \"Monday\",\n \"point_scale\": \"0,1,2,3\",\n \"point_scale_is_custom\": false,\n \"bugs_and_chores_are_estimatable\": false,\n \"enable_planned_mode\": false,\n \"enable_tasks\": true,\n \"time_zone\": {\n \"kind\": \"time_zone\",\n \"olson_name\": \"America/Los_Angeles\",\n \"offset\": \"-07:00\"\n },\n \"velocity_averaged_over\": 3,\n \"number_of_done_iterations_to_show\": 12,\n \"has_google_domain\": false,\n \"profile_content\": \"This is a demo project, created by Tracker, with example stories for a simple shopping web site.\",\n \"enable_incoming_emails\": true,\n \"initial_velocity\": 10,\n \"public\": false,\n \"atom_enabled\": false,\n \"start_time\": \"2014-02-10T08:00:00Z\",\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"account_id\": 621384,\n \"current_iteration_number\": 13,\n \"enable_following\": true\n}"},"http_version":null},"recorded_at":"Wed, 07 May 2014 04:50:06 GMT"},{"request":{"method":"get","uri":"https://www.pivotaltracker.com/services/v5/projects/1027488/iterations?scope=done&offset=-12&limit=5","body":{"encoding":"US-ASCII","string":""},"headers":{"User-Agent":["Ruby/2.0.0 (x86_64-darwin13.0.2; ruby) TrackerApi/0.2.1 Faraday/0.8.9"],"X-TrackerToken":["d55c3bc1f74346b843ca84ba340b29bf"]}},"response":{"status":{"code":200,"message":null},"headers":{"content-type":["application/json; charset=utf-8"],"transfer-encoding":["chunked"],"connection":["close"],"status":["200 OK"],"x-tracker-project-version":["3"],"x-tracker-pagination-total":["12"],"x-tracker-pagination-offset":["-12"],"x-tracker-pagination-limit":["5"],"x-tracker-pagination-returned":["5"],"x-ua-compatible":["IE=Edge,chrome=1"],"cache-control":["max-age=0, private, must-revalidate"],"x-request-id":["2af256a26bcee7412d3de3ec23167684"],"x-runtime":["0.258338"],"date":["Wed, 07 May 2014 04:48:53 GMT"],"x-rack-cache":["miss"],"x-powered-by":["Phusion Passenger 4.0.41"],"server":["nginx/1.6.0 + Phusion Passenger 4.0.41"],"access-control-allow-origin":["*"],"access-control-allow-credentials":["false"],"access-control-allow-methods":["GET, POST, PUT, DELETE, OPTIONS"],"access-control-allow-headers":["X-TrackerToken,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Tracker-Warn-Unless-Project-Version-Is"]},"body":{"encoding":"UTF-8","string":"[\n {\n \"kind\": \"iteration\",\n \"number\": 1,\n \"project_id\": 1027488,\n \"team_strength\": 1,\n \"stories\": [\n {\n \"kind\": \"story\",\n \"id\": 66727974,\n \"project_id\": 1027488,\n \"name\": \"Setup development environment\",\n \"description\": \"We need 2 machines set up\",\n \"story_type\": \"chore\",\n \"current_state\": \"accepted\",\n \"accepted_at\": \"2014-02-11T00:00:00Z\",\n \"requested_by_id\": 1266314,\n \"owner_ids\": [\n\n ],\n \"labels\": [\n\n ],\n \"created_at\": \"2014-02-10T00:00:00Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"url\": \"http://www.pivotaltracker.com/story/show/66727974\"\n },\n {\n \"kind\": \"story\",\n \"id\": 66727976,\n \"project_id\": 1027488,\n \"name\": \"Setup demo server\",\n \"description\": \"Should be accessible from outside the network, with basic auth\",\n \"story_type\": \"chore\",\n \"current_state\": \"accepted\",\n \"accepted_at\": \"2014-02-11T00:00:00Z\",\n \"requested_by_id\": 1266314,\n \"owner_ids\": [\n\n ],\n \"labels\": [\n {\n \"kind\": \"label\",\n \"id\": 7849078,\n \"project_id\": 1027488,\n \"name\": \"deployment\",\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\"\n }\n ],\n \"created_at\": \"2014-02-10T00:00:00Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"url\": \"http://www.pivotaltracker.com/story/show/66727976\"\n },\n {\n \"kind\": \"story\",\n \"id\": 66727978,\n \"project_id\": 1027488,\n \"name\": \"Admin should be able to login\",\n \"description\": \"Admin should be a special user type. We can create the first admin user directly in the DB, but let's encrypt the password.\",\n \"story_type\": \"feature\",\n \"current_state\": \"accepted\",\n \"estimate\": 2,\n \"accepted_at\": \"2014-02-11T00:00:00Z\",\n \"requested_by_id\": 1266314,\n \"owner_ids\": [\n\n ],\n \"labels\": [\n {\n \"kind\": \"label\",\n \"id\": 7849080,\n \"project_id\": 1027488,\n \"name\": \"admin\",\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\"\n }\n ],\n \"created_at\": \"2014-02-10T00:00:00Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"url\": \"http://www.pivotaltracker.com/story/show/66727978\"\n },\n {\n \"kind\": \"story\",\n \"id\": 66727980,\n \"project_id\": 1027488,\n \"name\": \"Admin should be able to create new product\",\n \"description\": \"Product information includes title, description, price, SKU.\",\n \"story_type\": \"feature\",\n \"current_state\": \"accepted\",\n \"estimate\": 1,\n \"accepted_at\": \"2014-02-11T00:00:00Z\",\n \"requested_by_id\": 1266314,\n \"owner_ids\": [\n\n ],\n \"labels\": [\n {\n \"kind\": \"label\",\n \"id\": 7849080,\n \"project_id\": 1027488,\n \"name\": \"admin\",\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\"\n }\n ],\n \"created_at\": \"2014-02-10T00:00:00Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"url\": \"http://www.pivotaltracker.com/story/show/66727980\"\n },\n {\n \"kind\": \"story\",\n \"id\": 66727982,\n \"project_id\": 1027488,\n \"name\": \"Admin should be able to upload product photo\",\n \"story_type\": \"feature\",\n \"current_state\": \"accepted\",\n \"estimate\": 2,\n \"accepted_at\": \"2014-02-11T00:00:00Z\",\n \"requested_by_id\": 1266314,\n \"owner_ids\": [\n\n ],\n \"labels\": [\n {\n \"kind\": \"label\",\n \"id\": 7849080,\n \"project_id\": 1027488,\n \"name\": \"admin\",\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\"\n }\n ],\n \"created_at\": \"2014-02-10T00:00:00Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"url\": \"http://www.pivotaltracker.com/story/show/66727982\"\n }\n ],\n \"start\": \"2014-02-10T08:00:00Z\",\n \"finish\": \"2014-02-17T08:00:00Z\"\n },\n {\n \"kind\": \"iteration\",\n \"number\": 2,\n \"project_id\": 1027488,\n \"team_strength\": 1,\n \"stories\": [\n {\n \"kind\": \"story\",\n \"id\": 66727984,\n \"project_id\": 1027488,\n \"name\": \"Admin should be able to upload multiple product photos and mark one as the primary\",\n \"story_type\": \"feature\",\n \"current_state\": \"accepted\",\n \"estimate\": 3,\n \"accepted_at\": \"2014-02-18T00:00:00Z\",\n \"requested_by_id\": 1266314,\n \"owner_ids\": [\n\n ],\n \"labels\": [\n {\n \"kind\": \"label\",\n \"id\": 7849080,\n \"project_id\": 1027488,\n \"name\": \"admin\",\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\"\n }\n ],\n \"created_at\": \"2014-02-10T00:00:00Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"url\": \"http://www.pivotaltracker.com/story/show/66727984\"\n },\n {\n \"kind\": \"story\",\n \"id\": 66727986,\n \"project_id\": 1027488,\n \"name\": \"Shopper should see list of products, with primary photo as thumbnail\",\n \"story_type\": \"feature\",\n \"current_state\": \"accepted\",\n \"estimate\": 2,\n \"accepted_at\": \"2014-02-18T00:00:00Z\",\n \"requested_by_id\": 1266314,\n \"owner_ids\": [\n\n ],\n \"labels\": [\n {\n \"kind\": \"label\",\n \"id\": 7849082,\n \"project_id\": 1027488,\n \"name\": \"shopping\",\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\"\n }\n ],\n \"created_at\": \"2014-02-10T00:00:00Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"url\": \"http://www.pivotaltracker.com/story/show/66727986\"\n },\n {\n \"kind\": \"story\",\n \"id\": 66727988,\n \"project_id\": 1027488,\n \"name\": \"Product browsing should be paginated, with 10 products per page\",\n \"story_type\": \"feature\",\n \"current_state\": \"accepted\",\n \"estimate\": 1,\n \"accepted_at\": \"2014-02-18T00:00:00Z\",\n \"requested_by_id\": 1266314,\n \"owner_ids\": [\n\n ],\n \"labels\": [\n {\n \"kind\": \"label\",\n \"id\": 7849082,\n \"project_id\": 1027488,\n \"name\": \"shopping\",\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\"\n }\n ],\n \"created_at\": \"2014-02-10T00:00:00Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"url\": \"http://www.pivotaltracker.com/story/show/66727988\"\n },\n {\n \"kind\": \"story\",\n \"id\": 66727990,\n \"project_id\": 1027488,\n \"name\": \"Make product browsing pagination AJAXy\",\n \"story_type\": \"feature\",\n \"current_state\": \"accepted\",\n \"estimate\": 2,\n \"accepted_at\": \"2014-02-18T00:00:00Z\",\n \"requested_by_id\": 1266314,\n \"owner_ids\": [\n\n ],\n \"labels\": [\n {\n \"kind\": \"label\",\n \"id\": 7849082,\n \"project_id\": 1027488,\n \"name\": \"shopping\",\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\"\n },\n {\n \"kind\": \"label\",\n \"id\": 7849084,\n \"project_id\": 1027488,\n \"name\": \"usability\",\n \"created_at\": \"2014-03-02T07:11:05Z\",\n \"updated_at\": \"2014-03-02T07:11:05Z\"\n }\n ],\n \"created_at\": \"2014-02-10T00:00:00Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"url\": \"http://www.pivotaltracker.com/story/show/66727990\"\n },\n {\n \"kind\": \"story\",\n \"id\": 66727992,\n \"project_id\": 1027488,\n \"name\": \"Admin should be able to import multiple new products from CSV file\",\n \"story_type\": \"feature\",\n \"current_state\": \"accepted\",\n \"estimate\": 3,\n \"accepted_at\": \"2014-02-18T00:00:00Z\",\n \"requested_by_id\": 1266314,\n \"owner_ids\": [\n\n ],\n \"labels\": [\n {\n \"kind\": \"label\",\n \"id\": 7849080,\n \"project_id\": 1027488,\n \"name\": \"admin\",\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\"\n }\n ],\n \"created_at\": \"2014-02-10T00:00:00Z\",\n \"updated_at\": \"2014-03-02T07:11:05Z\",\n \"url\": \"http://www.pivotaltracker.com/story/show/66727992\"\n }\n ],\n \"start\": \"2014-02-17T08:00:00Z\",\n \"finish\": \"2014-02-24T08:00:00Z\"\n },\n {\n \"kind\": \"iteration\",\n \"number\": 3,\n \"project_id\": 1027488,\n \"team_strength\": 1,\n \"stories\": [\n {\n \"kind\": \"story\",\n \"id\": 66727994,\n \"project_id\": 1027488,\n \"name\": \"Shopper should be able to click on a product, and see all product details, including photos\",\n \"story_type\": \"feature\",\n \"current_state\": \"accepted\",\n \"estimate\": 1,\n \"accepted_at\": \"2014-03-02T00:00:00Z\",\n \"requested_by_id\": 1266314,\n \"owner_ids\": [\n\n ],\n \"labels\": [\n {\n \"kind\": \"label\",\n \"id\": 7849082,\n \"project_id\": 1027488,\n \"name\": \"shopping\",\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\"\n }\n ],\n \"created_at\": \"2014-02-17T00:00:00Z\",\n \"updated_at\": \"2014-03-02T07:11:05Z\",\n \"url\": \"http://www.pivotaltracker.com/story/show/66727994\"\n },\n {\n \"kind\": \"story\",\n \"id\": 66727996,\n \"project_id\": 1027488,\n \"name\": \"Shopper should be able to add product to shopping cart\",\n \"story_type\": \"feature\",\n \"current_state\": \"accepted\",\n \"estimate\": 1,\n \"accepted_at\": \"2014-03-02T07:11:05Z\",\n \"requested_by_id\": 1266314,\n \"owner_ids\": [\n\n ],\n \"labels\": [\n {\n \"kind\": \"label\",\n \"id\": 7849086,\n \"project_id\": 1027488,\n \"name\": \"cart\",\n \"created_at\": \"2014-03-02T07:11:05Z\",\n \"updated_at\": \"2014-03-02T07:11:05Z\"\n },\n {\n \"kind\": \"label\",\n \"id\": 7849082,\n \"project_id\": 1027488,\n \"name\": \"shopping\",\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\"\n }\n ],\n \"created_at\": \"2014-02-17T00:00:00Z\",\n \"updated_at\": \"2014-03-02T07:11:05Z\",\n \"url\": \"http://www.pivotaltracker.com/story/show/66727996\"\n }\n ],\n \"start\": \"2014-02-24T08:00:00Z\",\n \"finish\": \"2014-03-03T08:00:00Z\"\n },\n {\n \"kind\": \"iteration\",\n \"number\": 4,\n \"project_id\": 1027488,\n \"team_strength\": 1,\n \"stories\": [\n\n ],\n \"start\": \"2014-03-03T08:00:00Z\",\n \"finish\": \"2014-03-10T07:00:00Z\"\n },\n {\n \"kind\": \"iteration\",\n \"number\": 5,\n \"project_id\": 1027488,\n \"team_strength\": 1,\n \"stories\": [\n\n ],\n \"start\": \"2014-03-10T07:00:00Z\",\n \"finish\": \"2014-03-17T07:00:00Z\"\n }\n]"},"http_version":null},"recorded_at":"Wed, 07 May 2014 04:50:06 GMT"},{"request":{"method":"get","uri":"https://www.pivotaltracker.com/services/v5/projects/1027488/iterations?scope=done&offset=-7&limit=5","body":{"encoding":"US-ASCII","string":""},"headers":{"User-Agent":["Ruby/2.0.0 (x86_64-darwin13.0.2; ruby) TrackerApi/0.2.1 Faraday/0.8.9"],"X-TrackerToken":["d55c3bc1f74346b843ca84ba340b29bf"]}},"response":{"status":{"code":200,"message":null},"headers":{"content-type":["application/json; charset=utf-8"],"transfer-encoding":["chunked"],"connection":["close"],"status":["200 OK"],"x-tracker-project-version":["3"],"x-tracker-pagination-total":["12"],"x-tracker-pagination-offset":["-7"],"x-tracker-pagination-limit":["5"],"x-tracker-pagination-returned":["5"],"x-ua-compatible":["IE=Edge,chrome=1"],"cache-control":["max-age=0, private, must-revalidate"],"x-request-id":["2e91547e50e9b86e52da6fd56876b1d4"],"x-runtime":["0.154181"],"date":["Wed, 07 May 2014 04:48:53 GMT"],"x-rack-cache":["miss"],"x-powered-by":["Phusion Passenger 4.0.41"],"server":["nginx/1.6.0 + Phusion Passenger 4.0.41"],"access-control-allow-origin":["*"],"access-control-allow-credentials":["false"],"access-control-allow-methods":["GET, POST, PUT, DELETE, OPTIONS"],"access-control-allow-headers":["X-TrackerToken,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Tracker-Warn-Unless-Project-Version-Is"]},"body":{"encoding":"UTF-8","string":"[\n {\n \"kind\": \"iteration\",\n \"number\": 6,\n \"project_id\": 1027488,\n \"team_strength\": 1,\n \"stories\": [\n\n ],\n \"start\": \"2014-03-17T07:00:00Z\",\n \"finish\": \"2014-03-24T07:00:00Z\"\n },\n {\n \"kind\": \"iteration\",\n \"number\": 7,\n \"project_id\": 1027488,\n \"team_strength\": 1,\n \"stories\": [\n\n ],\n \"start\": \"2014-03-24T07:00:00Z\",\n \"finish\": \"2014-03-31T07:00:00Z\"\n },\n {\n \"kind\": \"iteration\",\n \"number\": 8,\n \"project_id\": 1027488,\n \"team_strength\": 1,\n \"stories\": [\n\n ],\n \"start\": \"2014-03-31T07:00:00Z\",\n \"finish\": \"2014-04-07T07:00:00Z\"\n },\n {\n \"kind\": \"iteration\",\n \"number\": 9,\n \"project_id\": 1027488,\n \"team_strength\": 1,\n \"stories\": [\n\n ],\n \"start\": \"2014-04-07T07:00:00Z\",\n \"finish\": \"2014-04-14T07:00:00Z\"\n },\n {\n \"kind\": \"iteration\",\n \"number\": 10,\n \"project_id\": 1027488,\n \"team_strength\": 1,\n \"stories\": [\n\n ],\n \"start\": \"2014-04-14T07:00:00Z\",\n \"finish\": \"2014-04-21T07:00:00Z\"\n }\n]"},"http_version":null},"recorded_at":"Wed, 07 May 2014 04:50:07 GMT"},{"request":{"method":"get","uri":"https://www.pivotaltracker.com/services/v5/projects/1027488/iterations?scope=done&offset=-2&limit=5","body":{"encoding":"US-ASCII","string":""},"headers":{"User-Agent":["Ruby/2.0.0 (x86_64-darwin13.0.2; ruby) TrackerApi/0.2.1 Faraday/0.8.9"],"X-TrackerToken":["d55c3bc1f74346b843ca84ba340b29bf"]}},"response":{"status":{"code":200,"message":null},"headers":{"content-type":["application/json; charset=utf-8"],"transfer-encoding":["chunked"],"connection":["close"],"status":["200 OK"],"x-tracker-project-version":["3"],"x-tracker-pagination-total":["12"],"x-tracker-pagination-offset":["-2"],"x-tracker-pagination-limit":["5"],"x-tracker-pagination-returned":["2"],"x-ua-compatible":["IE=Edge,chrome=1"],"cache-control":["max-age=0, private, must-revalidate"],"x-request-id":["3ba332b4d55c2aa937ea538fbd8a9171"],"x-runtime":["0.126451"],"date":["Wed, 07 May 2014 04:50:07 GMT"],"x-rack-cache":["miss"],"x-powered-by":["Phusion Passenger 4.0.41"],"server":["nginx/1.6.0 + Phusion Passenger 4.0.41"],"access-control-allow-origin":["*"],"access-control-allow-credentials":["false"],"access-control-allow-methods":["GET, POST, PUT, DELETE, OPTIONS"],"access-control-allow-headers":["X-TrackerToken,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Tracker-Warn-Unless-Project-Version-Is"]},"body":{"encoding":"UTF-8","string":"[\n {\n \"kind\": \"iteration\",\n \"number\": 11,\n \"project_id\": 1027488,\n \"team_strength\": 1,\n \"stories\": [\n\n ],\n \"start\": \"2014-04-21T07:00:00Z\",\n \"finish\": \"2014-04-28T07:00:00Z\"\n },\n {\n \"kind\": \"iteration\",\n \"number\": 12,\n \"project_id\": 1027488,\n \"team_strength\": 1,\n \"stories\": [\n\n ],\n \"start\": \"2014-04-28T07:00:00Z\",\n \"finish\": \"2014-05-05T07:00:00Z\"\n }\n]"},"http_version":null},"recorded_at":"Wed, 07 May 2014 04:50:07 GMT"},{"request":{"method":"get","uri":"https://www.pivotaltracker.com/services/v5/projects/1027488/iterations?limit=5&offset=-12&scope=done","body":{"encoding":"US-ASCII","string":""},"headers":{"User-Agent":["Ruby/2.1.4 (x86_64-darwin14.0; ruby) TrackerApi/0.2.6 Faraday/0.9.0"],"X-TrackerToken":["d55c3bc1f74346b843ca84ba340b29bf"]}},"response":{"status":{"code":200,"message":null},"headers":{"Content-Type":["application/json; charset=utf-8"],"Status":["200 OK"],"X-Tracker-Project-Version":["25"],"X-Tracker-Pagination-Total":["40"],"X-Tracker-Pagination-Offset":["-12"],"X-Tracker-Pagination-Limit":["5"],"X-Tracker-Pagination-Returned":["5"],"X-UA-Compatible":["IE=Edge,chrome=1"],"ETag":["\"d45246fca9ea2bbd4df46ee61af141d2\""],"Cache-Control":["max-age=0, private, must-revalidate"],"X-Request-Id":["8829ce4a3d9ce39db64aeed5f69c6c2b"],"X-Runtime":["0.218563"],"Date":["Mon, 17 Nov 2014 19:02:40 GMT"],"X-Rack-Cache":["miss"],"X-Powered-By":["Phusion Passenger 4.0.41"],"Server":["nginx/1.6.0 + Phusion Passenger 4.0.41"],"Access-Control-Allow-Origin":["*"],"Access-Control-Allow-Credentials":["false"],"Access-Control-Allow-Methods":["GET, POST, PUT, DELETE, OPTIONS"],"Access-Control-Allow-Headers":["X-TrackerToken,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Tracker-Warn-Unless-Project-Version-Is"],"X-Tracker-Client-Pinger-Interval":["12"]},"body":{"encoding":"UTF-8","string":"[\n {\n \"kind\": \"iteration\",\n \"number\": 29,\n \"project_id\": 1027488,\n \"team_strength\": 1,\n \"stories\": [\n\n ],\n \"start\": \"2014-08-25T07:00:00Z\",\n \"finish\": \"2014-09-01T07:00:00Z\"\n },\n {\n \"kind\": \"iteration\",\n \"number\": 30,\n \"project_id\": 1027488,\n \"team_strength\": 1,\n \"stories\": [\n\n ],\n \"start\": \"2014-09-01T07:00:00Z\",\n \"finish\": \"2014-09-08T07:00:00Z\"\n },\n {\n \"kind\": \"iteration\",\n \"number\": 31,\n \"project_id\": 1027488,\n \"team_strength\": 1,\n \"stories\": [\n\n ],\n \"start\": \"2014-09-08T07:00:00Z\",\n \"finish\": \"2014-09-15T07:00:00Z\"\n },\n {\n \"kind\": \"iteration\",\n \"number\": 32,\n \"project_id\": 1027488,\n \"team_strength\": 1,\n \"stories\": [\n\n ],\n \"start\": \"2014-09-15T07:00:00Z\",\n \"finish\": \"2014-09-22T07:00:00Z\"\n },\n {\n \"kind\": \"iteration\",\n \"number\": 33,\n \"project_id\": 1027488,\n \"team_strength\": 1,\n \"stories\": [\n\n ],\n \"start\": \"2014-09-22T07:00:00Z\",\n \"finish\": \"2014-09-29T07:00:00Z\"\n }\n]"},"http_version":null},"recorded_at":"Mon, 17 Nov 2014 19:02:40 GMT"},{"request":{"method":"get","uri":"https://www.pivotaltracker.com/services/v5/projects/1027488/iterations?limit=5&offset=-7&scope=done","body":{"encoding":"US-ASCII","string":""},"headers":{"User-Agent":["Ruby/2.1.4 (x86_64-darwin14.0; ruby) TrackerApi/0.2.6 Faraday/0.9.0"],"X-TrackerToken":["d55c3bc1f74346b843ca84ba340b29bf"]}},"response":{"status":{"code":200,"message":null},"headers":{"Content-Type":["application/json; charset=utf-8"],"Status":["200 OK"],"X-Tracker-Project-Version":["25"],"X-Tracker-Pagination-Total":["40"],"X-Tracker-Pagination-Offset":["-7"],"X-Tracker-Pagination-Limit":["5"],"X-Tracker-Pagination-Returned":["5"],"X-UA-Compatible":["IE=Edge,chrome=1"],"ETag":["\"3187e9f0eac3eb32bd330e7f9647baef\""],"Cache-Control":["max-age=0, private, must-revalidate"],"X-Request-Id":["b8da8b3435bb60f89b4f6b1ef9b7c6f1"],"X-Runtime":["0.156633"],"Date":["Mon, 17 Nov 2014 19:02:40 GMT"],"X-Rack-Cache":["miss"],"X-Powered-By":["Phusion Passenger 4.0.41"],"Server":["nginx/1.6.0 + Phusion Passenger 4.0.41"],"Access-Control-Allow-Origin":["*"],"Access-Control-Allow-Credentials":["false"],"Access-Control-Allow-Methods":["GET, POST, PUT, DELETE, OPTIONS"],"Access-Control-Allow-Headers":["X-TrackerToken,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Tracker-Warn-Unless-Project-Version-Is"],"X-Tracker-Client-Pinger-Interval":["12"]},"body":{"encoding":"UTF-8","string":"[\n {\n \"kind\": \"iteration\",\n \"number\": 34,\n \"project_id\": 1027488,\n \"team_strength\": 1,\n \"stories\": [\n\n ],\n \"start\": \"2014-09-29T07:00:00Z\",\n \"finish\": \"2014-10-06T07:00:00Z\"\n },\n {\n \"kind\": \"iteration\",\n \"number\": 35,\n \"project_id\": 1027488,\n \"team_strength\": 1,\n \"stories\": [\n\n ],\n \"start\": \"2014-10-06T07:00:00Z\",\n \"finish\": \"2014-10-13T07:00:00Z\"\n },\n {\n \"kind\": \"iteration\",\n \"number\": 36,\n \"project_id\": 1027488,\n \"team_strength\": 1,\n \"stories\": [\n\n ],\n \"start\": \"2014-10-13T07:00:00Z\",\n \"finish\": \"2014-10-20T07:00:00Z\"\n },\n {\n \"kind\": \"iteration\",\n \"number\": 37,\n \"project_id\": 1027488,\n \"team_strength\": 1,\n \"stories\": [\n\n ],\n \"start\": \"2014-10-20T07:00:00Z\",\n \"finish\": \"2014-10-27T07:00:00Z\"\n },\n {\n \"kind\": \"iteration\",\n \"number\": 38,\n \"project_id\": 1027488,\n \"team_strength\": 1,\n \"stories\": [\n\n ],\n \"start\": \"2014-10-27T07:00:00Z\",\n \"finish\": \"2014-11-03T08:00:00Z\"\n }\n]"},"http_version":null},"recorded_at":"Mon, 17 Nov 2014 19:02:40 GMT"},{"request":{"method":"get","uri":"https://www.pivotaltracker.com/services/v5/projects/1027488/iterations?limit=5&offset=-2&scope=done","body":{"encoding":"US-ASCII","string":""},"headers":{"User-Agent":["Ruby/2.1.4 (x86_64-darwin14.0; ruby) TrackerApi/0.2.6 Faraday/0.9.0"],"X-TrackerToken":["d55c3bc1f74346b843ca84ba340b29bf"]}},"response":{"status":{"code":200,"message":null},"headers":{"Content-Type":["application/json; charset=utf-8"],"Status":["200 OK"],"X-Tracker-Project-Version":["25"],"X-Tracker-Pagination-Total":["40"],"X-Tracker-Pagination-Offset":["-2"],"X-Tracker-Pagination-Limit":["5"],"X-Tracker-Pagination-Returned":["2"],"X-UA-Compatible":["IE=Edge,chrome=1"],"ETag":["\"03e2871bc22bb1cb39066ebb5b505b3c\""],"Cache-Control":["max-age=0, private, must-revalidate"],"X-Request-Id":["b2d1eee3045a011bb4a2d5f544f4a277"],"X-Runtime":["0.218874"],"Date":["Mon, 17 Nov 2014 19:02:41 GMT"],"X-Rack-Cache":["miss"],"X-Powered-By":["Phusion Passenger 4.0.41"],"Server":["nginx/1.6.0 + Phusion Passenger 4.0.41"],"Access-Control-Allow-Origin":["*"],"Access-Control-Allow-Credentials":["false"],"Access-Control-Allow-Methods":["GET, POST, PUT, DELETE, OPTIONS"],"Access-Control-Allow-Headers":["X-TrackerToken,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Tracker-Warn-Unless-Project-Version-Is"],"X-Tracker-Client-Pinger-Interval":["12"]},"body":{"encoding":"UTF-8","string":"[\n {\n \"kind\": \"iteration\",\n \"number\": 39,\n \"project_id\": 1027488,\n \"team_strength\": 1,\n \"stories\": [\n\n ],\n \"start\": \"2014-11-03T08:00:00Z\",\n \"finish\": \"2014-11-10T08:00:00Z\"\n },\n {\n \"kind\": \"iteration\",\n \"number\": 40,\n \"project_id\": 1027488,\n \"team_strength\": 1,\n \"stories\": [\n\n ],\n \"start\": \"2014-11-10T08:00:00Z\",\n \"finish\": \"2014-11-17T08:00:00Z\"\n }\n]"},"http_version":null},"recorded_at":"Mon, 17 Nov 2014 19:02:41 GMT"}],"recorded_with":"VCR 2.9.3"}
1
+ {"http_interactions":[{"request":{"method":"get","uri":"https://www.pivotaltracker.com/services/v5/projects/1027488","body":{"encoding":"US-ASCII","string":""},"headers":{"User-Agent":["Ruby/2.1.5 (x86_64-darwin14.0; ruby) TrackerApi/0.2.9 Faraday/0.9.1"],"X-TrackerToken":["d55c3bc1f74346b843ca84ba340b29bf"]}},"response":{"status":{"code":200,"message":null},"headers":{"Content-Type":["application/json; charset=utf-8"],"Status":["200 OK"],"X-Tracker-Project-Version":["65"],"X-UA-Compatible":["IE=Edge,chrome=1"],"ETag":["\"d68ec2d38a9a18645ab9524b715d7cbc\""],"Cache-Control":["max-age=0, private, must-revalidate"],"X-Request-Id":["7edfa5d7e97312fd83d249936afab63c"],"X-Runtime":["0.041782"],"Date":["Wed, 24 Jun 2015 21:05:44 GMT"],"X-Rack-Cache":["miss"],"X-Powered-By":["Phusion Passenger 4.0.41"],"Server":["nginx/1.6.0 + Phusion Passenger 4.0.41"],"Access-Control-Allow-Origin":["*"],"Access-Control-Allow-Credentials":["false"],"Access-Control-Allow-Methods":["GET, POST, PUT, DELETE, OPTIONS"],"Access-Control-Allow-Headers":["X-TrackerToken,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Tracker-Warn-Unless-Project-Version-Is"],"X-Tracker-Client-Pinger-Interval":["12"]},"body":{"encoding":"UTF-8","string":"{\"id\":1027488,\"kind\":\"project\",\"name\":\"My Sample Project\",\"version\":65,\"iteration_length\":1,\"week_start_day\":\"Monday\",\"point_scale\":\"0,1,2,3\",\"point_scale_is_custom\":false,\"bugs_and_chores_are_estimatable\":false,\"automatic_planning\":true,\"enable_tasks\":true,\"time_zone\":{\"kind\":\"time_zone\",\"olson_name\":\"America/Los_Angeles\",\"offset\":\"-07:00\"},\"velocity_averaged_over\":3,\"number_of_done_iterations_to_show\":12,\"has_google_domain\":false,\"profile_content\":\"This is a demo project, created by Tracker, with example stories for a simple shopping web site.\",\"enable_incoming_emails\":true,\"initial_velocity\":10,\"public\":false,\"atom_enabled\":false,\"project_type\":\"demo\",\"start_time\":\"2014-02-10T08:00:00Z\",\"created_at\":\"2014-03-02T07:11:04Z\",\"updated_at\":\"2014-03-02T07:11:04Z\",\"account_id\":621384,\"current_iteration_number\":72,\"enable_following\":true}"},"http_version":null},"recorded_at":"Wed, 24 Jun 2015 21:05:53 GMT"},{"request":{"method":"get","uri":"https://www.pivotaltracker.com/services/v5/projects/1027488/iterations?limit=5&offset=-12&scope=done","body":{"encoding":"US-ASCII","string":""},"headers":{"User-Agent":["Ruby/2.1.5 (x86_64-darwin14.0; ruby) TrackerApi/0.2.9 Faraday/0.9.1"],"X-TrackerToken":["d55c3bc1f74346b843ca84ba340b29bf"]}},"response":{"status":{"code":200,"message":null},"headers":{"Content-Type":["application/json; charset=utf-8"],"Status":["200 OK"],"X-Tracker-Project-Version":["65"],"X-Tracker-Pagination-Total":["71"],"X-Tracker-Pagination-Offset":["-12"],"X-Tracker-Pagination-Limit":["5"],"X-Tracker-Pagination-Returned":["5"],"X-UA-Compatible":["IE=Edge,chrome=1"],"ETag":["\"a405058648c69e8dca1eee9d910db156\""],"Cache-Control":["max-age=0, private, must-revalidate"],"X-Request-Id":["a33ce508c69a70c84d64a81d30d9aea6"],"X-Runtime":["0.120395"],"Date":["Wed, 24 Jun 2015 21:05:44 GMT"],"X-Rack-Cache":["miss"],"X-Powered-By":["Phusion Passenger 4.0.41"],"Server":["nginx/1.6.0 + Phusion Passenger 4.0.41"],"Access-Control-Allow-Origin":["*"],"Access-Control-Allow-Credentials":["false"],"Access-Control-Allow-Methods":["GET, POST, PUT, DELETE, OPTIONS"],"Access-Control-Allow-Headers":["X-TrackerToken,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Tracker-Warn-Unless-Project-Version-Is"],"X-Tracker-Client-Pinger-Interval":["12"]},"body":{"encoding":"UTF-8","string":"[{\"kind\":\"iteration\",\"number\":60,\"project_id\":1027488,\"team_strength\":1,\"stories\":[],\"start\":\"2015-03-30T07:00:00Z\",\"finish\":\"2015-04-06T07:00:00Z\"},{\"kind\":\"iteration\",\"number\":61,\"project_id\":1027488,\"team_strength\":1,\"stories\":[],\"start\":\"2015-04-06T07:00:00Z\",\"finish\":\"2015-04-13T07:00:00Z\"},{\"kind\":\"iteration\",\"number\":62,\"project_id\":1027488,\"team_strength\":1,\"stories\":[],\"start\":\"2015-04-13T07:00:00Z\",\"finish\":\"2015-04-20T07:00:00Z\"},{\"kind\":\"iteration\",\"number\":63,\"project_id\":1027488,\"team_strength\":1,\"stories\":[],\"start\":\"2015-04-20T07:00:00Z\",\"finish\":\"2015-04-27T07:00:00Z\"},{\"kind\":\"iteration\",\"number\":64,\"project_id\":1027488,\"team_strength\":1,\"stories\":[],\"start\":\"2015-04-27T07:00:00Z\",\"finish\":\"2015-05-04T07:00:00Z\"}]"},"http_version":null},"recorded_at":"Wed, 24 Jun 2015 21:05:54 GMT"},{"request":{"method":"get","uri":"https://www.pivotaltracker.com/services/v5/projects/1027488/iterations?limit=5&offset=-7&scope=done","body":{"encoding":"US-ASCII","string":""},"headers":{"User-Agent":["Ruby/2.1.5 (x86_64-darwin14.0; ruby) TrackerApi/0.2.9 Faraday/0.9.1"],"X-TrackerToken":["d55c3bc1f74346b843ca84ba340b29bf"]}},"response":{"status":{"code":200,"message":null},"headers":{"Content-Type":["application/json; charset=utf-8"],"Status":["200 OK"],"X-Tracker-Project-Version":["65"],"X-Tracker-Pagination-Total":["71"],"X-Tracker-Pagination-Offset":["-7"],"X-Tracker-Pagination-Limit":["5"],"X-Tracker-Pagination-Returned":["5"],"X-UA-Compatible":["IE=Edge,chrome=1"],"ETag":["\"cf5318db65ebe2e02b1d0404de0fac71\""],"Cache-Control":["max-age=0, private, must-revalidate"],"X-Request-Id":["8e46019d24c44904f0e4268073dd4937"],"X-Runtime":["0.103841"],"Date":["Wed, 24 Jun 2015 21:05:45 GMT"],"X-Rack-Cache":["miss"],"X-Powered-By":["Phusion Passenger 4.0.41"],"Server":["nginx/1.6.0 + Phusion Passenger 4.0.41"],"Access-Control-Allow-Origin":["*"],"Access-Control-Allow-Credentials":["false"],"Access-Control-Allow-Methods":["GET, POST, PUT, DELETE, OPTIONS"],"Access-Control-Allow-Headers":["X-TrackerToken,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Tracker-Warn-Unless-Project-Version-Is"],"X-Tracker-Client-Pinger-Interval":["12"]},"body":{"encoding":"UTF-8","string":"[{\"kind\":\"iteration\",\"number\":65,\"project_id\":1027488,\"team_strength\":1,\"stories\":[],\"start\":\"2015-05-04T07:00:00Z\",\"finish\":\"2015-05-11T07:00:00Z\"},{\"kind\":\"iteration\",\"number\":66,\"project_id\":1027488,\"team_strength\":1,\"stories\":[],\"start\":\"2015-05-11T07:00:00Z\",\"finish\":\"2015-05-18T07:00:00Z\"},{\"kind\":\"iteration\",\"number\":67,\"project_id\":1027488,\"team_strength\":1,\"stories\":[],\"start\":\"2015-05-18T07:00:00Z\",\"finish\":\"2015-05-25T07:00:00Z\"},{\"kind\":\"iteration\",\"number\":68,\"project_id\":1027488,\"team_strength\":1,\"stories\":[],\"start\":\"2015-05-25T07:00:00Z\",\"finish\":\"2015-06-01T07:00:00Z\"},{\"kind\":\"iteration\",\"number\":69,\"project_id\":1027488,\"team_strength\":1,\"stories\":[],\"start\":\"2015-06-01T07:00:00Z\",\"finish\":\"2015-06-08T07:00:00Z\"}]"},"http_version":null},"recorded_at":"Wed, 24 Jun 2015 21:05:54 GMT"},{"request":{"method":"get","uri":"https://www.pivotaltracker.com/services/v5/projects/1027488/iterations?limit=5&offset=-2&scope=done","body":{"encoding":"US-ASCII","string":""},"headers":{"User-Agent":["Ruby/2.1.5 (x86_64-darwin14.0; ruby) TrackerApi/0.2.9 Faraday/0.9.1"],"X-TrackerToken":["d55c3bc1f74346b843ca84ba340b29bf"]}},"response":{"status":{"code":200,"message":null},"headers":{"Content-Type":["application/json; charset=utf-8"],"Status":["200 OK"],"X-Tracker-Project-Version":["65"],"X-Tracker-Pagination-Total":["71"],"X-Tracker-Pagination-Offset":["-2"],"X-Tracker-Pagination-Limit":["5"],"X-Tracker-Pagination-Returned":["2"],"X-UA-Compatible":["IE=Edge,chrome=1"],"ETag":["\"191d708afd98790f96ff56664d04b59e\""],"Cache-Control":["max-age=0, private, must-revalidate"],"X-Request-Id":["849e5c50272bc695131507ab2e65dca6"],"X-Runtime":["0.098432"],"Date":["Wed, 24 Jun 2015 21:05:45 GMT"],"X-Rack-Cache":["miss"],"X-Powered-By":["Phusion Passenger 4.0.41"],"Server":["nginx/1.6.0 + Phusion Passenger 4.0.41"],"Access-Control-Allow-Origin":["*"],"Access-Control-Allow-Credentials":["false"],"Access-Control-Allow-Methods":["GET, POST, PUT, DELETE, OPTIONS"],"Access-Control-Allow-Headers":["X-TrackerToken,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Tracker-Warn-Unless-Project-Version-Is"],"X-Tracker-Client-Pinger-Interval":["12"]},"body":{"encoding":"UTF-8","string":"[{\"kind\":\"iteration\",\"number\":70,\"project_id\":1027488,\"team_strength\":1,\"stories\":[],\"start\":\"2015-06-08T07:00:00Z\",\"finish\":\"2015-06-15T07:00:00Z\"},{\"kind\":\"iteration\",\"number\":71,\"project_id\":1027488,\"team_strength\":1,\"stories\":[],\"start\":\"2015-06-15T07:00:00Z\",\"finish\":\"2015-06-22T07:00:00Z\"}]"},"http_version":null},"recorded_at":"Wed, 24 Jun 2015 21:05:54 GMT"}],"recorded_with":"VCR 2.9.3"}