git-pivotal 0.1.0 → 0.1.1
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/.gitignore +1 -0
- data/Rakefile +3 -0
- data/VERSION +1 -1
- data/git-pivotal.gemspec +5 -2
- data/lib/commands/pick.rb +4 -1
- data/lib/pivotal/base.rb +29 -1
- data/lib/pivotal/story.rb +2 -2
- data/readme.markdown +19 -5
- data/spec/pivotal/base_spec.rb +27 -0
- data/spec/pivotal/story_spec.rb +14 -0
- metadata +12 -2
data/.gitignore
CHANGED
data/Rakefile
CHANGED
@@ -20,6 +20,7 @@ begin
|
|
20
20
|
gemspec.add_dependency "rest-client"
|
21
21
|
|
22
22
|
gemspec.add_development_dependency "rspec"
|
23
|
+
gemspec.add_development_dependency "mocha"
|
23
24
|
end
|
24
25
|
|
25
26
|
Jeweler::GemcutterTasks.new
|
@@ -29,4 +30,6 @@ end
|
|
29
30
|
|
30
31
|
Spec::Rake::SpecTask.new do |t|
|
31
32
|
t.warning = true
|
33
|
+
t.rcov = true
|
34
|
+
t.rcov_opts = ['--exclude', 'gems']
|
32
35
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.1
|
data/git-pivotal.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{git-pivotal}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Jeff Tucker"]
|
12
|
-
s.date = %q{2010-01-
|
12
|
+
s.date = %q{2010-01-29}
|
13
13
|
s.default_executable = %q{git-pick}
|
14
14
|
s.description = %q{A collection of git utilities to ease integration with Pivotal Tracker}
|
15
15
|
s.email = %q{jeff@trydionel.com}
|
@@ -66,15 +66,18 @@ Gem::Specification.new do |s|
|
|
66
66
|
s.add_runtime_dependency(%q<nokogiri>, [">= 0"])
|
67
67
|
s.add_runtime_dependency(%q<rest-client>, [">= 0"])
|
68
68
|
s.add_development_dependency(%q<rspec>, [">= 0"])
|
69
|
+
s.add_development_dependency(%q<mocha>, [">= 0"])
|
69
70
|
else
|
70
71
|
s.add_dependency(%q<nokogiri>, [">= 0"])
|
71
72
|
s.add_dependency(%q<rest-client>, [">= 0"])
|
72
73
|
s.add_dependency(%q<rspec>, [">= 0"])
|
74
|
+
s.add_dependency(%q<mocha>, [">= 0"])
|
73
75
|
end
|
74
76
|
else
|
75
77
|
s.add_dependency(%q<nokogiri>, [">= 0"])
|
76
78
|
s.add_dependency(%q<rest-client>, [">= 0"])
|
77
79
|
s.add_dependency(%q<rspec>, [">= 0"])
|
80
|
+
s.add_dependency(%q<mocha>, [">= 0"])
|
78
81
|
end
|
79
82
|
end
|
80
83
|
|
data/lib/commands/pick.rb
CHANGED
@@ -33,9 +33,11 @@ private
|
|
33
33
|
def parse_gitconfig
|
34
34
|
token = get("git config --get pivotal.api-token").strip
|
35
35
|
id = get("git config --get pivotal.project-id").strip
|
36
|
+
name = get("git config --get pivotal.full-name").strip
|
36
37
|
|
37
38
|
@options[:api_token] = token if token
|
38
39
|
@options[:project_id] = id if id
|
40
|
+
@options[:full_name] = name if name
|
39
41
|
end
|
40
42
|
|
41
43
|
def parse_argv(*args)
|
@@ -43,6 +45,7 @@ private
|
|
43
45
|
opts.banner = "Usage: git pick [options]"
|
44
46
|
opts.on("-k", "--api-key=", "Pivotal Tracker API key") { |k| @options[:api_token] = k }
|
45
47
|
opts.on("-p", "--project-id=", "Pivotal Trakcer project id") { |p| @options[:project_id] = p }
|
48
|
+
opts.on("-n", "--full-name=", "Pivotal Trakcer full name") { |n| @options[:full_name] = n }
|
46
49
|
opts.on("-q", "--quiet", "Quiet, no-interaction mode") { |q| @options[:quiet] = q }
|
47
50
|
opts.on("-v", "--[no-]verbose", "Run verbosely") { |v| @options[:verbose] = v }
|
48
51
|
opts.on_tail("-h", "--help", "This usage guide") { puts opts; exit 0 }
|
@@ -110,7 +113,7 @@ private
|
|
110
113
|
|
111
114
|
def start_story(story)
|
112
115
|
puts "Updating story status in Pivotal Tracker..."
|
113
|
-
story.start!
|
116
|
+
story.start!(:owned_by => @options[:full_name])
|
114
117
|
end
|
115
118
|
|
116
119
|
end
|
data/lib/pivotal/base.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'rest_client'
|
3
3
|
require 'nokogiri'
|
4
|
+
require 'builder'
|
4
5
|
|
5
6
|
module Pivotal
|
6
7
|
class Base
|
@@ -27,9 +28,36 @@ module Pivotal
|
|
27
28
|
parsed_resource.css(method.to_s).text
|
28
29
|
end
|
29
30
|
|
31
|
+
def update_attributes(options = {})
|
32
|
+
@xml = resource.put generate_xml(options)
|
33
|
+
end
|
34
|
+
|
30
35
|
class << self
|
36
|
+
def name_as_xml_attribute
|
37
|
+
self.name.gsub(/.+\:\:/, '').downcase
|
38
|
+
end
|
39
|
+
|
31
40
|
def xpath
|
32
|
-
'//' + self.
|
41
|
+
'//' + self.name_as_xml_attribute
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def generate_xml(options = {})
|
48
|
+
builder = Builder::XmlMarkup.new
|
49
|
+
allowed_keys(options).each do |key, value|
|
50
|
+
builder.key(value.to_s)
|
51
|
+
end
|
52
|
+
|
53
|
+
builder
|
54
|
+
end
|
55
|
+
|
56
|
+
def allowed_keys(options = {})
|
57
|
+
options.reject do |key, _|
|
58
|
+
!%w[id story_type url estimate current_state
|
59
|
+
description name requested_by owned_by
|
60
|
+
created_at accepted_at labels].include? key.to_s
|
33
61
|
end
|
34
62
|
end
|
35
63
|
|
data/lib/pivotal/story.rb
CHANGED
data/readme.markdown
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
#Git Pivotal
|
2
2
|
|
3
3
|
##Prelude
|
4
|
-
You might want to have [this song](
|
4
|
+
You might want to have [this song](http://www.dailymotion.com/video/x9vzh0_olivia-newton-john-lets-get-physica_music) running in the background while you read this.
|
5
5
|
|
6
6
|
##Let's Git Pivotal
|
7
|
-
Inspired by [Hashrocket's blend of git and Pivotal Tracker](
|
7
|
+
Inspired by [Hashrocket's blend of git and Pivotal Tracker](http://reinh.com/blog/2009/03/02/a-git-workflow-for-agile-teams.html) and [a popular article on effective git workflows](http://nvie.com/archives/323), I set off to create a set of utilities to simplify the workflow between the two.
|
8
8
|
|
9
9
|
###Git Pick
|
10
10
|
This selects the top-most available feature from your Pivotal Tracker, and offers to create a feature branch.
|
@@ -21,13 +21,27 @@ This selects the top-most available feature from your Pivotal Tracker, and offer
|
|
21
21
|
2 git-pick:feature-1234567 %
|
22
22
|
|
23
23
|
##Installation
|
24
|
-
|
25
|
-
|
24
|
+
To install git-pivotal, simply run
|
25
|
+
|
26
|
+
[sudo] gem install git-pivotal
|
27
|
+
|
28
|
+
<h2 id="config">Configuration</h2>
|
29
|
+
Once installed, git pivotal needs three bits of info: your Pivotal Tracker API Token, your name as it appears in Pivotal Tracker and your Pivotal Tracker project id. The former two are best set as a global git config options:
|
26
30
|
|
27
31
|
git config --global pivotal.api-token 9a9a9a9a9a9a9a9a9a9a
|
32
|
+
git config --global pivotal.full-name "Jeff Tucker"
|
28
33
|
|
29
34
|
The project id is best placed within your project's git config:
|
30
35
|
|
31
36
|
git config -f .git/config pivotal.project-id 88888
|
32
37
|
|
33
|
-
If you're not interested in storing these options in git, you can pass them into git pivotal as command line arguments. See the usage guides for more details.
|
38
|
+
If you're not interested in storing these options in git, you can pass them into git pivotal as command line arguments. See the usage guides for more details.
|
39
|
+
|
40
|
+
##TODO
|
41
|
+
This is <del>some seriously</del> alpha software. Several things on the ol' todo list:
|
42
|
+
|
43
|
+
* <del>Create a general Pivotal::Base#update_attributes method</del>
|
44
|
+
* <del>`git pick` doesn't update the story to indicate who claimed it</del>
|
45
|
+
* Add command to close/finish currently 'picked' feature
|
46
|
+
* Reduce verbosity of `git pick`
|
47
|
+
* More that I can't recall at the moment
|
data/spec/pivotal/base_spec.rb
CHANGED
@@ -33,4 +33,31 @@ describe Pivotal::Base do
|
|
33
33
|
@base.class.should include(Pivotal::Associations)
|
34
34
|
end
|
35
35
|
|
36
|
+
describe "updating the remote resource" do
|
37
|
+
|
38
|
+
before(:each) do
|
39
|
+
@xml = "<story><current_state>started</current_state></story>"
|
40
|
+
@base.resource.expects(:put).with(@xml).returns(@xml)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should be able to update the remote resource with a hash of string values" do
|
44
|
+
@base.update_attributes(:current_state => "started")
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should be able to update the remote resource with a hash of symbol values" do
|
48
|
+
@base.update_attributes(:current_state => :started)
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should not update attributes which don't exist on the remote model" do
|
52
|
+
@base.update_attributes(:unknown_attribute => true)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should update the stored xml with the new remote model" do
|
56
|
+
lambda {
|
57
|
+
@base.update_attributes(:current_state => "started")
|
58
|
+
}.should change(@base, :xml).to(@xml)
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
36
63
|
end
|
data/spec/pivotal/story_spec.rb
CHANGED
@@ -12,4 +12,18 @@ describe Pivotal::Story do
|
|
12
12
|
@story.resource.url.should == "https://www.pivotaltracker.com/services/v3/projects/1/stories/1"
|
13
13
|
end
|
14
14
|
|
15
|
+
it "should be able to mark the story as started" do
|
16
|
+
@xml = "<story><current_state>started</current_state></story>"
|
17
|
+
@story.resource.expects(:put).with(@xml)
|
18
|
+
|
19
|
+
@story.start!
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should be able to update other attributes when marking the story as started" do
|
23
|
+
@xml = "<story><current_state>started</current_state><owned_by>Jeff Tucker</owned_by></story>"
|
24
|
+
@story.resource.expects(:put).with(@xml)
|
25
|
+
|
26
|
+
@story.start!(:owned_by => "Jeff Tucker")
|
27
|
+
end
|
28
|
+
|
15
29
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: git-pivotal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeff Tucker
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-01-
|
12
|
+
date: 2010-01-29 00:00:00 -05:00
|
13
13
|
default_executable: git-pick
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -42,6 +42,16 @@ dependencies:
|
|
42
42
|
- !ruby/object:Gem::Version
|
43
43
|
version: "0"
|
44
44
|
version:
|
45
|
+
- !ruby/object:Gem::Dependency
|
46
|
+
name: mocha
|
47
|
+
type: :development
|
48
|
+
version_requirement:
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: "0"
|
54
|
+
version:
|
45
55
|
description: A collection of git utilities to ease integration with Pivotal Tracker
|
46
56
|
email: jeff@trydionel.com
|
47
57
|
executables:
|