diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..c8d333e --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,3 @@ +0.1.0 +--- +- Initial release. diff --git a/README.md b/README.md index be20374..e72e0d6 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # TrackerApi -[![Gem Version](https://badge.fury.io/rb/tracker-api.png)](http://badge.fury.io/rb/tracker-api) -[![Build Status](https://travis-ci.org/dashofcode/tracker-api.png?branch=master)](https://travis-ci.org/dashofcode/tracker-api) -[![Code Climate](https://codeclimate.com/github/dashofcode/tracker-api.png)](https://codeclimate.com/github/dashofcode/tracker-api) -[![Coverage Status](https://coveralls.io/repos/dashofcode/tracker-api/badge.png?branch=master)](https://coveralls.io/r/dashofcode/tracker-api?branch=master) -[![Dependency Status](https://gemnasium.com/dashofcode/tracker-api.png)](https://gemnasium.com/dashofcode/tracker-api) +[![Gem Version](https://badge.fury.io/rb/tracker_api.png)](http://badge.fury.io/rb/tracker_api) +[![Build Status](https://travis-ci.org/dashofcode/tracker_api.png?branch=master)](https://travis-ci.org/dashofcode/tracker_api) +[![Code Climate](https://codeclimate.com/github/dashofcode/tracker_api.png)](https://codeclimate.com/github/dashofcode/tracker_api) +[![Coverage Status](https://coveralls.io/repos/dashofcode/tracker_api/badge.png?branch=master)](https://coveralls.io/r/dashofcode/tracker_api?branch=master) +[![Dependency Status](https://gemnasium.com/dashofcode/tracker_api.png)](https://gemnasium.com/dashofcode/tracker_api) This gem allows you to easily use the [Pivotal Tracker v5 API](https://www.pivotaltracker.com/help/api/rest/v5). @@ -14,42 +14,41 @@ It’s powered by [Faraday](https://github.com/lostisland/faraday) and [Virtus]( ## Basic Usage ```ruby -Trackher.configure(api_token: 'my-awesome-api-token') # Configure with API Token +client = TrackerApi::Client.new(token: 'my-api-token') # Create API client -projects = Trackher::Project.all # Get all projects -project = Trackher::Project.find(123456) # Find project with given ID +projects = client.projects # Get all projects +project = client.project(123456) # Find project with given ID -project.all # Get all stories for a project -project.stories.where(with_state: :unscheduled).limit(10) # Get 10 unscheduled stories for a project -project.stories.where(filter: 'requester:OWK label:"jedi stuff"') # Get all stories that match the given filters -project.stories.find(847762630) # Find a story with the given ID +project.stories # Get all stories for a project +project.stories(with_state: :unscheduled, limit: 10) # Get 10 unscheduled stories for a project +project.stories(filter: 'requester:OWK label:"jedi stuff"') # Get all stories that match the given filters +project.story(847762630) # Find a story with the given ID epics = project.epics # Get all epics for a project epic = epics.first label = epic.label # Get an epic's label ``` -## Scopes & Eager Loading +## Eager Loading + +See Pivotal Tracker API [documentation](https://www.pivotaltracker.com/help/api#Response_Controlling_Parameters) for how to use the `fields` parameter. ```ruby -Trackher.with_token('my-special-api-token') do # Use a token for a specific block only - epics = Trackher::Epic.for_project(@project.id) # Get all epics for a project -end +client = TrackerApi::Client.new(token: 'my-api-token') # Create API client -Trackher.configure(api_token: 'my-awesome-api-token') # Configure with API Token +client.project(project_id, fields: ':default,labels(name)') # Eagerly get labels with a project +client.project(project_id, fields: ':default,epics') # Eagerly get epics with a project +``` -Trackher::Iteration.current.for_project(@project.id).first # Get current iteration for a project -Trackher::Iteration.done.for_project(@project.id) # Get all done iterations for a project -Trackher::Iteration.done.offset(-2).for_project(@project.id) # Get last 2 done iterations for a project +## TODO -Trackher::Project.where(fields: ':default,labels(name)').find(project_id) # Eagerly get labels with a project -Trackher::Project.where(fields: ':default,epics').find(project_id) # Eagerly get epics with a project -``` +- Pagination +- Create, Update, Delete of Resources ## Contributing -Currently this client only supports read-only access to Pivotal Tracker. -I will be extending it as my use cases require, but am happy to accept contributions. +Currently this client supports read-only access to Pivotal Tracker. +We will be extending it as our use cases require, but are always happy to accept contributions. 1. Fork it 2. Create your feature branch (`git checkout -b my-new-feature`) diff --git a/Rakefile b/Rakefile index 3c7e60b..13fada3 100644 --- a/Rakefile +++ b/Rakefile @@ -11,7 +11,7 @@ require 'rake/testtask' Rake::TestTask.new(:test) do |t| t.libs << 'lib' t.libs << 'test' - t.test_files = FileList['test/**/*_spec.rb'] + t.test_files = FileList['test/**/*_test.rb'] t.verbose = true end diff --git a/lib/tracker_api.rb b/lib/tracker_api.rb index 05de5eb..c4dbf0b 100644 --- a/lib/tracker_api.rb +++ b/lib/tracker_api.rb @@ -1,16 +1,13 @@ require 'tracker_api/version' # dependencies -# require 'addressable/uri' require 'virtus' require 'faraday' require 'faraday_middleware' # stdlib -# require 'forwardable' +require 'forwardable' require 'logger' -# require 'time' -# require 'yaml' module TrackerApi autoload :Error, 'tracker_api/error' @@ -23,8 +20,11 @@ class UnexpectedData < StandardError; end module Endpoints autoload :Epic, 'tracker_api/endpoints/epic' + autoload :Epics, 'tracker_api/endpoints/epics' + autoload :Iterations, 'tracker_api/endpoints/iterations' autoload :Project, 'tracker_api/endpoints/project' autoload :Projects, 'tracker_api/endpoints/projects' + autoload :Stories, 'tracker_api/endpoints/stories' end module Resources @@ -36,16 +36,4 @@ module Resources autoload :Story, 'tracker_api/resources/story' autoload :TimeZone, 'tracker_api/resources/time_zone' end - - # def self.stringify_keys(hash) - # hash.inject({}) { |r, (k, v)| r.merge(k.to_s => v) } - # end - - # def self.symbolize_keys(hash) - # hash.inject({}) { |r, (k, v)| r.merge(k.to_sym => v) } - # end - - #def self.blank?(string) - # string.nil? || string == '' - #end end diff --git a/lib/tracker_api/endpoints/epic.rb b/lib/tracker_api/endpoints/epic.rb index ef0aee3..9673a7b 100644 --- a/lib/tracker_api/endpoints/epic.rb +++ b/lib/tracker_api/endpoints/epic.rb @@ -7,13 +7,10 @@ def initialize(client) @client = client end - def get(params={}) - project_id = params.fetch('project_id') - id = params.fetch('id') - + def get(project_id, id) data = client.request( - :method => :get, - :path => "/projects/#{project_id}/epics/#{id}" + method: :get, + :path => "/projects/#{project_id}/epics/#{id}" ).body Resources::Epic.new({ client: client }.merge(data)) diff --git a/lib/tracker_api/endpoints/epics.rb b/lib/tracker_api/endpoints/epics.rb new file mode 100644 index 0000000..71df2e7 --- /dev/null +++ b/lib/tracker_api/endpoints/epics.rb @@ -0,0 +1,22 @@ +module TrackerApi + module Endpoints + class Epics + attr_accessor :client + + def initialize(client) + @client = client + end + + def get(project_id, params={}) + data = client.request( + method: :get, + path: "/projects/#{project_id}/epics", + params: params + ).body + raise TrackerApi::Errors::UnexpectedData, 'Array of epics expected' unless data.is_a? Array + + data.map { |epic| Resources::Epic.new({ client: client }.merge(epic)) } + end + end + end +end diff --git a/lib/tracker_api/endpoints/get_epics.rb b/lib/tracker_api/endpoints/get_epics.rb deleted file mode 100644 index 8d1cc7f..0000000 --- a/lib/tracker_api/endpoints/get_epics.rb +++ /dev/null @@ -1,10 +0,0 @@ -# class TrackerApi::Client -# class Real -# def get_epics(project_id, params={}) -# request( -# :method => :get, -# :path => "/projects/#{project_id}/epics", -# ) -# end -# end -# end diff --git a/lib/tracker_api/endpoints/get_iterations.rb b/lib/tracker_api/endpoints/get_iterations.rb deleted file mode 100644 index ae8fc18..0000000 --- a/lib/tracker_api/endpoints/get_iterations.rb +++ /dev/null @@ -1,11 +0,0 @@ -# class TrackerApi::Client -# class Real -# def get_iterations(project_id, params={}) -# request( -# method: :get, -# path: "/projects/#{project_id}/iterations", -# params: params -# ) -# end -# end -# end diff --git a/lib/tracker_api/endpoints/iterations.rb b/lib/tracker_api/endpoints/iterations.rb new file mode 100644 index 0000000..3565e47 --- /dev/null +++ b/lib/tracker_api/endpoints/iterations.rb @@ -0,0 +1,22 @@ +module TrackerApi + module Endpoints + class Iterations + attr_accessor :client + + def initialize(client) + @client = client + end + + def get(project_id, params={}) + data = client.request( + method: :get, + path: "/projects/#{project_id}/iterations", + params: params + ).body + raise TrackerApi::Errors::UnexpectedData, 'Array of iterations expected' unless data.is_a? Array + + data.map { |iteration| Resources::Iteration.new({ client: client }.merge(iteration)) } + end + end + end +end diff --git a/lib/tracker_api/endpoints/stories.rb b/lib/tracker_api/endpoints/stories.rb new file mode 100644 index 0000000..c215cd1 --- /dev/null +++ b/lib/tracker_api/endpoints/stories.rb @@ -0,0 +1,22 @@ +module TrackerApi + module Endpoints + class Stories + attr_accessor :client + + def initialize(client) + @client = client + end + + def get(project_id, params={}) + data = client.request( + method: :get, + path: "/projects/#{project_id}/stories", + params: params + ).body + raise TrackerApi::Errors::UnexpectedData, 'Array of stories expected' unless data.is_a? Array + + data.map { |story| Resources::Story.new({ client: client }.merge(story)) } + end + end + end +end diff --git a/lib/tracker_api/endpoints/story.rb b/lib/tracker_api/endpoints/story.rb new file mode 100644 index 0000000..babbfe6 --- /dev/null +++ b/lib/tracker_api/endpoints/story.rb @@ -0,0 +1,20 @@ +module TrackerApi + module Endpoints + class Story + attr_accessor :client + + def initialize(client) + @client = client + end + + def get(project_id, id) + data = client.request( + method: :get, + :path => "/projects/#{project_id}/stories/#{id}" + ).body + + Resources::Story.new({ client: client }.merge(data)) + end + end + end +end diff --git a/lib/tracker_api/resources/epic.rb b/lib/tracker_api/resources/epic.rb index 44ddc6a..4468011 100644 --- a/lib/tracker_api/resources/epic.rb +++ b/lib/tracker_api/resources/epic.rb @@ -3,6 +3,8 @@ module Resources class Epic include Virtus.model + attribute :client + attribute :id, Integer attribute :created_at, DateTime attribute :description, String diff --git a/lib/tracker_api/resources/iteration.rb b/lib/tracker_api/resources/iteration.rb index 9dc440d..31399e3 100644 --- a/lib/tracker_api/resources/iteration.rb +++ b/lib/tracker_api/resources/iteration.rb @@ -3,6 +3,8 @@ module Resources class Iteration include Virtus.model + attribute :client + attribute :created_at, DateTime attribute :finish, DateTime attribute :id, Integer diff --git a/lib/tracker_api/resources/project.rb b/lib/tracker_api/resources/project.rb index 3ac670b..8caced7 100644 --- a/lib/tracker_api/resources/project.rb +++ b/lib/tracker_api/resources/project.rb @@ -39,34 +39,47 @@ class Project attribute :version, Integer attribute :week_start_day, String - # @return [TrackerApi::Client::Epics] epics associated with this project - #def epics - # requires :identity - # data = connection.get_epics(self.identity).body - # - # connection.epics.load(data) - #end + # @return [Array[Epic]] epics associated with this project + def epics(params={}) + raise ArgumentError, 'Expected @epics to be an Array' unless @epics.is_a? Array + return @epics unless @epics.empty? - # @param [Hash] options - # @option options [String] :scope ('') Restricts the state of iterations to return. + @epics = Endpoints::Epics.new(client).get(id, params) + end + + # @param [Hash] params + # @option params [String] :scope ('') Restricts the state of iterations to return. # If not specified, it defaults to all iterations including done. # Valid enumeration values: done, current, backlog, current_backlog. - # @option options [Integer] :offset The offset of first iteration to return, relative to the + # @option params [Integer] :offset The offset of first iteration to return, relative to the # set of iterations specified by 'scope', with zero being the first iteration in the scope. - # @option options [Integer] :limit The number of iterations to return relative to the offset. - # @return [Iterations] iterations associated with this project - #def iterations(options = {}) - # requires :identity - # - # data = connection.get_iterations(self.identity, options).body - # - # connection.iterations.load(data) - #end + # @option params [Integer] :limit The number of iterations to return relative to the offset. + # @return [Array[Iteration]] iterations associated with this project + def iterations(params = {}) + Endpoints::Iterations.new(client).get(id, params) + end + + # @param [Hash] params + # @option params [String] :with_label A label name which all returned stories must match. + # @option params [String] :with_state A story's current_state which all returned stories must match. + # Valid enumeration values: accepted, delivered, finished, started, rejected, unstarted, unscheduled + # @option params [String] :filter This parameter supplies a search string; + # only stories that match the search criteria are returned. + # Cannot be used together with any other parameters except limit and offset. + # ex) state:started requester:OWK label:"jedi stuff" keyword + # @option params [Integer] :offset With the first story in your priority list as 0, + # the index of the first story you want returned. + # @option params [Integer] :limit The number of stories you want returned. + # @return [Array[Story]] iterations associated with this project + def stories(params = {}) + Endpoints::Stories.new(client).get(id, params) + end - # @return [Iteration] current iteration associated with this project - #def current_iteration - # iterations(scope: 'current').first - #end + # @param [Fixnum] story_id id of story + # @return [Story] + def story(story_id) + Endpoints::Story.new(client).get(id, story_id) + end end end end diff --git a/lib/tracker_api/resources/story.rb b/lib/tracker_api/resources/story.rb index c2de41d..7c23682 100644 --- a/lib/tracker_api/resources/story.rb +++ b/lib/tracker_api/resources/story.rb @@ -3,6 +3,8 @@ module Resources class Story include Virtus.model + attribute :client + attribute :accepted_at, DateTime attribute :comment_ids, Array[Integer] attribute :created_at, DateTime diff --git a/lib/tracker_api/version.rb b/lib/tracker_api/version.rb index c29e79b..cac8915 100644 --- a/lib/tracker_api/version.rb +++ b/lib/tracker_api/version.rb @@ -1,3 +1,3 @@ module TrackerApi - VERSION = "0.0.1" + VERSION = '0.1.0' end diff --git a/test/client_test.rb b/test/client_test.rb index 9009079..64e2232 100644 --- a/test/client_test.rb +++ b/test/client_test.rb @@ -16,4 +16,46 @@ client.api_version.must_equal '/foo-bar/1' client.token.must_equal '12345' end + + describe '.projects' do + let(:pt_user) { PT_USER_1 } + let(:client) { TrackerApi::Client.new token: pt_user[:token] } + + it 'gets all projects' do + VCR.use_cassette('get all projects', record: :new_episodes) do + projects = client.projects(fields: ':default,account,current_velocity,labels(name),epics(:default,label(name))') + + projects.wont_be_empty + project = projects.first + project.must_be_instance_of TrackerApi::Resources::Project + project.id.must_equal pt_user[:project_id] + + project.account.must_be_instance_of TrackerApi::Resources::Account + + project.labels.wont_be_empty + project.labels.first.must_be_instance_of TrackerApi::Resources::Label + + project.epics.wont_be_empty + project.epics.first.must_be_instance_of TrackerApi::Resources::Epic + end + end + end + + describe '.project' do + let(:pt_user) { PT_USER_1 } + let(:client) { TrackerApi::Client.new token: pt_user[:token] } + let(:project_id) { pt_user[:project_id] } + + it 'gets a project by id' do + VCR.use_cassette('get project', record: :new_episodes) do + project = client.project(project_id) + + project.must_be_instance_of TrackerApi::Resources::Project + project.id.must_equal project_id + + project.account.must_be_nil + project.account_id.wont_be_nil + end + end + end end diff --git a/test/epic_test.rb b/test/epic_test.rb deleted file mode 100644 index 6242a3e..0000000 --- a/test/epic_test.rb +++ /dev/null @@ -1,16 +0,0 @@ -#require_relative '../minitest_helper' -# -#describe TrackerApi::Client do -# let(:client) { TrackerApi::Client.new } -# let(:projects) { VCR.use_cassette('all projects') { client.projects.all } } -# let(:project) { projects.first } -# let(:epics) { VCR.use_cassette('project epics') { project.epics } } -# let(:epic) { epics.first } -# -# describe 'Epic' do -# it 'can get an epics label' do -# epic.must_be_instance_of TrackerApi::Client::Epic -# epic.label.wont_be_empty -# end -# end -#end diff --git a/test/epics_test.rb b/test/epics_test.rb deleted file mode 100644 index 67e070b..0000000 --- a/test/epics_test.rb +++ /dev/null @@ -1,19 +0,0 @@ -#require_relative '../minitest_helper' -# -#describe TrackerApi::Client do -# let(:client) { TrackerApi::Client.new } -# let(:projects) { VCR.use_cassette('all projects') { client.projects.all } } -# let(:project) { projects.first } -# -# describe 'Project' do -# it 'can get epics for a project' do -# VCR.use_cassette('project epics') do -# epics = project.epics -# -# epics.must_be_instance_of TrackerApi::Client::Epics -# epics.wont_be_empty -# epics.size.must_equal 2 -# end -# end -# end -#end diff --git a/test/iterations_test.rb b/test/iterations_test.rb deleted file mode 100644 index d88bd09..0000000 --- a/test/iterations_test.rb +++ /dev/null @@ -1,17 +0,0 @@ -#require_relative '../minitest_helper' -# -#describe TrackerApi::Client do -# let(:client) { TrackerApi::Client.new } -# let(:projects) { VCR.use_cassette('all projects') { client.projects.all } } -# let(:project) { projects.first } -# -# describe 'Project' do -# it 'can get current iteration for a project' do -# VCR.use_cassette('current iteration') do -# iteration = project.current_iteration -# -# iteration.must_be_instance_of TrackerApi::Client::Iteration -# end -# end -# end -#end diff --git a/test/minitest_helper.rb b/test/minitest_helper.rb index 2b2dc96..8a878b9 100644 --- a/test/minitest_helper.rb +++ b/test/minitest_helper.rb @@ -20,7 +20,7 @@ c.cassette_library_dir = File.expand_path('../vcr/cassettes', __FILE__).to_s c.default_cassette_options = { serialize_with: :json } c.hook_into :faraday - c.allow_http_connections_when_no_cassette = true + c.allow_http_connections_when_no_cassette = false end # These API Tokens are for a user with just one Public Sample Project diff --git a/test/project_test.rb b/test/project_test.rb index c458a33..1273160 100644 --- a/test/project_test.rb +++ b/test/project_test.rb @@ -1,17 +1,80 @@ require_relative 'minitest_helper' -describe TrackerApi::Client do - let(:client) { TrackerApi::Client.new token: API_TOKEN_1 } - #let(:projects) { VCR.use_cassette('all projects') { client.projects.all } } - let(:project_id) { '123456' } #{ projects.first.id } - - describe 'Projects' do - it 'can get project by id' do - VCR.use_cassette('get project') do - project = client.project(project_id) - - project.must_be_instance_of TrackerApi::Resources::Project - project.id.must_equal project_id +describe TrackerApi::Resources::Project do + let(:pt_user) { PT_USER_1 } + let(:client) { TrackerApi::Client.new token: pt_user[:token] } + let(:project_id) { pt_user[:project_id] } + let(:project) { VCR.use_cassette('get project') { client.project(project_id) } } + + describe '.epics' do + it 'gets all epics for this project' do + VCR.use_cassette('get epics', record: :new_episodes) do + epics = project.epics + + epics.wont_be_empty + epic = epics.first + epic.must_be_instance_of TrackerApi::Resources::Epic + end + end + + describe 'with eager loading of epics' do + let(:project_with_epics) do + VCR.use_cassette('get project with epics') do + client.project(project_id, fields: ':default,epics(:default,label(name))') + end + end + + # does not raise VCR::Errors::UnhandledHTTPRequestError + it 'does not make an extra request' do + epics = project_with_epics.epics + + epics.wont_be_empty + epic = epics.first + epic.must_be_instance_of TrackerApi::Resources::Epic + end + end + end + + describe '.iterations' do + it 'can get only done iterations' do + VCR.use_cassette('get done iterations', record: :new_episodes) do + offset = -project.number_of_done_iterations_to_show.to_i + done_iterations = project.iterations(scope: :done, offset: offset) + + done_iterations.wont_be_empty + done_iterations.length.must_be :<, project.number_of_done_iterations_to_show + + iteration = done_iterations.first + iteration.must_be_instance_of TrackerApi::Resources::Iteration + end + end + + it 'can get current iteration' do + VCR.use_cassette('get current iteration', record: :new_episodes) do + iterations = project.iterations(scope: :current) + + iterations.wont_be_empty + + current = iterations.first + current.must_be_instance_of TrackerApi::Resources::Iteration + current.stories.wont_be_empty + + story = current.stories.first + story.must_be_instance_of TrackerApi::Resources::Story + end + end + end + + describe '.stories' do + it 'can get unscheduled stories (icebox)' do + VCR.use_cassette('get unscheduled stories', record: :new_episodes) do + stories = project.stories(with_state: :unscheduled) + + stories.wont_be_empty + + story = stories.first + story.must_be_instance_of TrackerApi::Resources::Story + story.current_state.must_equal 'unscheduled' end end end diff --git a/test/projects_test.rb b/test/projects_test.rb deleted file mode 100644 index f1afa05..0000000 --- a/test/projects_test.rb +++ /dev/null @@ -1,19 +0,0 @@ -require_relative 'minitest_helper' - -describe TrackerApi::Client do - let(:pt_user) { PT_USER_1 } - let(:client) { TrackerApi::Client.new token: pt_user[:token] } - - describe 'Projects' do - it 'can get all projects' do - VCR.use_cassette('all projects', record: :new_episodes) do - projects = client.projects(fields: ':default,account,current_velocity,labels(name),epics(:default,label(name))') - - projects.wont_be_empty - project = projects.first - project.must_be_instance_of TrackerApi::Resources::Project - project.id.must_equal pt_user[:project_id] - end - end - end -end diff --git a/test/vcr/cassettes/all_projects.json b/test/vcr/cassettes/all_projects.json deleted file mode 100644 index 07c2a6f..0000000 --- a/test/vcr/cassettes/all_projects.json +++ /dev/null @@ -1,84 +0,0 @@ -{"http_interactions": [ - { - "request": { - "method": "get", - "uri": "https://www.pivotaltracker.com/services/v5/projects", - "body": { - "encoding": "US-ASCII", - "string": "" - }, - "headers": { - "User-Agent": ["Ruby/2.0.0 (x86_64-darwin13.0.2; ruby) TrackerApi/0.0.1 Faraday/0.8.9"], - "X-TrackerToken": ["0de3ac29f13082f0c16ed76f3f3f6895"] - } - }, - "response": { - "status": { - "code": 200, - "message": null - }, - "headers": { - "content-type": ["application/json; charset=utf-8"], - "transfer-encoding": ["chunked"], - "connection": ["close"], - "status": ["200"], - "x-powered-by": ["Phusion Passenger (mod_rails/mod_rack) 3.0.14"], - "cache-control": ["private, max-age=0, must-revalidate"], - "etag": ["\"1036d8283fedd6b8195cba956a2f947b\""], - "x-runtime": ["40"], - "server": ["nginx/1.2.2 + Phusion Passenger 3.0.14 (mod_rails/mod_rack)"], - "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 \"created_at\": \"2014-03-02T07:11:04Z\",\n \"version\": 1,\n \"current_iteration_number\": 6,\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"enable_following\": true,\n \"time_zone\": {\n \"offset\": \"-07:00\",\n \"olson_name\": \"America/Los_Angeles\",\n \"kind\": \"time_zone\"\n },\n \"point_scale_is_custom\": false,\n \"account_id\": 621384,\n \"atom_enabled\": false,\n \"has_google_domain\": false,\n \"start_time\": \"2014-02-10T08:00:00Z\",\n \"number_of_done_iterations_to_show\": 12,\n \"week_start_day\": \"Monday\",\n \"id\": 1027488,\n \"enable_tasks\": true,\n \"bugs_and_chores_are_estimatable\": false,\n \"point_scale\": \"0,1,2,3\",\n \"public\": false,\n \"enable_incoming_emails\": true,\n \"profile_content\": \"This is a demo project, created by Tracker, with example stories for a simple shopping web site.\",\n \"velocity_averaged_over\": 3,\n \"name\": \"My Sample Project\",\n \"iteration_length\": 1,\n \"kind\": \"project\",\n \"initial_velocity\": 10,\n \"enable_planned_mode\": false\n }\n]" - }, - "http_version": null - }, - "recorded_at": "Fri, 21 Mar 2014 06:15:34 GMT" - }, - { - "request": { - "method": "get", - "uri": "https://www.pivotaltracker.com/services/v5/projects?fields=%3Adefault%2Caccount%2Ccurrent_velocity%2Clabels%28name%29%2Cepics%28%3Adefault%2Clabel%28name%29%29", - "body": { - "encoding": "US-ASCII", - "string": "" - }, - "headers": { - "User-Agent": ["Ruby/2.0.0 (x86_64-darwin13.0.2; ruby) TrackerApi/0.0.1 Faraday/0.8.9"], - "X-TrackerToken": ["0de3ac29f13082f0c16ed76f3f3f6895"] - } - }, - "response": { - "status": { - "code": 200, - "message": null - }, - "headers": { - "content-type": ["application/json; charset=utf-8"], - "transfer-encoding": ["chunked"], - "connection": ["close"], - "status": ["200"], - "x-powered-by": ["Phusion Passenger (mod_rails/mod_rack) 3.0.14"], - "cache-control": ["private, max-age=0, must-revalidate"], - "etag": ["\"31cd7f9529f30277d8817c988d748c0e\""], - "x-runtime": ["397"], - "server": ["nginx/1.2.2 + Phusion Passenger 3.0.14 (mod_rails/mod_rack)"], - "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 \"created_at\": \"2014-03-02T07:11:04Z\",\n \"version\": 1,\n \"current_iteration_number\": 6,\n \"account\": {\n \"days_left\": 41,\n \"id\": 621384,\n \"status\": \"active\",\n \"name\": \"Trackher User1\",\n \"kind\": \"account_summary\"\n },\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"enable_following\": true,\n \"time_zone\": {\n \"offset\": \"-07:00\",\n \"olson_name\": \"America/Los_Angeles\",\n \"kind\": \"time_zone\"\n },\n \"point_scale_is_custom\": false,\n \"account_id\": 621384,\n \"epics\": [\n {\n \"created_at\": \"2014-03-02T07:11:07Z\",\n \"label\": {\n \"id\": 7849080,\n \"name\": \"admin\"\n },\n \"description\": \"Get the Admin users working on the site\",\n \"updated_at\": \"2014-03-02T07:11:07Z\",\n \"url\": \"http://www.pivotaltracker.com/epic/show/1087314\",\n \"project_id\": 1027488,\n \"id\": 1087314,\n \"name\": \"Admin Users\",\n \"kind\": \"epic\"\n },\n {\n \"created_at\": \"2014-03-02T07:11:07Z\",\n \"label\": {\n \"id\": 7849082,\n \"name\": \"shopping\"\n },\n \"description\": \"Allow shoppers to use the site\",\n \"updated_at\": \"2014-03-02T07:11:07Z\",\n \"url\": \"http://www.pivotaltracker.com/epic/show/1087316\",\n \"project_id\": 1027488,\n \"id\": 1087316,\n \"name\": \"Shoppers\",\n \"kind\": \"epic\"\n }\n ],\n \"labels\": [\n {\n \"id\": 7849080,\n \"name\": \"admin\"\n },\n {\n \"id\": 7849106,\n \"name\": \"blog\"\n },\n {\n \"id\": 7849086,\n \"name\": \"cart\"\n },\n {\n \"id\": 7849090,\n \"name\": \"checkout\"\n },\n {\n \"id\": 7849078,\n \"name\": \"deployment\"\n },\n {\n \"id\": 7849100,\n \"name\": \"design\"\n },\n {\n \"id\": 7849112,\n \"name\": \"epic\"\n },\n {\n \"id\": 7849104,\n \"name\": \"featured products\"\n },\n {\n \"id\": 7849110,\n \"name\": \"ie6\"\n },\n {\n \"id\": 7849092,\n \"name\": \"needs discussion\"\n },\n {\n \"id\": 7849094,\n \"name\": \"orders\"\n },\n {\n \"id\": 7849108,\n \"name\": \"reporting\"\n },\n {\n \"id\": 7849088,\n \"name\": \"search\"\n },\n {\n \"id\": 7849098,\n \"name\": \"shopper accounts\"\n },\n {\n \"id\": 7849082,\n \"name\": \"shopping\"\n },\n {\n \"id\": 7849096,\n \"name\": \"signup / signin\"\n },\n {\n \"id\": 7849084,\n \"name\": \"usability\"\n },\n {\n \"id\": 7849102,\n \"name\": \"user generated content\"\n }\n ],\n \"atom_enabled\": false,\n \"has_google_domain\": false,\n \"start_time\": \"2014-02-10T08:00:00Z\",\n \"number_of_done_iterations_to_show\": 12,\n \"week_start_day\": \"Monday\",\n \"id\": 1027488,\n \"enable_tasks\": true,\n \"bugs_and_chores_are_estimatable\": false,\n \"point_scale\": \"0,1,2,3\",\n \"current_velocity\": 1,\n \"public\": false,\n \"enable_incoming_emails\": true,\n \"profile_content\": \"This is a demo project, created by Tracker, with example stories for a simple shopping web site.\",\n \"velocity_averaged_over\": 3,\n \"name\": \"My Sample Project\",\n \"iteration_length\": 1,\n \"kind\": \"project\",\n \"initial_velocity\": 10,\n \"enable_planned_mode\": false\n }\n]" - }, - "http_version": null - }, - "recorded_at": "Fri, 21 Mar 2014 06:41:33 GMT" - } -], "recorded_with": "VCR 2.8.0"} diff --git a/test/vcr/cassettes/get_all_projects.json b/test/vcr/cassettes/get_all_projects.json new file mode 100644 index 0000000..26f8c4c --- /dev/null +++ b/test/vcr/cassettes/get_all_projects.json @@ -0,0 +1 @@ +{"http_interactions":[{"request":{"method":"get","uri":"https://www.pivotaltracker.com/services/v5/projects?fields=%3Adefault%2Caccount%2Ccurrent_velocity%2Clabels%28name%29%2Cepics%28%3Adefault%2Clabel%28name%29%29","body":{"encoding":"US-ASCII","string":""},"headers":{"User-Agent":["Ruby/2.0.0 (x86_64-darwin13.0.2; ruby) TrackerApi/0.0.1 Faraday/0.8.9"],"X-TrackerToken":["0de3ac29f13082f0c16ed76f3f3f6895"]}},"response":{"status":{"code":200,"message":null},"headers":{"content-type":["application/json; charset=utf-8"],"transfer-encoding":["chunked"],"connection":["close"],"status":["200"],"x-powered-by":["Phusion Passenger (mod_rails/mod_rack) 3.0.14"],"cache-control":["private, max-age=0, must-revalidate"],"etag":["\"0d122ab3cf93bd85140ffc95b445d705\""],"x-runtime":["120"],"server":["nginx/1.2.2 + Phusion Passenger 3.0.14 (mod_rails/mod_rack)"],"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 \"created_at\": \"2014-03-02T07:11:04Z\",\n \"version\": 1,\n \"current_iteration_number\": 6,\n \"account\": {\n \"days_left\": 39,\n \"id\": 621384,\n \"status\": \"active\",\n \"name\": \"Trackher User1\",\n \"kind\": \"account_summary\"\n },\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"enable_following\": true,\n \"time_zone\": {\n \"offset\": \"-07:00\",\n \"olson_name\": \"America/Los_Angeles\",\n \"kind\": \"time_zone\"\n },\n \"point_scale_is_custom\": false,\n \"account_id\": 621384,\n \"epics\": [\n {\n \"created_at\": \"2014-03-02T07:11:07Z\",\n \"label\": {\n \"id\": 7849080,\n \"name\": \"admin\"\n },\n \"description\": \"Get the Admin users working on the site\",\n \"updated_at\": \"2014-03-02T07:11:07Z\",\n \"url\": \"http://www.pivotaltracker.com/epic/show/1087314\",\n \"project_id\": 1027488,\n \"id\": 1087314,\n \"name\": \"Admin Users\",\n \"kind\": \"epic\"\n },\n {\n \"created_at\": \"2014-03-02T07:11:07Z\",\n \"label\": {\n \"id\": 7849082,\n \"name\": \"shopping\"\n },\n \"description\": \"Allow shoppers to use the site\",\n \"updated_at\": \"2014-03-02T07:11:07Z\",\n \"url\": \"http://www.pivotaltracker.com/epic/show/1087316\",\n \"project_id\": 1027488,\n \"id\": 1087316,\n \"name\": \"Shoppers\",\n \"kind\": \"epic\"\n }\n ],\n \"labels\": [\n {\n \"id\": 7849080,\n \"name\": \"admin\"\n },\n {\n \"id\": 7849106,\n \"name\": \"blog\"\n },\n {\n \"id\": 7849086,\n \"name\": \"cart\"\n },\n {\n \"id\": 7849090,\n \"name\": \"checkout\"\n },\n {\n \"id\": 7849078,\n \"name\": \"deployment\"\n },\n {\n \"id\": 7849100,\n \"name\": \"design\"\n },\n {\n \"id\": 7849112,\n \"name\": \"epic\"\n },\n {\n \"id\": 7849104,\n \"name\": \"featured products\"\n },\n {\n \"id\": 7849110,\n \"name\": \"ie6\"\n },\n {\n \"id\": 7849092,\n \"name\": \"needs discussion\"\n },\n {\n \"id\": 7849094,\n \"name\": \"orders\"\n },\n {\n \"id\": 7849108,\n \"name\": \"reporting\"\n },\n {\n \"id\": 7849088,\n \"name\": \"search\"\n },\n {\n \"id\": 7849098,\n \"name\": \"shopper accounts\"\n },\n {\n \"id\": 7849082,\n \"name\": \"shopping\"\n },\n {\n \"id\": 7849096,\n \"name\": \"signup / signin\"\n },\n {\n \"id\": 7849084,\n \"name\": \"usability\"\n },\n {\n \"id\": 7849102,\n \"name\": \"user generated content\"\n }\n ],\n \"atom_enabled\": false,\n \"has_google_domain\": false,\n \"start_time\": \"2014-02-10T08:00:00Z\",\n \"number_of_done_iterations_to_show\": 12,\n \"week_start_day\": \"Monday\",\n \"id\": 1027488,\n \"enable_tasks\": true,\n \"bugs_and_chores_are_estimatable\": false,\n \"point_scale\": \"0,1,2,3\",\n \"current_velocity\": 1,\n \"public\": false,\n \"enable_incoming_emails\": true,\n \"profile_content\": \"This is a demo project, created by Tracker, with example stories for a simple shopping web site.\",\n \"velocity_averaged_over\": 3,\n \"name\": \"My Sample Project\",\n \"iteration_length\": 1,\n \"kind\": \"project\",\n \"initial_velocity\": 10,\n \"enable_planned_mode\": false\n }\n]"},"http_version":null},"recorded_at":"Sun, 23 Mar 2014 06:28:26 GMT"}],"recorded_with":"VCR 2.8.0"} \ No newline at end of file diff --git a/test/vcr/cassettes/get_current_iteration.json b/test/vcr/cassettes/get_current_iteration.json new file mode 100644 index 0000000..2e204e7 --- /dev/null +++ b/test/vcr/cassettes/get_current_iteration.json @@ -0,0 +1 @@ +{"http_interactions":[{"request":{"method":"get","uri":"https://www.pivotaltracker.com/services/v5/projects/1027488/iterations?scope=current","body":{"encoding":"US-ASCII","string":""},"headers":{"User-Agent":["Ruby/2.0.0 (x86_64-darwin13.0.2; ruby) TrackerApi/0.0.1 Faraday/0.8.9"],"X-TrackerToken":["0de3ac29f13082f0c16ed76f3f3f6895"]}},"response":{"status":{"code":200,"message":null},"headers":{"content-type":["application/json; charset=utf-8"],"transfer-encoding":["chunked"],"connection":["close"],"status":["200"],"x-powered-by":["Phusion Passenger (mod_rails/mod_rack) 3.0.14"],"cache-control":["private, max-age=0, must-revalidate"],"x-tracker-project-version":["1"],"etag":["\"b7929dd9d79159714ee85b3c70fe1d79\""],"x-runtime":["150"],"server":["nginx/1.2.2 + Phusion Passenger 3.0.14 (mod_rails/mod_rack)"],"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 \"finish\": \"2014-03-24T07:00:00Z\",\n \"kind\": \"iteration\",\n \"stories\": [\n {\n \"name\": \"Shopper should be able to view contents of shopping cart\",\n \"story_type\": \"feature\",\n \"requested_by_id\": 1266314,\n \"kind\": \"story\",\n \"created_at\": \"2014-02-17T00:00:00Z\",\n \"labels\": [\n {\n \"name\": \"cart\",\n \"kind\": \"label\",\n \"created_at\": \"2014-03-02T07:11:05Z\",\n \"updated_at\": \"2014-03-02T07:11:05Z\",\n \"id\": 7849086,\n \"project_id\": 1027488\n },\n {\n \"name\": \"shopping\",\n \"kind\": \"label\",\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"id\": 7849082,\n \"project_id\": 1027488\n }\n ],\n \"current_state\": \"delivered\",\n \"updated_at\": \"2014-03-02T07:11:05Z\",\n \"id\": 66727998,\n \"project_id\": 1027488,\n \"owner_ids\": [\n\n ],\n \"url\": \"http://www.pivotaltracker.com/story/show/66727998\",\n \"estimate\": 2,\n \"description\": \"Cart icon in top right corner, with a number indicating how many items in cart\"\n },\n {\n \"name\": \"Shopper should be able to remove product from shopping cart\",\n \"story_type\": \"feature\",\n \"requested_by_id\": 1266314,\n \"kind\": \"story\",\n \"created_at\": \"2014-02-17T00:00:00Z\",\n \"labels\": [\n {\n \"name\": \"cart\",\n \"kind\": \"label\",\n \"created_at\": \"2014-03-02T07:11:05Z\",\n \"updated_at\": \"2014-03-02T07:11:05Z\",\n \"id\": 7849086,\n \"project_id\": 1027488\n },\n {\n \"name\": \"shopping\",\n \"kind\": \"label\",\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"id\": 7849082,\n \"project_id\": 1027488\n }\n ],\n \"current_state\": \"delivered\",\n \"updated_at\": \"2014-03-02T07:11:05Z\",\n \"id\": 66728000,\n \"project_id\": 1027488,\n \"owner_ids\": [\n\n ],\n \"url\": \"http://www.pivotaltracker.com/story/show/66728000\",\n \"estimate\": 1\n },\n {\n \"name\": \"Cart manipulation should be AJAXy\",\n \"story_type\": \"feature\",\n \"requested_by_id\": 1266314,\n \"kind\": \"story\",\n \"created_at\": \"2014-02-17T00:00:00Z\",\n \"labels\": [\n {\n \"name\": \"cart\",\n \"kind\": \"label\",\n \"created_at\": \"2014-03-02T07:11:05Z\",\n \"updated_at\": \"2014-03-02T07:11:05Z\",\n \"id\": 7849086,\n \"project_id\": 1027488\n },\n {\n \"name\": \"shopping\",\n \"kind\": \"label\",\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"id\": 7849082,\n \"project_id\": 1027488\n }\n ],\n \"current_state\": \"finished\",\n \"updated_at\": \"2014-03-02T07:11:05Z\",\n \"id\": 66728002,\n \"project_id\": 1027488,\n \"owner_ids\": [\n\n ],\n \"url\": \"http://www.pivotaltracker.com/story/show/66728002\",\n \"estimate\": 1\n },\n {\n \"name\": \"Some product photos not scaled properly when browsing products\",\n \"story_type\": \"bug\",\n \"requested_by_id\": 1266314,\n \"kind\": \"story\",\n \"created_at\": \"2014-02-17T00:00:00Z\",\n \"labels\": [\n {\n \"name\": \"shopping\",\n \"kind\": \"label\",\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"id\": 7849082,\n \"project_id\": 1027488\n }\n ],\n \"current_state\": \"started\",\n \"updated_at\": \"2014-03-02T07:11:05Z\",\n \"id\": 66728004,\n \"project_id\": 1027488,\n \"owner_ids\": [\n\n ],\n \"url\": \"http://www.pivotaltracker.com/story/show/66728004\"\n }\n ],\n \"start\": \"2014-03-17T07:00:00Z\",\n \"project_id\": 1027488,\n \"team_strength\": 1,\n \"number\": 6\n }\n]"},"http_version":null},"recorded_at":"Sun, 23 Mar 2014 06:28:28 GMT"}],"recorded_with":"VCR 2.8.0"} \ No newline at end of file diff --git a/test/vcr/cassettes/get_done_iterations.json b/test/vcr/cassettes/get_done_iterations.json new file mode 100644 index 0000000..6b2ddb2 --- /dev/null +++ b/test/vcr/cassettes/get_done_iterations.json @@ -0,0 +1 @@ +{"http_interactions":[{"request":{"method":"get","uri":"https://www.pivotaltracker.com/services/v5/projects/1027488/iterations?scope=done&offset=-12","body":{"encoding":"US-ASCII","string":""},"headers":{"User-Agent":["Ruby/2.0.0 (x86_64-darwin13.0.2; ruby) TrackerApi/0.0.1 Faraday/0.8.9"],"X-TrackerToken":["0de3ac29f13082f0c16ed76f3f3f6895"]}},"response":{"status":{"code":200,"message":null},"headers":{"content-type":["application/json; charset=utf-8"],"transfer-encoding":["chunked"],"connection":["close"],"status":["200"],"x-powered-by":["Phusion Passenger (mod_rails/mod_rack) 3.0.14"],"x-tracker-project-version":["1"],"cache-control":["private, max-age=0, must-revalidate"],"x-tracker-pagination-offset":["-12"],"etag":["\"5f632dec8cf809f0b82e3f7f5d91a801\""],"x-runtime":["522"],"x-tracker-pagination-returned":["5"],"x-tracker-pagination-limit":["10"],"x-tracker-pagination-total":["5"],"server":["nginx/1.2.2 + Phusion Passenger 3.0.14 (mod_rails/mod_rack)"],"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 \"number\": 1,\n \"kind\": \"iteration\",\n \"finish\": \"2014-02-17T08:00:00Z\",\n \"project_id\": 1027488,\n \"start\": \"2014-02-10T08:00:00Z\",\n \"stories\": [\n {\n \"name\": \"Setup development environment\",\n \"kind\": \"story\",\n \"description\": \"We need 2 machines set up\",\n \"accepted_at\": \"2014-02-11T00:00:00Z\",\n \"id\": 66727974,\n \"project_id\": 1027488,\n \"current_state\": \"accepted\",\n \"owner_ids\": [\n\n ],\n \"created_at\": \"2014-02-10T00:00:00Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"requested_by_id\": 1266314,\n \"labels\": [\n\n ],\n \"story_type\": \"chore\",\n \"url\": \"http://www.pivotaltracker.com/story/show/66727974\"\n },\n {\n \"name\": \"Setup demo server\",\n \"kind\": \"story\",\n \"description\": \"Should be accessible from outside the network, with basic auth\",\n \"accepted_at\": \"2014-02-11T00:00:00Z\",\n \"id\": 66727976,\n \"project_id\": 1027488,\n \"current_state\": \"accepted\",\n \"owner_ids\": [\n\n ],\n \"created_at\": \"2014-02-10T00:00:00Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"requested_by_id\": 1266314,\n \"labels\": [\n {\n \"name\": \"deployment\",\n \"kind\": \"label\",\n \"id\": 7849078,\n \"project_id\": 1027488,\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\"\n }\n ],\n \"story_type\": \"chore\",\n \"url\": \"http://www.pivotaltracker.com/story/show/66727976\"\n },\n {\n \"name\": \"Admin should be able to login\",\n \"kind\": \"story\",\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 \"accepted_at\": \"2014-02-11T00:00:00Z\",\n \"id\": 66727978,\n \"project_id\": 1027488,\n \"current_state\": \"accepted\",\n \"owner_ids\": [\n\n ],\n \"created_at\": \"2014-02-10T00:00:00Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"estimate\": 2,\n \"requested_by_id\": 1266314,\n \"labels\": [\n {\n \"name\": \"admin\",\n \"kind\": \"label\",\n \"id\": 7849080,\n \"project_id\": 1027488,\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\"\n }\n ],\n \"story_type\": \"feature\",\n \"url\": \"http://www.pivotaltracker.com/story/show/66727978\"\n },\n {\n \"name\": \"Admin should be able to create new product\",\n \"kind\": \"story\",\n \"description\": \"Product information includes title, description, price, SKU.\",\n \"accepted_at\": \"2014-02-11T00:00:00Z\",\n \"id\": 66727980,\n \"project_id\": 1027488,\n \"current_state\": \"accepted\",\n \"owner_ids\": [\n\n ],\n \"created_at\": \"2014-02-10T00:00:00Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"estimate\": 1,\n \"requested_by_id\": 1266314,\n \"labels\": [\n {\n \"name\": \"admin\",\n \"kind\": \"label\",\n \"id\": 7849080,\n \"project_id\": 1027488,\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\"\n }\n ],\n \"story_type\": \"feature\",\n \"url\": \"http://www.pivotaltracker.com/story/show/66727980\"\n },\n {\n \"name\": \"Admin should be able to upload product photo\",\n \"kind\": \"story\",\n \"accepted_at\": \"2014-02-11T00:00:00Z\",\n \"id\": 66727982,\n \"project_id\": 1027488,\n \"current_state\": \"accepted\",\n \"owner_ids\": [\n\n ],\n \"created_at\": \"2014-02-10T00:00:00Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"estimate\": 2,\n \"requested_by_id\": 1266314,\n \"labels\": [\n {\n \"name\": \"admin\",\n \"kind\": \"label\",\n \"id\": 7849080,\n \"project_id\": 1027488,\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\"\n }\n ],\n \"story_type\": \"feature\",\n \"url\": \"http://www.pivotaltracker.com/story/show/66727982\"\n }\n ],\n \"team_strength\": 1\n },\n {\n \"number\": 2,\n \"kind\": \"iteration\",\n \"finish\": \"2014-02-24T08:00:00Z\",\n \"project_id\": 1027488,\n \"start\": \"2014-02-17T08:00:00Z\",\n \"stories\": [\n {\n \"name\": \"Admin should be able to upload multiple product photos and mark one as the primary\",\n \"kind\": \"story\",\n \"accepted_at\": \"2014-02-18T00:00:00Z\",\n \"id\": 66727984,\n \"project_id\": 1027488,\n \"current_state\": \"accepted\",\n \"owner_ids\": [\n\n ],\n \"created_at\": \"2014-02-10T00:00:00Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"estimate\": 3,\n \"requested_by_id\": 1266314,\n \"labels\": [\n {\n \"name\": \"admin\",\n \"kind\": \"label\",\n \"id\": 7849080,\n \"project_id\": 1027488,\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\"\n }\n ],\n \"story_type\": \"feature\",\n \"url\": \"http://www.pivotaltracker.com/story/show/66727984\"\n },\n {\n \"name\": \"Shopper should see list of products, with primary photo as thumbnail\",\n \"kind\": \"story\",\n \"accepted_at\": \"2014-02-18T00:00:00Z\",\n \"id\": 66727986,\n \"project_id\": 1027488,\n \"current_state\": \"accepted\",\n \"owner_ids\": [\n\n ],\n \"created_at\": \"2014-02-10T00:00:00Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"estimate\": 2,\n \"requested_by_id\": 1266314,\n \"labels\": [\n {\n \"name\": \"shopping\",\n \"kind\": \"label\",\n \"id\": 7849082,\n \"project_id\": 1027488,\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\"\n }\n ],\n \"story_type\": \"feature\",\n \"url\": \"http://www.pivotaltracker.com/story/show/66727986\"\n },\n {\n \"name\": \"Product browsing should be paginated, with 10 products per page\",\n \"kind\": \"story\",\n \"accepted_at\": \"2014-02-18T00:00:00Z\",\n \"id\": 66727988,\n \"project_id\": 1027488,\n \"current_state\": \"accepted\",\n \"owner_ids\": [\n\n ],\n \"created_at\": \"2014-02-10T00:00:00Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"estimate\": 1,\n \"requested_by_id\": 1266314,\n \"labels\": [\n {\n \"name\": \"shopping\",\n \"kind\": \"label\",\n \"id\": 7849082,\n \"project_id\": 1027488,\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\"\n }\n ],\n \"story_type\": \"feature\",\n \"url\": \"http://www.pivotaltracker.com/story/show/66727988\"\n },\n {\n \"name\": \"Make product browsing pagination AJAXy\",\n \"kind\": \"story\",\n \"accepted_at\": \"2014-02-18T00:00:00Z\",\n \"id\": 66727990,\n \"project_id\": 1027488,\n \"current_state\": \"accepted\",\n \"owner_ids\": [\n\n ],\n \"created_at\": \"2014-02-10T00:00:00Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"estimate\": 2,\n \"requested_by_id\": 1266314,\n \"labels\": [\n {\n \"name\": \"shopping\",\n \"kind\": \"label\",\n \"id\": 7849082,\n \"project_id\": 1027488,\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\"\n },\n {\n \"name\": \"usability\",\n \"kind\": \"label\",\n \"id\": 7849084,\n \"project_id\": 1027488,\n \"created_at\": \"2014-03-02T07:11:05Z\",\n \"updated_at\": \"2014-03-02T07:11:05Z\"\n }\n ],\n \"story_type\": \"feature\",\n \"url\": \"http://www.pivotaltracker.com/story/show/66727990\"\n },\n {\n \"name\": \"Admin should be able to import multiple new products from CSV file\",\n \"kind\": \"story\",\n \"accepted_at\": \"2014-02-18T00:00:00Z\",\n \"id\": 66727992,\n \"project_id\": 1027488,\n \"current_state\": \"accepted\",\n \"owner_ids\": [\n\n ],\n \"created_at\": \"2014-02-10T00:00:00Z\",\n \"updated_at\": \"2014-03-02T07:11:05Z\",\n \"estimate\": 3,\n \"requested_by_id\": 1266314,\n \"labels\": [\n {\n \"name\": \"admin\",\n \"kind\": \"label\",\n \"id\": 7849080,\n \"project_id\": 1027488,\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\"\n }\n ],\n \"story_type\": \"feature\",\n \"url\": \"http://www.pivotaltracker.com/story/show/66727992\"\n }\n ],\n \"team_strength\": 1\n },\n {\n \"number\": 3,\n \"kind\": \"iteration\",\n \"finish\": \"2014-03-03T08:00:00Z\",\n \"project_id\": 1027488,\n \"start\": \"2014-02-24T08:00:00Z\",\n \"stories\": [\n {\n \"name\": \"Shopper should be able to click on a product, and see all product details, including photos\",\n \"kind\": \"story\",\n \"accepted_at\": \"2014-03-02T00:00:00Z\",\n \"id\": 66727994,\n \"project_id\": 1027488,\n \"current_state\": \"accepted\",\n \"owner_ids\": [\n\n ],\n \"created_at\": \"2014-02-17T00:00:00Z\",\n \"updated_at\": \"2014-03-02T07:11:05Z\",\n \"estimate\": 1,\n \"requested_by_id\": 1266314,\n \"labels\": [\n {\n \"name\": \"shopping\",\n \"kind\": \"label\",\n \"id\": 7849082,\n \"project_id\": 1027488,\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\"\n }\n ],\n \"story_type\": \"feature\",\n \"url\": \"http://www.pivotaltracker.com/story/show/66727994\"\n },\n {\n \"name\": \"Shopper should be able to add product to shopping cart\",\n \"kind\": \"story\",\n \"accepted_at\": \"2014-03-02T07:11:05Z\",\n \"id\": 66727996,\n \"project_id\": 1027488,\n \"current_state\": \"accepted\",\n \"owner_ids\": [\n\n ],\n \"created_at\": \"2014-02-17T00:00:00Z\",\n \"updated_at\": \"2014-03-02T07:11:05Z\",\n \"estimate\": 1,\n \"requested_by_id\": 1266314,\n \"labels\": [\n {\n \"name\": \"cart\",\n \"kind\": \"label\",\n \"id\": 7849086,\n \"project_id\": 1027488,\n \"created_at\": \"2014-03-02T07:11:05Z\",\n \"updated_at\": \"2014-03-02T07:11:05Z\"\n },\n {\n \"name\": \"shopping\",\n \"kind\": \"label\",\n \"id\": 7849082,\n \"project_id\": 1027488,\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\"\n }\n ],\n \"story_type\": \"feature\",\n \"url\": \"http://www.pivotaltracker.com/story/show/66727996\"\n }\n ],\n \"team_strength\": 1\n },\n {\n \"number\": 4,\n \"kind\": \"iteration\",\n \"finish\": \"2014-03-10T07:00:00Z\",\n \"project_id\": 1027488,\n \"start\": \"2014-03-03T08:00:00Z\",\n \"stories\": [\n\n ],\n \"team_strength\": 1\n },\n {\n \"number\": 5,\n \"kind\": \"iteration\",\n \"finish\": \"2014-03-17T07:00:00Z\",\n \"project_id\": 1027488,\n \"start\": \"2014-03-10T07:00:00Z\",\n \"stories\": [\n\n ],\n \"team_strength\": 1\n }\n]"},"http_version":null},"recorded_at":"Sun, 23 Mar 2014 06:28:29 GMT"}],"recorded_with":"VCR 2.8.0"} \ No newline at end of file diff --git a/test/vcr/cassettes/get_epics.json b/test/vcr/cassettes/get_epics.json new file mode 100644 index 0000000..6d1d329 --- /dev/null +++ b/test/vcr/cassettes/get_epics.json @@ -0,0 +1 @@ +{"http_interactions":[{"request":{"method":"get","uri":"https://www.pivotaltracker.com/services/v5/projects/1027488/epics","body":{"encoding":"US-ASCII","string":""},"headers":{"User-Agent":["Ruby/2.0.0 (x86_64-darwin13.0.2; ruby) TrackerApi/0.0.1 Faraday/0.8.9"],"X-TrackerToken":["0de3ac29f13082f0c16ed76f3f3f6895"]}},"response":{"status":{"code":200,"message":null},"headers":{"content-type":["application/json; charset=utf-8"],"transfer-encoding":["chunked"],"connection":["close"],"status":["200"],"x-powered-by":["Phusion Passenger (mod_rails/mod_rack) 3.0.14"],"cache-control":["private, max-age=0, must-revalidate"],"x-tracker-project-version":["1"],"etag":["\"fd893b81ac58cf4eb575d740e8475145\""],"x-runtime":["42"],"server":["nginx/1.2.2 + Phusion Passenger 3.0.14 (mod_rails/mod_rack)"],"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 \"name\": \"Admin Users\",\n \"kind\": \"epic\",\n \"label\": {\n \"name\": \"admin\",\n \"kind\": \"label\",\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"id\": 7849080,\n \"project_id\": 1027488\n },\n \"created_at\": \"2014-03-02T07:11:07Z\",\n \"updated_at\": \"2014-03-02T07:11:07Z\",\n \"id\": 1087314,\n \"url\": \"http://www.pivotaltracker.com/epic/show/1087314\",\n \"project_id\": 1027488,\n \"description\": \"Get the Admin users working on the site\"\n },\n {\n \"name\": \"Shoppers\",\n \"kind\": \"epic\",\n \"label\": {\n \"name\": \"shopping\",\n \"kind\": \"label\",\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"id\": 7849082,\n \"project_id\": 1027488\n },\n \"created_at\": \"2014-03-02T07:11:07Z\",\n \"updated_at\": \"2014-03-02T07:11:07Z\",\n \"id\": 1087316,\n \"url\": \"http://www.pivotaltracker.com/epic/show/1087316\",\n \"project_id\": 1027488,\n \"description\": \"Allow shoppers to use the site\"\n }\n]"},"http_version":null},"recorded_at":"Sun, 23 Mar 2014 06:28:26 GMT"}],"recorded_with":"VCR 2.8.0"} \ No newline at end of file diff --git a/test/vcr/cassettes/get_project.json b/test/vcr/cassettes/get_project.json new file mode 100644 index 0000000..912342b --- /dev/null +++ b/test/vcr/cassettes/get_project.json @@ -0,0 +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.0.1 Faraday/0.8.9"],"X-TrackerToken":["0de3ac29f13082f0c16ed76f3f3f6895"]}},"response":{"status":{"code":200,"message":null},"headers":{"content-type":["application/json; charset=utf-8"],"transfer-encoding":["chunked"],"connection":["close"],"status":["200"],"x-powered-by":["Phusion Passenger (mod_rails/mod_rack) 3.0.14"],"cache-control":["private, max-age=0, must-revalidate"],"etag":["\"dbf4aea2a2935eefffe4468d24191436\""],"x-runtime":["36"],"x-tracker-project-version":["1"],"server":["nginx/1.2.2 + Phusion Passenger 3.0.14 (mod_rails/mod_rack)"],"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 \"created_at\": \"2014-03-02T07:11:04Z\",\n \"version\": 1,\n \"current_iteration_number\": 6,\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"enable_following\": true,\n \"time_zone\": {\n \"offset\": \"-07:00\",\n \"olson_name\": \"America/Los_Angeles\",\n \"kind\": \"time_zone\"\n },\n \"point_scale_is_custom\": false,\n \"account_id\": 621384,\n \"atom_enabled\": false,\n \"has_google_domain\": false,\n \"start_time\": \"2014-02-10T08:00:00Z\",\n \"number_of_done_iterations_to_show\": 12,\n \"week_start_day\": \"Monday\",\n \"id\": 1027488,\n \"enable_tasks\": true,\n \"bugs_and_chores_are_estimatable\": false,\n \"point_scale\": \"0,1,2,3\",\n \"public\": false,\n \"enable_incoming_emails\": true,\n \"profile_content\": \"This is a demo project, created by Tracker, with example stories for a simple shopping web site.\",\n \"velocity_averaged_over\": 3,\n \"name\": \"My Sample Project\",\n \"iteration_length\": 1,\n \"kind\": \"project\",\n \"initial_velocity\": 10,\n \"enable_planned_mode\": false\n}"},"http_version":null},"recorded_at":"Sun, 23 Mar 2014 06:28:26 GMT"}],"recorded_with":"VCR 2.8.0"} \ No newline at end of file diff --git a/test/vcr/cassettes/get_project_with_epics.json b/test/vcr/cassettes/get_project_with_epics.json new file mode 100644 index 0000000..9f2776e --- /dev/null +++ b/test/vcr/cassettes/get_project_with_epics.json @@ -0,0 +1 @@ +{"http_interactions":[{"request":{"method":"get","uri":"https://www.pivotaltracker.com/services/v5/projects/1027488?fields=%3Adefault%2Cepics%28%3Adefault%2Clabel%28name%29%29","body":{"encoding":"US-ASCII","string":""},"headers":{"User-Agent":["Ruby/2.0.0 (x86_64-darwin13.0.2; ruby) TrackerApi/0.0.1 Faraday/0.8.9"],"X-TrackerToken":["0de3ac29f13082f0c16ed76f3f3f6895"]}},"response":{"status":{"code":200,"message":null},"headers":{"content-type":["application/json; charset=utf-8"],"transfer-encoding":["chunked"],"connection":["close"],"status":["200"],"x-powered-by":["Phusion Passenger (mod_rails/mod_rack) 3.0.14"],"x-tracker-project-version":["1"],"cache-control":["private, max-age=0, must-revalidate"],"etag":["\"36004bb89c883ff022386d617b8edc8d\""],"x-runtime":["104"],"server":["nginx/1.2.2 + Phusion Passenger 3.0.14 (mod_rails/mod_rack)"],"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 \"enable_following\": true,\n \"atom_enabled\": false,\n \"public\": false,\n \"version\": 1,\n \"account_id\": 621384,\n \"enable_tasks\": true,\n \"name\": \"My Sample Project\",\n \"kind\": \"project\",\n \"velocity_averaged_over\": 3,\n \"profile_content\": \"This is a demo project, created by Tracker, with example stories for a simple shopping web site.\",\n \"enable_planned_mode\": false,\n \"bugs_and_chores_are_estimatable\": false,\n \"point_scale\": \"0,1,2,3\",\n \"id\": 1027488,\n \"current_iteration_number\": 6,\n \"updated_at\": \"2014-03-02T07:11:04Z\",\n \"created_at\": \"2014-03-02T07:11:04Z\",\n \"enable_incoming_emails\": true,\n \"has_google_domain\": false,\n \"number_of_done_iterations_to_show\": 12,\n \"epics\": [\n {\n \"name\": \"Admin Users\",\n \"kind\": \"epic\",\n \"description\": \"Get the Admin users working on the site\",\n \"project_id\": 1027488,\n \"id\": 1087314,\n \"updated_at\": \"2014-03-02T07:11:07Z\",\n \"created_at\": \"2014-03-02T07:11:07Z\",\n \"url\": \"http://www.pivotaltracker.com/epic/show/1087314\",\n \"label\": {\n \"name\": \"admin\",\n \"id\": 7849080\n }\n },\n {\n \"name\": \"Shoppers\",\n \"kind\": \"epic\",\n \"description\": \"Allow shoppers to use the site\",\n \"project_id\": 1027488,\n \"id\": 1087316,\n \"updated_at\": \"2014-03-02T07:11:07Z\",\n \"created_at\": \"2014-03-02T07:11:07Z\",\n \"url\": \"http://www.pivotaltracker.com/epic/show/1087316\",\n \"label\": {\n \"name\": \"shopping\",\n \"id\": 7849082\n }\n }\n ],\n \"start_time\": \"2014-02-10T08:00:00Z\",\n \"iteration_length\": 1,\n \"initial_velocity\": 10,\n \"point_scale_is_custom\": false,\n \"week_start_day\": \"Monday\",\n \"time_zone\": {\n \"kind\": \"time_zone\",\n \"olson_name\": \"America/Los_Angeles\",\n \"offset\": \"-07:00\"\n }\n}"},"http_version":null},"recorded_at":"Sun, 23 Mar 2014 06:28:27 GMT"}],"recorded_with":"VCR 2.8.0"} \ No newline at end of file diff --git a/test/vcr/cassettes/get_unscheduled_stories.json b/test/vcr/cassettes/get_unscheduled_stories.json new file mode 100644 index 0000000..82dc955 --- /dev/null +++ b/test/vcr/cassettes/get_unscheduled_stories.json @@ -0,0 +1 @@ +{"http_interactions":[{"request":{"method":"get","uri":"https://www.pivotaltracker.com/services/v5/projects/1027488/stories?with_state=unscheduled","body":{"encoding":"US-ASCII","string":""},"headers":{"User-Agent":["Ruby/2.0.0 (x86_64-darwin13.0.2; ruby) TrackerApi/0.0.1 Faraday/0.8.9"],"X-TrackerToken":["0de3ac29f13082f0c16ed76f3f3f6895"]}},"response":{"status":{"code":200,"message":null},"headers":{"content-type":["application/json; charset=utf-8"],"transfer-encoding":["chunked"],"connection":["close"],"status":["200"],"x-powered-by":["Phusion Passenger (mod_rails/mod_rack) 3.0.14"],"x-tracker-project-version":["1"],"cache-control":["private, max-age=0, must-revalidate"],"x-tracker-pagination-offset":["0"],"etag":["\"a514b80d7c48f36d9ab4109709ca7e31\""],"x-runtime":["22"],"x-tracker-pagination-returned":["4"],"x-tracker-pagination-total":["4"],"x-tracker-pagination-limit":["100"],"server":["nginx/1.2.2 + Phusion Passenger 3.0.14 (mod_rails/mod_rack)"],"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 \"name\": \"Product browsing pagination not working in IE6\",\n \"kind\": \"story\",\n \"project_id\": 1027488,\n \"id\": 66728084,\n \"owner_ids\": [\n\n ],\n \"current_state\": \"unscheduled\",\n \"updated_at\": \"2014-03-02T07:11:07Z\",\n \"created_at\": \"2014-02-17T00:00:00Z\",\n \"requested_by_id\": 1266314,\n \"labels\": [\n {\n \"name\": \"ie6\",\n \"kind\": \"label\",\n \"project_id\": 1027488,\n \"id\": 7849110,\n \"updated_at\": \"2014-03-02T07:11:07Z\",\n \"created_at\": \"2014-03-02T07:11:07Z\"\n }\n ],\n \"url\": \"https://www.pivotaltracker.com/story/show/66728084\",\n \"story_type\": \"bug\"\n },\n {\n \"name\": \"Integrate with automated order fullfillment system\",\n \"kind\": \"story\",\n \"project_id\": 1027488,\n \"id\": 66728086,\n \"owner_ids\": [\n\n ],\n \"current_state\": \"unscheduled\",\n \"updated_at\": \"2014-03-02T07:11:07Z\",\n \"created_at\": \"2014-02-17T00:00:00Z\",\n \"requested_by_id\": 1266314,\n \"labels\": [\n\n ],\n \"url\": \"https://www.pivotaltracker.com/story/show/66728086\",\n \"story_type\": \"feature\"\n },\n {\n \"name\": \"native iPhone app to allow product browsing and checkout\",\n \"kind\": \"story\",\n \"project_id\": 1027488,\n \"id\": 66728088,\n \"owner_ids\": [\n\n ],\n \"current_state\": \"unscheduled\",\n \"updated_at\": \"2014-03-02T07:11:07Z\",\n \"created_at\": \"2014-02-17T00:00:00Z\",\n \"requested_by_id\": 1266314,\n \"labels\": [\n {\n \"name\": \"epic\",\n \"kind\": \"label\",\n \"project_id\": 1027488,\n \"id\": 7849112,\n \"updated_at\": \"2014-03-02T07:11:07Z\",\n \"created_at\": \"2014-03-02T07:11:07Z\"\n }\n ],\n \"url\": \"https://www.pivotaltracker.com/story/show/66728088\",\n \"story_type\": \"feature\"\n },\n {\n \"name\": \"Facebook app, allowing users to share favorite products\",\n \"kind\": \"story\",\n \"project_id\": 1027488,\n \"id\": 66728090,\n \"owner_ids\": [\n\n ],\n \"current_state\": \"unscheduled\",\n \"updated_at\": \"2014-03-02T07:11:07Z\",\n \"created_at\": \"2014-02-17T00:00:00Z\",\n \"requested_by_id\": 1266314,\n \"labels\": [\n\n ],\n \"url\": \"https://www.pivotaltracker.com/story/show/66728090\",\n \"story_type\": \"feature\"\n }\n]"},"http_version":null},"recorded_at":"Sun, 23 Mar 2014 06:28:30 GMT"}],"recorded_with":"VCR 2.8.0"} \ No newline at end of file