jsmestad-pivotal-tracker 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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