ora-cli 0.1.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 +7 -0
- data/.gitignore +9 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/README.md +36 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/ora +13 -0
- data/bin/ora_selecta +840 -0
- data/bin/setup +8 -0
- data/lib/ora/cli/bash.rb +96 -0
- data/lib/ora/cli/print.rb +27 -0
- data/lib/ora/cli/stdin.rb +22 -0
- data/lib/ora/cli/task.rb +43 -0
- data/lib/ora/cli/tasks/new_feature_branch.rb +21 -0
- data/lib/ora/cli/tasks/push_feature_branch.rb +15 -0
- data/lib/ora/cli/tasks/push_to_master.rb +51 -0
- data/lib/ora/cli/tasks/push_to_staging.rb +26 -0
- data/lib/ora/cli/tasks/push_to_uat.rb +26 -0
- data/lib/ora/cli/version.rb +5 -0
- data/lib/ora/cli.rb +10 -0
- data/ora-cli.gemspec +24 -0
- metadata +107 -0
data/bin/setup
ADDED
data/lib/ora/cli/bash.rb
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
module Ora::Cli
|
2
|
+
class Bash
|
3
|
+
def initialize(target, from: nil, print: Print.new)
|
4
|
+
@target = target
|
5
|
+
@from = from
|
6
|
+
@print = print
|
7
|
+
end
|
8
|
+
|
9
|
+
def silent command
|
10
|
+
`#{move}#{command}#{capture_err}`
|
11
|
+
end
|
12
|
+
|
13
|
+
def run commands
|
14
|
+
unprocessed_commands = extract commands
|
15
|
+
|
16
|
+
outputs = []
|
17
|
+
while (command = complete unprocessed_commands.shift)
|
18
|
+
break unless call command do |output|
|
19
|
+
outputs.push output
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
handle_failed unprocessed_commands
|
24
|
+
|
25
|
+
join outputs
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
def move
|
30
|
+
"cd #{@from} && " if @from
|
31
|
+
end
|
32
|
+
def capture_err
|
33
|
+
" 2>&1"
|
34
|
+
end
|
35
|
+
|
36
|
+
def extract commands
|
37
|
+
commands.split("\n").map(&:strip).reject(&:empty?)
|
38
|
+
end
|
39
|
+
def join outputs
|
40
|
+
outputs.compact.map(&:strip).reject(&:empty?).join("\n")
|
41
|
+
end
|
42
|
+
|
43
|
+
def call_target method_name
|
44
|
+
@target.method(method_name).call
|
45
|
+
end
|
46
|
+
|
47
|
+
def complete unprocessed_command
|
48
|
+
return nil unless unprocessed_command
|
49
|
+
|
50
|
+
unprocessed_command.gsub(/#\{([\S]+)\}/) do
|
51
|
+
call_target Regexp.last_match[1]
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def call command
|
56
|
+
@print.green command
|
57
|
+
|
58
|
+
success =
|
59
|
+
if method? command
|
60
|
+
call_method command
|
61
|
+
else
|
62
|
+
yield(shell command)
|
63
|
+
$?.success?
|
64
|
+
end
|
65
|
+
|
66
|
+
alert command unless success
|
67
|
+
success
|
68
|
+
end
|
69
|
+
def method? command
|
70
|
+
command.start_with? ":"
|
71
|
+
end
|
72
|
+
def method_name command
|
73
|
+
command.sub(':', '')
|
74
|
+
end
|
75
|
+
def call_method command
|
76
|
+
success_call? call_target(method_name command)
|
77
|
+
end
|
78
|
+
def success_call? method_return
|
79
|
+
method_return != false
|
80
|
+
end
|
81
|
+
def shell command
|
82
|
+
@print.plain `#{move}#{command}#{capture_err}`
|
83
|
+
end
|
84
|
+
|
85
|
+
def alert command
|
86
|
+
@print.red "\nProcess Failed! Please resolve the issue above and run commands below manually\n"
|
87
|
+
@print.red command
|
88
|
+
end
|
89
|
+
|
90
|
+
def handle_failed unprocessed_commands
|
91
|
+
unprocessed_commands.each do |unprocessed_command|
|
92
|
+
@print.red(complete unprocessed_command)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Ora::Cli
|
2
|
+
class Print
|
3
|
+
def initialize(silent = false)
|
4
|
+
@silent = silent
|
5
|
+
end
|
6
|
+
|
7
|
+
def inline text
|
8
|
+
print text unless @silent
|
9
|
+
text
|
10
|
+
end
|
11
|
+
|
12
|
+
def plain text
|
13
|
+
puts text unless @silent
|
14
|
+
text
|
15
|
+
end
|
16
|
+
|
17
|
+
def green text
|
18
|
+
puts "\e[32m#{text}\e[0m" unless @silent
|
19
|
+
text
|
20
|
+
end
|
21
|
+
|
22
|
+
def red text
|
23
|
+
puts "\e[31m#{text}\e[0m" unless @silent
|
24
|
+
text
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Ora::Cli
|
2
|
+
class Stdin
|
3
|
+
def initialize(inputs = [], print: Print.new)
|
4
|
+
@inputs = inputs
|
5
|
+
@print = print
|
6
|
+
end
|
7
|
+
|
8
|
+
def gets(pattern = '')
|
9
|
+
input = nil
|
10
|
+
|
11
|
+
until input
|
12
|
+
input = @inputs.shift || STDIN.gets.chomp.strip
|
13
|
+
unless input.match(pattern)
|
14
|
+
@print.red "Please match #{pattern.inspect}"
|
15
|
+
input = nil
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
input
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/ora/cli/task.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
module Ora::Cli
|
2
|
+
class Task
|
3
|
+
attr_reader :branch, :stdin, :print
|
4
|
+
|
5
|
+
def initialize(from, inputs: [], print: Print.new)
|
6
|
+
@from = from
|
7
|
+
@bash = Bash.new(self, from: @from, print: print)
|
8
|
+
@branch = current_branch
|
9
|
+
@stdin = Stdin.new(inputs, print: print)
|
10
|
+
@print = print
|
11
|
+
end
|
12
|
+
|
13
|
+
def run
|
14
|
+
@bash.run commands
|
15
|
+
end
|
16
|
+
|
17
|
+
def commands
|
18
|
+
raise "Override this method in subclass"
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
def current_branch
|
23
|
+
@bash.silent('git branch | grep \\*').sub("*", "").strip
|
24
|
+
end
|
25
|
+
|
26
|
+
def feature_branch!
|
27
|
+
if %w{master develop staging uat}.include?(branch)
|
28
|
+
@print.red "Please checkout feature branch first!"
|
29
|
+
false
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def clean_branch!
|
34
|
+
if dirty?
|
35
|
+
print.red "Please clean the feature branch '#{branch}'!"
|
36
|
+
return false
|
37
|
+
end
|
38
|
+
end
|
39
|
+
def dirty?
|
40
|
+
!@bash.silent('git status').include? 'nothing to commit'
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Ora::Cli
|
2
|
+
class NewFeatureBranch < Task
|
3
|
+
attr_reader :branch_name
|
4
|
+
|
5
|
+
def commands
|
6
|
+
'
|
7
|
+
:set_branch_name
|
8
|
+
:clean_branch!
|
9
|
+
git checkout develop
|
10
|
+
git pull origin develop
|
11
|
+
git checkout -b #{branch_name}
|
12
|
+
'
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
def set_branch_name
|
17
|
+
print.inline 'Type new branch name: '
|
18
|
+
@branch_name = stdin.gets(/^[a-zA-Z0-9\/_-]+$/)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Ora::Cli
|
2
|
+
class PushFeatureBranch < Task
|
3
|
+
def commands
|
4
|
+
'
|
5
|
+
:feature_branch!
|
6
|
+
:clean_branch!
|
7
|
+
git checkout develop
|
8
|
+
git pull origin develop
|
9
|
+
git checkout #{branch}
|
10
|
+
git merge develop
|
11
|
+
git push origin #{branch}
|
12
|
+
'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Ora::Cli
|
2
|
+
class PushToMaster < Task
|
3
|
+
attr_reader :version
|
4
|
+
|
5
|
+
def commands
|
6
|
+
'
|
7
|
+
:feature_branch!
|
8
|
+
:clean_branch!
|
9
|
+
git checkout develop
|
10
|
+
git pull origin develop
|
11
|
+
git merge #{branch}
|
12
|
+
git push origin develop
|
13
|
+
git checkout master
|
14
|
+
git pull origin master
|
15
|
+
git merge develop
|
16
|
+
git push origin master
|
17
|
+
git fetch --tags
|
18
|
+
:set_version
|
19
|
+
git checkout #{branch}
|
20
|
+
git tag -a "#{version}" -m "#{branch}"
|
21
|
+
git push --tags
|
22
|
+
:slack_message_to_paste
|
23
|
+
'
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
def set_version
|
28
|
+
print.plain "Latest versions:"
|
29
|
+
print.plain latest_versions
|
30
|
+
print.plain "Enter to use #{recommend_version} or type new version:"
|
31
|
+
print.inline "New Version: "
|
32
|
+
@version = stdin.gets(/^(v[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)?$/)
|
33
|
+
@version = recommend_version if @version.empty?
|
34
|
+
end
|
35
|
+
def latest_versions
|
36
|
+
@latest_versions ||=
|
37
|
+
@bash.silent('git tag').split("\n").
|
38
|
+
select {|tag| tag.match(/^v[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/)}.
|
39
|
+
map {|tag| Gem::Version.create(tag.sub(/^v/, ''))}.sort.last(5).
|
40
|
+
map {|ver| "v#{ver}"}
|
41
|
+
end
|
42
|
+
def recommend_version
|
43
|
+
@recommend_version ||=
|
44
|
+
latest_versions.last.to_s.sub(/\.(\d+)$/, '.') + ($1.to_i + 1).to_s
|
45
|
+
end
|
46
|
+
|
47
|
+
def slack_message_to_paste
|
48
|
+
print.plain ":merge: #{branch} => develop\n:merge: develop => master\n:monorail: production"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Ora::Cli
|
2
|
+
class PushToStaging < Task
|
3
|
+
|
4
|
+
def commands
|
5
|
+
'
|
6
|
+
:feature_branch!
|
7
|
+
:clean_branch!
|
8
|
+
git checkout develop
|
9
|
+
git pull origin develop
|
10
|
+
git checkout #{branch}
|
11
|
+
git merge develop
|
12
|
+
git checkout staging
|
13
|
+
git pull origin staging
|
14
|
+
git merge #{branch}
|
15
|
+
git push origin staging
|
16
|
+
git checkout #{branch}
|
17
|
+
:slack_message_to_paste
|
18
|
+
'
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
def slack_message_to_paste
|
23
|
+
print.plain ":merge: #{branch} => staging\n:monorail: staging"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Ora::Cli
|
2
|
+
class PushToUat < Task
|
3
|
+
|
4
|
+
def commands
|
5
|
+
'
|
6
|
+
:feature_branch!
|
7
|
+
:clean_branch!
|
8
|
+
git checkout develop
|
9
|
+
git pull origin develop
|
10
|
+
git checkout #{branch}
|
11
|
+
git merge develop
|
12
|
+
git checkout uat
|
13
|
+
git pull origin uat
|
14
|
+
git merge #{branch}
|
15
|
+
git push origin uat
|
16
|
+
git checkout #{branch}
|
17
|
+
:slack_message_to_paste
|
18
|
+
'
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
def slack_message_to_paste
|
23
|
+
print.plain ":merge: #{branch} => uat\n:monorail: uat"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/ora/cli.rb
ADDED
data/ora-cli.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'ora/cli/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "ora-cli"
|
8
|
+
spec.version = Ora::Cli::VERSION
|
9
|
+
spec.authors = ["Ducksan Cho"]
|
10
|
+
spec.email = ["ducktyper@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = "ORA CLI"
|
13
|
+
spec.description = "ORA CLI"
|
14
|
+
spec.homepage = "https://orahq.com"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
17
|
+
spec.bindir = "exe"
|
18
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.12"
|
22
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
23
|
+
spec.add_development_dependency "minitest", "~> 5.0"
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ora-cli
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ducksan Cho
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-08-27 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.12'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.12'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '5.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '5.0'
|
55
|
+
description: ORA CLI
|
56
|
+
email:
|
57
|
+
- ducktyper@gmail.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- ".gitignore"
|
63
|
+
- ".travis.yml"
|
64
|
+
- Gemfile
|
65
|
+
- README.md
|
66
|
+
- Rakefile
|
67
|
+
- bin/console
|
68
|
+
- bin/ora
|
69
|
+
- bin/ora_selecta
|
70
|
+
- bin/setup
|
71
|
+
- lib/ora/cli.rb
|
72
|
+
- lib/ora/cli/bash.rb
|
73
|
+
- lib/ora/cli/print.rb
|
74
|
+
- lib/ora/cli/stdin.rb
|
75
|
+
- lib/ora/cli/task.rb
|
76
|
+
- lib/ora/cli/tasks/new_feature_branch.rb
|
77
|
+
- lib/ora/cli/tasks/push_feature_branch.rb
|
78
|
+
- lib/ora/cli/tasks/push_to_master.rb
|
79
|
+
- lib/ora/cli/tasks/push_to_staging.rb
|
80
|
+
- lib/ora/cli/tasks/push_to_uat.rb
|
81
|
+
- lib/ora/cli/version.rb
|
82
|
+
- ora-cli.gemspec
|
83
|
+
homepage: https://orahq.com
|
84
|
+
licenses: []
|
85
|
+
metadata: {}
|
86
|
+
post_install_message:
|
87
|
+
rdoc_options: []
|
88
|
+
require_paths:
|
89
|
+
- lib
|
90
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
requirements: []
|
101
|
+
rubyforge_project:
|
102
|
+
rubygems_version: 2.2.2
|
103
|
+
signing_key:
|
104
|
+
specification_version: 4
|
105
|
+
summary: ORA CLI
|
106
|
+
test_files: []
|
107
|
+
has_rdoc:
|