pivo_flow 0.3.0 → 0.3.3
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/.rspec +2 -0
- data/.travis.yml +8 -0
- data/README.md +40 -10
- data/Rakefile +3 -0
- data/bin/pf +1 -1
- data/lib/pivo_flow/base.rb +35 -3
- data/lib/pivo_flow/cli.rb +85 -27
- data/lib/pivo_flow/pivotal.rb +0 -1
- data/lib/pivo_flow/version.rb +1 -1
- data/pivo_flow.gemspec +2 -0
- data/spec/pivo_flow/cli_spec.rb +73 -0
- data/spec/spec_helper.rb +7 -0
- metadata +39 -2
data/.rspec
ADDED
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,18 +1,12 @@
|
|
1
1
|
# PivoFlow
|
2
2
|
|
3
|
-
|
3
|
+
[](http://travis-ci.org/hybridgroup/taskmapper)
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
Add this line to your application's Gemfile:
|
8
|
-
|
9
|
-
gem 'pivo_flow'
|
5
|
+
PivoFlow let's you choose the story from Pivotal Tracker you are currently working on. Intended for all the people, who doesn't like feature-branch approach or are "merdżuj - nie pier*ol"-theory enthusiasts.
|
10
6
|
|
11
|
-
|
12
|
-
|
13
|
-
$ bundle
|
7
|
+
## Installation
|
14
8
|
|
15
|
-
|
9
|
+
Install it yourself as:
|
16
10
|
|
17
11
|
$ gem install pivo_flow
|
18
12
|
|
@@ -39,10 +33,42 @@ Clear current story without notifying Pivotal
|
|
39
33
|
|
40
34
|
pf clear
|
41
35
|
|
36
|
+
Display current gem version
|
37
|
+
|
38
|
+
pf version
|
39
|
+
|
42
40
|
## Git-hooks
|
43
41
|
|
44
42
|
This gem installs a `pepare-commit-msg` hook by adding a reference to `pf-prepare-commit-msg` file. In short: you shouldn't be worried about your own `prepare-commit-msg` hook, the one added by `pivo_flow` will be added in the last line of original hook file.
|
45
43
|
|
44
|
+
## Roadmap
|
45
|
+
|
46
|
+
### Incoming releases
|
47
|
+
|
48
|
+
* story statistics
|
49
|
+
* colorized output
|
50
|
+
|
51
|
+
### 0.3 Current release
|
52
|
+
|
53
|
+
* single-story view
|
54
|
+
* flow:
|
55
|
+
* select story
|
56
|
+
* read the story description
|
57
|
+
* accept or back to story selection
|
58
|
+
* **TODO** `pf info` displaying info about current task, it's comments and all the available data
|
59
|
+
* **TODO** `pf help`
|
60
|
+
|
61
|
+
### 0.2
|
62
|
+
|
63
|
+
* git hoook
|
64
|
+
* formatted output
|
65
|
+
* bugfixes
|
66
|
+
|
67
|
+
### before 0.2
|
68
|
+
|
69
|
+
* gem basic structure
|
70
|
+
* git config read/write
|
71
|
+
|
46
72
|
## Contributing
|
47
73
|
|
48
74
|
1. Fork it
|
@@ -50,3 +76,7 @@ This gem installs a `pepare-commit-msg` hook by adding a reference to `pf-prepar
|
|
50
76
|
3. Commit your changes (`git commit -am 'Added some feature'`)
|
51
77
|
4. Push to the branch (`git push origin my-new-feature`)
|
52
78
|
5. Create new Pull Request
|
79
|
+
|
80
|
+
## Thanks
|
81
|
+
|
82
|
+
This gem is inspired by https://github.com/blindsey/git_pivotal_tracker. Thanks to it's author for the inspiration and idea. If you would like to use Pivotal with feature-branch-based flow, `git_pivotal_tracker` is the way you should proably go.
|
data/Rakefile
CHANGED
data/bin/pf
CHANGED
data/lib/pivo_flow/base.rb
CHANGED
@@ -1,13 +1,24 @@
|
|
1
1
|
module PivoFlow
|
2
|
+
|
3
|
+
# This class is responsible for setting up the project environment
|
4
|
+
#
|
5
|
+
# * saving Pivotal Tracker API token and project ID in git repository config
|
6
|
+
# * installing git hook
|
7
|
+
|
2
8
|
class Base
|
9
|
+
|
10
|
+
# Git repository directory
|
3
11
|
GIT_DIR = '.git'
|
12
|
+
# Keys used by gem in git config, with corresponding questions which are
|
13
|
+
# used during project setup
|
4
14
|
KEYS_AND_QUESTIONS = {
|
5
15
|
"pivo-flow.project-id" => "Pivotal: what is your project's ID?",
|
6
16
|
"pivo-flow.api-token" => "Pivotal: what is your pivotal tracker api-token?"
|
7
17
|
}
|
8
18
|
|
9
|
-
|
10
|
-
|
19
|
+
# Basic initialize method
|
20
|
+
def initialize(options={})
|
21
|
+
@options = options
|
11
22
|
@current_dir = Dir.pwd
|
12
23
|
|
13
24
|
# exit if no git repo found
|
@@ -29,10 +40,16 @@ module PivoFlow
|
|
29
40
|
run
|
30
41
|
end
|
31
42
|
|
43
|
+
# Check if git hook is already installed
|
32
44
|
def git_hook_needed?
|
33
45
|
!File.executable?(@git_hook_path) || !File.read(@git_hook_path).match(/#{@pf_git_hook_name} \$1/)
|
34
46
|
end
|
35
47
|
|
48
|
+
# Install git hook
|
49
|
+
# Copy hook to <tt>.git/hooks</tt> directory and add a reference to this
|
50
|
+
# executable file within <tt>prepare-commit-msg</tt> hook (it may be
|
51
|
+
# helpful if user has his custom hooks)
|
52
|
+
|
36
53
|
def install_git_hook
|
37
54
|
puts "Installing prepare-commit-msg hook..."
|
38
55
|
hook_path = File.join(File.dirname(__FILE__), '..', '..', 'bin', @pf_git_hook_name)
|
@@ -50,22 +67,30 @@ module PivoFlow
|
|
50
67
|
puts "Success!\n"
|
51
68
|
end
|
52
69
|
|
70
|
+
# This method is fired after initialization and should be overwritten by
|
71
|
+
# subclasses
|
53
72
|
def run
|
54
73
|
end
|
55
74
|
|
75
|
+
# Get full user name from git config, i.e. Adam Newman
|
56
76
|
def user_name
|
57
77
|
@options[:user_name] ||= @options[:repository].config['pivotal.full-name'] || @options[:repository].config['user.name']
|
58
78
|
end
|
59
79
|
|
80
|
+
# Setup project by entering Pivotal <tt>api-token</tt> and Pivotal Tracker <tt>project_id</tt>
|
60
81
|
def reconfig
|
61
82
|
KEYS_AND_QUESTIONS.each do |key, question|
|
62
83
|
ask_question_and_force_update_config(question, key)
|
63
84
|
end
|
64
|
-
|
85
|
+
config_update_success
|
65
86
|
end
|
66
87
|
|
67
88
|
private
|
68
89
|
|
90
|
+
def config_update_success
|
91
|
+
puts "[SUCCESS] Pivotal Tracker configuration has been updated."
|
92
|
+
end
|
93
|
+
|
69
94
|
def git_config_ok?
|
70
95
|
!KEYS_AND_QUESTIONS.keys.any? { |key| @options[:repository].config[key].nil? }
|
71
96
|
end
|
@@ -92,6 +117,13 @@ module PivoFlow
|
|
92
117
|
@options[:repository].config[variable] = ask_question(question)
|
93
118
|
end
|
94
119
|
|
120
|
+
def update_config_from_options
|
121
|
+
KEYS_AND_QUESTIONS.keys.each do |key|
|
122
|
+
@options[:repository].config[key] = @options[key.gsub(/-/, "_")]
|
123
|
+
end
|
124
|
+
config_update_success
|
125
|
+
end
|
126
|
+
|
95
127
|
def ask_question question, first_answer = nil
|
96
128
|
h = HighLine.new
|
97
129
|
h.ask("#{question}\t") do |q|
|
data/lib/pivo_flow/cli.rb
CHANGED
@@ -2,37 +2,42 @@ module PivoFlow
|
|
2
2
|
class Cli
|
3
3
|
|
4
4
|
def initialize *args
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
@file_story_path = File.join(Dir.pwd, "/tmp/.pivotal_story_id")
|
6
|
+
@args = args
|
7
|
+
end
|
8
|
+
|
9
|
+
def go!
|
9
10
|
Signal.trap(2) {
|
10
11
|
puts "\nkkthxbye!"
|
11
|
-
|
12
|
+
return 0
|
12
13
|
}
|
13
|
-
parse_argv(
|
14
|
+
return parse_argv(@args)
|
14
15
|
end
|
15
16
|
|
17
|
+
private
|
18
|
+
|
16
19
|
def stories
|
17
|
-
|
20
|
+
pivotal_object.show_stories
|
18
21
|
end
|
19
22
|
|
20
|
-
def start story_id
|
21
|
-
|
23
|
+
def start story_id=nil
|
24
|
+
unless story_id
|
25
|
+
puts "Ok, but which story?"
|
26
|
+
return 1
|
27
|
+
end
|
28
|
+
pivotal_object.pick_up_story(story_id)
|
22
29
|
end
|
23
30
|
|
24
31
|
def finish story_id=nil
|
25
|
-
|
26
|
-
|
27
|
-
story_id = File.open(file_story_path).read.strip
|
32
|
+
if File.exists? @file_story_path
|
33
|
+
story_id = File.open(@file_story_path).read.strip
|
28
34
|
end
|
29
|
-
|
35
|
+
pivotal_object.finish_story(story_id)
|
30
36
|
end
|
31
37
|
|
32
38
|
def clear
|
33
|
-
|
34
|
-
|
35
|
-
FileUtils.remove_file(file_story_path)
|
39
|
+
if File.exists? @file_story_path
|
40
|
+
FileUtils.remove_file(@file_story_path)
|
36
41
|
end
|
37
42
|
puts "Current pivotal story id cleared."
|
38
43
|
end
|
@@ -45,22 +50,75 @@ module PivoFlow
|
|
45
50
|
puts PivoFlow::VERSION
|
46
51
|
end
|
47
52
|
|
48
|
-
|
53
|
+
def pivotal_object
|
54
|
+
@pivotal_object ||= PivoFlow::Pivotal.new(@options)
|
55
|
+
end
|
56
|
+
|
57
|
+
def no_method_error
|
58
|
+
puts "You forgot a method name"
|
59
|
+
end
|
49
60
|
|
50
|
-
def
|
51
|
-
|
61
|
+
def invalid_method_error
|
62
|
+
puts "Ups, no such method..."
|
52
63
|
end
|
53
64
|
|
54
|
-
def parse_argv(
|
55
|
-
|
56
|
-
|
65
|
+
def parse_argv(args)
|
66
|
+
@options = {}
|
67
|
+
|
68
|
+
opt_parser = OptionParser.new do |opts|
|
69
|
+
opts.banner = "Usage: pf <COMMAND> [OPTIONS]\n"
|
70
|
+
opts.separator "Commands"
|
71
|
+
opts.separator " clear: clears STORY_ID from temp file"
|
72
|
+
opts.separator " finish [STORY_ID]: finish story on Pivotal"
|
73
|
+
opts.separator " reconfig: clears API_TOKEN and PROJECT_ID from git config"
|
74
|
+
opts.separator " start <STORY_ID>: start a story of given ID"
|
75
|
+
opts.separator " stories: list stories for current project"
|
76
|
+
opts.separator ""
|
77
|
+
opts.separator "Options"
|
78
|
+
|
79
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
80
|
+
puts opts
|
81
|
+
return 1
|
82
|
+
end
|
83
|
+
|
84
|
+
opts.on_tail("-v", "--version", "Show version") do
|
85
|
+
puts PivoFlow::VERSION
|
86
|
+
return 1
|
87
|
+
end
|
88
|
+
|
89
|
+
opts.on("-t <API_TOKEN>", "--token <API_TOKEN>", "Sets Pivotal Tracker API TOKEN") do |api_token|
|
90
|
+
@options[:api_token] = api_token
|
91
|
+
end
|
92
|
+
|
93
|
+
opts.on("-p <PROJECT_ID>", "--project <PROJECT_ID>", Numeric, "Sets Pivotal Tracker PROJECT_ID") do |project_id|
|
94
|
+
@options[:project_id] = project_id
|
95
|
+
end
|
57
96
|
|
58
|
-
unless valid_method?(command)
|
59
|
-
puts "Ups, no such method..."
|
60
|
-
exit 1
|
61
97
|
end
|
62
|
-
|
63
|
-
|
98
|
+
|
99
|
+
opt_parser.parse!(args)
|
100
|
+
|
101
|
+
case args[0]
|
102
|
+
when "clear"
|
103
|
+
clear
|
104
|
+
when "reconfig"
|
105
|
+
reconfig
|
106
|
+
when "start"
|
107
|
+
start args[1]
|
108
|
+
when "stories"
|
109
|
+
stories
|
110
|
+
when "finish"
|
111
|
+
finish args[1]
|
112
|
+
when nil
|
113
|
+
no_method_error
|
114
|
+
puts opt_parser.summarize
|
115
|
+
return 1
|
116
|
+
else
|
117
|
+
invalid_method_error
|
118
|
+
return 1
|
119
|
+
end
|
120
|
+
return 0
|
121
|
+
|
64
122
|
end
|
65
123
|
|
66
124
|
end
|
data/lib/pivo_flow/pivotal.rb
CHANGED
data/lib/pivo_flow/version.rb
CHANGED
data/pivo_flow.gemspec
CHANGED
@@ -0,0 +1,73 @@
|
|
1
|
+
require_relative './../../lib/pivo_flow/cli'
|
2
|
+
|
3
|
+
describe PivoFlow::Cli do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
# we don't need cli output all over the specs
|
7
|
+
PivoFlow::Cli.any_instance.stub(:puts)
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "with no args provided" do
|
11
|
+
|
12
|
+
let(:command) { PivoFlow::Cli.new.go! }
|
13
|
+
|
14
|
+
before(:each) do
|
15
|
+
PivoFlow::Cli.any_instance.should_receive(:no_method_error).and_return(true)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "calls no_method_error message " do
|
19
|
+
command
|
20
|
+
end
|
21
|
+
|
22
|
+
it "returns 1" do
|
23
|
+
expect(command).to eq 1
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "on invalid command" do
|
29
|
+
|
30
|
+
let(:command) { PivoFlow::Cli.new("invalid_method_name").go! }
|
31
|
+
|
32
|
+
before(:each) do
|
33
|
+
PivoFlow::Cli.any_instance.should_receive(:invalid_method_error)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "calls invalid_method_error message" do
|
37
|
+
command
|
38
|
+
end
|
39
|
+
|
40
|
+
it "returns 1" do
|
41
|
+
expect(command).to eq 1
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "with valid command" do
|
47
|
+
cmd = "stories"
|
48
|
+
let(:command) { PivoFlow::Cli.new(cmd).go! }
|
49
|
+
|
50
|
+
before do
|
51
|
+
PivoFlow::Cli.any_instance.should_receive(cmd.to_sym)
|
52
|
+
end
|
53
|
+
|
54
|
+
it "runs this command if it is public" do
|
55
|
+
command
|
56
|
+
end
|
57
|
+
|
58
|
+
it "returns 0" do
|
59
|
+
expect(command).to eq 0
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should allow to execute given commands" do
|
65
|
+
methods = [:stories, :start, :finish, :clear, :reconfig]
|
66
|
+
|
67
|
+
methods.each do |method|
|
68
|
+
PivoFlow::Cli.any_instance.stub(method)
|
69
|
+
PivoFlow::Cli.new(method.to_s).go!.should eq 0
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pivo_flow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-08-
|
12
|
+
date: 2012-08-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: pivotal-tracker
|
@@ -75,6 +75,38 @@ dependencies:
|
|
75
75
|
- - ! '>='
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: simplecov
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: rake
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
78
110
|
description: Automated querying for pivotal stories, adding story id to commit message,
|
79
111
|
etc.
|
80
112
|
email:
|
@@ -86,6 +118,8 @@ extensions: []
|
|
86
118
|
extra_rdoc_files: []
|
87
119
|
files:
|
88
120
|
- .gitignore
|
121
|
+
- .rspec
|
122
|
+
- .travis.yml
|
89
123
|
- Gemfile
|
90
124
|
- LICENSE
|
91
125
|
- README.md
|
@@ -98,6 +132,7 @@ files:
|
|
98
132
|
- lib/pivo_flow/pivotal.rb
|
99
133
|
- lib/pivo_flow/version.rb
|
100
134
|
- pivo_flow.gemspec
|
135
|
+
- spec/pivo_flow/cli_spec.rb
|
101
136
|
- spec/spec_helper.rb
|
102
137
|
homepage: https://github.com/lubieniebieski/pivo_flow
|
103
138
|
licenses: []
|
@@ -124,4 +159,6 @@ signing_key:
|
|
124
159
|
specification_version: 3
|
125
160
|
summary: Simple pivotal tracker integration for day to day work with git
|
126
161
|
test_files:
|
162
|
+
- spec/pivo_flow/cli_spec.rb
|
127
163
|
- spec/spec_helper.rb
|
164
|
+
has_rdoc:
|