tsenart-pivotal-tracker 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/Gemfile +16 -0
  2. data/Gemfile.lock +48 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +77 -0
  5. data/Rakefile +50 -0
  6. data/VERSION +1 -0
  7. data/lib/pivotal-tracker/activity.rb +46 -0
  8. data/lib/pivotal-tracker/attachment.rb +16 -0
  9. data/lib/pivotal-tracker/client.rb +41 -0
  10. data/lib/pivotal-tracker/extensions.rb +11 -0
  11. data/lib/pivotal-tracker/iteration.rb +34 -0
  12. data/lib/pivotal-tracker/membership.rb +20 -0
  13. data/lib/pivotal-tracker/note.rb +58 -0
  14. data/lib/pivotal-tracker/project.rb +58 -0
  15. data/lib/pivotal-tracker/proxy.rb +66 -0
  16. data/lib/pivotal-tracker/story.rb +148 -0
  17. data/lib/pivotal-tracker/task.rb +53 -0
  18. data/lib/pivotal-tracker/validation.rb +68 -0
  19. data/lib/pivotal-tracker.rb +40 -0
  20. data/lib/pivotal_tracker.rb +2 -0
  21. data/pivotal-tracker.gemspec +121 -0
  22. data/spec/fixtures/activity.xml +177 -0
  23. data/spec/fixtures/created_note.xml +14 -0
  24. data/spec/fixtures/created_story.xml +14 -0
  25. data/spec/fixtures/iterations_all.xml +237 -0
  26. data/spec/fixtures/iterations_backlog.xml +163 -0
  27. data/spec/fixtures/iterations_current.xml +47 -0
  28. data/spec/fixtures/iterations_done.xml +33 -0
  29. data/spec/fixtures/memberships.xml +42 -0
  30. data/spec/fixtures/notes.xml +33 -0
  31. data/spec/fixtures/project.xml +51 -0
  32. data/spec/fixtures/project_activity.xml +177 -0
  33. data/spec/fixtures/projects.xml +103 -0
  34. data/spec/fixtures/stale_fish.yml +100 -0
  35. data/spec/fixtures/stories.xml +293 -0
  36. data/spec/fixtures/tasks.xml +24 -0
  37. data/spec/spec.opts +1 -0
  38. data/spec/spec_helper.rb +31 -0
  39. data/spec/support/stale_fish_fixtures.rb +67 -0
  40. data/spec/unit/pivotal-tracker/activity_spec.rb +32 -0
  41. data/spec/unit/pivotal-tracker/attachment_spec.rb +62 -0
  42. data/spec/unit/pivotal-tracker/client_spec.rb +87 -0
  43. data/spec/unit/pivotal-tracker/iteration_spec.rb +52 -0
  44. data/spec/unit/pivotal-tracker/membership_spec.rb +20 -0
  45. data/spec/unit/pivotal-tracker/note_spec.rb +61 -0
  46. data/spec/unit/pivotal-tracker/project_spec.rb +55 -0
  47. data/spec/unit/pivotal-tracker/story_spec.rb +185 -0
  48. data/spec/unit/pivotal-tracker/task_spec.rb +21 -0
  49. metadata +236 -0
@@ -0,0 +1,148 @@
1
+ module PivotalTracker
2
+ class Story
3
+ include HappyMapper
4
+
5
+ class << self
6
+ def all(project, options={})
7
+ params = PivotalTracker.encode_options(options)
8
+ stories = parse(Client.connection["/projects/#{project.id}/stories#{params}"].get)
9
+ stories.each { |s| s.project_id = project.id }
10
+ return stories
11
+ end
12
+
13
+ def find(param, project_id)
14
+ begin
15
+ story = parse(Client.connection["/projects/#{project_id}/stories/#{param}"].get)
16
+ story.project_id = project_id
17
+ rescue RestClient::ExceptionWithResponse
18
+ story = nil
19
+ end
20
+ return story
21
+ end
22
+ end
23
+
24
+ tag "story"
25
+
26
+ element :id, Integer
27
+ element :url, String
28
+ element :created_at, DateTime
29
+ element :accepted_at, DateTime
30
+ element :project_id, Integer
31
+
32
+ element :name, String
33
+ element :description, String
34
+ element :story_type, String
35
+ element :estimate, Integer
36
+ element :current_state, String
37
+ element :requested_by, String
38
+ element :owned_by, String
39
+ element :labels, String
40
+ element :jira_id, Integer
41
+ element :jira_url, String
42
+ element :other_id, Integer
43
+ element :integration_id, Integer
44
+ element :deadline, DateTime # Only available for Release stories
45
+
46
+ has_many :attachments, Attachment, :tag => 'attachments'
47
+
48
+ def initialize(attributes={})
49
+ if attributes[:owner]
50
+ self.project_id = attributes.delete(:owner).id
51
+ end
52
+ update_attributes(attributes)
53
+ end
54
+
55
+ def create
56
+ return self if project_id.nil?
57
+ response = Client.connection["/projects/#{project_id}/stories"].post(self.to_xml, :content_type => 'application/xml')
58
+ new_story = Story.parse(response)
59
+ new_story.project_id = project_id
60
+ return new_story
61
+ end
62
+
63
+ def update(attrs={})
64
+ update_attributes(attrs)
65
+ response = Client.connection["/projects/#{project_id}/stories/#{id}"].put(self.to_xml, :content_type => 'application/xml')
66
+ return Story.parse(response)
67
+ end
68
+
69
+ def delete
70
+ Client.connection["/projects/#{project_id}/stories/#{id}"].delete
71
+ end
72
+
73
+ def notes
74
+ @notes ||= Proxy.new(self, Note)
75
+ end
76
+
77
+ def tasks
78
+ @tasks ||= Proxy.new(self, Task)
79
+ end
80
+
81
+ def upload_attachment(filename)
82
+ Attachment.parse(Client.connection["/projects/#{project_id}/stories/#{id}/attachments"].post(:Filedata => File.new(filename)))
83
+ end
84
+
85
+ def move_to_project(new_project)
86
+ move = true
87
+ old_project_id = self.project_id
88
+ target_project = -1
89
+ case new_project.class.to_s
90
+ when 'PivotalTracker::Story'
91
+ target_project = new_project.project_id
92
+ when 'PivotalTracker::Project'
93
+ target_project = new_project.id
94
+ when 'String'
95
+ target_project = new_project.to_i
96
+ when 'Fixnum', 'Integer'
97
+ target_project = new_project
98
+ else
99
+ move = false
100
+ end
101
+ if move
102
+ move_builder = Nokogiri::XML::Builder.new do |story|
103
+ story.story {
104
+ story.project_id "#{target_project}"
105
+ }
106
+ end
107
+ Story.parse(Client.connection["/projects/#{old_project_id}/stories/#{id}"].put(move_builder.to_xml, :content_type => 'application/xml'))
108
+ end
109
+ end
110
+
111
+ protected
112
+
113
+ def to_xml
114
+ builder = Nokogiri::XML::Builder.new do |xml|
115
+ xml.story {
116
+ xml.name "#{name}"
117
+ xml.description "#{description}"
118
+ xml.story_type "#{story_type}"
119
+ xml.estimate "#{estimate}"
120
+ xml.current_state "#{current_state}"
121
+ xml.requested_by "#{requested_by}"
122
+ xml.owned_by "#{owned_by}"
123
+ xml.labels "#{labels}"
124
+ xml.project_id "#{project_id}"
125
+ # See spec
126
+ # xml.jira_id "#{jira_id}"
127
+ # xml.jira_url "#{jira_url}"
128
+ xml.other_id "#{other_id}"
129
+ xml.integration_id "#{integration_id}"
130
+ xml.created_at DateTime.parse(created_at.to_s).to_s if created_at
131
+ xml.accepted_at DateTime.parse(accepted_at.to_s).to_s if accepted_at
132
+ xml.deadline DateTime.parse(deadline.to_s).to_s if deadline
133
+ }
134
+ end
135
+ return builder.to_xml
136
+ end
137
+
138
+ def update_attributes(attrs)
139
+ attrs.each do |key, value|
140
+ self.send("#{key}=", value.is_a?(Array) ? value.join(',') : value )
141
+ end
142
+ end
143
+ end
144
+
145
+ class Story
146
+ include Validation
147
+ end
148
+ end
@@ -0,0 +1,53 @@
1
+ module PivotalTracker
2
+ class Task
3
+ include HappyMapper
4
+
5
+ class << self
6
+ def all(story, options={})
7
+ tasks = parse(Client.connection["/projects/#{story.project_id}/stories/#{story.id}/tasks"].get)
8
+ tasks.each { |t| t.project_id, t.story_id = story.project_id, story.id }
9
+ return tasks
10
+ end
11
+ end
12
+
13
+ attr_accessor :project_id, :story_id
14
+
15
+ element :id, Integer
16
+ element :description, String
17
+ element :position, Integer
18
+ element :complete, Boolean
19
+ element :created_at, DateTime
20
+
21
+ def create
22
+ response = Client.connection["/projects/#{project_id}/stories/#{story_id}/tasks"].post(self.to_xml, :content_type => 'application/xml')
23
+ return Task.parse(response)
24
+ end
25
+
26
+ def update
27
+ response = Client.connection["/projects/#{project_id}/stories/#{story_id}/tasks/#{id}"].put(self.to_xml, :content_type => 'application/xml')
28
+ return Task.parse(response)
29
+ end
30
+
31
+ def delete
32
+ Client.connection["/projects/#{project_id}/stories/#{story_id}/tasks/#{id}"].delete
33
+ end
34
+
35
+ protected
36
+
37
+ def to_xml
38
+ builder = Nokogiri::XML::Builder.new do |xml|
39
+ xml.task {
40
+ xml.description "#{description}"
41
+ # xml.position "#{position}"
42
+ xml.complete "#{complete}"
43
+ }
44
+ end
45
+ return builder.to_xml
46
+ end
47
+
48
+ end
49
+
50
+ class Task
51
+ include Validation
52
+ end
53
+ end
@@ -0,0 +1,68 @@
1
+ module PivotalTracker
2
+
3
+ class Errors
4
+ include Enumerable
5
+ attr_reader :errors
6
+
7
+ alias :messages :errors
8
+
9
+ def initialize
10
+ @errors = []
11
+ end
12
+
13
+ def each
14
+ @errors.each do |error|
15
+ yield error
16
+ end
17
+ end
18
+
19
+ def empty?
20
+ @errors.empty?
21
+ end
22
+
23
+ def add_from_xml(xml)
24
+ Nokogiri::XML(xml).xpath("/errors/error").each do |error|
25
+ @errors << error.text
26
+ end
27
+ end
28
+ end
29
+
30
+ module Validation
31
+
32
+ def self.included(klass)
33
+ klass.class_eval do
34
+ if klass.instance_methods.include?(:create)
35
+ alias_method :create_without_validations, :create
36
+ alias_method :create, :create_with_validations
37
+ end
38
+
39
+ if klass.instance_methods.include?(:update)
40
+ alias_method :update_without_validations, :update
41
+ alias_method :update, :update_with_validations
42
+ end
43
+ end
44
+ end
45
+
46
+ def create_with_validations
47
+ begin
48
+ create_without_validations
49
+ rescue RestClient::UnprocessableEntity => e
50
+ errors.add_from_xml e.response
51
+ self
52
+ end
53
+ end
54
+
55
+ def update_with_validations(attrs={})
56
+ begin
57
+ update_without_validations attrs
58
+ rescue RestClient::UnprocessableEntity => e
59
+ errors.add_from_xml e.response
60
+ self
61
+ end
62
+ end
63
+
64
+ def errors
65
+ @errors ||= Errors.new
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,40 @@
1
+ require 'cgi'
2
+ require 'rest_client'
3
+ require 'happymapper'
4
+ require 'nokogiri'
5
+
6
+
7
+ require File.join(File.dirname(__FILE__), 'pivotal-tracker', 'validation')
8
+ require File.join(File.dirname(__FILE__), 'pivotal-tracker', 'extensions')
9
+ require File.join(File.dirname(__FILE__), 'pivotal-tracker', 'proxy')
10
+ require File.join(File.dirname(__FILE__), 'pivotal-tracker', 'client')
11
+ require File.join(File.dirname(__FILE__), 'pivotal-tracker', 'project')
12
+ require File.join(File.dirname(__FILE__), 'pivotal-tracker', 'attachment')
13
+ require File.join(File.dirname(__FILE__), 'pivotal-tracker', 'story')
14
+ require File.join(File.dirname(__FILE__), 'pivotal-tracker', 'task')
15
+ require File.join(File.dirname(__FILE__), 'pivotal-tracker', 'membership')
16
+ require File.join(File.dirname(__FILE__), 'pivotal-tracker', 'activity')
17
+ require File.join(File.dirname(__FILE__), 'pivotal-tracker', 'iteration')
18
+ require File.join(File.dirname(__FILE__), 'pivotal-tracker', 'note')
19
+
20
+ module PivotalTracker
21
+
22
+ # define error types
23
+ class ProjectNotSpecified < StandardError; end
24
+
25
+ def self.encode_options(options)
26
+ options_strings = options.inject({}) do |m, (k,v)|
27
+ if [:limit, :offset].include?(k.to_sym)
28
+ m.update k => v
29
+ elsif k.to_sym == :search
30
+ m.update :filter => v
31
+ else
32
+ filter_query = %{#{k}:#{[v].flatten.join(",")}}
33
+ m.update :filter => (m[:filter] ? "#{m[:filter]} #{filter_query}" : filter_query)
34
+ end
35
+ end.map {|k,v| "#{k}=#{CGI.escape(v.to_s)}"}
36
+
37
+ %{?#{options_strings.join("&")}} unless options_strings.empty?
38
+ end
39
+
40
+ end
@@ -0,0 +1,2 @@
1
+ require "pivotal-tracker"
2
+
@@ -0,0 +1,121 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{pivotal-tracker}
8
+ s.version = "0.4.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = [%q{Justin Smestad}, %q{Josh Nichols}, %q{Terence Lee}]
12
+ s.date = %q{2011-07-07}
13
+ s.email = %q{justin.smestad@gmail.com}
14
+ s.extra_rdoc_files = [
15
+ "LICENSE",
16
+ "README.rdoc"
17
+ ]
18
+ s.files = [
19
+ ".gitignore",
20
+ "Gemfile",
21
+ "Gemfile.lock",
22
+ "LICENSE",
23
+ "README.rdoc",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "lib/pivotal-tracker.rb",
27
+ "lib/pivotal-tracker/activity.rb",
28
+ "lib/pivotal-tracker/attachment.rb",
29
+ "lib/pivotal-tracker/client.rb",
30
+ "lib/pivotal-tracker/extensions.rb",
31
+ "lib/pivotal-tracker/iteration.rb",
32
+ "lib/pivotal-tracker/membership.rb",
33
+ "lib/pivotal-tracker/note.rb",
34
+ "lib/pivotal-tracker/project.rb",
35
+ "lib/pivotal-tracker/proxy.rb",
36
+ "lib/pivotal-tracker/story.rb",
37
+ "lib/pivotal-tracker/task.rb",
38
+ "lib/pivotal-tracker/validation.rb",
39
+ "lib/pivotal_tracker.rb",
40
+ "pivotal-tracker.gemspec",
41
+ "spec/fixtures/activity.xml",
42
+ "spec/fixtures/created_note.xml",
43
+ "spec/fixtures/created_story.xml",
44
+ "spec/fixtures/iterations_all.xml",
45
+ "spec/fixtures/iterations_backlog.xml",
46
+ "spec/fixtures/iterations_current.xml",
47
+ "spec/fixtures/iterations_done.xml",
48
+ "spec/fixtures/memberships.xml",
49
+ "spec/fixtures/notes.xml",
50
+ "spec/fixtures/project.xml",
51
+ "spec/fixtures/project_activity.xml",
52
+ "spec/fixtures/projects.xml",
53
+ "spec/fixtures/stale_fish.yml",
54
+ "spec/fixtures/stories.xml",
55
+ "spec/fixtures/tasks.xml",
56
+ "spec/spec.opts",
57
+ "spec/spec_helper.rb",
58
+ "spec/support/stale_fish_fixtures.rb",
59
+ "spec/unit/pivotal-tracker/activity_spec.rb",
60
+ "spec/unit/pivotal-tracker/attachment_spec.rb",
61
+ "spec/unit/pivotal-tracker/client_spec.rb",
62
+ "spec/unit/pivotal-tracker/iteration_spec.rb",
63
+ "spec/unit/pivotal-tracker/membership_spec.rb",
64
+ "spec/unit/pivotal-tracker/note_spec.rb",
65
+ "spec/unit/pivotal-tracker/project_spec.rb",
66
+ "spec/unit/pivotal-tracker/story_spec.rb",
67
+ "spec/unit/pivotal-tracker/task_spec.rb"
68
+ ]
69
+ s.homepage = %q{http://github.com/jsmestad/pivotal-tracker}
70
+ s.rdoc_options = [%q{--charset=UTF-8}]
71
+ s.require_paths = [%q{lib}]
72
+ s.rubygems_version = %q{1.8.5}
73
+ s.summary = %q{Ruby wrapper for the Pivotal Tracker API}
74
+ s.test_files = [
75
+ "spec/spec_helper.rb",
76
+ "spec/support/stale_fish_fixtures.rb",
77
+ "spec/unit/pivotal-tracker/activity_spec.rb",
78
+ "spec/unit/pivotal-tracker/attachment_spec.rb",
79
+ "spec/unit/pivotal-tracker/client_spec.rb",
80
+ "spec/unit/pivotal-tracker/iteration_spec.rb",
81
+ "spec/unit/pivotal-tracker/membership_spec.rb",
82
+ "spec/unit/pivotal-tracker/note_spec.rb",
83
+ "spec/unit/pivotal-tracker/project_spec.rb",
84
+ "spec/unit/pivotal-tracker/story_spec.rb",
85
+ "spec/unit/pivotal-tracker/task_spec.rb"
86
+ ]
87
+
88
+ if s.respond_to? :specification_version then
89
+ s.specification_version = 3
90
+
91
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
92
+ s.add_runtime_dependency(%q<rest-client>, ["~> 1.6.0"])
93
+ s.add_runtime_dependency(%q<happymapper>, [">= 0.3.2"])
94
+ s.add_runtime_dependency(%q<builder>, [">= 0"])
95
+ s.add_runtime_dependency(%q<nokogiri>, ["~> 1.4.3.1"])
96
+ s.add_development_dependency(%q<rspec>, [">= 0"])
97
+ s.add_development_dependency(%q<bundler>, [">= 0.9.26"])
98
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
99
+ s.add_development_dependency(%q<stale_fish>, ["~> 1.3.0"])
100
+ else
101
+ s.add_dependency(%q<rest-client>, ["~> 1.6.0"])
102
+ s.add_dependency(%q<happymapper>, [">= 0.3.2"])
103
+ s.add_dependency(%q<builder>, [">= 0"])
104
+ s.add_dependency(%q<nokogiri>, ["~> 1.4.3.1"])
105
+ s.add_dependency(%q<rspec>, [">= 0"])
106
+ s.add_dependency(%q<bundler>, [">= 0.9.26"])
107
+ s.add_dependency(%q<jeweler>, [">= 0"])
108
+ s.add_dependency(%q<stale_fish>, ["~> 1.3.0"])
109
+ end
110
+ else
111
+ s.add_dependency(%q<rest-client>, ["~> 1.6.0"])
112
+ s.add_dependency(%q<happymapper>, [">= 0.3.2"])
113
+ s.add_dependency(%q<builder>, [">= 0"])
114
+ s.add_dependency(%q<nokogiri>, ["~> 1.4.3.1"])
115
+ s.add_dependency(%q<rspec>, [">= 0"])
116
+ s.add_dependency(%q<bundler>, [">= 0.9.26"])
117
+ s.add_dependency(%q<jeweler>, [">= 0"])
118
+ s.add_dependency(%q<stale_fish>, ["~> 1.3.0"])
119
+ end
120
+ end
121
+
@@ -0,0 +1,177 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <activities type="array">
3
+ <activity>
4
+ <id type="integer">24492385</id>
5
+ <version type="integer">206</version>
6
+ <event_type>story_create</event_type>
7
+ <occurred_at type="datetime">2010/07/29 19:13:04 UTC</occurred_at>
8
+ <author>Test Suite Access</author>
9
+ <project_id type="integer">102622</project_id>
10
+ <description>Test Suite Access added &quot;Create stuff&quot;</description>
11
+ <stories>
12
+ <story>
13
+ <id type="integer">4492080</id>
14
+ <url>http://www.pivotaltracker.com/services/v3/projects/102622/stories/4492080</url>
15
+ <name>Create stuff</name>
16
+ <story_type>feature</story_type>
17
+ <current_state>unscheduled</current_state>
18
+ </story>
19
+ </stories>
20
+ </activity>
21
+ <activity>
22
+ <id type="integer">24492375</id>
23
+ <version type="integer">205</version>
24
+ <event_type>story_create</event_type>
25
+ <occurred_at type="datetime">2010/07/29 19:13:01 UTC</occurred_at>
26
+ <author>Test Suite Access</author>
27
+ <project_id type="integer">102622</project_id>
28
+ <description>Test Suite Access added &quot;Create stuff&quot;</description>
29
+ <stories>
30
+ <story>
31
+ <id type="integer">4492078</id>
32
+ <url>http://www.pivotaltracker.com/services/v3/projects/102622/stories/4492078</url>
33
+ <name>Create stuff</name>
34
+ <story_type>feature</story_type>
35
+ <current_state>unscheduled</current_state>
36
+ </story>
37
+ </stories>
38
+ </activity>
39
+ <activity>
40
+ <id type="integer">24492239</id>
41
+ <version type="integer">200</version>
42
+ <event_type>story_create</event_type>
43
+ <occurred_at type="datetime">2010/07/29 19:11:43 UTC</occurred_at>
44
+ <author>Test Suite Access</author>
45
+ <project_id type="integer">102622</project_id>
46
+ <description>Test Suite Access added &quot;Create stuff&quot;</description>
47
+ <stories>
48
+ <story>
49
+ <id type="integer">4492060</id>
50
+ <url>http://www.pivotaltracker.com/services/v3/projects/102622/stories/4492060</url>
51
+ <name>Create stuff</name>
52
+ <story_type>feature</story_type>
53
+ <current_state>unscheduled</current_state>
54
+ </story>
55
+ </stories>
56
+ </activity>
57
+ <activity>
58
+ <id type="integer">24492220</id>
59
+ <version type="integer">199</version>
60
+ <event_type>story_create</event_type>
61
+ <occurred_at type="datetime">2010/07/29 19:11:38 UTC</occurred_at>
62
+ <author>Test Suite Access</author>
63
+ <project_id type="integer">102622</project_id>
64
+ <description>Test Suite Access added &quot;Create stuff&quot;</description>
65
+ <stories>
66
+ <story>
67
+ <id type="integer">4492059</id>
68
+ <url>http://www.pivotaltracker.com/services/v3/projects/102622/stories/4492059</url>
69
+ <name>Create stuff</name>
70
+ <story_type>feature</story_type>
71
+ <current_state>unscheduled</current_state>
72
+ </story>
73
+ </stories>
74
+ </activity>
75
+ <activity>
76
+ <id type="integer">24491968</id>
77
+ <version type="integer">194</version>
78
+ <event_type>story_create</event_type>
79
+ <occurred_at type="datetime">2010/07/29 19:09:26 UTC</occurred_at>
80
+ <author>Test Suite Access</author>
81
+ <project_id type="integer">102622</project_id>
82
+ <description>Test Suite Access added &quot;Create stuff&quot;</description>
83
+ <stories>
84
+ <story>
85
+ <id type="integer">4491973</id>
86
+ <url>http://www.pivotaltracker.com/services/v3/projects/102622/stories/4491973</url>
87
+ <name>Create stuff</name>
88
+ <story_type>feature</story_type>
89
+ <current_state>unscheduled</current_state>
90
+ </story>
91
+ </stories>
92
+ </activity>
93
+ <activity>
94
+ <id type="integer">24491959</id>
95
+ <version type="integer">193</version>
96
+ <event_type>story_create</event_type>
97
+ <occurred_at type="datetime">2010/07/29 19:09:24 UTC</occurred_at>
98
+ <author>Test Suite Access</author>
99
+ <project_id type="integer">102622</project_id>
100
+ <description>Test Suite Access added &quot;Create stuff&quot;</description>
101
+ <stories>
102
+ <story>
103
+ <id type="integer">4491971</id>
104
+ <url>http://www.pivotaltracker.com/services/v3/projects/102622/stories/4491971</url>
105
+ <name>Create stuff</name>
106
+ <story_type>feature</story_type>
107
+ <current_state>unscheduled</current_state>
108
+ </story>
109
+ </stories>
110
+ </activity>
111
+ <activity>
112
+ <id type="integer">24491880</id>
113
+ <version type="integer">192</version>
114
+ <event_type>story_update</event_type>
115
+ <occurred_at type="datetime">2010/07/29 19:08:43 UTC</occurred_at>
116
+ <author>Jon</author>
117
+ <project_id type="integer">102622</project_id>
118
+ <description>Jon edited &quot;Movable Story&quot;</description>
119
+ <stories>
120
+ <story>
121
+ <id type="integer">4490874</id>
122
+ <url>http://www.pivotaltracker.com/services/v3/projects/102622/stories/4490874</url>
123
+ <estimate type="integer">0</estimate>
124
+ </story>
125
+ </stories>
126
+ </activity>
127
+ <activity>
128
+ <id type="integer">24491859</id>
129
+ <version type="integer">191</version>
130
+ <event_type>story_update</event_type>
131
+ <occurred_at type="datetime">2010/07/29 19:08:36 UTC</occurred_at>
132
+ <author>Jon</author>
133
+ <project_id type="integer">102622</project_id>
134
+ <description>Jon edited &quot;Movable Story&quot;</description>
135
+ <stories>
136
+ <story>
137
+ <id type="integer">4490874</id>
138
+ <url>http://www.pivotaltracker.com/services/v3/projects/102622/stories/4490874</url>
139
+ <current_state>unstarted</current_state>
140
+ </story>
141
+ </stories>
142
+ </activity>
143
+ <activity>
144
+ <id type="integer">24491236</id>
145
+ <version type="integer">158</version>
146
+ <event_type>story_update</event_type>
147
+ <occurred_at type="datetime">2010/07/29 19:04:29 UTC</occurred_at>
148
+ <author>Jon</author>
149
+ <project_id type="integer">102622</project_id>
150
+ <description>Jon edited &quot;Movable Story&quot;</description>
151
+ <stories>
152
+ <story>
153
+ <id type="integer">4490874</id>
154
+ <url>http://www.pivotaltracker.com/services/v3/projects/102622/stories/4490874</url>
155
+ <name>Movable Story</name>
156
+ </story>
157
+ </stories>
158
+ </activity>
159
+ <activity>
160
+ <id type="integer">24490623</id>
161
+ <version type="integer">153</version>
162
+ <event_type>story_create</event_type>
163
+ <occurred_at type="datetime">2010/07/29 18:58:45 UTC</occurred_at>
164
+ <author>Test Suite Access</author>
165
+ <project_id type="integer">102622</project_id>
166
+ <description>Test Suite Access added &quot;Create stuff&quot;</description>
167
+ <stories>
168
+ <story>
169
+ <id type="integer">4491800</id>
170
+ <url>http://www.pivotaltracker.com/services/v3/projects/102622/stories/4491800</url>
171
+ <name>Create stuff</name>
172
+ <story_type>feature</story_type>
173
+ <current_state>unscheduled</current_state>
174
+ </story>
175
+ </stories>
176
+ </activity>
177
+ </activities>
@@ -0,0 +1,14 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <story>
3
+ <id type="integer">4492112</id>
4
+ <project_id type="integer">102622</project_id>
5
+ <story_type>feature</story_type>
6
+ <url>http://www.pivotaltracker.com/story/show/4492112</url>
7
+ <estimate type="integer">-1</estimate>
8
+ <current_state>unscheduled</current_state>
9
+ <description></description>
10
+ <name>Create stuff</name>
11
+ <requested_by>Test Suite Access</requested_by>
12
+ <created_at type="datetime">2010/07/29 19:15:16 UTC</created_at>
13
+ <updated_at type="datetime">2010/07/29 19:15:16 UTC</updated_at>
14
+ </story>
@@ -0,0 +1,14 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <story>
3
+ <id type="integer">4492111</id>
4
+ <project_id type="integer">102622</project_id>
5
+ <story_type>feature</story_type>
6
+ <url>http://www.pivotaltracker.com/story/show/4492111</url>
7
+ <estimate type="integer">-1</estimate>
8
+ <current_state>unscheduled</current_state>
9
+ <description></description>
10
+ <name>Create stuff</name>
11
+ <requested_by>Test Suite Access</requested_by>
12
+ <created_at type="datetime">2010/07/29 19:15:13 UTC</created_at>
13
+ <updated_at type="datetime">2010/07/29 19:15:13 UTC</updated_at>
14
+ </story>