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/commands/pick.rb
CHANGED
@@ -2,57 +2,61 @@ require 'commands/base'
|
|
2
2
|
|
3
3
|
module Commands
|
4
4
|
class Pick < Base
|
5
|
-
|
5
|
+
|
6
6
|
def type
|
7
7
|
raise Error("must define in subclass")
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
def plural_type
|
11
11
|
raise Error("must define in subclass")
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
def branch_suffix
|
15
15
|
raise Error("must define in subclass")
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
def run!
|
19
|
-
super
|
19
|
+
response = super
|
20
|
+
return response if response > 0
|
20
21
|
|
21
22
|
msg = "Retrieving latest #{plural_type} from Pivotal Tracker"
|
22
23
|
if options[:only_mine]
|
23
24
|
msg += " for #{options[:full_name]}"
|
24
25
|
end
|
25
26
|
put "#{msg}..."
|
26
|
-
|
27
|
+
|
27
28
|
unless story
|
28
29
|
put "No #{plural_type} available!"
|
29
30
|
return 0
|
30
31
|
end
|
31
|
-
|
32
|
+
|
32
33
|
put "Story: #{story.name}"
|
33
34
|
put "URL: #{story.url}"
|
34
35
|
|
35
36
|
put "Updating #{type} status in Pivotal Tracker..."
|
36
|
-
if story.
|
37
|
-
|
38
|
-
|
39
|
-
unless options[:quiet]
|
40
|
-
put "Enter branch name (will be prepended by #{story.id}) [#{
|
41
|
-
|
42
|
-
|
43
|
-
suffix = "feature" if suffix == ""
|
37
|
+
if story.update(:owned_by => options[:full_name], :current_state => :started)
|
38
|
+
|
39
|
+
suffix_or_prefix = ""
|
40
|
+
unless options[:quiet] || options[:defaults]
|
41
|
+
put "Enter branch name (will be #{options[:append_name] ? 'appended' : 'prepended'} by #{story.id}) [#{suffix_or_prefix}]: ", false
|
42
|
+
suffix_or_prefix = input.gets.chomp
|
44
43
|
end
|
44
|
+
suffix_or_prefix = branch_suffix if suffix_or_prefix == ""
|
45
45
|
|
46
|
-
|
46
|
+
if options[:append_name]
|
47
|
+
branch = "#{suffix_or_prefix}-#{story.id}"
|
48
|
+
else
|
49
|
+
branch = "#{story.id}-#{suffix_or_prefix}"
|
50
|
+
end
|
47
51
|
if get("git branch").match(branch).nil?
|
48
|
-
put "
|
52
|
+
put "Switched to a new branch '#{branch}'"
|
49
53
|
sys "git checkout -b #{branch}"
|
50
54
|
end
|
51
|
-
|
55
|
+
|
52
56
|
return 0
|
53
57
|
else
|
54
58
|
put "Unable to mark #{type} as started"
|
55
|
-
|
59
|
+
|
56
60
|
return 1
|
57
61
|
end
|
58
62
|
end
|
@@ -61,10 +65,10 @@ module Commands
|
|
61
65
|
|
62
66
|
def story
|
63
67
|
return @story if @story
|
64
|
-
|
65
|
-
conditions = { :story_type => type, :current_state =>
|
68
|
+
|
69
|
+
conditions = { :story_type => type, :current_state => "unstarted", :limit => 1, :offset => 0 }
|
66
70
|
conditions[:owned_by] = options[:full_name] if options[:only_mine]
|
67
|
-
@story = project.stories.
|
71
|
+
@story = project.stories.all(conditions).first
|
68
72
|
end
|
69
73
|
end
|
70
74
|
end
|
data/lib/git-pivotal.rb
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__))
|
2
|
+
|
3
|
+
require File.join('commands', 'base')
|
4
|
+
require File.join('commands', 'pick')
|
5
|
+
require File.join('commands', 'feature')
|
6
|
+
require File.join('commands', 'bug')
|
7
|
+
require File.join('commands', 'chore')
|
8
|
+
require File.join('commands', 'finish')
|
9
|
+
require File.join('commands', 'info')
|
data/readme.markdown
CHANGED
@@ -27,6 +27,15 @@ When on a feature branch, this command will close the associated story in Pivota
|
|
27
27
|
Removing 1234567-testing branch
|
28
28
|
4 git-pivotal:master %
|
29
29
|
|
30
|
+
###Git Info
|
31
|
+
When on a feature/bug/chore branch, this command will display the story information as recorded in Pivotal Tracker.
|
32
|
+
|
33
|
+
5 git-pivotal:1234567-testing % git info
|
34
|
+
Story: Test git pivotal
|
35
|
+
URL: http://www.pivotaltracker.com/story/show/1234567
|
36
|
+
Description: The awesome story description
|
37
|
+
6 git-pivotal:1234567-testing %
|
38
|
+
|
30
39
|
##Installation
|
31
40
|
To install git-pivotal, simply run
|
32
41
|
|
@@ -50,6 +59,10 @@ The project id is best placed within your project's git config:
|
|
50
59
|
|
51
60
|
git config -f .git/config pivotal.project-id 88888
|
52
61
|
|
62
|
+
If you would rather have the story id appended to the branch name (feature-123456) instead of prepending (123456-feature), you can configue that:
|
63
|
+
|
64
|
+
git config -f .git/config pivotal.append-name true
|
65
|
+
|
53
66
|
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.
|
54
67
|
|
55
68
|
##TODO
|
data/spec/commands/base_spec.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'commands/base'
|
3
2
|
|
4
3
|
describe Commands::Base do
|
5
4
|
|
@@ -101,4 +100,24 @@ describe Commands::Base do
|
|
101
100
|
@pick.run!
|
102
101
|
end
|
103
102
|
|
103
|
+
it "should set the append name flag with the -a option" do
|
104
|
+
@pick = Commands::Base.new(@input, @output,"-a")
|
105
|
+
@pick.options[:append_name].should be_true
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should set the append name flag from git config" do
|
109
|
+
Commands::Base.any_instance.stubs(:get).with("git config --get pivotal.append-name").returns("true")
|
110
|
+
@pick = Commands::Base.new
|
111
|
+
@pick.options[:append_name].should be_true
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should set the append name flag with the --append-name" do
|
115
|
+
@pick = Commands::Base.new(@input, @output, "--append-name")
|
116
|
+
@pick.options[:append_name].should be_true
|
117
|
+
end
|
118
|
+
|
119
|
+
it "should default the append name flag if none is specified" do
|
120
|
+
@pick = Commands::Base.new
|
121
|
+
@pick.options[:append_name].should be_false
|
122
|
+
end
|
104
123
|
end
|
data/spec/commands/bug_spec.rb
CHANGED
data/spec/commands/chore_spec.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'commands/finish'
|
2
1
|
require 'spec_helper'
|
3
2
|
|
4
3
|
describe Commands::Finish do
|
@@ -46,7 +45,7 @@ describe Commands::Finish do
|
|
46
45
|
# stub out git config requests
|
47
46
|
Commands::Finish.any_instance.stubs(:get).with { |v| v =~ /git config/ }.returns("")
|
48
47
|
|
49
|
-
|
48
|
+
PivotalTracker::Project.stubs(:find).returns(mock_projects)
|
50
49
|
|
51
50
|
@finish = Commands::Finish.new(nil, nil, "-p", mock_project_id)
|
52
51
|
@finish.stubs(:sys)
|
data/spec/spec_helper.rb
CHANGED
@@ -1,18 +1,14 @@
|
|
1
|
-
require '
|
1
|
+
require 'rspec'
|
2
2
|
require 'mocha'
|
3
3
|
require 'builder'
|
4
|
-
require 'pivotal'
|
4
|
+
require 'lib/git-pivotal'
|
5
|
+
|
5
6
|
require File.join(File.dirname(__FILE__), 'factories')
|
6
7
|
|
7
|
-
|
8
|
+
RSpec.configure do |config|
|
8
9
|
config.mock_with :mocha
|
9
10
|
end
|
10
11
|
|
11
12
|
def stub_connection_to_pivotal
|
12
13
|
RestClient::Resource.any_instance.stubs(:get).returns("")
|
13
|
-
end
|
14
|
-
|
15
|
-
def pivotal_api
|
16
|
-
stub_connection_to_pivotal
|
17
|
-
Pivotal::Api.new :api_token => 1
|
18
14
|
end
|
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: git-pivotal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 17
|
5
4
|
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
7
|
+
- 8
|
8
|
+
- 0
|
9
|
+
version: 0.8.0
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Jeff Tucker
|
@@ -16,93 +15,93 @@ autorequire:
|
|
16
15
|
bindir: bin
|
17
16
|
cert_chain: []
|
18
17
|
|
19
|
-
date:
|
18
|
+
date: 2011-04-10 00:00:00 -04:00
|
20
19
|
default_executable:
|
21
20
|
dependencies:
|
22
21
|
- !ruby/object:Gem::Dependency
|
23
|
-
name:
|
22
|
+
name: builder
|
24
23
|
prerelease: false
|
25
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
26
25
|
none: false
|
27
26
|
requirements:
|
28
27
|
- - ">="
|
29
28
|
- !ruby/object:Gem::Version
|
30
|
-
hash: 3
|
31
29
|
segments:
|
32
30
|
- 0
|
33
31
|
version: "0"
|
34
32
|
type: :runtime
|
35
33
|
version_requirements: *id001
|
36
34
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
35
|
+
name: pivotal-tracker
|
38
36
|
prerelease: false
|
39
37
|
requirement: &id002 !ruby/object:Gem::Requirement
|
40
38
|
none: false
|
41
39
|
requirements:
|
42
40
|
- - ~>
|
43
41
|
- !ruby/object:Gem::Version
|
44
|
-
hash: 7
|
45
42
|
segments:
|
46
|
-
- 1
|
47
|
-
- 4
|
48
43
|
- 0
|
49
|
-
|
44
|
+
- 3
|
45
|
+
- 1
|
46
|
+
version: 0.3.1
|
50
47
|
type: :runtime
|
51
48
|
version_requirements: *id002
|
52
49
|
- !ruby/object:Gem::Dependency
|
53
|
-
name:
|
50
|
+
name: rspec
|
54
51
|
prerelease: false
|
55
52
|
requirement: &id003 !ruby/object:Gem::Requirement
|
56
53
|
none: false
|
57
54
|
requirements:
|
58
|
-
- -
|
55
|
+
- - ~>
|
59
56
|
- !ruby/object:Gem::Version
|
60
|
-
hash: 3
|
61
57
|
segments:
|
58
|
+
- 2
|
59
|
+
- 5
|
62
60
|
- 0
|
63
|
-
version:
|
64
|
-
type: :
|
61
|
+
version: 2.5.0
|
62
|
+
type: :development
|
65
63
|
version_requirements: *id003
|
66
64
|
- !ruby/object:Gem::Dependency
|
67
|
-
name:
|
65
|
+
name: rcov
|
68
66
|
prerelease: false
|
69
67
|
requirement: &id004 !ruby/object:Gem::Requirement
|
70
68
|
none: false
|
71
69
|
requirements:
|
72
70
|
- - ">="
|
73
71
|
- !ruby/object:Gem::Version
|
74
|
-
hash: 3
|
75
72
|
segments:
|
76
73
|
- 0
|
77
74
|
version: "0"
|
78
75
|
type: :development
|
79
76
|
version_requirements: *id004
|
80
77
|
- !ruby/object:Gem::Dependency
|
81
|
-
name:
|
78
|
+
name: cucumber
|
82
79
|
prerelease: false
|
83
80
|
requirement: &id005 !ruby/object:Gem::Requirement
|
84
81
|
none: false
|
85
82
|
requirements:
|
86
|
-
- -
|
83
|
+
- - ~>
|
87
84
|
- !ruby/object:Gem::Version
|
88
|
-
hash: 3
|
89
85
|
segments:
|
90
86
|
- 0
|
91
|
-
|
87
|
+
- 9
|
88
|
+
- 2
|
89
|
+
version: 0.9.2
|
92
90
|
type: :development
|
93
91
|
version_requirements: *id005
|
94
92
|
- !ruby/object:Gem::Dependency
|
95
|
-
name:
|
93
|
+
name: aruba
|
96
94
|
prerelease: false
|
97
95
|
requirement: &id006 !ruby/object:Gem::Requirement
|
98
96
|
none: false
|
99
97
|
requirements:
|
100
|
-
- -
|
98
|
+
- - ~>
|
101
99
|
- !ruby/object:Gem::Version
|
102
|
-
hash: 3
|
103
100
|
segments:
|
104
101
|
- 0
|
105
|
-
|
102
|
+
- 2
|
103
|
+
- 3
|
104
|
+
version: 0.2.3
|
106
105
|
type: :development
|
107
106
|
version_requirements: *id006
|
108
107
|
description: A collection of git utilities to ease integration with Pivotal Tracker
|
@@ -112,6 +111,7 @@ executables:
|
|
112
111
|
- git-chore
|
113
112
|
- git-feature
|
114
113
|
- git-finish
|
114
|
+
- git-info
|
115
115
|
- git-pick
|
116
116
|
extensions: []
|
117
117
|
|
@@ -127,22 +127,48 @@ files:
|
|
127
127
|
- bin/git-chore
|
128
128
|
- bin/git-feature
|
129
129
|
- bin/git-finish
|
130
|
+
- bin/git-info
|
130
131
|
- bin/git-pick
|
132
|
+
- features/bug.feature
|
133
|
+
- features/chore.feature
|
134
|
+
- features/feature.feature
|
135
|
+
- features/finish.feature
|
136
|
+
- features/info.feature
|
137
|
+
- features/step_definitions/steps.rb
|
138
|
+
- features/support/env.rb
|
139
|
+
- features/support/git-pivotal.rb
|
140
|
+
- features/test_repo/readme
|
141
|
+
- features/test_repo/working.git/COMMIT_EDITMSG
|
142
|
+
- features/test_repo/working.git/HEAD
|
143
|
+
- features/test_repo/working.git/config
|
144
|
+
- features/test_repo/working.git/description
|
145
|
+
- features/test_repo/working.git/hooks/applypatch-msg.sample
|
146
|
+
- features/test_repo/working.git/hooks/commit-msg.sample
|
147
|
+
- features/test_repo/working.git/hooks/post-commit.sample
|
148
|
+
- features/test_repo/working.git/hooks/post-receive.sample
|
149
|
+
- features/test_repo/working.git/hooks/post-update.sample
|
150
|
+
- features/test_repo/working.git/hooks/pre-applypatch.sample
|
151
|
+
- features/test_repo/working.git/hooks/pre-commit.sample
|
152
|
+
- features/test_repo/working.git/hooks/pre-rebase.sample
|
153
|
+
- features/test_repo/working.git/hooks/prepare-commit-msg.sample
|
154
|
+
- features/test_repo/working.git/hooks/update.sample
|
155
|
+
- features/test_repo/working.git/index
|
156
|
+
- features/test_repo/working.git/info/exclude
|
157
|
+
- features/test_repo/working.git/logs/HEAD
|
158
|
+
- features/test_repo/working.git/logs/refs/heads/master
|
159
|
+
- features/test_repo/working.git/objects/0c/6f7b1384910d1a2f137590095f008a06c7e00c
|
160
|
+
- features/test_repo/working.git/objects/10/ecf2b7ce989f01f3f7266e712b48d9275f2635
|
161
|
+
- features/test_repo/working.git/objects/a5/71d56305df09fb060f6ccb730b46080d305beb
|
162
|
+
- features/test_repo/working.git/refs/heads/master
|
131
163
|
- git-pivotal.gemspec
|
132
164
|
- lib/commands/base.rb
|
133
165
|
- lib/commands/bug.rb
|
134
166
|
- lib/commands/chore.rb
|
135
167
|
- lib/commands/feature.rb
|
136
168
|
- lib/commands/finish.rb
|
169
|
+
- lib/commands/info.rb
|
137
170
|
- lib/commands/pick.rb
|
138
|
-
- lib/pivotal.rb
|
139
|
-
- lib/pivotal/api.rb
|
140
|
-
- lib/pivotal/associations.rb
|
141
|
-
- lib/pivotal/attributes.rb
|
142
|
-
- lib/pivotal/base.rb
|
143
|
-
- lib/pivotal/collection.rb
|
144
|
-
- lib/pivotal/project.rb
|
145
|
-
- lib/pivotal/story.rb
|
171
|
+
- lib/git-pivotal.rb
|
146
172
|
- readme.markdown
|
147
173
|
- spec/commands/base_spec.rb
|
148
174
|
- spec/commands/bug_spec.rb
|
@@ -151,14 +177,6 @@ files:
|
|
151
177
|
- spec/commands/finish_spec.rb
|
152
178
|
- spec/factories.rb
|
153
179
|
- spec/factory.rb
|
154
|
-
- spec/pivotal/api_spec.rb
|
155
|
-
- spec/pivotal/associations_spec.rb
|
156
|
-
- spec/pivotal/attributes_spec.rb
|
157
|
-
- spec/pivotal/base_spec.rb
|
158
|
-
- spec/pivotal/collection_spec.rb
|
159
|
-
- spec/pivotal/project_spec.rb
|
160
|
-
- spec/pivotal/story_spec.rb
|
161
|
-
- spec/spec.opts
|
162
180
|
- spec/spec_helper.rb
|
163
181
|
has_rdoc: true
|
164
182
|
homepage: http://github.com/trydionel/git-pivotal
|
@@ -174,7 +192,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
174
192
|
requirements:
|
175
193
|
- - ">="
|
176
194
|
- !ruby/object:Gem::Version
|
177
|
-
hash: 3
|
178
195
|
segments:
|
179
196
|
- 0
|
180
197
|
version: "0"
|
@@ -183,7 +200,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
183
200
|
requirements:
|
184
201
|
- - ">="
|
185
202
|
- !ruby/object:Gem::Version
|
186
|
-
hash: 3
|
187
203
|
segments:
|
188
204
|
- 0
|
189
205
|
version: "0"
|
@@ -202,11 +218,4 @@ test_files:
|
|
202
218
|
- spec/commands/finish_spec.rb
|
203
219
|
- spec/factories.rb
|
204
220
|
- spec/factory.rb
|
205
|
-
- spec/pivotal/api_spec.rb
|
206
|
-
- spec/pivotal/associations_spec.rb
|
207
|
-
- spec/pivotal/attributes_spec.rb
|
208
|
-
- spec/pivotal/base_spec.rb
|
209
|
-
- spec/pivotal/collection_spec.rb
|
210
|
-
- spec/pivotal/project_spec.rb
|
211
|
-
- spec/pivotal/story_spec.rb
|
212
221
|
- spec/spec_helper.rb
|
data/lib/pivotal/api.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
module Pivotal
|
2
|
-
class Api < Base
|
3
|
-
|
4
|
-
attr_accessor :api_token
|
5
|
-
has_collection :projects, :of => Pivotal::Project
|
6
|
-
|
7
|
-
def initialize(options = {})
|
8
|
-
super(options)
|
9
|
-
@api_url = "https://www.pivotaltracker.com/services/v3"
|
10
|
-
end
|
11
|
-
|
12
|
-
def resource
|
13
|
-
@resource ||= RestClient::Resource.new @api_url, :headers => { 'X-TrackerToken' => api_token, 'Content-Type' => 'application/xml' }
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
17
|
-
end
|
data/lib/pivotal/associations.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
module Pivotal
|
2
|
-
module Associations
|
3
|
-
|
4
|
-
def self.included(base)
|
5
|
-
base.extend ClassMethods
|
6
|
-
end
|
7
|
-
|
8
|
-
module ClassMethods
|
9
|
-
def has_collection(name, options = {})
|
10
|
-
define_method name do
|
11
|
-
Pivotal::Collection.new resource[name], options[:of]
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
17
|
-
end
|
data/lib/pivotal/attributes.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
module Pivotal
|
2
|
-
module Attributes
|
3
|
-
|
4
|
-
def self.included(base)
|
5
|
-
base.extend ClassMethods
|
6
|
-
|
7
|
-
class << base
|
8
|
-
attr_accessor :attributes
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
module ClassMethods
|
13
|
-
def has_attributes(*attributes)
|
14
|
-
@attributes = attributes.map { |attribute| attribute.to_s }
|
15
|
-
|
16
|
-
attributes.each do |attribute|
|
17
|
-
define_method attribute do
|
18
|
-
parsed_resource.xpath("*/" + attribute.to_s).text
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
end
|
data/lib/pivotal/base.rb
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
gem 'rest-client', '~>1.4.0'
|
3
|
-
require 'rest_client'
|
4
|
-
require 'nokogiri'
|
5
|
-
require 'builder'
|
6
|
-
|
7
|
-
module Pivotal
|
8
|
-
class Base
|
9
|
-
include Pivotal::Associations
|
10
|
-
include Pivotal::Attributes
|
11
|
-
|
12
|
-
attr_accessor :resource, :xml
|
13
|
-
|
14
|
-
def initialize(params = {})
|
15
|
-
params.each do |key, value|
|
16
|
-
send("#{key}=", value)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def xml
|
21
|
-
@xml ||= resource.get.body
|
22
|
-
end
|
23
|
-
|
24
|
-
def parsed_resource
|
25
|
-
@parsed_resource ||= Nokogiri::XML(xml)
|
26
|
-
end
|
27
|
-
|
28
|
-
def update_attributes(options = {})
|
29
|
-
begin
|
30
|
-
resource.put generate_xml(options) do |response|
|
31
|
-
if response.code == 200
|
32
|
-
@xml = response.body
|
33
|
-
return true
|
34
|
-
else
|
35
|
-
return false
|
36
|
-
end
|
37
|
-
end
|
38
|
-
rescue RestClient::Exception
|
39
|
-
return false
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
class << self
|
44
|
-
def name_as_xml_attribute
|
45
|
-
self.name.gsub(/.+\:\:/, '').downcase
|
46
|
-
end
|
47
|
-
|
48
|
-
def xpath
|
49
|
-
'//' + self.name_as_xml_attribute
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
private
|
54
|
-
|
55
|
-
def generate_xml(options = {})
|
56
|
-
builder = Builder::XmlMarkup.new
|
57
|
-
builder.__send__ self.class.name_as_xml_attribute do
|
58
|
-
allowed_keys(options).each do |key, value|
|
59
|
-
builder.__send__(key, value.to_s)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
builder.target!
|
64
|
-
end
|
65
|
-
|
66
|
-
def allowed_keys(options = {})
|
67
|
-
options.reject do |key, _|
|
68
|
-
!self.class.attributes.include? key.to_s
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
end
|
73
|
-
end
|
data/lib/pivotal/collection.rb
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
require 'cgi'
|
2
|
-
|
3
|
-
module Pivotal
|
4
|
-
class Collection
|
5
|
-
|
6
|
-
attr_accessor :resource, :component_class
|
7
|
-
|
8
|
-
def initialize(resource, component_class)
|
9
|
-
@resource, @component_class = resource, component_class
|
10
|
-
end
|
11
|
-
|
12
|
-
# Param queries will break our REST structure,
|
13
|
-
# so if we find an :id parameter, accept it and
|
14
|
-
# ignore all other params.
|
15
|
-
def find(*args)
|
16
|
-
params = args.last.is_a?(Hash) ? args.pop : {}
|
17
|
-
finder = args.first
|
18
|
-
|
19
|
-
return item(params[:id]) if params[:id]
|
20
|
-
return item(finder) if finder.is_a?(Numeric)
|
21
|
-
|
22
|
-
all(params)
|
23
|
-
end
|
24
|
-
|
25
|
-
def first
|
26
|
-
all.first
|
27
|
-
end
|
28
|
-
|
29
|
-
private
|
30
|
-
|
31
|
-
def item(id)
|
32
|
-
component_class.new :resource => resource[id]
|
33
|
-
end
|
34
|
-
|
35
|
-
def filters(params = {})
|
36
|
-
return "" if params.empty?
|
37
|
-
|
38
|
-
param_url = []
|
39
|
-
if params[:conditions]
|
40
|
-
condition_string = params[:conditions].map { |k,v| "#{k}:#{v}" }.join " "
|
41
|
-
param_url << "filter=#{CGI::escape(condition_string)}"
|
42
|
-
end
|
43
|
-
|
44
|
-
if params[:limit]
|
45
|
-
param_url << "limit=#{params[:limit]}&offset=#{params[:offset]||0}"
|
46
|
-
end
|
47
|
-
|
48
|
-
"?" + param_url.join("&")
|
49
|
-
end
|
50
|
-
|
51
|
-
def build_collection_from_xml(xml = "")
|
52
|
-
Nokogiri::XML(xml).xpath(component_class.xpath).map do |item|
|
53
|
-
item_id = item.xpath("id").text
|
54
|
-
component_class.new :resource => resource[item_id], :xml => item.to_xml
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
def all(params = {})
|
59
|
-
build_collection_from_xml resource[filters(params)].get.body
|
60
|
-
end
|
61
|
-
|
62
|
-
end
|
63
|
-
end
|
data/lib/pivotal/project.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
module Pivotal
|
2
|
-
class Project < Base
|
3
|
-
|
4
|
-
has_collection :stories, :of => Pivotal::Story
|
5
|
-
has_attributes :id, :name, :iteration_length, :week_start_day,
|
6
|
-
:point_scale, :account, :velocity_scheme,
|
7
|
-
:current_velocity, :initial_velocity,
|
8
|
-
:number_of_iterations_to_show, :labels,
|
9
|
-
:allow_attachments, :public, :use_https,
|
10
|
-
:bugs_and_chores_are_estimatable, :commit_mode,
|
11
|
-
:last_activity_at, :memberships, :integrations
|
12
|
-
|
13
|
-
end
|
14
|
-
end
|