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 CHANGED
@@ -1 +1 @@
1
- 0.0.2
1
+ 0.0.3
@@ -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 'Token' => @token
26
+ response = project_resource.get
17
27
  Project.parse(response).first
18
28
  end
19
29
 
20
30
  def stories
21
- response = project_resource['stories'].get 'Token' => @token
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
- response = stories_resource[filter_string].get
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 'Token' => @token, 'Content-Type' => 'application/xml'
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, 'Token' => @token, 'Content-Type' => 'application/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, 'Token' => @token, 'Content-Type' => 'application/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 'Token' => @token
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 "http://www.pivotaltracker.com/services/v1/projects"
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
@@ -0,0 +1,7 @@
1
+ class Iteration
2
+ include HappyMapper
3
+ element :id, Integer
4
+ element :number, Integer
5
+ element :start, DateTime
6
+ has_many :stories, Story
7
+ end
@@ -1,7 +1,8 @@
1
1
  class Project
2
2
  include HappyMapper
3
+ element :id, Integer
3
4
  element :name, String
4
- element :iteration_length, String
5
+ element :iteration_length, Integer
5
6
  element :week_start_day, String
6
7
  element :point_scale, String
7
8
  end
@@ -1,8 +1,17 @@
1
1
  class Story
2
2
  include HappyMapper
3
3
  element :id, Integer
4
- element :type, String
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|
@@ -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.2"
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-05-27}
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/pivotal_tracker_test.rb",
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
- def setup
6
- @tracker = Tracker.new
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
@@ -1,5 +1,6 @@
1
1
  require 'rubygems'
2
2
  require 'test/unit'
3
+ require 'shoulda'
3
4
 
4
5
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
5
6
  $LOAD_PATH.unshift(File.dirname(__FILE__))
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.2
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-05-27 00:00:00 -07:00
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