pivotal-tracker 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.3.1
@@ -4,6 +4,7 @@ require 'happymapper'
4
4
  require 'nokogiri'
5
5
 
6
6
 
7
+ require File.join(File.dirname(__FILE__), 'pivotal-tracker', 'validation')
7
8
  require File.join(File.dirname(__FILE__), 'pivotal-tracker', 'extensions')
8
9
  require File.join(File.dirname(__FILE__), 'pivotal-tracker', 'proxy')
9
10
  require File.join(File.dirname(__FILE__), 'pivotal-tracker', 'client')
@@ -22,18 +23,16 @@ module PivotalTracker
22
23
  class ProjectNotSpecified < StandardError; end
23
24
 
24
25
  def self.encode_options(options)
25
- return nil if !options.is_a?(Hash) || options.empty?
26
- options_strings = []
27
- # remove options which are not filters, and encode them as such
28
- [:limit, :offset].each do |o|
29
- options_strings << "#{CGI.escape(o.to_s)}=#{CGI.escape(options.delete(o))}" if options[o]
30
- end
31
- # assume remaining key-value pairs describe filters, and encode them as such.
32
- filters_string = options.map do |key, value|
33
- [value].flatten.map {|v| "#{CGI.escape(key.to_s)}%3A#{CGI.escape(v)}"}.join('&filter=')
34
- end
35
- options_strings << "filter=#{filters_string}" unless filters_string.empty?
36
- return "?#{options_strings.join('&')}"
26
+ options_strings = options.inject({}) do |m, (k,v)|
27
+ if [:limit, :offset].include?(k.to_sym)
28
+ m.update k => v
29
+ else
30
+ filter_query = %{#{k}:#{[v].flatten.join(",")}}
31
+ m.update :filter => (m[:filter] ? "#{m[:filter]} #{filter_query}" : filter_query)
32
+ end
33
+ end.map {|k,v| "#{k}=#{CGI.escape(v.to_s)}"}
34
+
35
+ %{?#{options_strings.join("&")}} unless options_strings.empty?
37
36
  end
38
37
 
39
38
  end
@@ -41,6 +41,7 @@ module PivotalTracker
41
41
  element :jira_url, String
42
42
  element :other_id, Integer
43
43
  element :integration_id, Integer
44
+ element :deadline, DateTime # Only available for Release stories
44
45
 
45
46
  has_many :attachments, Attachment, :tag => 'attachments'
46
47
 
@@ -128,6 +129,7 @@ module PivotalTracker
128
129
  xml.integration_id "#{integration_id}"
129
130
  xml.created_at DateTime.parse(created_at.to_s).to_s if created_at
130
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
131
133
  }
132
134
  end
133
135
  return builder.to_xml
@@ -139,4 +141,8 @@ module PivotalTracker
139
141
  end
140
142
  end
141
143
  end
144
+
145
+ class Story
146
+ include Validation
147
+ end
142
148
  end
@@ -46,4 +46,8 @@ module PivotalTracker
46
46
  end
47
47
 
48
48
  end
49
+
50
+ class Task
51
+ include Validation
52
+ end
49
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
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{pivotal-tracker}
8
- s.version = "0.3.0"
8
+ s.version = "0.3.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-11-04}
12
+ s.date = %q{2010-12-15}
13
13
  s.email = %q{justin.smestad@gmail.com}
14
14
  s.extra_rdoc_files = [
15
15
  "LICENSE",
@@ -35,6 +35,7 @@ Gem::Specification.new do |s|
35
35
  "lib/pivotal-tracker/proxy.rb",
36
36
  "lib/pivotal-tracker/story.rb",
37
37
  "lib/pivotal-tracker/task.rb",
38
+ "lib/pivotal-tracker/validation.rb",
38
39
  "lib/pivotal_tracker.rb",
39
40
  "pivotal-tracker.gemspec",
40
41
  "spec/fixtures/activity.xml",
@@ -22,6 +22,27 @@ describe PivotalTracker::Story do
22
22
  it "should return the created story" do
23
23
  @project.stories.create(:name => 'Create Stuff').should be_a(PivotalTracker::Story)
24
24
  end
25
+
26
+ context "on failure" do
27
+ before do
28
+ FakeWeb.register_uri(:post, "http://www.pivotaltracker.com/services/v3/projects/#{@project.id}/stories",
29
+ :body => %{<?xml version="1.0" encoding="UTF-8"?>
30
+ <errors>
31
+ <error>error#1 message</error>
32
+ <error>error#2 message</error>
33
+ </errors>%},
34
+ :status => "422")
35
+ end
36
+
37
+ it "should not raise an exception" do
38
+ expect { @project.stories.create }.to_not raise_error(Exception)
39
+ end
40
+
41
+ it "should report errors encountered" do
42
+ story = @project.stories.create :name => "Invalid story"
43
+ story.errors.messages.should =~ ["error#1 message", "error#2 message"]
44
+ end
45
+ end
25
46
  end
26
47
 
27
48
  context ".attachments" do
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pivotal-tracker
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 17
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 3
9
- - 0
10
- version: 0.3.0
9
+ - 1
10
+ version: 0.3.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Justin Smestad
@@ -17,7 +17,7 @@ autorequire:
17
17
  bindir: bin
18
18
  cert_chain: []
19
19
 
20
- date: 2010-11-04 00:00:00 -06:00
20
+ date: 2010-12-15 00:00:00 -07:00
21
21
  default_executable:
22
22
  dependencies:
23
23
  - !ruby/object:Gem::Dependency
@@ -172,6 +172,7 @@ files:
172
172
  - lib/pivotal-tracker/proxy.rb
173
173
  - lib/pivotal-tracker/story.rb
174
174
  - lib/pivotal-tracker/task.rb
175
+ - lib/pivotal-tracker/validation.rb
175
176
  - lib/pivotal_tracker.rb
176
177
  - pivotal-tracker.gemspec
177
178
  - spec/fixtures/activity.xml