jsmestad-pivotal-tracker 0.0.2 → 0.0.3
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/VERSION +1 -1
- data/lib/pivotal-tracker.rb +54 -22
- data/lib/pivotal-tracker/iteration.rb +7 -0
- data/lib/pivotal-tracker/project.rb +2 -1
- data/lib/pivotal-tracker/story.rb +10 -1
- data/pivotal-tracker.gemspec +6 -3
- data/test/extensions_test.rb +19 -0
- data/test/pivotal_tracker_test.rb +3 -50
- data/test/test_helper.rb +1 -0
- metadata +5 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.3
|
data/lib/pivotal-tracker.rb
CHANGED
@@ -1,71 +1,88 @@
|
|
1
1
|
require 'restclient'
|
2
2
|
require 'happymapper'
|
3
3
|
require 'builder'
|
4
|
+
require 'cgi'
|
4
5
|
|
5
6
|
|
7
|
+
# initial definition, to avoid circular dependencies when declaring happymappings
|
8
|
+
class Story; end
|
9
|
+
class Iteration; end
|
10
|
+
class Project; end
|
11
|
+
|
6
12
|
require 'pivotal-tracker/extensions'
|
7
13
|
require 'pivotal-tracker/project'
|
8
14
|
require 'pivotal-tracker/story'
|
15
|
+
require 'pivotal-tracker/iteration'
|
9
16
|
|
10
17
|
class PivotalTracker
|
11
|
-
def initialize(project_id, token)
|
18
|
+
def initialize(project_id, token, options = {})
|
12
19
|
@project_id, @token = project_id, token
|
20
|
+
|
21
|
+
@base_url = "http://www.pivotaltracker.com/services/v2"
|
22
|
+
@base_url.gsub! 'http', 'https' if options[:use_ssl]
|
13
23
|
end
|
14
24
|
|
15
25
|
def project
|
16
|
-
response = project_resource.get
|
26
|
+
response = project_resource.get
|
17
27
|
Project.parse(response).first
|
18
28
|
end
|
19
29
|
|
20
30
|
def stories
|
21
|
-
response =
|
31
|
+
response = stories_resource.get
|
22
32
|
Story.parse(response)
|
23
33
|
end
|
24
|
-
|
25
|
-
# would ideally like to pass a size, aka :all to limit search
|
26
|
-
def find(filters = {})
|
27
|
-
unless filters.empty?
|
28
|
-
filter_string = "?filter="
|
29
|
-
filters.each do |key, value|
|
30
|
-
filter_string << CGI::escape("#{key}:\"#{value}\"")
|
31
|
-
end
|
32
|
-
else
|
33
|
-
filter_string = ""
|
34
|
-
end
|
35
34
|
|
36
|
-
|
37
|
-
|
35
|
+
def iterations
|
36
|
+
response = iterations_resource.get
|
37
|
+
Iteration.parse(response)
|
38
|
+
end
|
39
|
+
|
40
|
+
def find(*filters)
|
41
|
+
filter_query = CGI::escape coerce_to_filter(filters)
|
42
|
+
response = stories_resource["?filter=#{filter_query}"].get
|
38
43
|
Story.parse(response)
|
39
44
|
end
|
40
45
|
|
41
46
|
def find_story(id)
|
42
|
-
story_resource(id).get
|
43
|
-
|
47
|
+
response = story_resource(id).get
|
44
48
|
Story.parse(response).first
|
45
49
|
end
|
46
50
|
|
47
51
|
def create_story(story)
|
48
|
-
stories_resource.post story.to_xml
|
52
|
+
stories_resource.post story.to_xml
|
49
53
|
end
|
50
54
|
|
51
55
|
def update_story(story)
|
52
|
-
story_resource(story).put story.to_xml
|
56
|
+
story_resource(story).put story.to_xml
|
53
57
|
end
|
54
58
|
|
55
59
|
def delete_story(story)
|
56
|
-
story_resource(story).delete
|
60
|
+
story_resource(story).delete
|
61
|
+
end
|
62
|
+
|
63
|
+
def deliver_all_finished_stories
|
64
|
+
response = stories_resource['/deliver_all_finished'].put ''
|
65
|
+
Story.parse(response)
|
57
66
|
end
|
58
67
|
|
59
68
|
protected
|
60
69
|
|
61
70
|
def projects_resource
|
62
|
-
RestClient::Resource.new "
|
71
|
+
RestClient::Resource.new "#{@base_url}/projects",
|
72
|
+
:headers => {
|
73
|
+
'X-TrackerToken' => @token,
|
74
|
+
'Content-Type' => 'application/xml'
|
75
|
+
}
|
63
76
|
end
|
64
77
|
|
65
78
|
def project_resource(project = @project_id)
|
66
79
|
projects_resource["/#{@project_id}"]
|
67
80
|
end
|
68
81
|
|
82
|
+
def iterations_resource
|
83
|
+
project_resource["/iterations"]
|
84
|
+
end
|
85
|
+
|
69
86
|
def stories_resource
|
70
87
|
project_resource['/stories']
|
71
88
|
end
|
@@ -73,4 +90,19 @@ class PivotalTracker
|
|
73
90
|
def story_resource(story)
|
74
91
|
stories_resource["/#{story.to_param}"]
|
75
92
|
end
|
93
|
+
|
94
|
+
def coerce_to_filter(object)
|
95
|
+
case object
|
96
|
+
when String, Integer,NilClass
|
97
|
+
object.to_s.inspect
|
98
|
+
when Hash
|
99
|
+
object.collect do |key, value|
|
100
|
+
"#{key}:#{coerce_to_filter(value)}"
|
101
|
+
end.join(' ')
|
102
|
+
when Array
|
103
|
+
object.collect do |each|
|
104
|
+
coerce_to_filter(each)
|
105
|
+
end.join(' ')
|
106
|
+
end
|
107
|
+
end
|
76
108
|
end
|
@@ -1,8 +1,17 @@
|
|
1
1
|
class Story
|
2
2
|
include HappyMapper
|
3
3
|
element :id, Integer
|
4
|
-
element :
|
4
|
+
element :story_type, String
|
5
|
+
element :url, String
|
6
|
+
element :estimate, Integer
|
7
|
+
element :current_state, String
|
5
8
|
element :name, String
|
9
|
+
element :requested_by, String
|
10
|
+
element :owned_by, String
|
11
|
+
element :created_at, DateTime
|
12
|
+
element :accepted_at, DateTime
|
13
|
+
element :labels, String
|
14
|
+
has_one :iteration, Iteration
|
6
15
|
|
7
16
|
def initialize(attributes = {})
|
8
17
|
attributes.each do |key, value|
|
data/pivotal-tracker.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{pivotal-tracker}
|
5
|
-
s.version = "0.0.
|
5
|
+
s.version = "0.0.3"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Justin Smestad", "Josh Nichols"]
|
9
|
-
s.date = %q{2009-
|
9
|
+
s.date = %q{2009-06-07}
|
10
10
|
s.email = %q{justin.smestad@gmail.com}
|
11
11
|
s.extra_rdoc_files = [
|
12
12
|
"LICENSE",
|
@@ -21,9 +21,11 @@ Gem::Specification.new do |s|
|
|
21
21
|
"VERSION",
|
22
22
|
"lib/pivotal-tracker.rb",
|
23
23
|
"lib/pivotal-tracker/extensions.rb",
|
24
|
+
"lib/pivotal-tracker/iteration.rb",
|
24
25
|
"lib/pivotal-tracker/project.rb",
|
25
26
|
"lib/pivotal-tracker/story.rb",
|
26
27
|
"pivotal-tracker.gemspec",
|
28
|
+
"test/extensions_test.rb",
|
27
29
|
"test/pivotal_tracker_test.rb",
|
28
30
|
"test/test_helper.rb"
|
29
31
|
]
|
@@ -34,7 +36,8 @@ Gem::Specification.new do |s|
|
|
34
36
|
s.rubygems_version = %q{1.3.1}
|
35
37
|
s.summary = %q{Ruby wrapper for the Pivotal Tracker API}
|
36
38
|
s.test_files = [
|
37
|
-
"test/
|
39
|
+
"test/extensions_test.rb",
|
40
|
+
"test/pivotal_tracker_test.rb",
|
38
41
|
"test/test_helper.rb"
|
39
42
|
]
|
40
43
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ExtensionTest < Test::Unit::TestCase
|
4
|
+
context String do
|
5
|
+
should "return the string for to_param" do
|
6
|
+
string = "my string!"
|
7
|
+
assert_same string, string.to_param
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
context Integer do
|
12
|
+
should "return a string representation for to_param" do
|
13
|
+
integer = 5
|
14
|
+
assert_equal "5", integer.to_param
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
|
@@ -1,56 +1,9 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class PivotalTrackerTest < Test::Unit::TestCase
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
end
|
8
|
-
|
9
|
-
def test_assert_stories_return
|
10
|
-
assert_equal 3, @tracker.stories.size
|
11
|
-
end
|
12
|
-
|
13
|
-
def test_assert_project_response
|
14
|
-
project = @tracker.project
|
15
|
-
assert_equal "Factory Test", project[:name]
|
16
|
-
assert_equal "1", project[:iteration_length]
|
17
|
-
end
|
18
|
-
|
19
|
-
def test_find_without_filters
|
20
|
-
result = @tracker.find
|
21
|
-
assert_equal @tracker.stories.size, result.size
|
22
|
-
end
|
23
|
-
|
24
|
-
def test_find_with_filters
|
25
|
-
result = @tracker.find :name => 'Create another one'
|
26
|
-
assert_equal result[0][:name], 'Create another one'
|
27
|
-
end
|
28
|
-
|
29
|
-
def test_assert_story_creation
|
30
|
-
current_size = @tracker.stories.size
|
31
|
-
story = {
|
32
|
-
:name => 'Create another one',
|
33
|
-
:story_type => "feature",
|
34
|
-
:requested_by => "Justin Smestad"
|
35
|
-
}
|
36
|
-
@tracker.create_story(story)
|
37
|
-
assert_equal (current_size + 1), @tracker.stories.size
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_story_updates
|
41
|
-
story = {
|
42
|
-
:id => 272626,
|
43
|
-
:name => 'This has changed'
|
44
|
-
}
|
45
|
-
@tracker.update_story(story)
|
46
|
-
assert_equal @tracker.find_story(story[:id])[:name], story[:name]
|
47
|
-
end
|
48
|
-
|
49
|
-
def test_story_deletion
|
50
|
-
current_size = @tracker.stories.size
|
51
|
-
id = @tracker.stories[0][:id]
|
52
|
-
@tracker.delete_story(id)
|
53
|
-
assert_equal (current_size - 1), @tracker.stories.size
|
4
|
+
|
5
|
+
should "test stuff eventually" do
|
6
|
+
|
54
7
|
end
|
55
8
|
|
56
9
|
end
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jsmestad-pivotal-tracker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Smestad
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2009-
|
13
|
+
date: 2009-06-07 00:00:00 -07:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -51,9 +51,11 @@ files:
|
|
51
51
|
- VERSION
|
52
52
|
- lib/pivotal-tracker.rb
|
53
53
|
- lib/pivotal-tracker/extensions.rb
|
54
|
+
- lib/pivotal-tracker/iteration.rb
|
54
55
|
- lib/pivotal-tracker/project.rb
|
55
56
|
- lib/pivotal-tracker/story.rb
|
56
57
|
- pivotal-tracker.gemspec
|
58
|
+
- test/extensions_test.rb
|
57
59
|
- test/pivotal_tracker_test.rb
|
58
60
|
- test/test_helper.rb
|
59
61
|
has_rdoc: true
|
@@ -83,5 +85,6 @@ signing_key:
|
|
83
85
|
specification_version: 2
|
84
86
|
summary: Ruby wrapper for the Pivotal Tracker API
|
85
87
|
test_files:
|
88
|
+
- test/extensions_test.rb
|
86
89
|
- test/pivotal_tracker_test.rb
|
87
90
|
- test/test_helper.rb
|