pivotal-tracker 0.2.0 → 0.2.1
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.
- data/.gitignore +3 -1
- data/Gemfile +4 -5
- data/Gemfile.lock +40 -0
- data/LICENSE +1 -1
- data/README.rdoc +28 -16
- data/Rakefile +9 -6
- data/VERSION +1 -1
- data/lib/pivotal-tracker/attachment.rb +16 -0
- data/lib/pivotal-tracker/project.rb +11 -0
- data/lib/pivotal-tracker/story.rb +39 -6
- data/lib/pivotal-tracker.rb +1 -0
- data/pivotal-tracker.gemspec +29 -13
- data/spec/fixtures/activity.xml +107 -148
- data/spec/fixtures/created_note.xml +6 -6
- data/spec/fixtures/created_story.xml +6 -6
- data/spec/fixtures/iterations_all.xml +191 -46
- data/spec/fixtures/iterations_backlog.xml +136 -67
- data/spec/fixtures/iterations_current.xml +17 -62
- data/spec/fixtures/iterations_done.xml +20 -29
- data/spec/fixtures/memberships.xml +25 -12
- data/spec/fixtures/notes.xml +26 -10
- data/spec/fixtures/project.xml +26 -17
- data/spec/fixtures/project_activity.xml +85 -89
- data/spec/fixtures/projects.xml +37 -632
- data/spec/fixtures/stale_fish.yml +26 -26
- data/spec/fixtures/stories.xml +197 -131
- data/spec/fixtures/tasks.xml +6 -6
- data/spec/spec_helper.rb +4 -2
- data/spec/support/stale_fish_fixtures.rb +17 -13
- data/spec/unit/pivotal-tracker/attachment_spec.rb +62 -0
- data/spec/unit/pivotal-tracker/membership_spec.rb +2 -2
- data/spec/unit/pivotal-tracker/note_spec.rb +11 -11
- data/spec/unit/pivotal-tracker/project_spec.rb +11 -3
- data/spec/unit/pivotal-tracker/story_spec.rb +73 -24
- data/spec/unit/pivotal-tracker/task_spec.rb +3 -3
- metadata +103 -25
data/.gitignore
CHANGED
data/Gemfile
CHANGED
@@ -1,16 +1,15 @@
|
|
1
1
|
source 'http://rubygems.org'
|
2
2
|
|
3
3
|
group :runtime do
|
4
|
-
gem 'rest-client', '~> 1.
|
5
|
-
gem 'happymapper', '>= 0.2
|
4
|
+
gem 'rest-client', '~> 1.6.0'
|
5
|
+
gem 'happymapper', '>= 0.3.2'
|
6
6
|
gem 'builder'
|
7
|
-
gem 'nokogiri', '~> 1.4.1'
|
7
|
+
gem 'nokogiri', '~> 1.4.3.1'
|
8
8
|
end
|
9
9
|
|
10
10
|
group :test do
|
11
|
-
gem 'rspec', :require => 'spec'
|
11
|
+
gem 'rspec', '~> 1.3.0', :require => 'spec'
|
12
12
|
gem 'rake'
|
13
|
-
gem 'bundler', '~> 0.9.5'
|
14
13
|
gem 'jeweler'
|
15
14
|
gem 'stale_fish', '~> 1.3.0'
|
16
15
|
end
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
activesupport (2.3.8)
|
5
|
+
builder (2.1.2)
|
6
|
+
fakeweb (1.2.8)
|
7
|
+
gemcutter (0.6.1)
|
8
|
+
git (1.2.5)
|
9
|
+
happymapper (0.3.2)
|
10
|
+
libxml-ruby (~> 1.1.3)
|
11
|
+
jeweler (1.4.0)
|
12
|
+
gemcutter (>= 0.1.0)
|
13
|
+
git (>= 1.2.5)
|
14
|
+
rubyforge (>= 2.0.0)
|
15
|
+
json_pure (1.4.5)
|
16
|
+
libxml-ruby (1.1.4)
|
17
|
+
mime-types (1.16)
|
18
|
+
nokogiri (1.4.3.1)
|
19
|
+
rake (0.8.7)
|
20
|
+
rest-client (1.6.0)
|
21
|
+
mime-types (>= 1.16)
|
22
|
+
rspec (1.3.0)
|
23
|
+
rubyforge (2.0.4)
|
24
|
+
json_pure (>= 1.1.7)
|
25
|
+
stale_fish (1.3.0)
|
26
|
+
activesupport
|
27
|
+
fakeweb
|
28
|
+
|
29
|
+
PLATFORMS
|
30
|
+
ruby
|
31
|
+
|
32
|
+
DEPENDENCIES
|
33
|
+
builder
|
34
|
+
happymapper (>= 0.3.2)
|
35
|
+
jeweler
|
36
|
+
nokogiri (~> 1.4.3.1)
|
37
|
+
rake
|
38
|
+
rest-client (~> 1.6.0)
|
39
|
+
rspec (~> 1.3.0)
|
40
|
+
stale_fish (~> 1.3.0)
|
data/LICENSE
CHANGED
data/README.rdoc
CHANGED
@@ -2,10 +2,6 @@
|
|
2
2
|
|
3
3
|
Ruby wrapper for Pivotal Tracker API, no frameworks required. Simply Ruby.
|
4
4
|
|
5
|
-
== Note
|
6
|
-
|
7
|
-
Version 0.0.8 and above are incompatible with previous versions.
|
8
|
-
|
9
5
|
== Features
|
10
6
|
|
11
7
|
* Compatible with Pivotal Tracker API version 3
|
@@ -16,26 +12,39 @@ Version 0.0.8 and above are incompatible with previous versions.
|
|
16
12
|
|
17
13
|
PivotalTracker::Client.token('myusername@email.com', 'secretpassword') # Automatically fetch API Token
|
18
14
|
PivotalTracker::Client.token = 'jkfduisj97823974j2kl24899234' # Manually set API Token
|
19
|
-
|
15
|
+
|
20
16
|
@projects = PivotalTracker::Project.all # return all projects
|
21
17
|
@a_project = PivotalTracker::Project.find(84739) # find project with a given ID
|
22
|
-
|
18
|
+
|
23
19
|
@a_project.stories.all # return all stories for "a_project"
|
24
20
|
@a_project.stories.all(:label => 'overdue', :story_type => ['bug', 'chore']) # return all stories that match the passed filters
|
25
21
|
@a_project.stories.find(847762630) # find story with a given ID
|
26
|
-
|
22
|
+
|
27
23
|
@a_project.stories.create(:name => 'My Story', :story_type => 'feature') # create a story for this project
|
28
24
|
|
25
|
+
# all tracker defined filters are allowed, as well as :limit & :offset for pagination
|
26
|
+
|
27
|
+
# The below pattern below is planned to be added to the final release:
|
28
|
+
|
29
|
+
@a_project.stories << PivotalTracker::Story.new(84739, :name => 'Ur Story') # same as earlier story creation, useful for copying/cloning from proj
|
30
|
+
|
31
|
+
|
29
32
|
@story = @a_project.stories.find(847762630)
|
30
33
|
@story.notes.all # return all notes (comments) for a story
|
31
|
-
@story.notes.create(:text => 'A new
|
32
|
-
|
34
|
+
@story.notes.create(:text => 'A new comment', :noted_at => '06/29/2010 05:00 EST') # add a new note
|
33
35
|
|
34
|
-
# all tracker defined filters are allowed, as well as :limit & :offset for pagination
|
35
36
|
|
36
|
-
#
|
37
|
+
@story.attachments # return an array of all attachment items (data only, not the files)
|
38
|
+
@story.upload_attachment(file_path) # add a file attachment to @story that can be found at file_path
|
39
|
+
|
40
|
+
|
41
|
+
# All 4 examples below return a PivotalTracker::Story from the new project, with the same story ID
|
42
|
+
|
43
|
+
@story.move_to_project(123456) # move @story to the project with ID 123456
|
44
|
+
@story.move_to_project('123456') # same as above
|
45
|
+
@story.move_to_project(@project) # move @story to @project
|
46
|
+
@story.move_to_project(@another_story) # move @story into the same project as @another_story
|
37
47
|
|
38
|
-
@a_project.stories << PivotalTracker::Story.new(84739, :name => 'Ur Story') # same as above, useful for copying/cloning from proj
|
39
48
|
|
40
49
|
|
41
50
|
The API is based on the following this gist: http://gist.github.com/283120
|
@@ -52,14 +61,17 @@ The API is based on the following this gist: http://gist.github.com/283120
|
|
52
61
|
$ cd pivotal-tracker
|
53
62
|
$ bundle install
|
54
63
|
$ bundle exec rake
|
55
|
-
|
64
|
+
|
56
65
|
== Additional Information
|
57
66
|
|
58
|
-
Wiki: http://wiki.github.com/jsmestad/pivotal-tracker
|
59
|
-
Documentation: http://rdoc.info/projects/jsmestad/pivotal-tracker
|
67
|
+
* Wiki: http://wiki.github.com/jsmestad/pivotal-tracker
|
68
|
+
* Documentation: http://rdoc.info/projects/jsmestad/pivotal-tracker
|
69
|
+
* Pivotal API v3 Docs: http://www.pivotaltracker.com/help/api?version=v3
|
60
70
|
|
61
|
-
==
|
71
|
+
== Contributors along the way
|
62
72
|
|
63
73
|
* Justin Smestad (http://github.com/jsmestad)
|
64
74
|
* Josh Nichols (http://github.com/technicalpickles)
|
65
75
|
* Terence Lee (http://github.com/hone)
|
76
|
+
* Jon Mischo (http://github.com/supertaz)
|
77
|
+
* Gabor Ratky (http://github.com/rgabo)
|
data/Rakefile
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'rake'
|
2
|
-
require 'bundler'
|
3
2
|
|
4
3
|
begin
|
5
4
|
require 'jeweler'
|
@@ -10,11 +9,15 @@ begin
|
|
10
9
|
gem.homepage = "http://github.com/jsmestad/pivotal-tracker"
|
11
10
|
gem.authors = ["Justin Smestad", "Josh Nichols", "Terence Lee"]
|
12
11
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
12
|
+
gem.add_dependency 'rest-client', '~> 1.6.0'
|
13
|
+
gem.add_dependency 'happymapper', '>= 0.3.2'
|
14
|
+
gem.add_dependency 'builder'
|
15
|
+
gem.add_dependency 'nokogiri', '~> 1.4.3.1'
|
16
|
+
|
17
|
+
gem.add_development_dependency 'rspec'
|
18
|
+
gem.add_development_dependency 'bundler', '>= 0.9.26'
|
19
|
+
gem.add_development_dependency 'jeweler'
|
20
|
+
gem.add_development_dependency 'stale_fish', '~> 1.3.0'
|
18
21
|
end
|
19
22
|
Jeweler::GemcutterTasks.new
|
20
23
|
rescue LoadError
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.1
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module PivotalTracker
|
2
|
+
class Attachment
|
3
|
+
include HappyMapper
|
4
|
+
|
5
|
+
tag 'attachment'
|
6
|
+
|
7
|
+
element :id, Integer
|
8
|
+
element :filename, String
|
9
|
+
element :description, String
|
10
|
+
element :uploaded_by, String
|
11
|
+
element :uploaded_at, DateTime
|
12
|
+
element :url, String
|
13
|
+
element :status, String
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
@@ -18,6 +18,7 @@ module PivotalTracker
|
|
18
18
|
|
19
19
|
element :id, Integer
|
20
20
|
element :name, String
|
21
|
+
element :account, String
|
21
22
|
element :week_start_day, String
|
22
23
|
element :point_scale, String
|
23
24
|
element :week_start_day, String
|
@@ -26,6 +27,7 @@ module PivotalTracker
|
|
26
27
|
element :initial_velocity, Integer
|
27
28
|
element :current_velocity, Integer
|
28
29
|
element :last_activity_at, DateTime
|
30
|
+
element :use_https, Boolean
|
29
31
|
|
30
32
|
def activities
|
31
33
|
@activities ||= Proxy.new(self, Activity)
|
@@ -43,5 +45,14 @@ module PivotalTracker
|
|
43
45
|
@memberships ||= Proxy.new(self, Membership)
|
44
46
|
end
|
45
47
|
|
48
|
+
def iteration(group)
|
49
|
+
case group.to_sym
|
50
|
+
when :done: Iteration.done(self)
|
51
|
+
when :current: Iteration.current(self)
|
52
|
+
when :backlog: Iteration.backlog(self)
|
53
|
+
else
|
54
|
+
raise ArgumentError, "Invalid group. Use :done, :current or :backlog instead."
|
55
|
+
end
|
56
|
+
end
|
46
57
|
end
|
47
58
|
end
|
@@ -11,12 +11,13 @@ module PivotalTracker
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
-
|
14
|
+
tag "story"
|
15
15
|
|
16
16
|
element :id, Integer
|
17
|
-
element :url, String
|
17
|
+
element :url, String
|
18
18
|
element :created_at, DateTime
|
19
19
|
element :accepted_at, DateTime
|
20
|
+
element :project_id, Integer
|
20
21
|
|
21
22
|
element :name, String
|
22
23
|
element :description, String
|
@@ -29,10 +30,14 @@ module PivotalTracker
|
|
29
30
|
element :jira_id, Integer
|
30
31
|
element :jira_url, String
|
31
32
|
element :other_id, Integer
|
33
|
+
element :integration_id, Integer
|
32
34
|
|
33
|
-
|
34
|
-
self.project_id = attributes.delete(:owner).id if attributes[:owner]
|
35
|
+
has_many :attachments, Attachment, :tag => 'attachments'
|
35
36
|
|
37
|
+
def initialize(attributes={})
|
38
|
+
if attributes[:owner]
|
39
|
+
self.project_id = attributes.delete(:owner).id
|
40
|
+
end
|
36
41
|
update_attributes(attributes)
|
37
42
|
end
|
38
43
|
|
@@ -62,8 +67,34 @@ module PivotalTracker
|
|
62
67
|
@tasks ||= Proxy.new(self, Task)
|
63
68
|
end
|
64
69
|
|
65
|
-
def
|
66
|
-
|
70
|
+
def upload_attachment(filename)
|
71
|
+
Attachment.parse(Client.connection["/projects/#{project_id}/stories/#{id}/attachments"].post(:Filedata => File.new(filename)))
|
72
|
+
end
|
73
|
+
|
74
|
+
def move_to_project(new_project)
|
75
|
+
move = true
|
76
|
+
old_project_id = self.project_id
|
77
|
+
target_project = -1
|
78
|
+
case new_project.class.to_s
|
79
|
+
when 'PivotalTracker::Story'
|
80
|
+
target_project = new_project.project_id
|
81
|
+
when 'PivotalTracker::Project'
|
82
|
+
target_project = new_project.id
|
83
|
+
when 'String'
|
84
|
+
target_project = new_project.to_i
|
85
|
+
when 'Fixnum', 'Integer'
|
86
|
+
target_project = new_project
|
87
|
+
else
|
88
|
+
move = false
|
89
|
+
end
|
90
|
+
if move
|
91
|
+
move_builder = Nokogiri::XML::Builder.new do |story|
|
92
|
+
story.story {
|
93
|
+
story.project_id "#{target_project}"
|
94
|
+
}
|
95
|
+
end
|
96
|
+
Story.parse(Client.connection["/projects/#{old_project_id}/stories/#{id}"].put(move_builder.to_xml, :content_type => 'application/xml'))
|
97
|
+
end
|
67
98
|
end
|
68
99
|
|
69
100
|
protected
|
@@ -79,10 +110,12 @@ module PivotalTracker
|
|
79
110
|
xml.requested_by "#{requested_by}"
|
80
111
|
xml.owned_by "#{owned_by}"
|
81
112
|
xml.labels "#{labels}"
|
113
|
+
xml.project_id "#{project_id}"
|
82
114
|
# See spec
|
83
115
|
# xml.jira_id "#{jira_id}"
|
84
116
|
# xml.jira_url "#{jira_url}"
|
85
117
|
xml.other_id "#{other_id}"
|
118
|
+
xml.integration_id "#{integration_id}"
|
86
119
|
}
|
87
120
|
end
|
88
121
|
return builder.to_xml
|
data/lib/pivotal-tracker.rb
CHANGED
@@ -8,6 +8,7 @@ require File.join(File.dirname(__FILE__), 'pivotal-tracker', 'extensions')
|
|
8
8
|
require File.join(File.dirname(__FILE__), 'pivotal-tracker', 'proxy')
|
9
9
|
require File.join(File.dirname(__FILE__), 'pivotal-tracker', 'client')
|
10
10
|
require File.join(File.dirname(__FILE__), 'pivotal-tracker', 'project')
|
11
|
+
require File.join(File.dirname(__FILE__), 'pivotal-tracker', 'attachment')
|
11
12
|
require File.join(File.dirname(__FILE__), 'pivotal-tracker', 'story')
|
12
13
|
require File.join(File.dirname(__FILE__), 'pivotal-tracker', 'task')
|
13
14
|
require File.join(File.dirname(__FILE__), 'pivotal-tracker', 'membership')
|
data/pivotal-tracker.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{pivotal-tracker}
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Justin Smestad", "Josh Nichols", "Terence Lee"]
|
12
|
-
s.date = %q{2010-07
|
12
|
+
s.date = %q{2010-08-07}
|
13
13
|
s.email = %q{justin.smestad@gmail.com}
|
14
14
|
s.extra_rdoc_files = [
|
15
15
|
"LICENSE",
|
@@ -18,12 +18,14 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.files = [
|
19
19
|
".gitignore",
|
20
20
|
"Gemfile",
|
21
|
+
"Gemfile.lock",
|
21
22
|
"LICENSE",
|
22
23
|
"README.rdoc",
|
23
24
|
"Rakefile",
|
24
25
|
"VERSION",
|
25
26
|
"lib/pivotal-tracker.rb",
|
26
27
|
"lib/pivotal-tracker/activity.rb",
|
28
|
+
"lib/pivotal-tracker/attachment.rb",
|
27
29
|
"lib/pivotal-tracker/client.rb",
|
28
30
|
"lib/pivotal-tracker/extensions.rb",
|
29
31
|
"lib/pivotal-tracker/iteration.rb",
|
@@ -54,6 +56,7 @@ Gem::Specification.new do |s|
|
|
54
56
|
"spec/spec_helper.rb",
|
55
57
|
"spec/support/stale_fish_fixtures.rb",
|
56
58
|
"spec/unit/pivotal-tracker/activity_spec.rb",
|
59
|
+
"spec/unit/pivotal-tracker/attachment_spec.rb",
|
57
60
|
"spec/unit/pivotal-tracker/iteration_spec.rb",
|
58
61
|
"spec/unit/pivotal-tracker/membership_spec.rb",
|
59
62
|
"spec/unit/pivotal-tracker/note_spec.rb",
|
@@ -64,12 +67,13 @@ Gem::Specification.new do |s|
|
|
64
67
|
s.homepage = %q{http://github.com/jsmestad/pivotal-tracker}
|
65
68
|
s.rdoc_options = ["--charset=UTF-8"]
|
66
69
|
s.require_paths = ["lib"]
|
67
|
-
s.rubygems_version = %q{1.3.
|
70
|
+
s.rubygems_version = %q{1.3.7}
|
68
71
|
s.summary = %q{Ruby wrapper for the Pivotal Tracker API}
|
69
72
|
s.test_files = [
|
70
73
|
"spec/spec_helper.rb",
|
71
74
|
"spec/support/stale_fish_fixtures.rb",
|
72
75
|
"spec/unit/pivotal-tracker/activity_spec.rb",
|
76
|
+
"spec/unit/pivotal-tracker/attachment_spec.rb",
|
73
77
|
"spec/unit/pivotal-tracker/iteration_spec.rb",
|
74
78
|
"spec/unit/pivotal-tracker/membership_spec.rb",
|
75
79
|
"spec/unit/pivotal-tracker/note_spec.rb",
|
@@ -82,22 +86,34 @@ Gem::Specification.new do |s|
|
|
82
86
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
83
87
|
s.specification_version = 3
|
84
88
|
|
85
|
-
if Gem::Version.new(Gem::
|
86
|
-
s.add_runtime_dependency(%q<rest-client>, ["~> 1.
|
87
|
-
s.add_runtime_dependency(%q<happymapper>, [">= 0.2
|
89
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
90
|
+
s.add_runtime_dependency(%q<rest-client>, ["~> 1.6.0"])
|
91
|
+
s.add_runtime_dependency(%q<happymapper>, [">= 0.3.2"])
|
88
92
|
s.add_runtime_dependency(%q<builder>, [">= 0"])
|
89
|
-
s.add_runtime_dependency(%q<nokogiri>, ["~> 1.4.1"])
|
93
|
+
s.add_runtime_dependency(%q<nokogiri>, ["~> 1.4.3.1"])
|
94
|
+
s.add_development_dependency(%q<rspec>, [">= 0"])
|
95
|
+
s.add_development_dependency(%q<bundler>, [">= 0.9.26"])
|
96
|
+
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
97
|
+
s.add_development_dependency(%q<stale_fish>, ["~> 1.3.0"])
|
90
98
|
else
|
91
|
-
s.add_dependency(%q<rest-client>, ["~> 1.
|
92
|
-
s.add_dependency(%q<happymapper>, [">= 0.2
|
99
|
+
s.add_dependency(%q<rest-client>, ["~> 1.6.0"])
|
100
|
+
s.add_dependency(%q<happymapper>, [">= 0.3.2"])
|
93
101
|
s.add_dependency(%q<builder>, [">= 0"])
|
94
|
-
s.add_dependency(%q<nokogiri>, ["~> 1.4.1"])
|
102
|
+
s.add_dependency(%q<nokogiri>, ["~> 1.4.3.1"])
|
103
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
104
|
+
s.add_dependency(%q<bundler>, [">= 0.9.26"])
|
105
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
106
|
+
s.add_dependency(%q<stale_fish>, ["~> 1.3.0"])
|
95
107
|
end
|
96
108
|
else
|
97
|
-
s.add_dependency(%q<rest-client>, ["~> 1.
|
98
|
-
s.add_dependency(%q<happymapper>, [">= 0.2
|
109
|
+
s.add_dependency(%q<rest-client>, ["~> 1.6.0"])
|
110
|
+
s.add_dependency(%q<happymapper>, [">= 0.3.2"])
|
99
111
|
s.add_dependency(%q<builder>, [">= 0"])
|
100
|
-
s.add_dependency(%q<nokogiri>, ["~> 1.4.1"])
|
112
|
+
s.add_dependency(%q<nokogiri>, ["~> 1.4.3.1"])
|
113
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
114
|
+
s.add_dependency(%q<bundler>, [">= 0.9.26"])
|
115
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
116
|
+
s.add_dependency(%q<stale_fish>, ["~> 1.3.0"])
|
101
117
|
end
|
102
118
|
end
|
103
119
|
|