test-kitchen 1.0.0.beta.2 → 1.0.0.beta.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +32 -1
- data/README.md +13 -31
- data/lib/kitchen/busser.rb +5 -6
- data/lib/kitchen/cli.rb +21 -1
- data/lib/kitchen/config.rb +5 -4
- data/lib/kitchen/driver/base.rb +16 -2
- data/lib/kitchen/driver/ssh_base.rb +2 -2
- data/lib/kitchen/generator/init.rb +1 -1
- data/lib/kitchen/provisioner/chef_base.rb +3 -3
- data/lib/kitchen/provisioner/chef_solo.rb +1 -0
- data/lib/kitchen/ssh.rb +21 -2
- data/lib/kitchen/version.rb +1 -1
- data/spec/kitchen/driver/base_spec.rb +4 -0
- data/test-kitchen.gemspec +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1e92b944518afe8ad9023cf97a51f14b427b28a0
|
4
|
+
data.tar.gz: e4f216d248e9e467eaa19b6c2049cb2d36cfc0f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 368dd8fbff5b816cc4622533809dd0992a3074818c93d0881312a1b988d2e3bb8786085ef3b82f6f8afd9cdd036279030c085e7cee2b8fd27dace7754e4b436b
|
7
|
+
data.tar.gz: 78bc12ab69f016079a311da68c6122144dcd8c94849a7b2f4c8cc22155bc5fd484403fbfef057536eccdf9450ae6d892b2ce2d061ce6c5625525b4087c5db3d8
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,22 @@
|
|
1
|
+
## 1.0.0.beta.3 / 2013-08-29
|
2
|
+
|
3
|
+
### Bug fixes
|
4
|
+
|
5
|
+
* Pull request [#157][]: Include definitions directory when uploading the cookbooks. ([@jasonroelofs][])
|
6
|
+
* Pull request [#178][]: Fix SSH#wait's logger call to #info. ([@ryansouza][])
|
7
|
+
* Pull request [#188][]: Truthy default_configs can now be overridden. ([@thommay][])
|
8
|
+
|
9
|
+
### Improvements
|
10
|
+
|
11
|
+
* Allow Test Kitchen to be used as a library; CWD is not enough. ([@portertech][])
|
12
|
+
* Add `kitchen list --debug` to display all merged & calculated config. ([@fnichol][])
|
13
|
+
* Add retry logic to Kitchen:SSH when initiating a connection. ([@fnichol][])
|
14
|
+
* Pull request [#147][]: Allow chef omnibus install.sh url to be configurable. ([@jrwesolo][])
|
15
|
+
* Pull request [#187][]: Add support for log file in chef solo. ([@arangamani][])
|
16
|
+
* Pull request [#179][]: Remove bundler references from README. ([@juliandunn][])
|
17
|
+
* Compute default test_base_path in Config based on kitchen_root. ([@fnichol][])
|
18
|
+
|
19
|
+
|
1
20
|
## 1.0.0.beta.2 / 2013-07-24
|
2
21
|
|
3
22
|
### Bug fixes
|
@@ -208,35 +227,47 @@ The initial release.
|
|
208
227
|
[#137]: https://github.com/opscode/test-kitchen/issues/137
|
209
228
|
[#140]: https://github.com/opscode/test-kitchen/issues/140
|
210
229
|
[#142]: https://github.com/opscode/test-kitchen/issues/142
|
230
|
+
[#147]: https://github.com/opscode/test-kitchen/issues/147
|
211
231
|
[#151]: https://github.com/opscode/test-kitchen/issues/151
|
212
232
|
[#152]: https://github.com/opscode/test-kitchen/issues/152
|
213
233
|
[#153]: https://github.com/opscode/test-kitchen/issues/153
|
214
234
|
[#154]: https://github.com/opscode/test-kitchen/issues/154
|
215
235
|
[#155]: https://github.com/opscode/test-kitchen/issues/155
|
236
|
+
[#157]: https://github.com/opscode/test-kitchen/issues/157
|
216
237
|
[#161]: https://github.com/opscode/test-kitchen/issues/161
|
217
238
|
[#163]: https://github.com/opscode/test-kitchen/issues/163
|
218
239
|
[#170]: https://github.com/opscode/test-kitchen/issues/170
|
219
240
|
[#171]: https://github.com/opscode/test-kitchen/issues/171
|
220
241
|
[#172]: https://github.com/opscode/test-kitchen/issues/172
|
242
|
+
[#178]: https://github.com/opscode/test-kitchen/issues/178
|
243
|
+
[#179]: https://github.com/opscode/test-kitchen/issues/179
|
244
|
+
[#187]: https://github.com/opscode/test-kitchen/issues/187
|
245
|
+
[#188]: https://github.com/opscode/test-kitchen/issues/188
|
221
246
|
[@ChrisLundquist]: https://github.com/ChrisLundquist
|
222
247
|
[@adamhjk]: https://github.com/adamhjk
|
248
|
+
[@arangamani]: https://github.com/arangamani
|
223
249
|
[@arunthampi]: https://github.com/arunthampi
|
224
250
|
[@bryanwb]: https://github.com/bryanwb
|
225
251
|
[@calavera]: https://github.com/calavera
|
226
252
|
[@fnichol]: https://github.com/fnichol
|
227
253
|
[@gondoi]: https://github.com/gondoi
|
228
254
|
[@grahamc]: https://github.com/grahamc
|
255
|
+
[@jasonroelofs]: https://github.com/jasonroelofs
|
229
256
|
[@jonsmorrow]: https://github.com/jonsmorrow
|
230
257
|
[@josephholsten]: https://github.com/josephholsten
|
258
|
+
[@jrwesolo]: https://github.com/jrwesolo
|
231
259
|
[@jtimberman]: https://github.com/jtimberman
|
260
|
+
[@juliandunn]: https://github.com/juliandunn
|
232
261
|
[@manul]: https://github.com/manul
|
233
262
|
[@mattray]: https://github.com/mattray
|
234
263
|
[@mconigliaro]: https://github.com/mconigliaro
|
235
264
|
[@patcon]: https://github.com/patcon
|
265
|
+
[@portertech]: https://github.com/portertech
|
236
266
|
[@reset]: https://github.com/reset
|
237
267
|
[@rteabeault]: https://github.com/rteabeault
|
268
|
+
[@ryansouza]: https://github.com/ryansouza
|
238
269
|
[@saketoba]: https://github.com/saketoba
|
239
270
|
[@sethvargo]: https://github.com/sethvargo
|
240
271
|
[@smith]: https://github.com/smith
|
241
272
|
[@stevendanna]: https://github.com/stevendanna
|
242
|
-
[@thommay]: https://github.com/thommay
|
273
|
+
[@thommay]: https://github.com/thommay
|
data/README.md
CHANGED
@@ -7,54 +7,36 @@ A convergence integration test harness for configuration management systems.
|
|
7
7
|
|
8
8
|
# Getting started
|
9
9
|
|
10
|
-
|
11
10
|
Project Setup
|
12
11
|
-------------
|
13
12
|
|
14
|
-
|
15
|
-
dependency:
|
13
|
+
Install the `test-kitchen` gem. `--pre` is necessary because Test Kitchen 1.0.0 has not been released yet.
|
16
14
|
|
17
|
-
```
|
18
|
-
gem
|
15
|
+
```text
|
16
|
+
$ gem install test-kitchen --pre
|
19
17
|
```
|
20
18
|
|
21
|
-
|
22
|
-
|
23
|
-
$ bundle install
|
24
|
-
|
25
|
-
This will expose the `test-kitchen` CLI. Run `bundle exec kitchen init` to get started:
|
26
|
-
|
27
|
-
$ kitchen init
|
28
|
-
|
29
|
-
You will be prompted with a series of questions. In this guide, we
|
30
|
-
will be using the [kitchen vagrant driver](https://github.com/opscode/kitchen-vagrant).
|
19
|
+
This will expose the `test-kitchen` CLI. Run `kitchen init` to get started:
|
31
20
|
|
32
21
|
```text
|
33
|
-
$
|
22
|
+
$ kitchen init
|
34
23
|
create .kitchen.yml
|
35
|
-
append Rakefile
|
36
|
-
create test/integration/default
|
37
|
-
append .gitignore
|
38
|
-
append .gitignore
|
39
|
-
Add a Driver plugin to your Gemfile?
|
40
|
-
(y/n)> y
|
41
|
-
Enter gem name, `list', or `skip'>
|
42
|
-
kitchen-vagrant
|
43
|
-
append Gemfile
|
44
|
-
You must run `bundle install' to fetch any new gems.
|
45
24
|
```
|
25
|
+
In this guide, we
|
26
|
+
will be using the [kitchen vagrant driver](https://github.com/opscode/kitchen-vagrant),
|
27
|
+
so install that:
|
46
28
|
|
47
|
-
|
48
|
-
|
49
|
-
|
29
|
+
```text
|
30
|
+
$ gem install kitchen-vagrant
|
31
|
+
```
|
50
32
|
|
51
33
|
Open up the `.kitchen.yml` file created in the root of your
|
52
|
-
repository.
|
34
|
+
repository and modify it if you wish.
|
53
35
|
|
54
36
|
Now, it is time to get testing. Use the `--parallel` option to run
|
55
37
|
your tests in parallel. Trust us, it's faster!
|
56
38
|
|
57
|
-
$
|
39
|
+
$ kitchen test
|
58
40
|
|
59
41
|
### Helpful Switches
|
60
42
|
|
data/lib/kitchen/busser.rb
CHANGED
@@ -35,11 +35,12 @@ module Kitchen
|
|
35
35
|
# @param [Hash] opts optional configuration
|
36
36
|
# @option opts [TrueClass, FalseClass] :use_sudo whether or not to invoke
|
37
37
|
# sudo before commands requiring root access (default: `true`)
|
38
|
-
def initialize(suite_name, opts = {
|
38
|
+
def initialize(suite_name, opts = {})
|
39
39
|
validate_options(suite_name)
|
40
40
|
|
41
|
+
@test_root = opts.fetch(:test_root, DEFAULT_TEST_ROOT)
|
41
42
|
@suite_name = suite_name
|
42
|
-
@use_sudo = opts
|
43
|
+
@use_sudo = opts.fetch(:use_sudo, true)
|
43
44
|
end
|
44
45
|
|
45
46
|
# Returns a command string which installs Busser, and installs all
|
@@ -103,6 +104,8 @@ module Kitchen
|
|
103
104
|
DEFAULT_BUSSER_ROOT = "/opt/busser".freeze
|
104
105
|
DEFAULT_TEST_ROOT = File.join(Dir.pwd, "test/integration").freeze
|
105
106
|
|
107
|
+
attr_reader :test_root
|
108
|
+
|
106
109
|
def validate_options(suite_name)
|
107
110
|
if suite_name.nil?
|
108
111
|
raise ClientError, "Busser#new requires a suite_name"
|
@@ -170,9 +173,5 @@ module Kitchen
|
|
170
173
|
def busser_gem
|
171
174
|
"busser"
|
172
175
|
end
|
173
|
-
|
174
|
-
def test_root
|
175
|
-
DEFAULT_TEST_ROOT
|
176
|
-
end
|
177
176
|
end
|
178
177
|
end
|
data/lib/kitchen/cli.rb
CHANGED
@@ -51,9 +51,13 @@ module Kitchen
|
|
51
51
|
desc "list [(all|<REGEX>)]", "List all instances"
|
52
52
|
method_option :bare, :aliases => "-b", :type => :boolean,
|
53
53
|
:desc => "List the name of each instance only, one per line"
|
54
|
+
method_option :debug, :aliases => "-d", :type => :boolean,
|
55
|
+
:desc => "Show computed driver configuration for each instance"
|
54
56
|
def list(*args)
|
55
57
|
result = parse_subcommand(args.first)
|
56
|
-
if options[:
|
58
|
+
if options[:debug]
|
59
|
+
Array(result).each { |i| debug_instance(i) }
|
60
|
+
elsif options[:bare]
|
57
61
|
say Array(result).map { |i| i.name }.join("\n")
|
58
62
|
else
|
59
63
|
list_table(result)
|
@@ -333,6 +337,22 @@ module Kitchen
|
|
333
337
|
]
|
334
338
|
end
|
335
339
|
|
340
|
+
def debug_instance(instance)
|
341
|
+
say "--------"
|
342
|
+
say "Instance: #{instance.name}"
|
343
|
+
say "Driver: #{instance.driver.name}"
|
344
|
+
say "Driver Config:"
|
345
|
+
instance.driver.config_keys.sort.each do |key|
|
346
|
+
say " #{key}: #{instance.driver[key]}"
|
347
|
+
end
|
348
|
+
if instance.kind_of?(Instance::Cheflike)
|
349
|
+
say "Chef Config:"
|
350
|
+
say " attributes: #{instance.attributes.inspect}"
|
351
|
+
say " run_list: #{instance.run_list.inspect}"
|
352
|
+
end
|
353
|
+
say ""
|
354
|
+
end
|
355
|
+
|
336
356
|
def color_pad(string)
|
337
357
|
string + set_color("", :white)
|
338
358
|
end
|
data/lib/kitchen/config.rb
CHANGED
@@ -40,9 +40,6 @@ module Kitchen
|
|
40
40
|
# Default provisioner to use
|
41
41
|
DEFAULT_PROVISIONER = "chef_solo".freeze
|
42
42
|
|
43
|
-
# Default base path which may contain `data_bags/` directories
|
44
|
-
DEFAULT_TEST_BASE_PATH = File.join(Dir.pwd, 'test/integration').freeze
|
45
|
-
|
46
43
|
# Creates a new configuration.
|
47
44
|
#
|
48
45
|
# @param [Hash] options configuration
|
@@ -54,7 +51,7 @@ module Kitchen
|
|
54
51
|
def initialize(options = {})
|
55
52
|
@loader = options[:loader] || Kitchen::Loader::YAML.new
|
56
53
|
@kitchen_root = options[:kitchen_root] || Dir.pwd
|
57
|
-
@test_base_path = options[:test_base_path] ||
|
54
|
+
@test_base_path = options[:test_base_path] || default_test_base_path
|
58
55
|
@log_level = options[:log_level] || Kitchen::DEFAULT_LOG_LEVEL
|
59
56
|
@supervised = options[:supervised]
|
60
57
|
end
|
@@ -258,5 +255,9 @@ module Kitchen
|
|
258
255
|
[:driver_plugin, :driver_config, :provisioner].include?(key)
|
259
256
|
end
|
260
257
|
end
|
258
|
+
|
259
|
+
def default_test_base_path
|
260
|
+
File.join(kitchen_root, 'test/integration')
|
261
|
+
end
|
261
262
|
end
|
262
263
|
end
|
data/lib/kitchen/driver/base.rb
CHANGED
@@ -39,7 +39,7 @@ module Kitchen
|
|
39
39
|
def initialize(config = {})
|
40
40
|
@config = LazyDriverHash.new(config, self)
|
41
41
|
self.class.defaults.each do |attr, value|
|
42
|
-
@config[attr] = value unless @config
|
42
|
+
@config[attr] = value unless @config.has_key?(attr)
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
@@ -64,6 +64,13 @@ module Kitchen
|
|
64
64
|
config[attr]
|
65
65
|
end
|
66
66
|
|
67
|
+
# Returns an array of configuration keys.
|
68
|
+
#
|
69
|
+
# @return [Array] array of configuration keys
|
70
|
+
def config_keys
|
71
|
+
config.keys
|
72
|
+
end
|
73
|
+
|
67
74
|
# Creates an instance.
|
68
75
|
#
|
69
76
|
# @param state [Hash] mutable instance and driver state
|
@@ -153,10 +160,11 @@ module Kitchen
|
|
153
160
|
end
|
154
161
|
|
155
162
|
def busser
|
163
|
+
test_root = File.join(config[:kitchen_root], 'test/integration')
|
156
164
|
@busser ||= begin
|
157
165
|
raise ClientError, "Instance must be set for Driver" if instance.nil?
|
158
166
|
|
159
|
-
Busser.new(instance.suite.name)
|
167
|
+
Busser.new(instance.suite.name, :test_root => test_root)
|
160
168
|
end
|
161
169
|
end
|
162
170
|
|
@@ -227,6 +235,12 @@ module Kitchen
|
|
227
235
|
proc_or_val
|
228
236
|
end
|
229
237
|
end
|
238
|
+
|
239
|
+
def to_hash
|
240
|
+
hash = Hash.new
|
241
|
+
__getobj__.keys.each { |key| hash[key] = self[key] }
|
242
|
+
hash
|
243
|
+
end
|
230
244
|
end
|
231
245
|
end
|
232
246
|
end
|
@@ -85,7 +85,7 @@ module Kitchen
|
|
85
85
|
end
|
86
86
|
|
87
87
|
def build_ssh_args(state)
|
88
|
-
combined = config.merge(state)
|
88
|
+
combined = config.to_hash.merge(state)
|
89
89
|
|
90
90
|
opts = Hash.new
|
91
91
|
opts[:user_known_hosts_file] = "/dev/null"
|
@@ -123,7 +123,7 @@ module Kitchen
|
|
123
123
|
end
|
124
124
|
|
125
125
|
def wait_for_sshd(hostname, username = nil, options = {})
|
126
|
-
SSH.new(hostname, username, options).wait
|
126
|
+
SSH.new(hostname, username, { :logger => logger }.merge(options)).wait
|
127
127
|
end
|
128
128
|
end
|
129
129
|
end
|
@@ -181,7 +181,7 @@ module Kitchen
|
|
181
181
|
end
|
182
182
|
|
183
183
|
def unbundlerize
|
184
|
-
keys = %w[
|
184
|
+
keys = ENV.keys.select { |key| key =~ /^BUNDLER?_/ } + %w[RUBYOPT]
|
185
185
|
|
186
186
|
keys.each { |key| ENV["__#{key}"] = ENV[key] ; ENV.delete(key) }
|
187
187
|
yield
|
@@ -31,7 +31,7 @@ module Kitchen
|
|
31
31
|
def install_command
|
32
32
|
return nil unless config[:require_chef_omnibus]
|
33
33
|
|
34
|
-
url = "https://www.opscode.com/chef/install.sh"
|
34
|
+
url = config[:chef_omnibus_url] || "https://www.opscode.com/chef/install.sh"
|
35
35
|
flag = config[:require_chef_omnibus]
|
36
36
|
version = if flag.is_a?(String) && flag != "latest"
|
37
37
|
"-s -- -v #{flag.downcase}"
|
@@ -237,7 +237,7 @@ module Kitchen
|
|
237
237
|
" Please add: `name '<cookbook_name>'` to metadata.rb and retry")
|
238
238
|
|
239
239
|
cb_path = File.join(tmpbooks_dir, cb_name)
|
240
|
-
glob = Dir.glob("#{kitchen_root}/{metadata.rb,README.*," +
|
240
|
+
glob = Dir.glob("#{kitchen_root}/{metadata.rb,README.*,definitions," +
|
241
241
|
"attributes,files,libraries,providers,recipes,resources,templates}")
|
242
242
|
|
243
243
|
FileUtils.mkdir_p(cb_path)
|
@@ -279,7 +279,7 @@ module Kitchen
|
|
279
279
|
end
|
280
280
|
|
281
281
|
Kitchen.mutex.synchronize do
|
282
|
-
env = Librarian::Chef::Environment.new
|
282
|
+
env = Librarian::Chef::Environment.new(:project_path => kitchen_root)
|
283
283
|
env.config_db.local["path"] = tmpbooks_dir
|
284
284
|
Librarian::Action::Resolve.new(env).run
|
285
285
|
Librarian::Action::Install.new(env).run
|
data/lib/kitchen/ssh.rb
CHANGED
@@ -86,7 +86,7 @@ module Kitchen
|
|
86
86
|
end
|
87
87
|
|
88
88
|
def wait
|
89
|
-
logger.
|
89
|
+
logger.info("Waiting for #{hostname}:#{port}...") until test_ssh
|
90
90
|
end
|
91
91
|
|
92
92
|
def login_command
|
@@ -105,9 +105,28 @@ module Kitchen
|
|
105
105
|
attr_reader :hostname, :username, :options, :logger
|
106
106
|
|
107
107
|
def session
|
108
|
-
@session ||=
|
108
|
+
@session ||= establish_connection
|
109
|
+
end
|
110
|
+
|
111
|
+
def establish_connection
|
112
|
+
rescue_exceptions = [
|
113
|
+
Errno::EACCES, Errno::EADDRINUSE, Errno::ECONNREFUSED,
|
114
|
+
Errno::ECONNRESET, Errno::ENETUNREACH, Errno::EHOSTUNREACH,
|
115
|
+
Net::SSH::Disconnect
|
116
|
+
]
|
117
|
+
retries = 3
|
118
|
+
|
119
|
+
begin
|
109
120
|
logger.debug("[SSH] opening connection to #{self}")
|
110
121
|
Net::SSH.start(hostname, username, options)
|
122
|
+
rescue *rescue_exceptions => e
|
123
|
+
if (retries -= 1) > 0
|
124
|
+
logger.info("[SSH] connection failed, retrying (#{e.inspect})")
|
125
|
+
retry
|
126
|
+
else
|
127
|
+
logger.warn("[SSH] connection failed, terminating (#{e.inspect})")
|
128
|
+
raise
|
129
|
+
end
|
111
130
|
end
|
112
131
|
end
|
113
132
|
|
data/lib/kitchen/version.rb
CHANGED
@@ -30,6 +30,7 @@ module Kitchen
|
|
30
30
|
|
31
31
|
default_config :beans, "kidney"
|
32
32
|
default_config :tunables, { 'flimflam' => 'positate' }
|
33
|
+
default_config :edible, true
|
33
34
|
end
|
34
35
|
|
35
36
|
class ComputedDefaults < Base
|
@@ -88,12 +89,15 @@ describe Kitchen::Driver::Base do
|
|
88
89
|
it "uses default config" do
|
89
90
|
driver[:beans].must_equal "kidney"
|
90
91
|
driver[:tunables]['flimflam'].must_equal 'positate'
|
92
|
+
driver[:edible].must_equal true
|
91
93
|
end
|
92
94
|
|
93
95
|
it "uses user config over default config" do
|
94
96
|
config[:beans] = "pinto"
|
97
|
+
config[:edible] = false
|
95
98
|
|
96
99
|
driver[:beans].must_equal "pinto"
|
100
|
+
driver[:edible].must_equal false
|
97
101
|
end
|
98
102
|
end
|
99
103
|
|
data/test-kitchen.gemspec
CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |gem|
|
|
26
26
|
gem.add_dependency 'net-ssh'
|
27
27
|
gem.add_dependency 'net-scp'
|
28
28
|
gem.add_dependency 'mixlib-shellout'
|
29
|
-
gem.add_dependency 'safe_yaml', '~> 0.9.
|
29
|
+
gem.add_dependency 'safe_yaml', '~> 0.9.5'
|
30
30
|
|
31
31
|
gem.add_development_dependency 'bundler', '~> 1.3'
|
32
32
|
gem.add_development_dependency 'rake'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: test-kitchen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.beta.
|
4
|
+
version: 1.0.0.beta.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fletcher Nichol
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-08-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: celluloid
|
@@ -100,14 +100,14 @@ dependencies:
|
|
100
100
|
requirements:
|
101
101
|
- - ~>
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 0.9.
|
103
|
+
version: 0.9.5
|
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
|
-
version: 0.9.
|
110
|
+
version: 0.9.5
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: bundler
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|