chid 0.1.4.pre.beta → 0.1.4
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 +4 -4
- data/CHANGELOG.md +9 -1
- data/Gemfile.lock +24 -9
- data/bin/chid +16 -14
- data/chid.gemspec +1 -0
- data/lib/chid.rb +43 -44
- data/lib/chid/command.rb +150 -0
- data/lib/chid/commands/gitflow/commit.rb +92 -0
- data/lib/chid/commands/init.rb +71 -0
- data/lib/chid/commands/installs/dotfile.rb +17 -1
- data/lib/chid/commands/installs/node.rb +17 -1
- data/lib/chid/commands/installs/postgres.rb +19 -1
- data/lib/chid/commands/installs/rvm.rb +18 -1
- data/lib/chid/commands/workstation/list.rb +27 -0
- data/lib/chid/commands/workstation/open.rb +90 -0
- data/lib/chid/version.rb +1 -1
- data/spec/lib/chid/command_spec.rb +153 -0
- data/spec/lib/chid/commands/init_spec.rb +73 -0
- data/spec/lib/chid/commands/workstation/open_spec.rb +50 -0
- data/spec/spec_helper.rb +5 -0
- data/tasks/tmux/config_windows.rake +4 -17
- data/tasks/tmux/new_session.rake +3 -4
- metadata +27 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 03442575a6b3ffa0fcd60f867ac6d95827c87144
|
4
|
+
data.tar.gz: c6cadbbf436b85a9e6b72a2257902414fb17e126
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a70853be7604a95274f0f069d5f9f9a70b52a2568bd4841e45f9d052efba9ba5bbdf3ff41de94b3d9cc52860ad0e3a18a355fce7fb1e4376154ffd833f44f47e
|
7
|
+
data.tar.gz: ff2c4a51b2ea646ccce92c9c71a1619e2dbda433c3c1752ce63c7e6554031240e62e1270f0a10c03e15aa9147b00db9315b5052d4a2377a5a7e9a472123a7c69
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
chid (0.1.
|
4
|
+
chid (0.1.4.pre.beta)
|
5
5
|
easy_translate
|
6
6
|
http
|
7
7
|
rake
|
@@ -10,26 +10,27 @@ PATH
|
|
10
10
|
GEM
|
11
11
|
remote: https://rubygems.org/
|
12
12
|
specs:
|
13
|
-
addressable (2.5.
|
13
|
+
addressable (2.5.1)
|
14
14
|
public_suffix (~> 2.0, >= 2.0.2)
|
15
15
|
coderay (1.1.1)
|
16
|
-
|
16
|
+
diff-lcs (1.3)
|
17
|
+
domain_name (0.5.20170404)
|
17
18
|
unf (>= 0.0.5, < 1.0.0)
|
18
19
|
easy_translate (0.5.0)
|
19
20
|
json
|
20
21
|
thread
|
21
22
|
thread_safe
|
22
23
|
equatable (0.5.0)
|
23
|
-
http (2.2.
|
24
|
+
http (2.2.2)
|
24
25
|
addressable (~> 2.3)
|
25
26
|
http-cookie (~> 1.0)
|
26
27
|
http-form_data (~> 1.0.1)
|
27
28
|
http_parser.rb (~> 0.6.0)
|
28
29
|
http-cookie (1.0.3)
|
29
30
|
domain_name (~> 0.5)
|
30
|
-
http-form_data (1.0.
|
31
|
+
http-form_data (1.0.3)
|
31
32
|
http_parser.rb (0.6.0)
|
32
|
-
json (2.0
|
33
|
+
json (2.1.0)
|
33
34
|
method_source (0.8.2)
|
34
35
|
necromancer (0.4.0)
|
35
36
|
pastel (0.7.1)
|
@@ -41,19 +42,32 @@ GEM
|
|
41
42
|
slop (~> 3.4)
|
42
43
|
public_suffix (2.0.5)
|
43
44
|
rake (12.0.0)
|
45
|
+
rspec (3.6.0)
|
46
|
+
rspec-core (~> 3.6.0)
|
47
|
+
rspec-expectations (~> 3.6.0)
|
48
|
+
rspec-mocks (~> 3.6.0)
|
49
|
+
rspec-core (3.6.0)
|
50
|
+
rspec-support (~> 3.6.0)
|
51
|
+
rspec-expectations (3.6.0)
|
52
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
53
|
+
rspec-support (~> 3.6.0)
|
54
|
+
rspec-mocks (3.6.0)
|
55
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
56
|
+
rspec-support (~> 3.6.0)
|
57
|
+
rspec-support (3.6.0)
|
44
58
|
slop (3.6.0)
|
45
59
|
thread (0.2.2)
|
46
60
|
thread_safe (0.3.6)
|
47
61
|
tty-color (0.4.2)
|
48
62
|
tty-cursor (0.4.0)
|
49
|
-
tty-prompt (0.
|
63
|
+
tty-prompt (0.12.0)
|
50
64
|
necromancer (~> 0.4.0)
|
51
65
|
pastel (~> 0.7.0)
|
52
66
|
tty-cursor (~> 0.4.0)
|
53
67
|
wisper (~> 1.6.1)
|
54
68
|
unf (0.1.4)
|
55
69
|
unf_ext
|
56
|
-
unf_ext (0.0.7.
|
70
|
+
unf_ext (0.0.7.4)
|
57
71
|
wisper (1.6.1)
|
58
72
|
|
59
73
|
PLATFORMS
|
@@ -62,6 +76,7 @@ PLATFORMS
|
|
62
76
|
DEPENDENCIES
|
63
77
|
chid!
|
64
78
|
pry
|
79
|
+
rspec
|
65
80
|
|
66
81
|
BUNDLED WITH
|
67
|
-
1.
|
82
|
+
1.15.2
|
data/bin/chid
CHANGED
@@ -5,24 +5,26 @@ require 'rake'
|
|
5
5
|
|
6
6
|
task = ARGV.join(" ")
|
7
7
|
|
8
|
+
puts "TASK: #{ARGV}"
|
9
|
+
|
8
10
|
if task.empty?
|
9
11
|
#Rake.application.run
|
10
12
|
Chid::start
|
11
13
|
else
|
12
|
-
|
13
|
-
if task == 'install node'
|
14
|
-
|
15
|
-
elsif task == 'install postgres'
|
16
|
-
|
17
|
-
elsif task == 'install rvm'
|
18
|
-
|
19
|
-
elsif task == 'install dotfile'
|
20
|
-
|
21
|
-
elsif task == 'install'
|
22
|
-
|
23
|
-
else
|
24
|
-
|
25
|
-
end
|
14
|
+
Chid::Command.run(ARGV)
|
15
|
+
#if task == 'install node'
|
16
|
+
# Chid::Commands::Installs::Node.new().run
|
17
|
+
#elsif task == 'install postgres'
|
18
|
+
# Chid::Commands::Installs::Postgres.new().run
|
19
|
+
#elsif task == 'install rvm'
|
20
|
+
# Chid::Commands::Installs::Rvm.new().run
|
21
|
+
#elsif task == 'install dotfile'
|
22
|
+
# Chid::Commands::Installs::Dotfile.new().run
|
23
|
+
#elsif task == 'install'
|
24
|
+
# Chid::Commands::Install.new(Chid::chid_config_path).run
|
25
|
+
#else
|
26
|
+
# puts "Invalid task name. Try again"
|
27
|
+
#end
|
26
28
|
end
|
27
29
|
|
28
30
|
#Rake.application[task].invoke
|
data/chid.gemspec
CHANGED
data/lib/chid.rb
CHANGED
@@ -4,15 +4,11 @@ require 'tty-prompt'
|
|
4
4
|
require 'http'
|
5
5
|
require 'easy_translate'
|
6
6
|
|
7
|
-
require 'chid/
|
8
|
-
require 'chid/commands/installs/dotfile'
|
9
|
-
require 'chid/commands/installs/node'
|
10
|
-
require 'chid/commands/installs/postgres'
|
11
|
-
require 'chid/commands/installs/rvm'
|
7
|
+
require 'chid/command'
|
12
8
|
|
13
9
|
# Require all files inside the chid folder
|
14
10
|
dir = File.join(File.dirname(__FILE__))
|
15
|
-
glob = Dir.glob(dir + "/chid
|
11
|
+
glob = Dir.glob(dir + "/chid/**/*.rb")
|
16
12
|
glob.each { |r| require r }
|
17
13
|
|
18
14
|
dir_tasks = File.expand_path('..', File.dirname(__FILE__))
|
@@ -20,61 +16,64 @@ dir = File.join(dir_tasks, 'tasks')
|
|
20
16
|
glob = Dir.glob(dir + "/**/*.rake")
|
21
17
|
glob.each { |r| load r }
|
22
18
|
|
23
|
-
|
24
19
|
module Chid
|
25
|
-
def self.start
|
26
|
-
chid_config = ChidConfig.new
|
27
|
-
prompt = TTY::Prompt.new(help_color: :green)
|
28
|
-
confirm_install = -> (action, &block) {
|
29
|
-
matched = /^install:(.*)/.match(action)
|
30
|
-
return block.() unless matched
|
31
|
-
|
32
|
-
action_name = matched.captures.first
|
33
|
-
if prompt.yes?("Can I install the #{action_name}?")
|
34
|
-
block.()
|
35
|
-
else
|
36
|
-
puts "\nNo problem. What do you need?"
|
37
|
-
end
|
38
|
-
}
|
39
20
|
|
40
|
-
|
41
|
-
|
42
|
-
|
21
|
+
def self.chid_config
|
22
|
+
@chid_config ||= ChidConfig.new
|
23
|
+
end
|
43
24
|
|
44
|
-
|
45
|
-
|
25
|
+
def self.start
|
26
|
+
prompt = TTY::Prompt.new(help_color: :green)
|
27
|
+
confirm_install = -> (action, &block) {
|
28
|
+
matched = /^install:(.*)/.match(action)
|
29
|
+
return block.() unless matched
|
30
|
+
|
31
|
+
action_name = matched.captures.first
|
32
|
+
if prompt.yes?("Can I install the #{action_name}?")
|
33
|
+
block.()
|
34
|
+
else
|
35
|
+
puts "\nNo problem. What do you need?"
|
36
|
+
end
|
37
|
+
}
|
38
|
+
|
39
|
+
Main.new(chid_config).init do |action, args|
|
40
|
+
rake_task = Rake::Task[action]
|
41
|
+
task_args = Rake::TaskArguments.new(rake_task.arg_names, args)
|
42
|
+
|
43
|
+
confirm_install.(action) do
|
44
|
+
rake_task.execute(task_args)
|
45
|
+
end
|
46
|
+
|
47
|
+
puts "\nDone! What else?"
|
46
48
|
end
|
47
|
-
|
48
|
-
puts "\nDone! What else?"
|
49
49
|
end
|
50
|
-
end
|
51
50
|
|
52
51
|
def self.chid_config_path
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
end
|
52
|
+
home_path = File.expand_path("~/")
|
53
|
+
chid_config_path = File.join(home_path, '.chid.config')
|
54
|
+
chid_config_path
|
55
|
+
end
|
57
56
|
|
58
57
|
def self.username
|
59
|
-
|
60
|
-
|
61
|
-
end
|
58
|
+
on_linux { return %x[echo $USER].strip }
|
59
|
+
on_osx { return %x[echo $(logname)].strip }
|
60
|
+
end
|
62
61
|
|
63
62
|
def self.on_linux
|
64
|
-
|
65
|
-
|
63
|
+
if platform =~ /Linux/
|
64
|
+
yield
|
65
|
+
end
|
66
66
|
end
|
67
|
-
end
|
68
67
|
|
69
68
|
def self.on_osx
|
70
|
-
|
71
|
-
|
69
|
+
if platform =~ /Darwin/
|
70
|
+
yield
|
71
|
+
end
|
72
72
|
end
|
73
|
-
end
|
74
73
|
|
75
74
|
def self.platform
|
76
|
-
|
77
|
-
end
|
75
|
+
%x{echo $(uname -s)}.strip
|
76
|
+
end
|
78
77
|
|
79
78
|
|
80
79
|
# The Regex Actions are used to execute automatically some Rake::Task
|
data/lib/chid/command.rb
ADDED
@@ -0,0 +1,150 @@
|
|
1
|
+
module Chid
|
2
|
+
class Command
|
3
|
+
|
4
|
+
class << self
|
5
|
+
|
6
|
+
attr_accessor :summary, :description, :arguments
|
7
|
+
|
8
|
+
COMMANDS = {}
|
9
|
+
|
10
|
+
def command(cmd)
|
11
|
+
COMMANDS[cmd] = self.to_s
|
12
|
+
end
|
13
|
+
|
14
|
+
def help
|
15
|
+
if self.description.nil?
|
16
|
+
commands = String.new
|
17
|
+
COMMANDS.keys.each {|k| commands << " #{k.to_s}\n" }
|
18
|
+
self.description = <<-DESC
|
19
|
+
Usage:
|
20
|
+
|
21
|
+
$ chid [COMMAND]
|
22
|
+
|
23
|
+
To see what the Command do:
|
24
|
+
|
25
|
+
$ chid [COMMAND] -h
|
26
|
+
|
27
|
+
Commands:
|
28
|
+
|
29
|
+
#{commands}
|
30
|
+
DESC
|
31
|
+
end
|
32
|
+
|
33
|
+
puts summary
|
34
|
+
print description
|
35
|
+
end
|
36
|
+
|
37
|
+
def run(argv)
|
38
|
+
command_key = command_key(argv)
|
39
|
+
return self.help unless command_key_is_included?(command_key)
|
40
|
+
invoke(argv)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Returns a mapped options with your values from @argv
|
44
|
+
#
|
45
|
+
# @param [Array<String>] argv
|
46
|
+
# The arguments passed from input.
|
47
|
+
#
|
48
|
+
# @return [Hash<String, Array>] Mapped options with your values
|
49
|
+
# The keys of hash are the options and the values of hash
|
50
|
+
# are all values for the option.
|
51
|
+
#
|
52
|
+
# @example Map an argv
|
53
|
+
# argv = ['init', '-option_1', 'value_for_option_1']
|
54
|
+
#
|
55
|
+
# map_options_with_values(argv) #=> {'-option1' => ['value_for_option_1']}
|
56
|
+
#
|
57
|
+
def map_options_with_values(argv)
|
58
|
+
return argv.reduce({}) do |options, arg|
|
59
|
+
new_options = options
|
60
|
+
|
61
|
+
if arg_is_an_option?(arg)
|
62
|
+
new_options[arg] = []
|
63
|
+
next(new_options)
|
64
|
+
end
|
65
|
+
|
66
|
+
options_with_values(new_options, arg)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
def arg_is_an_option?(arg)
|
73
|
+
arg.include?('-')
|
74
|
+
end
|
75
|
+
|
76
|
+
def options_with_values(options, arg)
|
77
|
+
new_options = options
|
78
|
+
last_option = new_options.keys.last
|
79
|
+
new_options[last_option] << arg if last_option
|
80
|
+
|
81
|
+
new_options
|
82
|
+
end
|
83
|
+
|
84
|
+
def command_key_is_included?(command_key)
|
85
|
+
COMMANDS.include?(command_key)
|
86
|
+
end
|
87
|
+
|
88
|
+
# Returns the command key based on argv parameter.
|
89
|
+
# That command could be a single or compost command.
|
90
|
+
#
|
91
|
+
# @param [Array<String>] argv
|
92
|
+
# The arguments passed from input.
|
93
|
+
#
|
94
|
+
# @return [Sym] the sym of the command
|
95
|
+
#
|
96
|
+
# @example Get the command_key in an argv
|
97
|
+
# argv = ['init', '-option_1', 'value_for_option_1']
|
98
|
+
#
|
99
|
+
# command_key(argv) #=> :init
|
100
|
+
#
|
101
|
+
# argv = ['init', 'chid', '-option_1', 'value_for_option_1']
|
102
|
+
#
|
103
|
+
# command_key(argv) #=> :'init chid'
|
104
|
+
#
|
105
|
+
def command_key(argv)
|
106
|
+
argv.reduce('') { |command, arg|
|
107
|
+
break(command) if arg_is_an_option?(arg)
|
108
|
+
command << "#{arg} "
|
109
|
+
}.strip.to_sym
|
110
|
+
end
|
111
|
+
|
112
|
+
# Convenience method.
|
113
|
+
# Instantiate the command and run it with the provided arguments at once.
|
114
|
+
#
|
115
|
+
# @param [String..., Array<String>] args
|
116
|
+
# The arguments to initialize the command with
|
117
|
+
#
|
118
|
+
def invoke(argv)
|
119
|
+
options = map_options_with_values(argv)
|
120
|
+
command = new_command_instance(command_key(argv), options)
|
121
|
+
return command.run if has_no_arguments?(options) || has_valid_arguments?(command.class, options)
|
122
|
+
command.class.help
|
123
|
+
end
|
124
|
+
|
125
|
+
def new_command_instance(command_key, options)
|
126
|
+
Object.const_get(COMMANDS[command_key]).new(options)
|
127
|
+
end
|
128
|
+
|
129
|
+
def has_no_arguments?(options)
|
130
|
+
options.empty?
|
131
|
+
end
|
132
|
+
|
133
|
+
def has_valid_arguments?(command_class, options)
|
134
|
+
!(command_class.arguments & options.keys).empty?
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
|
139
|
+
# --- Instance methods ---
|
140
|
+
|
141
|
+
public
|
142
|
+
|
143
|
+
attr_reader :options
|
144
|
+
|
145
|
+
def initialize(options)
|
146
|
+
@options = options
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
150
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module Chid
|
2
|
+
module Commands
|
3
|
+
module Gitflow
|
4
|
+
class Commit < Command
|
5
|
+
|
6
|
+
command :commit
|
7
|
+
self.summary = 'Create a commits in based on gitFlow pattern'
|
8
|
+
self.description = <<-DESC
|
9
|
+
|
10
|
+
Usage:
|
11
|
+
|
12
|
+
$ chid commit
|
13
|
+
|
14
|
+
An easy way to create commits following simple steps:
|
15
|
+
|
16
|
+
First:
|
17
|
+
Choose your commit type in this options (add,Remove, Update, Refactor, Fix)
|
18
|
+
|
19
|
+
Second:
|
20
|
+
Type your commit title, a brief description of your changes
|
21
|
+
|
22
|
+
Third:
|
23
|
+
Add your description lines, describing exactly what you did
|
24
|
+
|
25
|
+
Thats it! Your commit will be created and pushed like this sample:
|
26
|
+
|
27
|
+
feature/#123 Add specific file needed to app
|
28
|
+
|
29
|
+
- specific file have now this line
|
30
|
+
- this is the description line two
|
31
|
+
|
32
|
+
DESC
|
33
|
+
|
34
|
+
self.arguments = []
|
35
|
+
|
36
|
+
def run
|
37
|
+
commit = build_commit
|
38
|
+
system("git commit -sm \"#{commit}\"")
|
39
|
+
system("git push origin #{branch}")
|
40
|
+
end
|
41
|
+
|
42
|
+
def build_commit
|
43
|
+
@commit_lines = "\n"
|
44
|
+
commit_kind = add_commit_kind
|
45
|
+
commit_title = add_commit_title
|
46
|
+
add_commit_description
|
47
|
+
commit = "#{branch_name} #{commit_kind} #{commit_title} \n #{@commit_lines}"
|
48
|
+
end
|
49
|
+
|
50
|
+
def branch
|
51
|
+
@branch ||= %x[git rev-parse --abbrev-ref HEAD].strip
|
52
|
+
end
|
53
|
+
|
54
|
+
def branch_name
|
55
|
+
@branch_name ||= branch[/\w{1,}\/#?\d{1,}/] || branch
|
56
|
+
end
|
57
|
+
|
58
|
+
def add_commit_kind
|
59
|
+
@prompt = TTY::Prompt.new
|
60
|
+
choices = ['Add', 'Remove','Update', 'Refactor','Fix']
|
61
|
+
result = @prompt.select('Select commit type: ', choices)
|
62
|
+
end
|
63
|
+
|
64
|
+
def add_commit_title
|
65
|
+
puts 'Tell me the commit title'
|
66
|
+
print '> '
|
67
|
+
commit_title = STDIN.gets.strip
|
68
|
+
end
|
69
|
+
|
70
|
+
def add_commit_description
|
71
|
+
puts 'Tell me the commit description, one action per line'
|
72
|
+
print "> "
|
73
|
+
commit_description ="- #{STDIN.gets.strip} \n"
|
74
|
+
@commit_lines << commit_description
|
75
|
+
add_commit_description unless did_commit_finished?
|
76
|
+
end
|
77
|
+
|
78
|
+
def do_push?
|
79
|
+
answers = ['Yes','No']
|
80
|
+
result_should_push = @prompt.select('Push changes?', answers)
|
81
|
+
result_should_push == 'Yes'
|
82
|
+
end
|
83
|
+
|
84
|
+
def did_commit_finished?
|
85
|
+
answers = ['Yes','No']
|
86
|
+
result_description_finished = @prompt.select('more?', answers)
|
87
|
+
result_description_finished == 'No'
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Chid
|
2
|
+
module Commands
|
3
|
+
class Init < Command
|
4
|
+
|
5
|
+
command :init
|
6
|
+
|
7
|
+
self.summary = 'Generate a .chid.config file on root directory'
|
8
|
+
self.description = <<-DESC
|
9
|
+
|
10
|
+
Usage:
|
11
|
+
|
12
|
+
$ chid init
|
13
|
+
|
14
|
+
Creates a .chid.config file on root directory if none .chid.config file exists.
|
15
|
+
|
16
|
+
To access that file will be created in `~/.chid.config`
|
17
|
+
|
18
|
+
DESC
|
19
|
+
self.arguments = []
|
20
|
+
|
21
|
+
def run
|
22
|
+
create_or_update_chid_config_file
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
def chid_config_path
|
27
|
+
@chid_config_path ||= ::Chid::chid_config_path
|
28
|
+
end
|
29
|
+
|
30
|
+
def create_or_update_chid_config_file
|
31
|
+
print_informations
|
32
|
+
dump_on_chid_config_file(chid_configurations)
|
33
|
+
end
|
34
|
+
|
35
|
+
def print_informations
|
36
|
+
print "\n--- Installing chid ---\n "
|
37
|
+
print "\nCreating the " unless chid_config_file_exist?
|
38
|
+
print "\nUpdating the " if chid_config_file_exist?
|
39
|
+
print "~/.chid.config ".blue
|
40
|
+
print "file\n"
|
41
|
+
end
|
42
|
+
|
43
|
+
def dump_on_chid_config_file(configurations)
|
44
|
+
File.open(chid_config_path, 'w') do |file|
|
45
|
+
YAML.dump(configurations, file)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def chid_configurations
|
50
|
+
return base_configurations unless chid_config_file_exist?
|
51
|
+
|
52
|
+
data = YAML.load_file chid_config_path
|
53
|
+
data[:chid][:workstations] = data[:chid].fetch(:workstations, {})
|
54
|
+
data
|
55
|
+
end
|
56
|
+
|
57
|
+
def base_configurations
|
58
|
+
{
|
59
|
+
chid: {
|
60
|
+
workstations: {}
|
61
|
+
}
|
62
|
+
}
|
63
|
+
end
|
64
|
+
|
65
|
+
def chid_config_file_exist?
|
66
|
+
File.exist?(chid_config_path)
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -1,7 +1,23 @@
|
|
1
1
|
module Chid
|
2
2
|
module Commands
|
3
3
|
module Installs
|
4
|
-
class Dotfile
|
4
|
+
class Dotfile < Command
|
5
|
+
|
6
|
+
command :'install dotfile'
|
7
|
+
|
8
|
+
self.summary = 'Install the Dotfile'
|
9
|
+
self.description = <<-DESC
|
10
|
+
|
11
|
+
Usage:
|
12
|
+
|
13
|
+
$ chid install dotfile
|
14
|
+
|
15
|
+
For Linux users will install through curl and will isntall zsh and git-core
|
16
|
+
|
17
|
+
For OSx users will install through curl
|
18
|
+
|
19
|
+
DESC
|
20
|
+
self.arguments = []
|
5
21
|
|
6
22
|
def run
|
7
23
|
puts "\nInstalling the YADR Dotfiles..."
|
@@ -1,7 +1,23 @@
|
|
1
1
|
module Chid
|
2
2
|
module Commands
|
3
3
|
module Installs
|
4
|
-
class Node
|
4
|
+
class Node < Command
|
5
|
+
|
6
|
+
command :'install node'
|
7
|
+
|
8
|
+
self.summary = 'Install the Node'
|
9
|
+
self.description = <<-DESC
|
10
|
+
|
11
|
+
Usage:
|
12
|
+
|
13
|
+
$ chid install node
|
14
|
+
|
15
|
+
For Linux users will install through apt-get
|
16
|
+
|
17
|
+
For OSx users will install through brew
|
18
|
+
|
19
|
+
DESC
|
20
|
+
self.arguments = []
|
5
21
|
|
6
22
|
def run
|
7
23
|
puts "\nInstalling the Node..."
|
@@ -1,7 +1,25 @@
|
|
1
1
|
module Chid
|
2
2
|
module Commands
|
3
3
|
module Installs
|
4
|
-
class Postgres
|
4
|
+
class Postgres < Command
|
5
|
+
|
6
|
+
command :'install postgres'
|
7
|
+
|
8
|
+
self.summary = 'Install the Postgres'
|
9
|
+
self.description = <<-DESC
|
10
|
+
|
11
|
+
Usage:
|
12
|
+
|
13
|
+
$ chid install postgres
|
14
|
+
|
15
|
+
For Linux users will install through apt-get
|
16
|
+
|
17
|
+
For OSx users will install through brew
|
18
|
+
|
19
|
+
DESC
|
20
|
+
self.arguments = []
|
21
|
+
|
22
|
+
|
5
23
|
|
6
24
|
def run
|
7
25
|
puts "\nInstalling the Postgres..."
|
@@ -1,7 +1,24 @@
|
|
1
1
|
module Chid
|
2
2
|
module Commands
|
3
3
|
module Installs
|
4
|
-
class Rvm
|
4
|
+
class Rvm < Command
|
5
|
+
|
6
|
+
command :'install rvm'
|
7
|
+
|
8
|
+
self.summary = 'Install the RVM'
|
9
|
+
self.description = <<-DESC
|
10
|
+
|
11
|
+
Usage:
|
12
|
+
|
13
|
+
$ chid install rvm
|
14
|
+
|
15
|
+
For Linux users will install through apt-get
|
16
|
+
|
17
|
+
For OSx users will install through curl
|
18
|
+
|
19
|
+
DESC
|
20
|
+
self.arguments = []
|
21
|
+
|
5
22
|
|
6
23
|
def run
|
7
24
|
puts "\nInstalling the RVM..."
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Chid
|
2
|
+
module Commands
|
3
|
+
module Workstation
|
4
|
+
class List < Command
|
5
|
+
|
6
|
+
command :'workstation list'
|
7
|
+
|
8
|
+
self.summary = 'List all existent workstations'
|
9
|
+
self.description = <<-DESC
|
10
|
+
|
11
|
+
Usage:
|
12
|
+
|
13
|
+
$ chid workstation list
|
14
|
+
|
15
|
+
DESC
|
16
|
+
self.arguments = []
|
17
|
+
|
18
|
+
def run
|
19
|
+
chid_config = ChidConfig.new
|
20
|
+
puts "Workstations availabbe:".blue
|
21
|
+
puts chid_config.all_workstations.keys
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
module Chid
|
2
|
+
module Commands
|
3
|
+
module Workstation
|
4
|
+
class Open < Command
|
5
|
+
|
6
|
+
command :'workstation open'
|
7
|
+
|
8
|
+
self.summary = 'Open a specific named workstation'
|
9
|
+
self.description = <<-DESC
|
10
|
+
|
11
|
+
Usage:
|
12
|
+
|
13
|
+
$ chid workstation open
|
14
|
+
or
|
15
|
+
$ chid workstation open -name some_workstation_name
|
16
|
+
|
17
|
+
Open all apps listed in the created workstations.
|
18
|
+
|
19
|
+
To see all workstations you can run
|
20
|
+
|
21
|
+
$ chid workstation list
|
22
|
+
|
23
|
+
If no options are specified, chid will show a list of Workstations created
|
24
|
+
to be selected.
|
25
|
+
|
26
|
+
Options:
|
27
|
+
|
28
|
+
-name workstation_name Open all applications in the 'workstation_name'
|
29
|
+
-n "base two" Open all applications in the 'base two'
|
30
|
+
|
31
|
+
DESC
|
32
|
+
self.arguments = ['-name', '-n']
|
33
|
+
|
34
|
+
def run
|
35
|
+
workstation_name = workstation_name_from_options
|
36
|
+
workstation_name = select_workstation if workstation_name.empty?
|
37
|
+
|
38
|
+
open_apps(workstation_name)
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
# Returns the workstation name mapped from the values of the options attribute.
|
44
|
+
# Will remove all nil values and join the array of values into String
|
45
|
+
#
|
46
|
+
# @return [String] Mapped values from options attribute
|
47
|
+
# If the options does not exist, will return empty String #=> ""
|
48
|
+
#
|
49
|
+
# @example Workstation Name
|
50
|
+
# options = {'-name' => ['base', 'two']}
|
51
|
+
#
|
52
|
+
# workstation_name #=> 'base two'
|
53
|
+
#
|
54
|
+
def workstation_name_from_options
|
55
|
+
@workstation_name ||= self.class.arguments.map { |a| options[a] }.compact.join(' ')
|
56
|
+
end
|
57
|
+
|
58
|
+
def chid_config
|
59
|
+
::Chid.chid_config
|
60
|
+
end
|
61
|
+
|
62
|
+
def workstations
|
63
|
+
@workstations ||= chid_config.all_workstations
|
64
|
+
end
|
65
|
+
|
66
|
+
def select_workstation
|
67
|
+
prompt = TTY::Prompt.new
|
68
|
+
choices = workstations.keys
|
69
|
+
selected_workstation = prompt.select('Choose a workstation to open', choices)
|
70
|
+
selected_workstation
|
71
|
+
end
|
72
|
+
|
73
|
+
def open_apps(workstation_name)
|
74
|
+
puts "\nOpening all Apps"
|
75
|
+
apps = workstations[workstation_name.to_sym]
|
76
|
+
apps.each do |app_name|
|
77
|
+
chid_config.on_osx do
|
78
|
+
system("open -a #{app_name}")
|
79
|
+
end
|
80
|
+
|
81
|
+
chid_config.on_linux do
|
82
|
+
system("#{app_name} >/dev/null 2>&1 &")
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
data/lib/chid/version.rb
CHANGED
@@ -0,0 +1,153 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Chid::Command do
|
4
|
+
|
5
|
+
let(:subject_class) { Chid::Command }
|
6
|
+
|
7
|
+
describe '.run' do
|
8
|
+
|
9
|
+
context 'When no pass any command' do
|
10
|
+
let(:argv) { options }
|
11
|
+
|
12
|
+
let(:setup_allows) { allow(subject_class).to receive(:help) }
|
13
|
+
|
14
|
+
before do
|
15
|
+
setup_allows
|
16
|
+
Chid::Command.run(argv)
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'When pass :helper option' do
|
20
|
+
let(:options) { ['-h'] }
|
21
|
+
|
22
|
+
it 'Should call :help method' do
|
23
|
+
expect(subject_class).to have_received(:help)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'When pass invalid option' do
|
28
|
+
let(:options) { ['-invalid_option'] }
|
29
|
+
|
30
|
+
it 'Should call :help method' do
|
31
|
+
expect(subject_class).to have_received(:help)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'When pass an invalid command' do
|
38
|
+
let(:command) { 'invalid_command' }
|
39
|
+
let(:options) { [] }
|
40
|
+
let(:argv) { [command].concat(options) }
|
41
|
+
|
42
|
+
let(:setup_allows) { allow(subject_class).to receive(:help) }
|
43
|
+
|
44
|
+
before do
|
45
|
+
setup_allows
|
46
|
+
Chid::Command.run(argv)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'Should call :help method' do
|
50
|
+
expect(subject_class).to have_received(:help)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'When pass a valid command' do
|
55
|
+
let(:init_command_class) { double arguments: [] }
|
56
|
+
let(:init_command) { double class: init_command_class }
|
57
|
+
|
58
|
+
let(:command) { ['init'] }
|
59
|
+
let(:options) { [] }
|
60
|
+
let(:argv) { command.concat(options) }
|
61
|
+
|
62
|
+
let(:default_allows) do
|
63
|
+
allow(subject_class).to receive(:command_key_is_included?).and_return(true)
|
64
|
+
allow(subject_class).to receive(:new_command_instance).and_return(init_command)
|
65
|
+
end
|
66
|
+
|
67
|
+
let(:setup_allows) { allow(init_command_class).to receive(:help) }
|
68
|
+
|
69
|
+
before do
|
70
|
+
default_allows
|
71
|
+
setup_allows
|
72
|
+
Chid::Command.run(argv)
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'When is a single command' do
|
76
|
+
|
77
|
+
let(:setup_allows) { allow(init_command).to receive(:run) }
|
78
|
+
|
79
|
+
it 'Command key should be :init' do
|
80
|
+
expect(subject_class).to have_received(:command_key_is_included?).with(:init)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
context 'When is a compost command' do
|
85
|
+
let(:command) { ['init', 'chid'] }
|
86
|
+
|
87
|
+
let(:setup_allows) { allow(init_command).to receive(:run) }
|
88
|
+
|
89
|
+
it 'Command key should be :"init chid"' do
|
90
|
+
expect(subject_class).to have_received(:command_key_is_included?).with(:'init chid')
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# @TODO: Extract that context to shared examples
|
95
|
+
context 'When pass :help options' do
|
96
|
+
let(:options) { ['-h'] }
|
97
|
+
|
98
|
+
it 'Command should call :help method' do
|
99
|
+
expect(init_command_class).to have_received(:help)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
context 'When pass invalid options' do
|
104
|
+
let(:options) { ['-ah', 'some', 'value'] }
|
105
|
+
|
106
|
+
it 'Should call :help method' do
|
107
|
+
expect(init_command_class).to have_received(:help)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context 'When pass valid options' do
|
112
|
+
let(:options) { ['-some_valid_option', 'some', 'value'] }
|
113
|
+
|
114
|
+
let(:setup_allows) do
|
115
|
+
allow(init_command).to receive(:run)
|
116
|
+
allow(subject_class).to receive(:has_valid_arguments?).and_return(true)
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'Command should call :new method with :options' do
|
120
|
+
expected_options = {
|
121
|
+
'-some_valid_option' => ['some', 'value']
|
122
|
+
}
|
123
|
+
expect(subject_class).to have_received(:new_command_instance).with(:init, expected_options)
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'Command should call :run method' do
|
127
|
+
expect(init_command).to have_received(:run)
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|
131
|
+
|
132
|
+
context 'When no pass any options' do
|
133
|
+
let(:options) { [] }
|
134
|
+
|
135
|
+
let(:setup_allows) do
|
136
|
+
allow(init_command).to receive(:run)
|
137
|
+
allow(subject_class).to receive(:has_valid_arguments?).and_return(false)
|
138
|
+
end
|
139
|
+
|
140
|
+
it 'Command should call :new method with :options' do
|
141
|
+
expected_options = {}
|
142
|
+
expect(subject_class).to have_received(:new_command_instance).with(:init, expected_options)
|
143
|
+
end
|
144
|
+
|
145
|
+
it 'Command should call :run method' do
|
146
|
+
expect(init_command).to have_received(:run)
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Chid::Commands::Init do
|
4
|
+
|
5
|
+
let(:argv) { {} }
|
6
|
+
subject { Chid::Commands::Init.new(argv) }
|
7
|
+
|
8
|
+
# @TODO: Extract for a shared context test
|
9
|
+
describe 'Documentations classes attributes' do
|
10
|
+
it('summary should not be nil') { expect(subject.class.summary).not_to be_nil }
|
11
|
+
it('description should not be nil') { expect(subject.class.description).not_to be_nil }
|
12
|
+
it('arguments should be empty') { expect(subject.class.arguments).to be_empty }
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '#run' do
|
16
|
+
let(:chid_config_path) { File.join(File.dirname(__FILE__), '.chid.config') }
|
17
|
+
let(:file_content_configurations) { YAML.load_file(chid_config_path) }
|
18
|
+
|
19
|
+
let(:default_allows) do
|
20
|
+
allow(subject).to receive(:chid_config_path).and_return(chid_config_path)
|
21
|
+
end
|
22
|
+
|
23
|
+
let(:setup) {}
|
24
|
+
|
25
|
+
before do
|
26
|
+
default_allows
|
27
|
+
setup
|
28
|
+
subject.run
|
29
|
+
end
|
30
|
+
|
31
|
+
after do
|
32
|
+
File.delete(chid_config_path) if File.exist?(chid_config_path)
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'When does not exist .chid.config file' do
|
36
|
+
let(:base_configuration) do
|
37
|
+
{
|
38
|
+
chid: {
|
39
|
+
workstations: {}
|
40
|
+
}
|
41
|
+
}
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'Should contains the base configuration' do
|
45
|
+
expect(file_content_configurations).to eq base_configuration
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context 'When does exist .chid.config file with some configuration' do
|
50
|
+
let(:existent_configurations) do
|
51
|
+
{
|
52
|
+
chid: {
|
53
|
+
workstations: {
|
54
|
+
base: 'vim'
|
55
|
+
}
|
56
|
+
}
|
57
|
+
}
|
58
|
+
end
|
59
|
+
|
60
|
+
let(:setup) do
|
61
|
+
File.open(chid_config_path, 'w') do |file|
|
62
|
+
YAML.dump(existent_configurations, file)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'Should remains the existent configuration' do
|
67
|
+
expect(file_content_configurations).to eq existent_configurations
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Chid::Commands::Workstation::Open, tt:true do
|
4
|
+
|
5
|
+
subject { Chid::Commands::Workstation::Open.new(options) }
|
6
|
+
|
7
|
+
describe '#run' do
|
8
|
+
let(:options) { {} }
|
9
|
+
let(:setup) { }
|
10
|
+
|
11
|
+
before do
|
12
|
+
allow(subject).to receive(:open_apps)
|
13
|
+
|
14
|
+
setup
|
15
|
+
subject.run
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'when no pass any argument' do
|
19
|
+
let(:expected_workstation_name) { 'none' }
|
20
|
+
|
21
|
+
let(:setup) do
|
22
|
+
allow(subject).to receive(:select_workstation).and_return expected_workstation_name
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should call :select_workstation method' do
|
26
|
+
expect(subject).to have_received(:select_workstation).once
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should call :open_apps method' do
|
30
|
+
expect(subject).to have_received(:open_apps).with(expected_workstation_name).once
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'when pass -name as argument' do
|
36
|
+
let(:options) { {'-name' => ['base', 'two']} }
|
37
|
+
let(:expected_workstation_name) { 'base two' }
|
38
|
+
|
39
|
+
let(:setup) do
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should call :open_apps method' do
|
44
|
+
expect(subject).to have_received(:open_apps).with(expected_workstation_name).once
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -1,21 +1,8 @@
|
|
1
1
|
desc 'Configure default windows for development'
|
2
|
-
task :tmux_config
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
system("tmux new-window -n app")
|
7
|
-
system("tmux new-window -n server")
|
8
|
-
elsif name == 'stant-api'
|
9
|
-
system("tmux rename-window app")
|
10
|
-
system("tmux new-window -n tests")
|
11
|
-
system("tmux new-window -n server")
|
12
|
-
system("tmux new-window -n bash")
|
13
|
-
elsif name == 'stant-traceability'
|
14
|
-
system("tmux rename-window ios-traceability")
|
15
|
-
system("tmux new-window -n ios-infrastructure")
|
16
|
-
system("tmux new-window -n ios-core")
|
17
|
-
system("tmux new-window -n bash")
|
18
|
-
end
|
2
|
+
task :tmux_config do
|
3
|
+
system("tmux rename-window bash")
|
4
|
+
system("tmux new-window -n app")
|
5
|
+
system("tmux new-window -n server")
|
19
6
|
end
|
20
7
|
|
21
8
|
|
data/tasks/tmux/new_session.rake
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
desc 'Open or Create the new session for development key'
|
2
|
-
task :tmux
|
3
|
-
|
4
|
-
session = system("tmux attach -t #{name}")
|
2
|
+
task :tmux do
|
3
|
+
session = system('tmux attach -t development')
|
5
4
|
unless session
|
6
|
-
system(
|
5
|
+
system('tmux new -s development')
|
7
6
|
end
|
8
7
|
end
|
9
8
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.4
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rachid Calazans
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-08-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pry
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: rake
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,11 +114,16 @@ files:
|
|
100
114
|
- etc/img/stack.png
|
101
115
|
- lib/chid.rb
|
102
116
|
- lib/chid/chid_config.rb
|
117
|
+
- lib/chid/command.rb
|
118
|
+
- lib/chid/commands/gitflow/commit.rb
|
119
|
+
- lib/chid/commands/init.rb
|
103
120
|
- lib/chid/commands/install.rb
|
104
121
|
- lib/chid/commands/installs/dotfile.rb
|
105
122
|
- lib/chid/commands/installs/node.rb
|
106
123
|
- lib/chid/commands/installs/postgres.rb
|
107
124
|
- lib/chid/commands/installs/rvm.rb
|
125
|
+
- lib/chid/commands/workstation/list.rb
|
126
|
+
- lib/chid/commands/workstation/open.rb
|
108
127
|
- lib/chid/currency_api.rb
|
109
128
|
- lib/chid/github_api.rb
|
110
129
|
- lib/chid/main.rb
|
@@ -113,6 +132,10 @@ files:
|
|
113
132
|
- lib/chid/stack_overflow_api.rb
|
114
133
|
- lib/chid/version.rb
|
115
134
|
- lib/chid/yandex_translate_api.rb
|
135
|
+
- spec/lib/chid/command_spec.rb
|
136
|
+
- spec/lib/chid/commands/init_spec.rb
|
137
|
+
- spec/lib/chid/commands/workstation/open_spec.rb
|
138
|
+
- spec/spec_helper.rb
|
116
139
|
- tasks/chid/config.rake
|
117
140
|
- tasks/chid/init.rake
|
118
141
|
- tasks/chid/install.rake
|
@@ -155,9 +178,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
155
178
|
version: '0'
|
156
179
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
157
180
|
requirements:
|
158
|
-
- - "
|
181
|
+
- - ">="
|
159
182
|
- !ruby/object:Gem::Version
|
160
|
-
version:
|
183
|
+
version: '0'
|
161
184
|
requirements: []
|
162
185
|
rubyforge_project:
|
163
186
|
rubygems_version: 2.6.6
|