assisted_workflow 0.3.1 → 0.4.0
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.
- checksums.yaml +5 -13
- data/.gitignore +5 -2
- data/.ruby-version +1 -0
- data/CHANGELOG.md +12 -0
- data/Gemfile.lock +62 -37
- data/{LICENSE.txt → LICENSE} +1 -1
- data/README.md +11 -8
- data/RELEASING.md +39 -0
- data/Rakefile +102 -0
- data/assisted_workflow.gemspec +4 -3
- data/lib/assisted_workflow/addons/git.rb +5 -5
- data/lib/assisted_workflow/addons/github.rb +11 -7
- data/lib/assisted_workflow/addons/jira.rb +5 -5
- data/lib/assisted_workflow/addons/pivotal.rb +52 -16
- data/lib/assisted_workflow/cli.rb +3 -2
- data/lib/assisted_workflow/output.rb +2 -6
- data/lib/assisted_workflow/templates/awconfig.global.tt +2 -1
- data/lib/assisted_workflow/version.rb +1 -1
- data/packaging/Gemfile +3 -0
- data/packaging/aw.sh +13 -0
- data/packaging/bundler-config +4 -0
- data/spec/assisted_workflow/addons/git_spec.rb +30 -16
- data/spec/assisted_workflow/addons/github_spec.rb +20 -10
- data/spec/assisted_workflow/addons/jira_spec.rb +1 -2
- data/spec/assisted_workflow/addons/pivotal_spec.rb +24 -23
- metadata +54 -37
checksums.yaml
CHANGED
|
@@ -1,15 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
|
|
5
|
-
data.tar.gz: !binary |-
|
|
6
|
-
ZjJkZTJjNTRmOGViZjFmNjhmNzZhZDUyMDhiMzViMTU4YmViYWYxMg==
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 67a9b4050e4f187dcce995edb3525fda212c62da
|
|
4
|
+
data.tar.gz: ff942865f4e047eb9d0ad746653ce694e8f4aabe
|
|
7
5
|
SHA512:
|
|
8
|
-
metadata.gz:
|
|
9
|
-
|
|
10
|
-
ZTY0NzIyZjhiZmU4NzlmZTE0MzA3ZDIyYjhkODkzZWUxMTdhYmRlNzYxMzli
|
|
11
|
-
YmRmNzY3MWE3MTczNDA5OTk1NDM0NTk2YjUyNDQxYjk0YTc4M2I=
|
|
12
|
-
data.tar.gz: !binary |-
|
|
13
|
-
OWU5ODQxOGMxYjc1NTllY2NjMWFlNmQ2M2EwYmU1NDJhOTYwZmFlNWFjNzI5
|
|
14
|
-
YmEwMzM0YjgzZGJkOTJhMzlkY2QwNjRkNzBkZTQyMmE4ODNhNGE5OTdhMmJl
|
|
15
|
-
NTE5NjliZjdhZWI2NWEyZTg0YjM0ODI5MTI2Zjk2NDU0MDJmMjg=
|
|
6
|
+
metadata.gz: 9c981d14895eac973df61ea28842306a73fd92eb92e691015eb249f15d861392a76172a15af13ffbb6acb0e6200700a322015952c4f17763932c481b71e885e3
|
|
7
|
+
data.tar.gz: 6545db20692ebb93fdae521dcc020a96b3d3fdb1e47d8c103117dff6feee5045409b1fcac232a6062c48197184282fc87e553b94bfa87dc3ceb24964020bd885
|
data/.gitignore
CHANGED
data/.ruby-version
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2.2.2
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
### Unreleased
|
|
2
2
|
|
|
3
|
+
### 0.4.0
|
|
4
|
+
|
|
5
|
+
* enchancements
|
|
6
|
+
* Moving from pivotal-tracker to tracker-api gem, in order to use api v5 (@alemata)
|
|
7
|
+
* Packaging with Traveling Ruby (@flaviogranero)
|
|
8
|
+
|
|
9
|
+
### 0.3.1
|
|
10
|
+
|
|
11
|
+
* bug fix
|
|
12
|
+
* Fixing issue when states/transitions are the default ones
|
|
13
|
+
* Bugfix for issues with empty descriptions
|
|
14
|
+
|
|
3
15
|
### 0.3.0
|
|
4
16
|
|
|
5
17
|
* enchancements
|
data/Gemfile.lock
CHANGED
|
@@ -1,64 +1,88 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
assisted_workflow (0.
|
|
4
|
+
assisted_workflow (0.4.0)
|
|
5
5
|
hashie (~> 2.0.5)
|
|
6
6
|
jiralicious (~> 0.4.0)
|
|
7
7
|
octokit (~> 2.0)
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
thor (~> 0.19)
|
|
9
|
+
tracker_api (~> 0.2.0)
|
|
10
10
|
|
|
11
11
|
GEM
|
|
12
12
|
remote: https://rubygems.org/
|
|
13
13
|
specs:
|
|
14
|
-
|
|
14
|
+
activemodel (4.2.1)
|
|
15
|
+
activesupport (= 4.2.1)
|
|
16
|
+
builder (~> 3.1)
|
|
17
|
+
activesupport (4.2.1)
|
|
18
|
+
i18n (~> 0.7)
|
|
19
|
+
json (~> 1.7, >= 1.7.7)
|
|
20
|
+
minitest (~> 5.1)
|
|
21
|
+
thread_safe (~> 0.3, >= 0.3.4)
|
|
22
|
+
tzinfo (~> 1.1)
|
|
23
|
+
addressable (2.3.8)
|
|
24
|
+
axiom-types (0.1.1)
|
|
25
|
+
descendants_tracker (~> 0.0.4)
|
|
26
|
+
ice_nine (~> 0.11.0)
|
|
27
|
+
thread_safe (~> 0.3, >= 0.3.1)
|
|
15
28
|
builder (3.2.2)
|
|
29
|
+
coercible (1.0.0)
|
|
30
|
+
descendants_tracker (~> 0.0.1)
|
|
16
31
|
crack (0.1.8)
|
|
17
|
-
|
|
18
|
-
|
|
32
|
+
descendants_tracker (0.0.4)
|
|
33
|
+
thread_safe (~> 0.3, >= 0.3.1)
|
|
34
|
+
equalizer (0.0.11)
|
|
35
|
+
excon (0.45.3)
|
|
36
|
+
fakefs (0.6.7)
|
|
37
|
+
faraday (0.9.1)
|
|
19
38
|
multipart-post (>= 1.2, < 3)
|
|
20
|
-
|
|
21
|
-
|
|
39
|
+
faraday_middleware (0.9.1)
|
|
40
|
+
faraday (>= 0.7.4, < 0.10)
|
|
22
41
|
hashie (2.0.5)
|
|
23
|
-
httparty (0.
|
|
24
|
-
|
|
42
|
+
httparty (0.13.5)
|
|
43
|
+
json (~> 1.8)
|
|
25
44
|
multi_xml (>= 0.5.2)
|
|
26
|
-
|
|
45
|
+
i18n (0.7.0)
|
|
46
|
+
ice_nine (0.11.1)
|
|
47
|
+
jiralicious (0.4.3)
|
|
27
48
|
crack (~> 0.1.8)
|
|
28
49
|
hashie (>= 1.1)
|
|
29
|
-
httparty (>= 0.10
|
|
50
|
+
httparty (>= 0.10)
|
|
30
51
|
json (>= 1.6, < 1.9.0)
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
mini_portile (0.
|
|
35
|
-
|
|
52
|
+
nokogiri
|
|
53
|
+
oauth
|
|
54
|
+
json (1.8.2)
|
|
55
|
+
mini_portile (0.6.2)
|
|
56
|
+
minitest (5.7.0)
|
|
36
57
|
multi_xml (0.5.5)
|
|
37
58
|
multipart-post (2.0.0)
|
|
38
|
-
nokogiri (1.6.
|
|
39
|
-
mini_portile (~> 0.
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
octokit (2.7.1)
|
|
59
|
+
nokogiri (1.6.6.2)
|
|
60
|
+
mini_portile (~> 0.6.0)
|
|
61
|
+
oauth (0.4.7)
|
|
62
|
+
octokit (2.7.2)
|
|
43
63
|
sawyer (~> 0.5.2)
|
|
44
|
-
|
|
45
|
-
builder
|
|
46
|
-
builder
|
|
47
|
-
crack
|
|
48
|
-
happymapper (>= 0.3.2)
|
|
49
|
-
nokogiri (>= 1.4.3)
|
|
50
|
-
nokogiri (>= 1.5.5)
|
|
51
|
-
nokogiri-happymapper (>= 0.5.4)
|
|
52
|
-
rest-client (~> 1.6.0)
|
|
53
|
-
rest-client (~> 1.6.0)
|
|
54
|
-
rake (10.1.1)
|
|
55
|
-
rest-client (1.6.7)
|
|
56
|
-
mime-types (>= 1.16)
|
|
64
|
+
rake (10.4.2)
|
|
57
65
|
rr (1.1.2)
|
|
58
|
-
sawyer (0.5.
|
|
66
|
+
sawyer (0.5.5)
|
|
59
67
|
addressable (~> 2.3.5)
|
|
60
68
|
faraday (~> 0.8, < 0.10)
|
|
61
|
-
thor (0.
|
|
69
|
+
thor (0.19.1)
|
|
70
|
+
thread_safe (0.3.5)
|
|
71
|
+
tracker_api (0.2.9)
|
|
72
|
+
activemodel
|
|
73
|
+
activesupport
|
|
74
|
+
addressable
|
|
75
|
+
excon
|
|
76
|
+
faraday (~> 0.9.0)
|
|
77
|
+
faraday_middleware
|
|
78
|
+
virtus
|
|
79
|
+
tzinfo (1.2.2)
|
|
80
|
+
thread_safe (~> 0.1)
|
|
81
|
+
virtus (1.0.5)
|
|
82
|
+
axiom-types (~> 0.1)
|
|
83
|
+
coercible (~> 1.0)
|
|
84
|
+
descendants_tracker (~> 0.0, >= 0.0.3)
|
|
85
|
+
equalizer (~> 0.0, >= 0.0.9)
|
|
62
86
|
|
|
63
87
|
PLATFORMS
|
|
64
88
|
ruby
|
|
@@ -66,5 +90,6 @@ PLATFORMS
|
|
|
66
90
|
DEPENDENCIES
|
|
67
91
|
assisted_workflow!
|
|
68
92
|
fakefs
|
|
93
|
+
minitest
|
|
69
94
|
rake
|
|
70
95
|
rr
|
data/{LICENSE.txt → LICENSE}
RENAMED
data/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Assisted Workflow (aw)
|
|
2
2
|
|
|
3
|
-
[](http://badge.fury.io/rb/assisted_workflow) [](http://badge.fury.io/rb/assisted_workflow) [](https://travis-ci.org/inaka/assisted_workflow) [](https://codeclimate.com/github/inaka/assisted_workflow)
|
|
4
4
|
|
|
5
5
|
AW is a CLI tool to automate software development workflows based on github pull requests.
|
|
6
6
|
|
|
@@ -14,10 +14,18 @@ Here in [Inaka](http://inaka.net) we have the following workflow steps:
|
|
|
14
14
|
4. Finish the story, removing both local and remote feature branches
|
|
15
15
|
5. Deploy master branch.
|
|
16
16
|
|
|
17
|
-
For more details, please read more about the [Inaka Workflow](https://github.com/inaka/
|
|
17
|
+
For more details, please read more about the [Inaka's Development Workflow](https://github.com/inaka/assisted_workflow/wiki/Inaka's-Development-Flow).
|
|
18
18
|
|
|
19
19
|
This gem provides a command line tool to automate tasks related with `start`, `submit` and `finish` steps.
|
|
20
20
|
|
|
21
|
+
## Contact Us
|
|
22
|
+
For **questions** or **general comments** regarding the use of this library, please use our public
|
|
23
|
+
[hipchat room](https://www.hipchat.com/gpBpW3SsT).
|
|
24
|
+
|
|
25
|
+
If you find any **bugs** or have a **problem** while using this library, please [open an issue](https://github.com/inaka/assisted_workflow/issues/new) in this repo (or a pull request :)).
|
|
26
|
+
|
|
27
|
+
And you can check all of our open-source projects at [inaka.github.io](http://inaka.github.io)
|
|
28
|
+
|
|
21
29
|
## Installation
|
|
22
30
|
|
|
23
31
|
Add this line to your application's Gemfile:
|
|
@@ -88,9 +96,4 @@ either add an 'origin' remote that points to the GitHub repository you want to s
|
|
|
88
96
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
|
89
97
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
|
90
98
|
4. Push to the branch (`git push origin my-new-feature`)
|
|
91
|
-
5. Create new Pull Request
|
|
92
|
-
|
|
93
|
-
## To-do
|
|
94
|
-
|
|
95
|
-
1. add github issues support
|
|
96
|
-
2. refactor addons to a base class, with access to a shell output wrapper.
|
|
99
|
+
5. Create new Pull Request
|
data/RELEASING.md
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
Releasing
|
|
2
|
+
=========
|
|
3
|
+
|
|
4
|
+
Assisted Workflow uses a set of `rake` tasks to create packages and bundles [traveling
|
|
5
|
+
ruby][traveling_ruby] to simplify the dependency on Ruby.
|
|
6
|
+
|
|
7
|
+
Generating packages
|
|
8
|
+
-------------------
|
|
9
|
+
|
|
10
|
+
Packages can be generated for the following systems:
|
|
11
|
+
|
|
12
|
+
* OSX `rake package:osx`
|
|
13
|
+
* Linux x86 `rake package:linux:x86`
|
|
14
|
+
* Linux x86_64 `rake package:linux:x86_64`
|
|
15
|
+
|
|
16
|
+
You can generate all packages with `rake package:all`
|
|
17
|
+
|
|
18
|
+
[traveling_ruby]: https://github.com/phusion/traveling-ruby
|
|
19
|
+
|
|
20
|
+
The packages generated are tarballs of the following directory structure:
|
|
21
|
+
|
|
22
|
+
aw-package
|
|
23
|
+
├── bin # shims
|
|
24
|
+
└── lib
|
|
25
|
+
├── app # where aw is installed as a gem with its dependencies
|
|
26
|
+
└── ruby # traveling ruby for target system
|
|
27
|
+
|
|
28
|
+
Releasing a new version
|
|
29
|
+
-----------------------
|
|
30
|
+
|
|
31
|
+
1. Update the version in `lib/assisted_workflow/version.rb`
|
|
32
|
+
1. Update the `CHANGELOG.md` with the news
|
|
33
|
+
1. Use `rake release` to tag and publish the new version as a gem
|
|
34
|
+
1. Generate the osx package with `rake package:osx`
|
|
35
|
+
1. Create a [release] for the latest tag and attach the packages
|
|
36
|
+
1. Update the [homebrew formula] to point to the latest OSX package
|
|
37
|
+
|
|
38
|
+
[release]: https://github.com/inaka/assisted_workflow/releases
|
|
39
|
+
[homebrew formula]: https://github.com/inaka/homebrew-formulas
|
data/Rakefile
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
require "bundler/gem_tasks"
|
|
2
2
|
require 'rake/testtask'
|
|
3
|
+
require 'assisted_workflow/version'
|
|
3
4
|
|
|
4
5
|
Rake::TestTask.new do |t|
|
|
5
6
|
t.libs << "spec"
|
|
@@ -13,4 +14,105 @@ task :console do
|
|
|
13
14
|
require 'assisted_workflow/cli'
|
|
14
15
|
ARGV.clear
|
|
15
16
|
IRB.start
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
PROJECT_NAME = "aw"
|
|
20
|
+
TRAVELING_RUBY_VERSION = "20150517-2.2.2"
|
|
21
|
+
TRAVELING_RUBY_HOST = "http://d6r77u77i8pq3.cloudfront.net/releases"
|
|
22
|
+
RUBY_BASENAME = "traveling-ruby-#{TRAVELING_RUBY_VERSION}"
|
|
23
|
+
|
|
24
|
+
namespace :package do
|
|
25
|
+
desc "Generate assisted_workflow #{AssistedWorkflow::VERSION} packages for OSX, Linux x86 and Linux x86_64"
|
|
26
|
+
|
|
27
|
+
task all: ["linux:x86", "linux:x86_64", "osx"]
|
|
28
|
+
|
|
29
|
+
namespace :linux do
|
|
30
|
+
desc "Generate assisted_workflow #{AssistedWorkflow::VERSION} package for Linux x86"
|
|
31
|
+
task x86: "packaging/#{RUBY_BASENAME}-linux-x86.tar.gz" do
|
|
32
|
+
clean_up("linux-x86")
|
|
33
|
+
create_package("linux-x86")
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
desc "Generate assisted_workflow #{AssistedWorkflow::VERSION} package for Linux x86_64"
|
|
37
|
+
task x86_64: "packaging/#{RUBY_BASENAME}-linux-x86_64.tar.gz" do
|
|
38
|
+
clean_up("linux-x86_64")
|
|
39
|
+
create_package("linux-x86_64")
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
desc "Generate assisted_workflow #{AssistedWorkflow::VERSION} package for OSX"
|
|
44
|
+
task osx: "packaging/#{RUBY_BASENAME}-osx.tar.gz" do
|
|
45
|
+
clean_up("osx")
|
|
46
|
+
create_package("osx")
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
desc "Remove the files generated by packaging"
|
|
50
|
+
task :cleanup do
|
|
51
|
+
clean_up("osx")
|
|
52
|
+
clean_up("linux-x86")
|
|
53
|
+
clean_up("linux-x86_64")
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
file "packaging/#{RUBY_BASENAME}-osx.tar.gz" do
|
|
58
|
+
sh "cd packaging && curl -L -O --fail #{TRAVELING_RUBY_HOST}/#{ruby_for("osx")}"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
file "packaging/#{RUBY_BASENAME}-linux-x86.tar.gz" do
|
|
62
|
+
sh "cd packaging && curl -L -O --fail #{TRAVELING_RUBY_HOST}/#{ruby_for("linux-x86")}"
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
file "packaging/#{RUBY_BASENAME}-linux-x86_64.tar.gz" do
|
|
66
|
+
sh "cd packaging && curl -L -O --fail #{TRAVELING_RUBY_HOST}/#{ruby_for("linux-x86_64")}"
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def create_package(target)
|
|
70
|
+
if RUBY_VERSION !~ /^2\.2\./
|
|
71
|
+
abort "You can't package with a Ruby version other than 2.2."
|
|
72
|
+
end
|
|
73
|
+
package_dir = "#{PROJECT_NAME}-#{AssistedWorkflow::VERSION}-#{target}"
|
|
74
|
+
|
|
75
|
+
copy_shims(package_dir)
|
|
76
|
+
install_dependencies(package_dir)
|
|
77
|
+
extract_ruby(package_dir, target)
|
|
78
|
+
archive_package(package_dir)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def clean_up(target)
|
|
82
|
+
package_name = "#{PROJECT_NAME}-#{AssistedWorkflow::VERSION}-#{target}"
|
|
83
|
+
rm_rf package_name
|
|
84
|
+
rm_f "#{package_name}.tar.gz"
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def ruby_for(target)
|
|
88
|
+
"#{RUBY_BASENAME}-#{target}.tar.gz"
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def install_dependencies(package_dir)
|
|
92
|
+
app_path = "#{package_dir}/lib/app"
|
|
93
|
+
mkdir_p app_path
|
|
94
|
+
|
|
95
|
+
cp "packaging/Gemfile", app_path
|
|
96
|
+
mkdir "#{app_path}/.bundle"
|
|
97
|
+
cp "packaging/bundler-config", "#{app_path}/.bundle/config"
|
|
98
|
+
Bundler.with_clean_env do
|
|
99
|
+
sh "cd #{app_path}/ && bundle install"
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def copy_shims(package_dir)
|
|
104
|
+
shim_dir = "#{package_dir}/bin"
|
|
105
|
+
mkdir_p shim_dir
|
|
106
|
+
|
|
107
|
+
cp "packaging/aw.sh", "#{shim_dir}/aw"
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def extract_ruby(package_dir, target)
|
|
111
|
+
ruby_dir = "#{package_dir}/lib/ruby"
|
|
112
|
+
mkdir_p ruby_dir
|
|
113
|
+
sh "tar -xzf packaging/#{ruby_for(target)} -C #{ruby_dir}"
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def archive_package(package_dir)
|
|
117
|
+
sh "tar -czf #{package_dir}.tar.gz #{package_dir}"
|
|
16
118
|
end
|
data/assisted_workflow.gemspec
CHANGED
|
@@ -9,7 +9,7 @@ Gem::Specification.new do |gem|
|
|
|
9
9
|
gem.authors = ["Flavio Granero"]
|
|
10
10
|
gem.email = ["maltempe@gmail.com"]
|
|
11
11
|
gem.summary = %q{AW is a CLI tool to automate software development workflows based on github pull requests}
|
|
12
|
-
gem.homepage = "https://github.com/
|
|
12
|
+
gem.homepage = "https://github.com/inaka/assisted_workflow"
|
|
13
13
|
gem.license = "MIT"
|
|
14
14
|
|
|
15
15
|
gem.files = `git ls-files`.split($/)
|
|
@@ -21,12 +21,13 @@ Gem::Specification.new do |gem|
|
|
|
21
21
|
gem.add_development_dependency "rake"
|
|
22
22
|
gem.add_development_dependency "rr"
|
|
23
23
|
gem.add_development_dependency "fakefs"
|
|
24
|
+
gem.add_development_dependency "minitest"
|
|
24
25
|
|
|
25
|
-
gem.add_dependency "thor", "~> 0.
|
|
26
|
-
gem.add_dependency "pivotal-tracker", "~> 0.5.12"
|
|
26
|
+
gem.add_dependency "thor", "~> 0.19"
|
|
27
27
|
gem.add_dependency "jiralicious", "~> 0.4.0"
|
|
28
28
|
gem.add_dependency "octokit", "~> 2.0"
|
|
29
29
|
gem.add_dependency "hashie", "~> 2.0.5"
|
|
30
|
+
gem.add_dependency "tracker_api", "~> 0.2.0"
|
|
30
31
|
|
|
31
32
|
gem.description = <<desc
|
|
32
33
|
`aw` is a command line tool to automate software development workflows based on github pull requests.
|
|
@@ -17,9 +17,9 @@ module AssistedWorkflow::Addons
|
|
|
17
17
|
# creates a new git branch based on story attributes
|
|
18
18
|
# the branch name format is:
|
|
19
19
|
# => story_onwer_username.story_id.story_name
|
|
20
|
-
def create_story_branch(story)
|
|
20
|
+
def create_story_branch(story, username)
|
|
21
21
|
log "creating the feature branch"
|
|
22
|
-
branch = branch_name(story)
|
|
22
|
+
branch = branch_name(story, username)
|
|
23
23
|
git "checkout -b #{branch}"
|
|
24
24
|
# git "push --set-upstream origin #{branch}"
|
|
25
25
|
end
|
|
@@ -97,9 +97,9 @@ module AssistedWorkflow::Addons
|
|
|
97
97
|
$? != 0
|
|
98
98
|
end
|
|
99
99
|
|
|
100
|
-
def branch_name(story)
|
|
100
|
+
def branch_name(story, username)
|
|
101
101
|
description = story.name.to_s.downcase.gsub(/\W/, "_").slice(0, DESCRIPTION_LIMIT)
|
|
102
|
-
[
|
|
102
|
+
[username, story.id, description].join(".").downcase
|
|
103
103
|
end
|
|
104
104
|
|
|
105
105
|
def not_commited_changes
|
|
@@ -110,4 +110,4 @@ module AssistedWorkflow::Addons
|
|
|
110
110
|
raise AssistedWorkflow::Error, "git: there are not commited changes" unless not_commited_changes.empty?
|
|
111
111
|
end
|
|
112
112
|
end
|
|
113
|
-
end
|
|
113
|
+
end
|
|
@@ -22,12 +22,12 @@ module AssistedWorkflow::Addons
|
|
|
22
22
|
@issue.body.to_s.gsub("\r\n", "\n")
|
|
23
23
|
end
|
|
24
24
|
|
|
25
|
-
def other_id
|
|
26
|
-
@issue.assignee.login
|
|
27
|
-
end
|
|
28
|
-
|
|
29
25
|
def current_state
|
|
30
|
-
|
|
26
|
+
@issue.labels.map(&:name).join(",")
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def owners_str
|
|
30
|
+
@issue.assignee.login if issue.assignee
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
def labels
|
|
@@ -57,7 +57,7 @@ module AssistedWorkflow::Addons
|
|
|
57
57
|
|
|
58
58
|
# Creates a pull request using current branch changes
|
|
59
59
|
#
|
|
60
|
-
# @param repo [String] Repository name.
|
|
60
|
+
# @param repo [String] Repository name. inaka/assisted_workflow
|
|
61
61
|
# @param branch [String] Branch name. flavio.0001.new_feature
|
|
62
62
|
# @param story [Story] Pivotal story object
|
|
63
63
|
# @return [Sawyer::Resource] The newly created pull request
|
|
@@ -118,5 +118,9 @@ module AssistedWorkflow::Addons
|
|
|
118
118
|
def valid?
|
|
119
119
|
@client.user_authenticated?
|
|
120
120
|
end
|
|
121
|
+
|
|
122
|
+
def username
|
|
123
|
+
@username
|
|
124
|
+
end
|
|
121
125
|
end
|
|
122
|
-
end
|
|
126
|
+
end
|
|
@@ -21,13 +21,13 @@ module AssistedWorkflow::Addons
|
|
|
21
21
|
@issue.summary
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
def other_id
|
|
25
|
-
@issue.fields.current["assignee"]["name"].split.join
|
|
26
|
-
end
|
|
27
|
-
|
|
28
24
|
def current_state
|
|
29
25
|
@issue.fields.current["status"]["name"]
|
|
30
26
|
end
|
|
27
|
+
|
|
28
|
+
def owners_str
|
|
29
|
+
@issue.fields.current["assignee"]["name"]
|
|
30
|
+
end
|
|
31
31
|
|
|
32
32
|
def estimate
|
|
33
33
|
@issue.fields.current["priority"]["name"]
|
|
@@ -102,4 +102,4 @@ module AssistedWorkflow::Addons
|
|
|
102
102
|
end
|
|
103
103
|
end
|
|
104
104
|
end
|
|
105
|
-
end
|
|
105
|
+
end
|
|
@@ -1,18 +1,30 @@
|
|
|
1
1
|
require "assisted_workflow/exceptions"
|
|
2
2
|
require "assisted_workflow/addons/base"
|
|
3
|
-
require
|
|
3
|
+
require "tracker_api"
|
|
4
4
|
|
|
5
5
|
# wrapper class to pivotal api client
|
|
6
6
|
module AssistedWorkflow::Addons
|
|
7
|
+
|
|
8
|
+
class PivotalStory < SimpleDelegator
|
|
9
|
+
def initialize(story)
|
|
10
|
+
super
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def owners_str
|
|
14
|
+
url = "/projects/#{project_id}/stories/#{id}/owners"
|
|
15
|
+
client.get(url).body.map{|owner| owner["name"]}.join(", ")
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
7
19
|
class Pivotal < Base
|
|
8
20
|
required_options :fullname, :token, :project_id
|
|
9
21
|
|
|
10
22
|
def initialize(output, options = {})
|
|
11
23
|
super
|
|
12
24
|
|
|
13
|
-
|
|
25
|
+
@client = TrackerApi::Client.new(token: options["token"])
|
|
14
26
|
begin
|
|
15
|
-
@project =
|
|
27
|
+
@project = @client.project(options["project_id"])
|
|
16
28
|
rescue
|
|
17
29
|
raise AssistedWorkflow::Error, "pivotal project #{options["project_id"]} not found."
|
|
18
30
|
end
|
|
@@ -23,22 +35,27 @@ module AssistedWorkflow::Addons
|
|
|
23
35
|
def find_story(story_id)
|
|
24
36
|
if story_id.to_i > 0
|
|
25
37
|
log "loading story ##{story_id}"
|
|
26
|
-
|
|
27
|
-
story.other_id = @username || @fullname
|
|
28
|
-
story.other_id = story.other_id.to_s.downcase.split.join
|
|
29
|
-
story
|
|
38
|
+
PivotalStory.new(@project.story(story_id))
|
|
30
39
|
end
|
|
31
40
|
end
|
|
32
41
|
|
|
33
42
|
def start_story(story, options = {})
|
|
34
43
|
log "starting story ##{story.id}"
|
|
35
|
-
|
|
44
|
+
options.delete(:estimate) if options[:estimate].nil?
|
|
45
|
+
update_story!(story, options.merge(:current_state => "started"))
|
|
46
|
+
|
|
47
|
+
owner_ids = story.owner_ids
|
|
48
|
+
if owner_ids.empty? || !owner_ids.include?(@client.me.id)
|
|
49
|
+
log "assigning story ##{story.id}"
|
|
50
|
+
update_story!(story, :owner_ids => owner_ids.dup << @client.me.id)
|
|
51
|
+
end
|
|
36
52
|
end
|
|
37
|
-
|
|
53
|
+
|
|
38
54
|
def finish_story(story, options = {})
|
|
39
55
|
log "finishing story ##{story.id}"
|
|
40
|
-
|
|
41
|
-
|
|
56
|
+
saved = update_story! story, :current_state => finished_state(story)
|
|
57
|
+
if saved && options[:note]
|
|
58
|
+
add_comment_to_story(story, options[:note])
|
|
42
59
|
end
|
|
43
60
|
end
|
|
44
61
|
|
|
@@ -46,14 +63,27 @@ module AssistedWorkflow::Addons
|
|
|
46
63
|
log "loading pending stories"
|
|
47
64
|
states = ["unstarted"]
|
|
48
65
|
states << "started" if options[:include_started]
|
|
49
|
-
|
|
66
|
+
filter_str = "state:#{states.join(',')} owned_by:#{@client.me.id}"
|
|
67
|
+
stories = @project.stories(:filter => filter_str, :limit => 5)
|
|
68
|
+
stories.map do |story|
|
|
69
|
+
PivotalStory.new(story)
|
|
70
|
+
end
|
|
50
71
|
end
|
|
51
72
|
|
|
52
73
|
def valid?
|
|
53
74
|
!@project.nil?
|
|
54
75
|
end
|
|
55
|
-
|
|
76
|
+
|
|
56
77
|
private
|
|
78
|
+
|
|
79
|
+
def add_comment_to_story(story, text)
|
|
80
|
+
url = "/projects/#{story.project_id}/stories/#{story.id}/comments"
|
|
81
|
+
@client.post(url, params: {:text => text})
|
|
82
|
+
rescue TrackerApi::Error => e
|
|
83
|
+
body = e.response[:body]
|
|
84
|
+
msg = body["possible_fix"] || body["general_problem"]
|
|
85
|
+
raise AssistedWorkflow::Error, msg
|
|
86
|
+
end
|
|
57
87
|
|
|
58
88
|
def finished_state(story)
|
|
59
89
|
if story.story_type == "chore"
|
|
@@ -65,10 +95,16 @@ module AssistedWorkflow::Addons
|
|
|
65
95
|
|
|
66
96
|
def update_story!(story, attributes)
|
|
67
97
|
if story
|
|
68
|
-
|
|
69
|
-
|
|
98
|
+
begin
|
|
99
|
+
story.attributes = attributes
|
|
100
|
+
story.save
|
|
101
|
+
rescue TrackerApi::Error => e
|
|
102
|
+
body = e.response[:body]
|
|
103
|
+
msg = body["possible_fix"] || body["general_problem"]
|
|
104
|
+
raise AssistedWorkflow::Error, msg
|
|
105
|
+
end
|
|
70
106
|
true
|
|
71
107
|
end
|
|
72
108
|
end
|
|
73
109
|
end
|
|
74
|
-
end
|
|
110
|
+
end
|
|
@@ -28,6 +28,7 @@ module AssistedWorkflow
|
|
|
28
28
|
c << "$ aw config pivotal.fullname='Your Pivotal User Name' --global"
|
|
29
29
|
c << "$ aw config pivotal.token=MYPIVOTALTOKEN --global"
|
|
30
30
|
c << "$ aw config github.token=MYGITHUBOAUTHTOKEN --global"
|
|
31
|
+
c << "$ aw config branch_username='Username for branch names' --global"
|
|
31
32
|
c << "$ aw config pivotal.project_id=00001"
|
|
32
33
|
end
|
|
33
34
|
end
|
|
@@ -45,7 +46,7 @@ module AssistedWorkflow
|
|
|
45
46
|
else
|
|
46
47
|
tracker.start_story(story, :estimate => options[:estimate])
|
|
47
48
|
out.print_story story
|
|
48
|
-
git.create_story_branch(story)
|
|
49
|
+
git.create_story_branch(story, configuration[:branch_username])
|
|
49
50
|
out.next_command "after commiting your changes, submit a pull request using:", "$ aw submit"
|
|
50
51
|
end
|
|
51
52
|
end
|
|
@@ -151,4 +152,4 @@ module AssistedWorkflow
|
|
|
151
152
|
end
|
|
152
153
|
end
|
|
153
154
|
end
|
|
154
|
-
end
|
|
155
|
+
end
|
|
@@ -25,11 +25,7 @@ module AssistedWorkflow
|
|
|
25
25
|
def print_stories(title, stories, options = {})
|
|
26
26
|
print_title title
|
|
27
27
|
rows = stories.map do |story|
|
|
28
|
-
|
|
29
|
-
[story.id, story.current_state, story.name]
|
|
30
|
-
else
|
|
31
|
-
[story.id, story.estimate, story.name]
|
|
32
|
-
end
|
|
28
|
+
[story.id, story.current_state, story.owners_str, story.name]
|
|
33
29
|
end
|
|
34
30
|
print_table(rows)
|
|
35
31
|
end
|
|
@@ -51,4 +47,4 @@ module AssistedWorkflow
|
|
|
51
47
|
end
|
|
52
48
|
|
|
53
49
|
end
|
|
54
|
-
end
|
|
50
|
+
end
|
data/packaging/Gemfile
ADDED
data/packaging/aw.sh
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -e
|
|
3
|
+
|
|
4
|
+
# Figure out where this script is located.
|
|
5
|
+
SELFDIR="`dirname \"$0\"`"
|
|
6
|
+
SELFDIR="`cd \"$SELFDIR\" && pwd`"
|
|
7
|
+
|
|
8
|
+
# Tell Bundler where the Gemfile and gems are.
|
|
9
|
+
export BUNDLE_GEMFILE="$SELFDIR/../lib/app/Gemfile"
|
|
10
|
+
unset BUNDLE_IGNORE_CONFIG
|
|
11
|
+
|
|
12
|
+
# Run the actual app using the bundled Ruby interpreter, with Bundler activated.
|
|
13
|
+
exec "$SELFDIR/../lib/ruby/bin/ruby" -rbundler/setup "$SELFDIR/../lib/app/vendor/ruby/2.2.0/bin/aw" "$@"
|
|
@@ -5,18 +5,18 @@ describe AssistedWorkflow::Addons::Git do
|
|
|
5
5
|
before do
|
|
6
6
|
@git = AssistedWorkflow::Addons::Git.new(nil, :silent => true)
|
|
7
7
|
stub(@git).system_error?{ false }
|
|
8
|
-
stub(@git).system("git rev-parse --abbrev-ref HEAD"){ "flavio.
|
|
8
|
+
stub(@git).system("git rev-parse --abbrev-ref HEAD"){ "flavio.1234.new_feature"}
|
|
9
9
|
end
|
|
10
10
|
|
|
11
11
|
it "creates a story branch" do
|
|
12
|
-
mock(@git).system("git checkout -b flavio.
|
|
13
|
-
@git.create_story_branch(story)
|
|
12
|
+
mock(@git).system("git checkout -b flavio.1234.new_feature")
|
|
13
|
+
@git.create_story_branch(story, "flavio")
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
it "raises a git error when git command does not exit with success" do
|
|
17
17
|
mock(@git).system_error?{ true }
|
|
18
|
-
mock(@git).system("git checkout -b flavio.
|
|
19
|
-
proc { @git.create_story_branch(story) }.must_raise AssistedWorkflow::Addons::GitError, "git command error"
|
|
18
|
+
mock(@git).system("git checkout -b flavio.1234.new_feature")
|
|
19
|
+
proc { @git.create_story_branch(story, "flavio") }.must_raise AssistedWorkflow::Addons::GitError, "git command error"
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
|
|
@@ -24,9 +24,9 @@ describe AssistedWorkflow::Addons::Git do
|
|
|
24
24
|
mock(@git).system("git status --porcelain"){ "" }
|
|
25
25
|
mock(@git).system("git checkout master")
|
|
26
26
|
mock(@git).system("git pull --rebase")
|
|
27
|
-
mock(@git).system("git checkout flavio.
|
|
27
|
+
mock(@git).system("git checkout flavio.1234.new_feature")
|
|
28
28
|
mock(@git).system("git rebase master")
|
|
29
|
-
mock(@git).system("git push -u -f origin flavio.
|
|
29
|
+
mock(@git).system("git push -u -f origin flavio.1234.new_feature")
|
|
30
30
|
@git.rebase_and_push
|
|
31
31
|
end
|
|
32
32
|
|
|
@@ -38,11 +38,11 @@ describe AssistedWorkflow::Addons::Git do
|
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
it "returns the story_id from branch name" do
|
|
41
|
-
@git.current_story_id.must_equal "
|
|
41
|
+
@git.current_story_id.must_equal "1234"
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
it "return the current branch name" do
|
|
45
|
-
@git.current_branch.must_equal "flavio.
|
|
45
|
+
@git.current_branch.must_equal "flavio.1234.new_feature"
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
it "returns the repository name assigned to origin" do
|
|
@@ -54,33 +54,47 @@ describe AssistedWorkflow::Addons::Git do
|
|
|
54
54
|
|
|
55
55
|
before do
|
|
56
56
|
mock(@git).system("git status --porcelain"){ "" }
|
|
57
|
-
mock(@git).system("git checkout flavio.
|
|
57
|
+
mock(@git).system("git checkout flavio.1234.new_feature")
|
|
58
58
|
mock(@git).system("git checkout master")
|
|
59
59
|
mock(@git).system("git pull --rebase")
|
|
60
60
|
end
|
|
61
61
|
|
|
62
62
|
it "returns true if current branch is merged into master" do
|
|
63
|
-
mock(@git).system("git branch --merged"){ "flavio.
|
|
63
|
+
mock(@git).system("git branch --merged"){ "flavio.1234.new_feature" }
|
|
64
64
|
@git.check_merged!.must_equal true
|
|
65
65
|
end
|
|
66
66
|
|
|
67
67
|
it "returns false if current branch is not merged into master" do
|
|
68
|
-
mock(@git).system("git branch --merged"){ "flavio.
|
|
68
|
+
mock(@git).system("git branch --merged"){ "flavio.1234.other_feature" }
|
|
69
69
|
proc { @git.check_merged! }.must_raise AssistedWorkflow::Error, "this branch is not merged into master"
|
|
70
70
|
|
|
71
71
|
end
|
|
72
72
|
end
|
|
73
73
|
|
|
74
74
|
it "removes current branch and its remote version" do
|
|
75
|
-
mock(@git).system("git push origin :flavio.
|
|
75
|
+
mock(@git).system("git push origin :flavio.1234.new_feature")
|
|
76
76
|
mock(@git).system("git checkout master")
|
|
77
|
-
mock(@git).system("git branch -D flavio.
|
|
77
|
+
mock(@git).system("git branch -D flavio.1234.new_feature")
|
|
78
78
|
@git.remove_branch
|
|
79
79
|
end
|
|
80
80
|
|
|
81
81
|
private #==================================================================
|
|
82
82
|
|
|
83
83
|
def story
|
|
84
|
-
|
|
84
|
+
# stubs
|
|
85
|
+
@client = TrackerApi::Client.new(token: "mypivotaltoken")
|
|
86
|
+
stub(TrackerApi::Client).new{ @client }
|
|
87
|
+
|
|
88
|
+
any_instance_of(TrackerApi::Resources::Story) do |klass|
|
|
89
|
+
stub(klass).comments { [] }
|
|
90
|
+
stub(klass).tasks { [] }
|
|
91
|
+
end
|
|
92
|
+
@story ||= TrackerApi::Resources::Story.new(:id => "1234",
|
|
93
|
+
:name => "New Feature",
|
|
94
|
+
:description => "Feature description",
|
|
95
|
+
:client => @client)
|
|
96
|
+
stub(@story).save {}
|
|
97
|
+
|
|
98
|
+
@story
|
|
85
99
|
end
|
|
86
|
-
end
|
|
100
|
+
end
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
|
-
require 'pivotal_tracker'
|
|
3
2
|
require 'assisted_workflow/addons/github'
|
|
4
3
|
|
|
5
4
|
describe AssistedWorkflow::Addons::Github do
|
|
@@ -25,25 +24,25 @@ describe AssistedWorkflow::Addons::Github do
|
|
|
25
24
|
end
|
|
26
25
|
|
|
27
26
|
it "creates a new valid pull request from a pivotal story" do
|
|
28
|
-
mock(@client).create_pull_request("fakeuser/fakerepo", "master", "fakeuser.
|
|
27
|
+
mock(@client).create_pull_request("fakeuser/fakerepo", "master", "fakeuser.1234.new_feature", "[#1234] New Feature", "Feature description"){ pull_request }
|
|
29
28
|
@github.create_pull_request(
|
|
30
|
-
"fakeuser.
|
|
29
|
+
"fakeuser.1234.new_feature", story
|
|
31
30
|
).must_match /fakeuser\/fakerepo\/pull\/1/
|
|
32
31
|
end
|
|
33
32
|
|
|
34
33
|
it "creates a new valid pull request from a github story" do
|
|
35
|
-
mock(@client).create_pull_request_for_issue("fakeuser/fakerepo", "master", "fakeuser.
|
|
34
|
+
mock(@client).create_pull_request_for_issue("fakeuser/fakerepo", "master", "fakeuser.1234.new_feature", 10){ pull_request }
|
|
36
35
|
@github.create_pull_request(
|
|
37
|
-
"fakeuser.
|
|
36
|
+
"fakeuser.1234.new_feature",
|
|
38
37
|
AssistedWorkflow::Addons::GithubStory.new(gh_issue(:number => 10))
|
|
39
38
|
).must_match /fakeuser\/fakerepo\/pull\/1/
|
|
40
39
|
end
|
|
41
40
|
|
|
42
41
|
it "raises on creating an invalid pull request" do
|
|
43
|
-
mock(@client).create_pull_request("fakeuser/fakerepo", "master", "fakeuser.
|
|
42
|
+
mock(@client).create_pull_request("fakeuser/fakerepo", "master", "fakeuser.1234.new_feature", "[#1234] New Feature", "Feature description"){ nil }
|
|
44
43
|
proc {
|
|
45
44
|
@github.create_pull_request(
|
|
46
|
-
"fakeuser.
|
|
45
|
+
"fakeuser.1234.new_feature", story
|
|
47
46
|
)
|
|
48
47
|
}.must_raise AssistedWorkflow::Error, "error on submiting the pull request"
|
|
49
48
|
end
|
|
@@ -55,7 +54,6 @@ describe AssistedWorkflow::Addons::Github do
|
|
|
55
54
|
|
|
56
55
|
story = @github.find_story("10")
|
|
57
56
|
story.id.must_equal "10"
|
|
58
|
-
story.other_id.must_match /fakeuser/
|
|
59
57
|
end
|
|
60
58
|
|
|
61
59
|
it "returns pending stories" do
|
|
@@ -82,7 +80,19 @@ describe AssistedWorkflow::Addons::Github do
|
|
|
82
80
|
private #==================================================================
|
|
83
81
|
|
|
84
82
|
def story
|
|
85
|
-
|
|
83
|
+
# stubs
|
|
84
|
+
@client = TrackerApi::Client.new(token: "mypivotaltoken")
|
|
85
|
+
stub(TrackerApi::Client).new{ @client }
|
|
86
|
+
|
|
87
|
+
any_instance_of(TrackerApi::Resources::Story) do |klass|
|
|
88
|
+
stub(klass).comments { [] }
|
|
89
|
+
stub(klass).tasks { [] }
|
|
90
|
+
end
|
|
91
|
+
@story ||= TrackerApi::Resources::Story.new(:id => "1234", :name => "New Feature",
|
|
92
|
+
:description => "Feature description", :client => @client)
|
|
93
|
+
stub(@story).save {}
|
|
94
|
+
|
|
95
|
+
@story
|
|
86
96
|
end
|
|
87
97
|
|
|
88
98
|
def agent_stub
|
|
@@ -108,4 +118,4 @@ describe AssistedWorkflow::Addons::Github do
|
|
|
108
118
|
stub(client).user_authenticated?{ true }
|
|
109
119
|
client
|
|
110
120
|
end
|
|
111
|
-
end
|
|
121
|
+
end
|
|
@@ -74,7 +74,6 @@ describe AssistedWorkflow::Addons::Jira do
|
|
|
74
74
|
|
|
75
75
|
story = @jira.find_story("aw-01")
|
|
76
76
|
story.id.must_equal "aw-01"
|
|
77
|
-
story.other_id.must_match /jirauser/
|
|
78
77
|
end
|
|
79
78
|
|
|
80
79
|
it "returns pending stories" do
|
|
@@ -134,4 +133,4 @@ describe AssistedWorkflow::Addons::Jira do
|
|
|
134
133
|
mock(Jiralicious::Issue).get_transitions(url){ response }
|
|
135
134
|
mock(Jiralicious::Issue).transition(url, {"transition" => status_id})
|
|
136
135
|
end
|
|
137
|
-
end
|
|
136
|
+
end
|
|
@@ -11,9 +11,12 @@ describe AssistedWorkflow::Addons::Pivotal do
|
|
|
11
11
|
"fullname" => "Flavio Granero"
|
|
12
12
|
}
|
|
13
13
|
# stubs
|
|
14
|
-
@
|
|
15
|
-
stub(
|
|
16
|
-
|
|
14
|
+
@client = TrackerApi::Client.new(token: "mypivotaltoken")
|
|
15
|
+
stub(TrackerApi::Client).new{ @client }
|
|
16
|
+
@project = TrackerApi::Resources::Project.new(client: @client, id: 1)
|
|
17
|
+
stub(@client).project(@configuration["project_id"]){ @project }
|
|
18
|
+
stub(@client).me{ TrackerApi::Resources::Me.new }
|
|
19
|
+
|
|
17
20
|
@pivotal = AssistedWorkflow::Addons::Pivotal.new(nil, @configuration)
|
|
18
21
|
end
|
|
19
22
|
|
|
@@ -49,23 +52,22 @@ describe AssistedWorkflow::Addons::Pivotal do
|
|
|
49
52
|
end
|
|
50
53
|
|
|
51
54
|
it "finds a story by id" do
|
|
52
|
-
mock(
|
|
53
|
-
story_stub(:id => story_id, :project_id =>
|
|
55
|
+
mock(@project).story("100001") do |story_id|
|
|
56
|
+
story_stub(:id => story_id, :project_id => @project.id)
|
|
54
57
|
end
|
|
55
58
|
|
|
56
59
|
story = @pivotal.find_story("100001")
|
|
57
|
-
story.id.must_equal
|
|
58
|
-
story.other_id.must_match /flavio/
|
|
60
|
+
story.id.must_equal 100001
|
|
59
61
|
end
|
|
60
62
|
|
|
61
63
|
it "returns pending stories" do
|
|
62
|
-
|
|
64
|
+
stub(@project).stories do
|
|
63
65
|
[
|
|
64
|
-
story_stub(:id => "100001", :project_id => project.id),
|
|
65
|
-
story_stub(:id => "100002", :project_id => project.id)
|
|
66
|
+
story_stub(:id => "100001", :project_id => @project.id),
|
|
67
|
+
story_stub(:id => "100002", :project_id => @project.id)
|
|
66
68
|
]
|
|
67
69
|
end
|
|
68
|
-
|
|
70
|
+
|
|
69
71
|
stories = @pivotal.pending_stories(:include_started => true)
|
|
70
72
|
stories.size.must_equal 2
|
|
71
73
|
end
|
|
@@ -74,30 +76,29 @@ describe AssistedWorkflow::Addons::Pivotal do
|
|
|
74
76
|
story = story_stub(:id => "100001", :project_id => @project.id)
|
|
75
77
|
@pivotal.start_story(story, :estimate => "3")
|
|
76
78
|
story.current_state.must_match /started/
|
|
77
|
-
story.estimate.must_equal
|
|
78
|
-
story.errors.must_be_empty
|
|
79
|
+
story.estimate.must_equal 3
|
|
79
80
|
end
|
|
80
81
|
|
|
81
82
|
it "finishes a story" do
|
|
82
83
|
story = story_stub(:id => "100001", :project_id => @project.id)
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
84
|
+
#stub post to create comment
|
|
85
|
+
url = "/projects/#{story.project_id}/stories/#{story.id}/comments"
|
|
86
|
+
stub(@client).post(url, :params => {:text=>"pull_request_url"}){}
|
|
86
87
|
|
|
87
88
|
@pivotal.finish_story(story, :note => "pull_request_url")
|
|
88
89
|
story.current_state.must_match /finished/
|
|
89
|
-
story.errors.must_be_empty
|
|
90
90
|
end
|
|
91
91
|
|
|
92
92
|
private #===================================================================
|
|
93
93
|
|
|
94
94
|
def story_stub(attributes = {})
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
story
|
|
95
|
+
any_instance_of(TrackerApi::Resources::Story) do |klass|
|
|
96
|
+
stub(klass).comments { [] }
|
|
97
|
+
stub(klass).tasks { [] }
|
|
99
98
|
end
|
|
100
|
-
|
|
99
|
+
story = TrackerApi::Resources::Story.new(attributes.merge(client: @client))
|
|
100
|
+
stub(story).save {}
|
|
101
|
+
|
|
101
102
|
story
|
|
102
103
|
end
|
|
103
|
-
end
|
|
104
|
+
end
|
metadata
CHANGED
|
@@ -1,131 +1,143 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: assisted_workflow
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Flavio Granero
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2015-05-29 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rake
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
|
-
- -
|
|
17
|
+
- - ">="
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
19
|
version: '0'
|
|
20
20
|
type: :development
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
|
-
- -
|
|
24
|
+
- - ">="
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
26
|
version: '0'
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: rr
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
|
-
- -
|
|
31
|
+
- - ">="
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
33
|
version: '0'
|
|
34
34
|
type: :development
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
|
-
- -
|
|
38
|
+
- - ">="
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
40
|
version: '0'
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: fakefs
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
44
44
|
requirements:
|
|
45
|
-
- -
|
|
45
|
+
- - ">="
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
47
|
version: '0'
|
|
48
48
|
type: :development
|
|
49
49
|
prerelease: false
|
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
51
|
requirements:
|
|
52
|
-
- -
|
|
52
|
+
- - ">="
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
54
|
version: '0'
|
|
55
55
|
- !ruby/object:Gem::Dependency
|
|
56
|
-
name:
|
|
56
|
+
name: minitest
|
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
|
58
58
|
requirements:
|
|
59
|
-
- -
|
|
59
|
+
- - ">="
|
|
60
60
|
- !ruby/object:Gem::Version
|
|
61
|
-
version: 0
|
|
62
|
-
type: :
|
|
61
|
+
version: '0'
|
|
62
|
+
type: :development
|
|
63
63
|
prerelease: false
|
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
65
|
requirements:
|
|
66
|
-
- -
|
|
66
|
+
- - ">="
|
|
67
67
|
- !ruby/object:Gem::Version
|
|
68
|
-
version: 0
|
|
68
|
+
version: '0'
|
|
69
69
|
- !ruby/object:Gem::Dependency
|
|
70
|
-
name:
|
|
70
|
+
name: thor
|
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
|
72
72
|
requirements:
|
|
73
|
-
- - ~>
|
|
73
|
+
- - "~>"
|
|
74
74
|
- !ruby/object:Gem::Version
|
|
75
|
-
version: 0.
|
|
75
|
+
version: '0.19'
|
|
76
76
|
type: :runtime
|
|
77
77
|
prerelease: false
|
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
79
|
requirements:
|
|
80
|
-
- - ~>
|
|
80
|
+
- - "~>"
|
|
81
81
|
- !ruby/object:Gem::Version
|
|
82
|
-
version: 0.
|
|
82
|
+
version: '0.19'
|
|
83
83
|
- !ruby/object:Gem::Dependency
|
|
84
84
|
name: jiralicious
|
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
|
86
86
|
requirements:
|
|
87
|
-
- - ~>
|
|
87
|
+
- - "~>"
|
|
88
88
|
- !ruby/object:Gem::Version
|
|
89
89
|
version: 0.4.0
|
|
90
90
|
type: :runtime
|
|
91
91
|
prerelease: false
|
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
|
93
93
|
requirements:
|
|
94
|
-
- - ~>
|
|
94
|
+
- - "~>"
|
|
95
95
|
- !ruby/object:Gem::Version
|
|
96
96
|
version: 0.4.0
|
|
97
97
|
- !ruby/object:Gem::Dependency
|
|
98
98
|
name: octokit
|
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
|
100
100
|
requirements:
|
|
101
|
-
- - ~>
|
|
101
|
+
- - "~>"
|
|
102
102
|
- !ruby/object:Gem::Version
|
|
103
103
|
version: '2.0'
|
|
104
104
|
type: :runtime
|
|
105
105
|
prerelease: false
|
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
|
107
107
|
requirements:
|
|
108
|
-
- - ~>
|
|
108
|
+
- - "~>"
|
|
109
109
|
- !ruby/object:Gem::Version
|
|
110
110
|
version: '2.0'
|
|
111
111
|
- !ruby/object:Gem::Dependency
|
|
112
112
|
name: hashie
|
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
|
114
114
|
requirements:
|
|
115
|
-
- - ~>
|
|
115
|
+
- - "~>"
|
|
116
116
|
- !ruby/object:Gem::Version
|
|
117
117
|
version: 2.0.5
|
|
118
118
|
type: :runtime
|
|
119
119
|
prerelease: false
|
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
|
121
121
|
requirements:
|
|
122
|
-
- - ~>
|
|
122
|
+
- - "~>"
|
|
123
123
|
- !ruby/object:Gem::Version
|
|
124
124
|
version: 2.0.5
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
125
|
+
- !ruby/object:Gem::Dependency
|
|
126
|
+
name: tracker_api
|
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
|
128
|
+
requirements:
|
|
129
|
+
- - "~>"
|
|
130
|
+
- !ruby/object:Gem::Version
|
|
131
|
+
version: 0.2.0
|
|
132
|
+
type: :runtime
|
|
133
|
+
prerelease: false
|
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
135
|
+
requirements:
|
|
136
|
+
- - "~>"
|
|
137
|
+
- !ruby/object:Gem::Version
|
|
138
|
+
version: 0.2.0
|
|
139
|
+
description: |2
|
|
140
|
+
`aw` is a command line tool to automate software development workflows based on github pull requests.
|
|
129
141
|
email:
|
|
130
142
|
- maltempe@gmail.com
|
|
131
143
|
executables:
|
|
@@ -133,13 +145,15 @@ executables:
|
|
|
133
145
|
extensions: []
|
|
134
146
|
extra_rdoc_files: []
|
|
135
147
|
files:
|
|
136
|
-
- .gitignore
|
|
137
|
-
- .
|
|
148
|
+
- ".gitignore"
|
|
149
|
+
- ".ruby-version"
|
|
150
|
+
- ".travis.yml"
|
|
138
151
|
- CHANGELOG.md
|
|
139
152
|
- Gemfile
|
|
140
153
|
- Gemfile.lock
|
|
141
|
-
- LICENSE
|
|
154
|
+
- LICENSE
|
|
142
155
|
- README.md
|
|
156
|
+
- RELEASING.md
|
|
143
157
|
- Rakefile
|
|
144
158
|
- assisted_workflow.gemspec
|
|
145
159
|
- bin/aw
|
|
@@ -157,17 +171,20 @@ files:
|
|
|
157
171
|
- lib/assisted_workflow/templates/awconfig.local.tt
|
|
158
172
|
- lib/assisted_workflow/templates/commit-msg.tt
|
|
159
173
|
- lib/assisted_workflow/version.rb
|
|
174
|
+
- packaging/Gemfile
|
|
175
|
+
- packaging/aw.sh
|
|
176
|
+
- packaging/bundler-config
|
|
160
177
|
- spec/assisted_workflow/addons/git_spec.rb
|
|
161
178
|
- spec/assisted_workflow/addons/github_spec.rb
|
|
162
179
|
- spec/assisted_workflow/addons/jira_spec.rb
|
|
163
180
|
- spec/assisted_workflow/addons/pivotal_spec.rb
|
|
164
181
|
- spec/assisted_workflow/config_file_spec.rb
|
|
165
182
|
- spec/spec_helper.rb
|
|
166
|
-
homepage: https://github.com/
|
|
183
|
+
homepage: https://github.com/inaka/assisted_workflow
|
|
167
184
|
licenses:
|
|
168
185
|
- MIT
|
|
169
186
|
metadata: {}
|
|
170
|
-
post_install_message:
|
|
187
|
+
post_install_message: "\n `..::/++ooooooooo+/::--` \n
|
|
171
188
|
\ `-:://:---....```......--::///:-.` \n
|
|
172
189
|
\ `..-:::---.``` ```...----::-..` \n
|
|
173
190
|
\ `.:///-````` .-:++::-` \n
|
|
@@ -215,17 +232,17 @@ require_paths:
|
|
|
215
232
|
- lib
|
|
216
233
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
217
234
|
requirements:
|
|
218
|
-
- -
|
|
235
|
+
- - ">="
|
|
219
236
|
- !ruby/object:Gem::Version
|
|
220
237
|
version: '0'
|
|
221
238
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
222
239
|
requirements:
|
|
223
|
-
- -
|
|
240
|
+
- - ">="
|
|
224
241
|
- !ruby/object:Gem::Version
|
|
225
242
|
version: '0'
|
|
226
243
|
requirements: []
|
|
227
244
|
rubyforge_project:
|
|
228
|
-
rubygems_version: 2.
|
|
245
|
+
rubygems_version: 2.4.6
|
|
229
246
|
signing_key:
|
|
230
247
|
specification_version: 4
|
|
231
248
|
summary: AW is a CLI tool to automate software development workflows based on github
|