git-pivotal 0.2.3 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/CHANGELOG +9 -1
- data/Rakefile +23 -10
- data/VERSION +1 -1
- data/bin/git-bug +0 -1
- data/bin/git-chore +0 -1
- data/bin/git-feature +0 -1
- data/bin/git-finish +0 -1
- data/bin/git-info +7 -0
- data/bin/git-pick +0 -1
- data/features/bug.feature +9 -0
- data/features/chore.feature +22 -0
- data/features/feature.feature +37 -0
- data/features/finish.feature +79 -0
- data/features/info.feature +39 -0
- data/features/step_definitions/steps.rb +18 -0
- data/features/support/env.rb +5 -0
- data/features/support/git-pivotal.rb +47 -0
- data/features/test_repo/readme +1 -0
- data/features/test_repo/working.git/COMMIT_EDITMSG +1 -0
- data/features/test_repo/working.git/HEAD +1 -0
- data/features/test_repo/working.git/config +8 -0
- data/features/test_repo/working.git/description +1 -0
- data/features/test_repo/working.git/hooks/applypatch-msg.sample +15 -0
- data/features/test_repo/working.git/hooks/commit-msg.sample +24 -0
- data/features/test_repo/working.git/hooks/post-commit.sample +8 -0
- data/features/test_repo/working.git/hooks/post-receive.sample +15 -0
- data/features/test_repo/working.git/hooks/post-update.sample +8 -0
- data/features/test_repo/working.git/hooks/pre-applypatch.sample +14 -0
- data/features/test_repo/working.git/hooks/pre-commit.sample +46 -0
- data/features/test_repo/working.git/hooks/pre-rebase.sample +169 -0
- data/features/test_repo/working.git/hooks/prepare-commit-msg.sample +36 -0
- data/features/test_repo/working.git/hooks/update.sample +128 -0
- data/features/test_repo/working.git/index +0 -0
- data/features/test_repo/working.git/info/exclude +6 -0
- data/features/test_repo/working.git/logs/HEAD +1 -0
- data/features/test_repo/working.git/logs/refs/heads/master +1 -0
- data/features/test_repo/working.git/objects/0c/6f7b1384910d1a2f137590095f008a06c7e00c +0 -0
- data/features/test_repo/working.git/objects/10/ecf2b7ce989f01f3f7266e712b48d9275f2635 +0 -0
- data/features/test_repo/working.git/objects/a5/71d56305df09fb060f6ccb730b46080d305beb +0 -0
- data/features/test_repo/working.git/refs/heads/master +1 -0
- data/git-pivotal.gemspec +49 -38
- data/lib/commands/base.rb +19 -9
- data/lib/commands/finish.rb +12 -9
- data/lib/commands/info.rb +31 -0
- data/lib/commands/pick.rb +26 -22
- data/lib/git-pivotal.rb +9 -0
- data/readme.markdown +13 -0
- data/spec/commands/base_spec.rb +20 -1
- data/spec/commands/bug_spec.rb +0 -1
- data/spec/commands/chore_spec.rb +0 -1
- data/spec/commands/feature_spec.rb +0 -1
- data/spec/commands/finish_spec.rb +1 -2
- data/spec/spec_helper.rb +4 -8
- metadata +61 -52
- data/lib/pivotal/api.rb +0 -17
- data/lib/pivotal/associations.rb +0 -17
- data/lib/pivotal/attributes.rb +0 -25
- data/lib/pivotal/base.rb +0 -73
- data/lib/pivotal/collection.rb +0 -63
- data/lib/pivotal/project.rb +0 -14
- data/lib/pivotal/story.rb +0 -44
- data/lib/pivotal.rb +0 -8
- data/spec/pivotal/api_spec.rb +0 -18
- data/spec/pivotal/associations_spec.rb +0 -13
- data/spec/pivotal/attributes_spec.rb +0 -31
- data/spec/pivotal/base_spec.rb +0 -77
- data/spec/pivotal/collection_spec.rb +0 -25
- data/spec/pivotal/project_spec.rb +0 -34
- data/spec/pivotal/story_spec.rb +0 -113
- data/spec/spec.opts +0 -1
data/lib/pivotal/story.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
module Pivotal
|
2
|
-
class Story < Base
|
3
|
-
|
4
|
-
has_attributes :id, :story_type, :url, :estimate, :current_state,
|
5
|
-
:description, :name, :requested_by, :owned_by,
|
6
|
-
:created_at, :accepted_at, :labels
|
7
|
-
|
8
|
-
def start!(options = {})
|
9
|
-
return false if feature? && unestimated?
|
10
|
-
|
11
|
-
update_attributes(options.merge(:current_state => :started))
|
12
|
-
end
|
13
|
-
|
14
|
-
def feature?
|
15
|
-
story_type == "feature"
|
16
|
-
end
|
17
|
-
|
18
|
-
def bug?
|
19
|
-
story_type == "bug"
|
20
|
-
end
|
21
|
-
|
22
|
-
def chore?
|
23
|
-
story_type == "chore"
|
24
|
-
end
|
25
|
-
|
26
|
-
def release?
|
27
|
-
story_type == "release"
|
28
|
-
end
|
29
|
-
|
30
|
-
def unestimated?
|
31
|
-
estimate == "unestimated"
|
32
|
-
end
|
33
|
-
|
34
|
-
def finished_state
|
35
|
-
case story_type
|
36
|
-
when "chore"
|
37
|
-
:accepted
|
38
|
-
else
|
39
|
-
:finished
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
44
|
-
end
|
data/lib/pivotal.rb
DELETED
@@ -1,8 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__),'pivotal', 'collection')
|
2
|
-
require File.join(File.dirname(__FILE__),'pivotal', 'associations')
|
3
|
-
require File.join(File.dirname(__FILE__),'pivotal', 'attributes')
|
4
|
-
|
5
|
-
require File.join(File.dirname(__FILE__),'pivotal','base')
|
6
|
-
require File.join(File.dirname(__FILE__),'pivotal','story')
|
7
|
-
require File.join(File.dirname(__FILE__),'pivotal','project')
|
8
|
-
require File.join(File.dirname(__FILE__),'pivotal','api')
|
data/spec/pivotal/api_spec.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Pivotal::Api do
|
4
|
-
|
5
|
-
before(:each) do
|
6
|
-
@api = pivotal_api
|
7
|
-
end
|
8
|
-
|
9
|
-
it "should connect to Pivotal Tracker's API" do
|
10
|
-
@api.resource.url.should == "https://www.pivotaltracker.com/services/v3"
|
11
|
-
end
|
12
|
-
|
13
|
-
it "should have a collection of projects" do
|
14
|
-
@api.projects.should be_a(Pivotal::Collection)
|
15
|
-
@api.projects.component_class.should == Pivotal::Project
|
16
|
-
end
|
17
|
-
|
18
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Pivotal::Associations do
|
4
|
-
|
5
|
-
it "should load the #has_collection method into a class" do
|
6
|
-
@base = Object
|
7
|
-
@base.should_not respond_to(:has_collection)
|
8
|
-
|
9
|
-
@base.send(:include, Pivotal::Associations)
|
10
|
-
@base.should respond_to(:has_collection)
|
11
|
-
end
|
12
|
-
|
13
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Pivotal::Attributes do
|
4
|
-
|
5
|
-
it "should load the #has_attributes method onto a class" do
|
6
|
-
@base = Class.new
|
7
|
-
@base.should_not respond_to(:has_attributes)
|
8
|
-
|
9
|
-
@base.send :include, Pivotal::Attributes
|
10
|
-
@base.should respond_to(:has_attributes)
|
11
|
-
end
|
12
|
-
|
13
|
-
it "should add methods specified in #has_attributes to the object" do
|
14
|
-
@base = Class.new
|
15
|
-
@base.send :include, Pivotal::Attributes
|
16
|
-
|
17
|
-
@base.new.should_not respond_to(:one)
|
18
|
-
@base.has_attributes :one
|
19
|
-
@base.new.should respond_to(:one)
|
20
|
-
end
|
21
|
-
|
22
|
-
it "should add the attributes specified in #has_attributes to the class #attributes list" do
|
23
|
-
@base = Class.new
|
24
|
-
@base.send :include, Pivotal::Attributes
|
25
|
-
|
26
|
-
@base.attributes.should be_nil
|
27
|
-
@base.has_attributes :one
|
28
|
-
@base.attributes.should == ["one"]
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
data/spec/pivotal/base_spec.rb
DELETED
@@ -1,77 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'nokogiri'
|
3
|
-
|
4
|
-
describe Pivotal::Base do
|
5
|
-
|
6
|
-
before(:each) do
|
7
|
-
@base = pivotal_api
|
8
|
-
@response = mock("response")
|
9
|
-
@response.stubs(:body => "<xml>Some XML String</xml>")
|
10
|
-
end
|
11
|
-
|
12
|
-
it "should expose a REST resource" do
|
13
|
-
@base.resource.should be_a(RestClient::Resource)
|
14
|
-
end
|
15
|
-
|
16
|
-
it "should expose the resource's XML" do
|
17
|
-
@base.resource.expects(:get).returns(@response)
|
18
|
-
@base.xml.should be_a(String)
|
19
|
-
end
|
20
|
-
|
21
|
-
it "should expose the resource's XML parse tree" do
|
22
|
-
@base.resource.expects(:get).returns(@response)
|
23
|
-
@base.parsed_resource.should be_a(Nokogiri::XML::Document)
|
24
|
-
end
|
25
|
-
|
26
|
-
it "should present the class's item xpath" do
|
27
|
-
@base.class.xpath.should == "//api"
|
28
|
-
end
|
29
|
-
|
30
|
-
it "should expose association methods" do
|
31
|
-
@base.class.should include(Pivotal::Associations)
|
32
|
-
end
|
33
|
-
|
34
|
-
describe "updating the remote resource" do
|
35
|
-
|
36
|
-
before(:each) do
|
37
|
-
@xml = "<api><current_state>started</current_state></api>"
|
38
|
-
@response.stubs(:code).returns(200)
|
39
|
-
@response.stubs(:body).returns(@xml)
|
40
|
-
|
41
|
-
@base.resource.expects(:put).with(@xml).yields(@response)
|
42
|
-
@base.class.has_attributes :current_state
|
43
|
-
end
|
44
|
-
|
45
|
-
it "should be able to update the remote resource with a hash of string values" do
|
46
|
-
@base.update_attributes(:current_state => "started")
|
47
|
-
end
|
48
|
-
|
49
|
-
it "should be able to update the remote resource with a hash of symbol values" do
|
50
|
-
@base.update_attributes(:current_state => :started)
|
51
|
-
end
|
52
|
-
|
53
|
-
it "should not update attributes which don't exist on the remote model" do
|
54
|
-
@base.update_attributes(:current_state => :started, :unknown_attribute => true)
|
55
|
-
end
|
56
|
-
|
57
|
-
it "should update the stored xml with the new remote model" do
|
58
|
-
pending("not sure what changed here, but it needs to be fixed") do
|
59
|
-
@base.resource.stubs(:get => @response)
|
60
|
-
lambda {
|
61
|
-
@base.update_attributes(:current_state => "started")
|
62
|
-
}.should change(@base, :xml).to(@response.body)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
it "should return true if the response code is 200" do
|
67
|
-
@base.update_attributes(:current_state => :started).should == true
|
68
|
-
end
|
69
|
-
|
70
|
-
it "should return false if the response code is not 200" do
|
71
|
-
@response.stubs(:code).returns(422)
|
72
|
-
@base.update_attributes(:current_state => :started).should == false
|
73
|
-
end
|
74
|
-
|
75
|
-
end
|
76
|
-
|
77
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Pivotal::Collection do
|
4
|
-
|
5
|
-
before(:each) do
|
6
|
-
@api = pivotal_api
|
7
|
-
response = mock("response")
|
8
|
-
response.stubs(:body => "<project><id>1</id></project>")
|
9
|
-
RestClient::Resource.any_instance.stubs(:get).returns(response)
|
10
|
-
end
|
11
|
-
|
12
|
-
it "should find a single item given an id" do
|
13
|
-
@api.projects.find(1).should be_a(Pivotal::Project)
|
14
|
-
end
|
15
|
-
|
16
|
-
it "should find a collection of items giving a set of conditions" do
|
17
|
-
@api.projects.find(:all).should be_a(Array)
|
18
|
-
@api.projects.first.should be_a(Pivotal::Project)
|
19
|
-
end
|
20
|
-
|
21
|
-
it "should return the first item of a collection" do
|
22
|
-
@api.projects.first.should be_a(Pivotal::Project)
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Pivotal::Project do
|
4
|
-
|
5
|
-
before(:each) do
|
6
|
-
@project = Pivotal::Project.new :resource => pivotal_api.resource["projects"][1]
|
7
|
-
end
|
8
|
-
|
9
|
-
it "should be connected to the project resource" do
|
10
|
-
@project.resource.url.should == "https://www.pivotaltracker.com/services/v3/projects/1"
|
11
|
-
end
|
12
|
-
|
13
|
-
it "should have a collection of stories" do
|
14
|
-
@project.stories.should be_a(Pivotal::Collection)
|
15
|
-
@project.stories.component_class.should == Pivotal::Story
|
16
|
-
end
|
17
|
-
|
18
|
-
[:id, :name, :iteration_length, :week_start_day,
|
19
|
-
:point_scale, :account, :velocity_scheme,
|
20
|
-
:current_velocity, :initial_velocity,
|
21
|
-
:number_of_iterations_to_show, :labels,
|
22
|
-
:allow_attachments, :public, :use_https,
|
23
|
-
:bugs_and_chores_are_estimatable, :commit_mode,
|
24
|
-
:last_activity_at, :memberships, :integrations].map(&:to_s).each do |method|
|
25
|
-
it "should have an accessor method for #{method}" do
|
26
|
-
@project.methods.should include(method)
|
27
|
-
end
|
28
|
-
|
29
|
-
it "should include #{method} in the list of valid attributes" do
|
30
|
-
@project.class.attributes.should include(method)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
data/spec/pivotal/story_spec.rb
DELETED
@@ -1,113 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Pivotal::Story do
|
4
|
-
|
5
|
-
def story_type(type = "feature")
|
6
|
-
Factory(:story, :story_type => type)
|
7
|
-
end
|
8
|
-
|
9
|
-
before(:each) do
|
10
|
-
@story = Pivotal::Story.new :resource => pivotal_api.resource["projects"][1]["stories"][1]
|
11
|
-
@response = mock("response")
|
12
|
-
@response.stubs(:body => "")
|
13
|
-
end
|
14
|
-
|
15
|
-
it "should be connected to the story resource" do
|
16
|
-
@story.resource.url.should == "https://www.pivotaltracker.com/services/v3/projects/1/stories/1"
|
17
|
-
end
|
18
|
-
|
19
|
-
[:id, :story_type, :url, :estimate, :current_state,
|
20
|
-
:description, :name, :requested_by, :owned_by,
|
21
|
-
:created_at, :accepted_at, :labels].map(&:to_s).each do |method|
|
22
|
-
it "should have an accessor method for #{method}" do
|
23
|
-
@story.methods.should include(method)
|
24
|
-
end
|
25
|
-
|
26
|
-
it "should include #{method} in the list of valid attributes" do
|
27
|
-
@story.class.attributes.should include(method)
|
28
|
-
end
|
29
|
-
|
30
|
-
it "should return the proper value when #{method} is called" do
|
31
|
-
@story.xml = Factory(:story, method.to_sym => "Test Result")
|
32
|
-
@story.send(method).should == "Test Result"
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
it "should specify whether the story is a feature" do
|
37
|
-
@story.xml = story_type "feature"
|
38
|
-
|
39
|
-
@story.should be_a_feature
|
40
|
-
@story.should_not be_a_bug
|
41
|
-
@story.should_not be_a_chore
|
42
|
-
@story.should_not be_a_release
|
43
|
-
end
|
44
|
-
|
45
|
-
it "should specify whether the story is a bug" do
|
46
|
-
@story.xml = story_type "bug"
|
47
|
-
|
48
|
-
@story.should_not be_a_feature
|
49
|
-
@story.should be_a_bug
|
50
|
-
@story.should_not be_a_chore
|
51
|
-
@story.should_not be_a_release
|
52
|
-
end
|
53
|
-
|
54
|
-
it "should specify whether the story is a chore" do
|
55
|
-
@story.xml = story_type "chore"
|
56
|
-
|
57
|
-
@story.should_not be_a_feature
|
58
|
-
@story.should_not be_a_bug
|
59
|
-
@story.should be_a_chore
|
60
|
-
@story.should_not be_a_release
|
61
|
-
end
|
62
|
-
|
63
|
-
it "should specify whether the story is a release" do
|
64
|
-
@story.xml = story_type "release"
|
65
|
-
|
66
|
-
@story.should_not be_a_feature
|
67
|
-
@story.should_not be_a_bug
|
68
|
-
@story.should_not be_a_chore
|
69
|
-
@story.should be_a_release
|
70
|
-
end
|
71
|
-
|
72
|
-
it "should be able to mark the story as started" do
|
73
|
-
@story.resource.stubs(:get => @response)
|
74
|
-
|
75
|
-
@xpath = "//current_state = 'started'"
|
76
|
-
@story.resource.expects(:put).with { |xml| Nokogiri::XML(xml).xpath(@xpath) }
|
77
|
-
@story.start!
|
78
|
-
end
|
79
|
-
|
80
|
-
it "should be able to update other attributes when marking the story as started" do
|
81
|
-
@story.resource.stubs(:get => @response)
|
82
|
-
|
83
|
-
# Check the XML contains the right options.
|
84
|
-
# Can't just check the XML string, because the elements may be in a
|
85
|
-
# different order (because it's built from a hash).
|
86
|
-
@xpath = "//current_state = 'started' and //owned_by = 'Jeff Tucker'"
|
87
|
-
@story.resource.expects(:put).with {|xml| Nokogiri.XML(xml).xpath(@xpath) }
|
88
|
-
@story.start!(:owned_by => "Jeff Tucker")
|
89
|
-
end
|
90
|
-
|
91
|
-
it "should return false if attempting to start an unestimated feature story" do
|
92
|
-
# bad_response = mock("Response")
|
93
|
-
# bad_response.stubs(:code).returns(422)
|
94
|
-
# RestClient::Resource.any_instance.stubs(:put).yields(bad_response)
|
95
|
-
|
96
|
-
@story.xml = Factory(:story, :story_type => :feature, :estimate => :unestimated)
|
97
|
-
@story.start!.should be_false
|
98
|
-
end
|
99
|
-
|
100
|
-
it "should return a finished state of accepted for a chore" do
|
101
|
-
@story.xml = story_type "chore"
|
102
|
-
@story.finished_state.should == :accepted
|
103
|
-
end
|
104
|
-
|
105
|
-
["feature", "release", "bug"].each do |type|
|
106
|
-
it "should return a finished state of finished for a #{type}" do
|
107
|
-
@story.xml = story_type type
|
108
|
-
@story.finished_state.should == :finished
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
|
113
|
-
end
|
data/spec/spec.opts
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
--color
|