redipress 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/redipress/cli/configurations.rb +104 -59
- data/lib/redipress/configuration/base.rb +27 -2
- data/lib/redipress/configuration.rb +18 -0
- data/lib/redipress/errors.rb +15 -0
- data/lib/redipress/variables.rb +1 -5
- data/redipress.gemspec +6 -6
- metadata +29 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a66ae6d877c3fa7b777a481c27b4e689bca89fed
|
4
|
+
data.tar.gz: 996402566da246e8387c35452d0fdc0a04b2be20
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd7b12ffb774b49aa25650ca6c0971b849e3a2192019ece186215740596bdf4dc876cf049671661711dcf3a349140af9c987f5dbbc07b14b140313cc8086efc6
|
7
|
+
data.tar.gz: a400e6f7a8d9797f168fdef7634d6ed585e88167d38a52d6252d04e30cc18ba1134f3c824da614c1b7764b9600322522b65d8cb9f2128a93e43c9633c2ae28bc
|
@@ -20,13 +20,19 @@ module RediPress
|
|
20
20
|
new_line
|
21
21
|
|
22
22
|
# Get the configuration
|
23
|
-
|
23
|
+
configurations = prompt_for_configurations
|
24
24
|
|
25
|
-
#
|
26
|
-
|
25
|
+
# Create a Hash to hold the options
|
26
|
+
options = Hash.new
|
27
|
+
|
28
|
+
# Loop over each configuration
|
29
|
+
configurations.each do |configuration|
|
30
|
+
# Print a new line
|
31
|
+
new_line
|
27
32
|
|
28
|
-
|
29
|
-
|
33
|
+
# Get the configuration's options
|
34
|
+
options[configuration.slug] = prompt_for_configuration_options(configuration)
|
35
|
+
end
|
30
36
|
|
31
37
|
# Print a new line
|
32
38
|
new_line
|
@@ -34,59 +40,96 @@ module RediPress
|
|
34
40
|
# Prompt to continue
|
35
41
|
exit(1) unless prompt.yes?("Proceed with the above settings?")
|
36
42
|
|
37
|
-
#
|
38
|
-
|
39
|
-
|
40
|
-
begin
|
41
|
-
# Check if the configuration is compatible with the host
|
42
|
-
compatible = configuration.compatible?(host, options)
|
43
|
-
rescue => error
|
43
|
+
# Loop over each configuration
|
44
|
+
configurations.each do |configuration|
|
45
|
+
# Print a new line
|
44
46
|
new_line
|
45
|
-
prompt.error("The configuration raised an error.")
|
46
|
-
prompt.error("See the error report below for more information:")
|
47
|
-
prompt.error("--------------------------------------------------")
|
48
47
|
|
49
|
-
|
50
|
-
|
48
|
+
begin
|
49
|
+
# Check if the configuration is compatible with the host
|
50
|
+
compatible = configuration.compatible?(host, options)
|
51
|
+
rescue => e
|
52
|
+
# Print a new line
|
53
|
+
new_line
|
51
54
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
+
# Print an error message
|
56
|
+
prompt.error("An exception was raised whilst running a configuration:")
|
57
|
+
prompt.error("-------------------------------------------------------")
|
55
58
|
|
56
|
-
|
57
|
-
|
59
|
+
raise e
|
60
|
+
end
|
58
61
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
new_line
|
64
|
-
prompt.error("The configuration raised an error.")
|
65
|
-
prompt.error("See the error report below for more information:")
|
66
|
-
prompt.error("--------------------------------------------------")
|
62
|
+
# Check if the configuration is not compatible
|
63
|
+
unless compatible
|
64
|
+
# Print a warning message
|
65
|
+
prompt.warning("'#{configuration.name}' is not compatible with #{host.username}@#{host.hostname}")
|
67
66
|
|
68
|
-
|
67
|
+
exit 1
|
68
|
+
end
|
69
69
|
end
|
70
70
|
|
71
|
-
#
|
72
|
-
|
73
|
-
|
74
|
-
|
71
|
+
# Print a message
|
72
|
+
prompt.ok("The selected configurations appear to be compatible with #{host.username}@#{host.hostname}")
|
73
|
+
|
74
|
+
# Create a Hash to hold the results
|
75
|
+
results = Hash.new
|
75
76
|
|
76
|
-
|
77
|
+
# Loop over each configuration
|
78
|
+
configurations.each do |configuration|
|
79
|
+
# Print a new line
|
80
|
+
new_line
|
81
|
+
|
82
|
+
# Print a message
|
83
|
+
prompt.ok("Configuring '#{configuration.name}' ...")
|
84
|
+
prompt.ok("------------------------------------------------------------")
|
85
|
+
|
86
|
+
begin
|
87
|
+
# Perform the configuration on the server
|
88
|
+
results[configuration.slug] = configuration.configure(host, options[configuration.slug])
|
89
|
+
rescue RediPress::ConfigurationFailed => e
|
90
|
+
# Print a new line
|
91
|
+
new_line
|
92
|
+
|
93
|
+
# Print an error message
|
94
|
+
prompt.error("Configuration '#{configuration.name}' failed:")
|
95
|
+
prompt.error("------------------------------------------------------------")
|
96
|
+
prompt.error(e.error)
|
97
|
+
|
98
|
+
exit 1
|
99
|
+
rescue => e
|
100
|
+
# Print a new line
|
101
|
+
new_line
|
102
|
+
|
103
|
+
# Print an error message
|
104
|
+
prompt.error("Configuration '#{configuration.name}' raised an error:")
|
105
|
+
prompt.error("------------------------------------------------------------")
|
106
|
+
|
107
|
+
raise e
|
108
|
+
end
|
77
109
|
end
|
78
110
|
|
111
|
+
# Print a new line
|
112
|
+
new_line
|
113
|
+
|
79
114
|
# The server has been configured
|
80
115
|
prompt.ok("Woo hoo! Your server has been configured.")
|
81
116
|
|
82
|
-
#
|
83
|
-
|
117
|
+
# Loop over each configuration
|
118
|
+
configurations.each do |configuration|
|
119
|
+
# Get the result
|
120
|
+
result = results[configuration.slug]
|
121
|
+
|
122
|
+
# Go next if there aren't any results to output
|
123
|
+
next if result.nil? || result.empty? || false == result.is_a?(Hash)
|
124
|
+
|
125
|
+
# Print a new line
|
126
|
+
new_line
|
84
127
|
|
85
|
-
# Check if there are any results to Show
|
86
|
-
unless result.empty?
|
87
128
|
# Print a table containing the results
|
88
129
|
puts TTY::Table.new(rows: result.map { |k, v| [" #{k} ", " #{v} "] }).render(:ascii)
|
89
130
|
end
|
131
|
+
|
132
|
+
nil
|
90
133
|
end
|
91
134
|
|
92
135
|
# Set the default task to execute
|
@@ -132,25 +175,24 @@ module RediPress
|
|
132
175
|
host
|
133
176
|
end
|
134
177
|
|
135
|
-
# Prompt the user for the
|
178
|
+
# Prompt the user for the configurations to use
|
136
179
|
#
|
137
180
|
# Example:
|
138
|
-
# >>
|
139
|
-
# => [#<Test:0x00000000000000
|
181
|
+
# >> prompt_for_configurations
|
182
|
+
# => [#<RediPress::Configuration::Test:0x00000000000000>]
|
140
183
|
#
|
141
|
-
def
|
184
|
+
def prompt_for_configurations
|
142
185
|
# Print a short message to explain why we need the following information
|
143
|
-
prompt.ok("Pick the
|
186
|
+
prompt.ok("Pick the configurations you'd like to use:")
|
144
187
|
|
145
188
|
begin
|
146
189
|
# Load the actual configuration classes
|
147
190
|
configurations = RediPress::Configuration.all
|
148
|
-
rescue
|
191
|
+
rescue e
|
149
192
|
prompt.error("Unable to load one or more configurations.")
|
150
|
-
prompt.error("See the error report below for more information:")
|
151
193
|
prompt.error("--------------------------------------------------")
|
152
194
|
|
153
|
-
raise
|
195
|
+
raise e
|
154
196
|
end
|
155
197
|
|
156
198
|
# Ensure there is at least one configuration available
|
@@ -161,13 +203,13 @@ module RediPress
|
|
161
203
|
raise RediPress::NoConfigurationsAvailable
|
162
204
|
end
|
163
205
|
|
164
|
-
# Prompt for the
|
165
|
-
|
206
|
+
# Prompt for the configurations to use
|
207
|
+
configurations = prompt.multi_select("Configurations:", configurations.values)
|
166
208
|
|
167
|
-
|
209
|
+
configurations
|
168
210
|
end
|
169
211
|
|
170
|
-
# Prompt the user for all options required by the specified configuration
|
212
|
+
# Prompt the user for all options required by the specified configuration
|
171
213
|
#
|
172
214
|
# Example:
|
173
215
|
# >> prompt_for_configuration_options(configuration)
|
@@ -177,7 +219,7 @@ module RediPress
|
|
177
219
|
return nil unless configuration.parameters && configuration.parameters.count > 0
|
178
220
|
|
179
221
|
# Print a short message to explain why we need the following information
|
180
|
-
prompt.ok("
|
222
|
+
prompt.ok("Options for #{configuration.name}:")
|
181
223
|
|
182
224
|
# Create an empty hash to store the configuration's options
|
183
225
|
options = Hash.new
|
@@ -185,19 +227,22 @@ module RediPress
|
|
185
227
|
# Loop through each parameter on the configuration
|
186
228
|
configuration.parameters.each do |parameter|
|
187
229
|
if :text == parameter.type
|
188
|
-
options[parameter.slug] = prompt.ask("#{parameter.name}:") do |q|
|
230
|
+
options[parameter.slug] = prompt.ask(" #{parameter.name}:") do |q|
|
189
231
|
q.required(true)
|
190
232
|
q.validate(parameter.validation) if parameter.validation
|
191
233
|
q.default(parameter.default) if parameter.default
|
192
234
|
end
|
193
|
-
elsif :
|
194
|
-
options[parameter.slug] = prompt.yes?("#{parameter.name}:")
|
235
|
+
elsif :yes == parameter.type
|
236
|
+
options[parameter.slug] = prompt.yes?(" #{parameter.name}:")
|
237
|
+
elsif :no == parameter.type
|
238
|
+
options[parameter.slug] = prompt.no?(" #{parameter.name}:")
|
195
239
|
elsif :select == parameter.type
|
196
|
-
options[parameter.slug] = prompt.select("#{parameter.name}:", parameter.options)
|
240
|
+
options[parameter.slug] = prompt.select(" #{parameter.name}:", parameter.options)
|
197
241
|
elsif :multi_select == parameter.type
|
198
|
-
options[parameter.slug] = prompt.multi_select("#{parameter.name}:", parameter.options)
|
242
|
+
options[parameter.slug] = prompt.multi_select(" #{parameter.name}:", parameter.options)
|
199
243
|
else
|
200
|
-
prompt.error("
|
244
|
+
prompt.error("'#{parameter.name}' has an unknown type of '#{parameter.type}'.")
|
245
|
+
|
201
246
|
exit 1
|
202
247
|
end
|
203
248
|
end
|
@@ -52,6 +52,16 @@ module RediPress
|
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
|
+
# Get the slug of the configuration
|
56
|
+
#
|
57
|
+
# Example:
|
58
|
+
# >> configuration.slug
|
59
|
+
# => "test"
|
60
|
+
#
|
61
|
+
def slug
|
62
|
+
RediPress::Configuration.slug_for(self.class)
|
63
|
+
end
|
64
|
+
|
55
65
|
# Get the name of the configuration
|
56
66
|
#
|
57
67
|
# Example:
|
@@ -99,8 +109,7 @@ module RediPress
|
|
99
109
|
end
|
100
110
|
|
101
111
|
# Configure the server
|
102
|
-
# This method should return a hash
|
103
|
-
# success and nil if an error occurs.
|
112
|
+
# This method should return a hash with info to display (if needed) or nil
|
104
113
|
#
|
105
114
|
# Arguments:
|
106
115
|
# host: (SSHKit::Host)
|
@@ -113,6 +122,22 @@ module RediPress
|
|
113
122
|
def configure(host, options)
|
114
123
|
raise RediPress::SetupNotImplemented
|
115
124
|
end
|
125
|
+
|
126
|
+
# Fail with an error
|
127
|
+
#
|
128
|
+
# Arguments:
|
129
|
+
# error: (String)
|
130
|
+
#
|
131
|
+
# Example:
|
132
|
+
# >> configuration.fail("Test error")
|
133
|
+
# => nil
|
134
|
+
#
|
135
|
+
# Raises:
|
136
|
+
# RediPress::ConfigurationFailed: When this function is called
|
137
|
+
#
|
138
|
+
def fail(error)
|
139
|
+
raise RediPress::ConfigurationFailed.new(self, error)
|
140
|
+
end
|
116
141
|
end
|
117
142
|
end
|
118
143
|
end
|
@@ -68,6 +68,24 @@ module RediPress
|
|
68
68
|
"RediPress::Configuration::#{klass}"
|
69
69
|
end
|
70
70
|
|
71
|
+
# Get the slug for a configuration class.
|
72
|
+
#
|
73
|
+
# Arguments:
|
74
|
+
# klass: (Class)
|
75
|
+
#
|
76
|
+
# Example:
|
77
|
+
# >> RediPress::Configuration.slug_for RediPress::Configuration::Test
|
78
|
+
# => "test"
|
79
|
+
#
|
80
|
+
def self.slug_for(klass)
|
81
|
+
slug = klass.to_s.split("::").last
|
82
|
+
slug.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
|
83
|
+
slug.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
84
|
+
slug.tr!("-", "_")
|
85
|
+
slug.downcase!
|
86
|
+
slug
|
87
|
+
end
|
88
|
+
|
71
89
|
# Load a configuration from the configurations directory.
|
72
90
|
#
|
73
91
|
# Arguments:
|
data/lib/redipress/errors.rb
CHANGED
@@ -32,4 +32,19 @@ module RediPress
|
|
32
32
|
"The setup function has not been implemented by the configuration."
|
33
33
|
end
|
34
34
|
end
|
35
|
+
|
36
|
+
# A RuntimeError subclass for when a configuration fails.
|
37
|
+
#
|
38
|
+
class ConfigurationFailed < RuntimeError
|
39
|
+
attr_reader :configuration, :error
|
40
|
+
|
41
|
+
def initialize(configuration, error)
|
42
|
+
@configuration = configuration
|
43
|
+
@error = error
|
44
|
+
end
|
45
|
+
|
46
|
+
def to_s
|
47
|
+
"The configuration '#{@configuration.name}' failed: #{@error}"
|
48
|
+
end
|
49
|
+
end
|
35
50
|
end
|
data/lib/redipress/variables.rb
CHANGED
data/redipress.gemspec
CHANGED
@@ -16,10 +16,10 @@ Gem::Specification.new do |s|
|
|
16
16
|
|
17
17
|
s.executables << 'redipress'
|
18
18
|
|
19
|
-
s.add_runtime_dependency "thor", "~> 0.19", "0.19.1"
|
20
|
-
s.add_runtime_dependency "tty-prompt", "~> 0.3", "0.3.0"
|
21
|
-
s.add_runtime_dependency "tty-table", "~> 0.4", "0.4.0"
|
22
|
-
s.add_runtime_dependency "tty-spinner", "~> 0.1", "0.1.0"
|
23
|
-
s.add_runtime_dependency "sshkey", "~> 1.8", "1.8.0"
|
24
|
-
s.add_runtime_dependency "sshkit", "~> 1.8", "1.8.1"
|
19
|
+
s.add_runtime_dependency "thor", "~> 0.19", ">= 0.19.1"
|
20
|
+
s.add_runtime_dependency "tty-prompt", "~> 0.3", ">= 0.3.0"
|
21
|
+
s.add_runtime_dependency "tty-table", "~> 0.4", ">= 0.4.0"
|
22
|
+
s.add_runtime_dependency "tty-spinner", "~> 0.1", ">= 0.1.0"
|
23
|
+
s.add_runtime_dependency "sshkey", "~> 1.8", ">= 1.8.0"
|
24
|
+
s.add_runtime_dependency "sshkit", "~> 1.8", ">= 1.8.1"
|
25
25
|
end
|
metadata
CHANGED
@@ -1,133 +1,133 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redipress
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rediweb Hosting
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-02-
|
11
|
+
date: 2016-02-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0.19'
|
20
|
-
- -
|
20
|
+
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
22
|
version: 0.19.1
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
|
-
- - ~>
|
27
|
+
- - "~>"
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '0.19'
|
30
|
-
- -
|
30
|
+
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: 0.19.1
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: tty-prompt
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
36
36
|
requirements:
|
37
|
-
- - ~>
|
37
|
+
- - "~>"
|
38
38
|
- !ruby/object:Gem::Version
|
39
39
|
version: '0.3'
|
40
|
-
- -
|
40
|
+
- - ">="
|
41
41
|
- !ruby/object:Gem::Version
|
42
42
|
version: 0.3.0
|
43
43
|
type: :runtime
|
44
44
|
prerelease: false
|
45
45
|
version_requirements: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
|
-
- - ~>
|
47
|
+
- - "~>"
|
48
48
|
- !ruby/object:Gem::Version
|
49
49
|
version: '0.3'
|
50
|
-
- -
|
50
|
+
- - ">="
|
51
51
|
- !ruby/object:Gem::Version
|
52
52
|
version: 0.3.0
|
53
53
|
- !ruby/object:Gem::Dependency
|
54
54
|
name: tty-table
|
55
55
|
requirement: !ruby/object:Gem::Requirement
|
56
56
|
requirements:
|
57
|
-
- - ~>
|
57
|
+
- - "~>"
|
58
58
|
- !ruby/object:Gem::Version
|
59
59
|
version: '0.4'
|
60
|
-
- -
|
60
|
+
- - ">="
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: 0.4.0
|
63
63
|
type: :runtime
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
|
-
- - ~>
|
67
|
+
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '0.4'
|
70
|
-
- -
|
70
|
+
- - ">="
|
71
71
|
- !ruby/object:Gem::Version
|
72
72
|
version: 0.4.0
|
73
73
|
- !ruby/object:Gem::Dependency
|
74
74
|
name: tty-spinner
|
75
75
|
requirement: !ruby/object:Gem::Requirement
|
76
76
|
requirements:
|
77
|
-
- - ~>
|
77
|
+
- - "~>"
|
78
78
|
- !ruby/object:Gem::Version
|
79
79
|
version: '0.1'
|
80
|
-
- -
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: 0.1.0
|
83
83
|
type: :runtime
|
84
84
|
prerelease: false
|
85
85
|
version_requirements: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - ~>
|
87
|
+
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0.1'
|
90
|
-
- -
|
90
|
+
- - ">="
|
91
91
|
- !ruby/object:Gem::Version
|
92
92
|
version: 0.1.0
|
93
93
|
- !ruby/object:Gem::Dependency
|
94
94
|
name: sshkey
|
95
95
|
requirement: !ruby/object:Gem::Requirement
|
96
96
|
requirements:
|
97
|
-
- - ~>
|
97
|
+
- - "~>"
|
98
98
|
- !ruby/object:Gem::Version
|
99
99
|
version: '1.8'
|
100
|
-
- -
|
100
|
+
- - ">="
|
101
101
|
- !ruby/object:Gem::Version
|
102
102
|
version: 1.8.0
|
103
103
|
type: :runtime
|
104
104
|
prerelease: false
|
105
105
|
version_requirements: !ruby/object:Gem::Requirement
|
106
106
|
requirements:
|
107
|
-
- - ~>
|
107
|
+
- - "~>"
|
108
108
|
- !ruby/object:Gem::Version
|
109
109
|
version: '1.8'
|
110
|
-
- -
|
110
|
+
- - ">="
|
111
111
|
- !ruby/object:Gem::Version
|
112
112
|
version: 1.8.0
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: sshkit
|
115
115
|
requirement: !ruby/object:Gem::Requirement
|
116
116
|
requirements:
|
117
|
-
- - ~>
|
117
|
+
- - "~>"
|
118
118
|
- !ruby/object:Gem::Version
|
119
119
|
version: '1.8'
|
120
|
-
- -
|
120
|
+
- - ">="
|
121
121
|
- !ruby/object:Gem::Version
|
122
122
|
version: 1.8.1
|
123
123
|
type: :runtime
|
124
124
|
prerelease: false
|
125
125
|
version_requirements: !ruby/object:Gem::Requirement
|
126
126
|
requirements:
|
127
|
-
- - ~>
|
127
|
+
- - "~>"
|
128
128
|
- !ruby/object:Gem::Version
|
129
129
|
version: '1.8'
|
130
|
-
- -
|
130
|
+
- - ">="
|
131
131
|
- !ruby/object:Gem::Version
|
132
132
|
version: 1.8.1
|
133
133
|
description: Automated server configuration!
|
@@ -137,7 +137,7 @@ executables:
|
|
137
137
|
extensions: []
|
138
138
|
extra_rdoc_files: []
|
139
139
|
files:
|
140
|
-
- .gitignore
|
140
|
+
- ".gitignore"
|
141
141
|
- LICENSE
|
142
142
|
- bin/redipress
|
143
143
|
- lib/redipress.rb
|
@@ -161,12 +161,12 @@ require_paths:
|
|
161
161
|
- lib
|
162
162
|
required_ruby_version: !ruby/object:Gem::Requirement
|
163
163
|
requirements:
|
164
|
-
- -
|
164
|
+
- - ">="
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: '0'
|
167
167
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
168
168
|
requirements:
|
169
|
-
- -
|
169
|
+
- - ">="
|
170
170
|
- !ruby/object:Gem::Version
|
171
171
|
version: '0'
|
172
172
|
requirements: []
|