tsenart-pivotal-tracker 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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>