fog-core 1.43.0 → 1.44.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 35b3d7d551ace1e046e9abf0421d9b58ad5706d2
4
- data.tar.gz: 7564233003859d297d3f3680a9bed1357ca5bdb0
3
+ metadata.gz: e7e0a641eb2c6f28ba2026bb5fe19918d003ea7f
4
+ data.tar.gz: 0e72e5f6ae021ce1476d8b297747faa5da894679
5
5
  SHA512:
6
- metadata.gz: 85c4fc73f6f1813c86ab69e2cfc9d1e4d55e86f7c4f9222a520daf0ae9a953713aa6292b67a9b44852811aea59af9dfabdbadd19e2ea6dbb6cd6fbc855bf8997
7
- data.tar.gz: 30bcb3420001dd9b06fc8b6f5d1ab9fee61dc23d90ed5e1df8aae36f2576a1186045d944447d295d18903e391b2da6e976cfedce52ac8601fb64daf6c1e6dda9
6
+ metadata.gz: f604ea2b9c97ab0b8e596b51c749b4175b96fc3e70e7eff5ec1cc23471024c8e03774aaeec0523b8fe57211f1e6fb2006430ee422f62b1979610160ad7bd2ce8
7
+ data.tar.gz: 28abea55b24d79055f9c1f5a89aaa5d2dfd622875a2d7162678a5b4fc4ef21a06760d6341cad772c3846f531274b13483823484641ee474cdf4c1630ff275c11
data/.gitignore CHANGED
@@ -3,7 +3,7 @@
3
3
  .bundle
4
4
  .config
5
5
  .yardoc
6
- Gemfile.lock
6
+ Gemfile.*lock
7
7
  InstalledFiles
8
8
  _yardoc
9
9
  coverage
@@ -15,4 +15,4 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
- .#*
18
+ .#*
@@ -1,26 +1,33 @@
1
1
  language: ruby
2
2
 
3
- gemfile:
4
- - Gemfile
5
-
6
3
  rvm:
7
- - 1.9.3
8
- - 2.0.0
9
- - 2.2.0
10
- - jruby9k
4
+ - 2.1
5
+ - 2.2
6
+ - 2.3
7
+ - 2.4
11
8
  - jruby-head
12
9
 
13
10
  sudo: false
11
+ dist: trusty
14
12
 
15
13
  script: bundle exec rake travis
16
14
 
17
15
  matrix:
16
+ fast_finish: true
18
17
  include:
19
18
  - rvm: 1.8.7
20
- gemfile: Gemfile18
19
+ gemfile: Gemfile.1.8.7
20
+ - rvm: jruby-18mode
21
+ gemfile: Gemfile.1.8.7
22
+ - rvm: 1.9.3
23
+ gemfile: Gemfile.1.9.3
24
+ - rvm: jruby-19mode
25
+ gemfile: Gemfile.1.9.3
21
26
  - rvm: 2.1.0
22
27
  gemfile: Gemfile
23
28
  env: COVERAGE=true
29
+ - rvm: jruby-head
30
+ gemfile: Gemfile
24
31
  allow_failures:
25
32
  - rvm: jruby-head
26
33
  - rvm: jruby9k
data/Gemfile CHANGED
@@ -1,4 +1,3 @@
1
1
  source 'https://rubygems.org'
2
-
3
2
  gemspec
4
3
 
File without changes
@@ -0,0 +1,5 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "net-ssh", "< 3.0"
4
+
5
+ gemspec
data/README.md CHANGED
@@ -25,6 +25,17 @@ Or install it yourself as:
25
25
 
26
26
  $ gem install fog-core
27
27
 
28
+ ### Ruby 1.9.3
29
+
30
+ Some of `fog-core`'s dependencies have dropped support for Ruby 1.9.3 in later
31
+ versions. Rather than limit all `fog` users to older but compatible versions,
32
+ if you are using 1.9.3 you will need to declare a compatible version in your
33
+ application's `Gemfile` like:
34
+
35
+ gem "net-ssh", "< 3.0"
36
+
37
+ See `Gemfile.1.9.3` for the definitive list as tested by Travis.
38
+
28
39
  ## Usage
29
40
 
30
41
  TODO: Write usage instructions here
@@ -1,3 +1,8 @@
1
+ 1.44.0 04/28/2017
2
+ ==========================================================
3
+
4
+ add basic caching support
5
+
1
6
  1.43.0 09/28/2016
2
7
  ==========================================================
3
8
 
@@ -21,7 +21,9 @@ Gem::Specification.new do |spec|
21
21
  spec.add_dependency("builder")
22
22
  spec.add_dependency("excon", "~> 0.49")
23
23
  spec.add_dependency("formatador", "~> 0.2")
24
+ spec.add_dependency("xmlrpc") if RUBY_VERSION.to_s >= "2.4"
24
25
 
26
+ spec.add_development_dependency("tins") if RUBY_VERSION.to_s > "2.0"
25
27
  spec.add_development_dependency("coveralls")
26
28
  spec.add_development_dependency("minitest")
27
29
  spec.add_development_dependency("minitest-stub-const")
@@ -0,0 +1,210 @@
1
+ # coding: utf-8
2
+ require "fileutils"
3
+ require "yaml"
4
+ require "tmpdir"
5
+
6
+ module Fog
7
+ # A generic cache mechanism for fog resources. This can be for a server, security group, etc.
8
+ #
9
+ # Currently this is a on-disk cache using yml files per-model instance, however
10
+ # there is nothing in the way of extending this to use various other cache
11
+ # backends.
12
+ #
13
+ # == Basic functionality
14
+ #
15
+ # set the namespace where this cache will be stored:
16
+ #
17
+ # Fog::Cache.namespace_prefix = "service-account-foo-region-bar"
18
+ #
19
+ # cache to disk:
20
+ #
21
+ # # after dumping, there will be a yml file on disk:
22
+ # resouce.cache.dump
23
+ #
24
+ # # you can load cached data in from a different session
25
+ # Fog::Cache.load(Fog::Compute::AWS::Server, compute)
26
+ #
27
+ # # you can also expire cache (removes cached data assocaited with the resources of this model associated to the service passed in).
28
+ # Fog::Cache.expire_cache!(Fog::Compute::AWS::Server, compute)
29
+ #
30
+ # == More detailed flow/usage
31
+ #
32
+ # Normally, you would have a bunch of resources you want to cache/reload from disk.
33
+ # Every fog model has a +cache+ object injected to accomplish this. So in order to cache a server for exmaple
34
+ # you would do something like this:
35
+ #
36
+ # # note this is necessary in order to segregate usage of cache between various providers regions and accounts.
37
+ # # if you are using one account/region/etc only, you still must set it. 'default' will do.
38
+ # Fog::Cache.namespace_prefix = "prod-emea-eu-west-1"
39
+ #
40
+ # s = security_groups.sample; s.name # => "default"
41
+ # s.cache.dump # => 2371
42
+ #
43
+ # Now it is on disk:
44
+ #
45
+ # shai@adsk-lappy ~ % tree ~/.fog-cache/prod-emea-eu-west-1/
46
+ #
47
+ # /Users/shai/.fog-cache/prod-emea-eu-west-1/
48
+ # └── fog_compute_aws_real
49
+ # └── fog_compute_aws_securitygroup
50
+ # ├── default-90928073d9d5d9b4e7545e88aee7ec4f.yml
51
+ #
52
+ # You can do the same with a SecurityGroup, Instances, Elbs, etc.
53
+ #
54
+ # Note that when loading cache from disk, you need to pass the appropriate model class, and service associated with it.
55
+ # +Service+ is passed in is so that the service/connection details can be loaded into the loaded instances so they can be re-queried, etc.
56
+ # +Model+ is passed in so we can find the cache data associated to that model in the namespace of cache this session is using:
57
+ # Will try to load all resources associated to those. If you had 1 yml file, or 100, it would load whatever it could find.
58
+ # As such, the normal usage of dumping would be do it on a collection:
59
+ #
60
+ # load_balancers.each {|elb| elb.cache.dump }
61
+ #
62
+ # In order to load the cache into a different session with nothing but the service set up, use like so:
63
+ # As mentioned, will load all resources associated to the +model_klass+ and +service+ passed in.
64
+ #
65
+ # instances = Fog::Cache.load(Fog::Compute::AWS::Server, compute)
66
+ # instances.first.id # => "i-0569a70ae6f47d229"
67
+ #
68
+ # Note that if there is no cache located for the +model+ class and +service+ passed to `Fog::Cache.load`
69
+ # you will get an exception you can handle (for example, to load the resources for the fisrt time):
70
+ #
71
+ # Fog::Cache.expire_cache!(Fog::Compute::AWS::SecurityGroup, compute)
72
+ # # ... now there is no SecurityGroup cache data. So, if you tried to load it, you would get an exception:
73
+ #
74
+ # Fog::Cache.load(Fog::Compute::AWS::SecurityGroup, compute)
75
+ # rescue Fog::Cache::CacheNotFound => e
76
+ # puts "could not find any cache data for security groups on #{compute}"
77
+ # get_resources_and_dump
78
+ #
79
+ # == Extending cache backends
80
+ #
81
+ # Currently this is on-disk using yml. If need be, this could be extended to other cache backends:
82
+ #
83
+ # Find references of yaml in this file, split out to strategy objects/diff backends etc.
84
+ class Cache
85
+
86
+ # cache associated not found
87
+ class CacheNotFound < StandardError; end
88
+
89
+ # cache directory problem
90
+ class CacheDir < StandardError; end
91
+
92
+ # where different caches per +service+ api keys, regions etc, are stored
93
+ # see the +namespace_prefix=+ method.
94
+ SANDBOX = "~/.fog-cache"
95
+
96
+ # when a resource is used such as `server.cache.dump` the model klass is passed in
97
+ # so that it can be identified from a different session.
98
+ attr_reader :model
99
+
100
+ # Loads cache associated to the +model_klass+ and +service+ into memory.
101
+ #
102
+ # If no cache is found, it will raise an error for handling:
103
+ #
104
+ # rescue Fog::Cache::CacheNotFound
105
+ # set_initial_cache
106
+ #
107
+ def self.load(model_klass, service)
108
+ cache_files = Dir.glob("#{namespace(model_klass, service)}/*")
109
+
110
+ raise CacheNotFound if cache_files.empty?
111
+
112
+ loaded = cache_files.map do |path|
113
+ model_klass = Object.const_get(load_cache(path)[:model_klass])
114
+ model_klass.new(load_cache(path)[:attrs])
115
+ end
116
+
117
+ collection_klass = load_cache(cache_files.sample)[:collection_klass] &&
118
+ Object.const_get(load_cache(cache_files.sample)[:collection_klass])
119
+
120
+ loaded.each do |i|
121
+ # See https://github.com/fog/fog-aws/issues/354#issuecomment-286789702
122
+ i.collection = collection_klass.new(:service => service) if collection_klass
123
+ i.instance_variable_set(:@service, service)
124
+ end
125
+
126
+ # uniqe-ify based on the total of attributes. duplicate cache can exist due to
127
+ # `model#identity` not being unique. but if all attributes match, they are unique
128
+ # and shouldn't be loaded again.
129
+ uniq_loaded = loaded.uniq { |i| i.attributes }
130
+ if uniq_loaded.size != loaded.size
131
+ Fog::Logger.warning("Found duplicate items in the cache. Expire all & refresh cache soon.")
132
+ end
133
+
134
+ # Fog models created, free memory of cached data used for creation.
135
+ @memoized = nil
136
+
137
+ uniq_loaded
138
+ end
139
+
140
+ # creates on-disk cache of this specific +model_klass+ and +@service+
141
+ def self.create_namespace(model_klass, service)
142
+ FileUtils.mkdir_p(self.namespace(model_klass, service))
143
+ end
144
+
145
+ # Expires cache - this does not expire all cache associated.
146
+ # Instead, this will remove all on-disk cache of this specific +model_klass+ and and +@service+
147
+ def self.expire_cache!(model_klass, service)
148
+ FileUtils.rm_rf(namespace(model_klass, service))
149
+ end
150
+
151
+ # loads yml cache from path on disk, used
152
+ # to initialize Fog models.
153
+ def self.load_cache(path)
154
+ @memoized ||= {}
155
+ return @memoized[path] if @memoized[path]
156
+ @memoized[path] = YAML.load(File.read(path))
157
+ end
158
+
159
+ def self.namespace_prefix=(name)
160
+ @namespace_prefix = name
161
+ end
162
+
163
+ def self.namespace_prefix
164
+ @namespace_prefix
165
+ end
166
+
167
+ # The path/namespace where the cache is stored for a specific +model_klass+ and +@service+.
168
+ def self.namespace(model_klass, service)
169
+
170
+ raise CacheDir.new("Must set an explicit identifier/name for this cache. Example: 'serviceX-regionY'") unless namespace_prefix
171
+
172
+ ns = File.join(SANDBOX, namespace_prefix, service.class.to_s, model_klass.to_s)
173
+ ns = safe_path(ns)
174
+ end
175
+
176
+ def self.safe_path(klass)
177
+ klass.to_s.gsub("::", "_").downcase
178
+ end
179
+
180
+ def initialize(model)
181
+ @model = model
182
+ end
183
+
184
+ # Dump a Fog::Model resource. Every fog model/instance now has a +cache+ method/object injected in.
185
+ # as such you can use the #dump method to save the attributes and metadata of that instance as cache
186
+ # which can be re-used in some other session.
187
+ def dump
188
+ if !File.exist?(self.class.namespace(model.class, model.service))
189
+ self.class.create_namespace(model.class, model.service)
190
+ end
191
+
192
+ data = { :identity => model.identity,
193
+ :model_klass => model.class.to_s,
194
+ :collection_klass => model.collection && model.collection.class.to_s,
195
+ :attrs => model.attributes }
196
+
197
+ File.open(dump_to, "w") { |f| f.write(YAML.dump(data)) }
198
+ end
199
+
200
+ # the location of where to save this fog model/instance to.
201
+ def dump_to
202
+ # some fog models have an identity field that is duplicate.
203
+ # duplicate identities can mean the cache for that already exists.
204
+ # this means cache duplication is possible.
205
+ #
206
+ # see "dumping two models that have duplicate identity" test case.
207
+ name = "#{self.class.namespace(model.class, model.service)}/#{model.identity}-#{SecureRandom.hex}.yml"
208
+ end
209
+ end
210
+ end
@@ -6,7 +6,6 @@ module Fog
6
6
  extend Fog::Attributes::ClassMethods
7
7
  include Fog::Attributes::InstanceMethods
8
8
  include Fog::Core::DeprecatedConnectionAccessors
9
-
10
9
 
11
10
  attr_reader :service
12
11
 
@@ -1,4 +1,5 @@
1
1
  require "fog/core/deprecated_connection_accessors"
2
+ require "fog/core/cache"
2
3
 
3
4
  module Fog
4
5
  class Model
@@ -20,6 +21,10 @@ module Fog
20
21
  merge_attributes(attribs)
21
22
  end
22
23
 
24
+ def cache
25
+ Fog::Cache.new(self)
26
+ end
27
+
23
28
  def inspect
24
29
  Fog::Formatador.format(self)
25
30
  end
@@ -1,5 +1,5 @@
1
1
  module Fog
2
2
  module Core
3
- VERSION = "1.43.0"
3
+ VERSION = "1.44.0"
4
4
  end
5
5
  end
@@ -0,0 +1,123 @@
1
+ require "spec_helper"
2
+ require "securerandom"
3
+ require "tmpdir"
4
+
5
+ module Fog
6
+ class SubFogTestModel < Fog::Model
7
+ identity :id
8
+ end
9
+ end
10
+
11
+ module Fog
12
+ class SubFogTestService < Fog::Service
13
+
14
+ class Mock
15
+ attr_reader :options
16
+
17
+ def initialize(opts = {})
18
+ @options = opts
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ describe Fog::Cache do
25
+ before(:each) do
26
+ Fog.mock!
27
+ @service = Fog::SubFogTestService.new
28
+ Fog::Cache.namespace_prefix = "test-dir"
29
+ end
30
+
31
+ it "has a namespace_prefix configurable" do
32
+ Fog::Cache.namespace_prefix = "for-service-user-region-foo"
33
+
34
+ # Expand path does not downcase. case insensitive platform tests.
35
+ example_cache = File.expand_path(Fog::Cache.namespace(Fog::SubFogTestModel, @service)).downcase
36
+ expected_namespace = File.expand_path("~/.fog-cache/for-service-user-region-foo").downcase
37
+
38
+ puts example_cache
39
+ puts expected_namespace
40
+ assert_equal example_cache.include?(expected_namespace), true
41
+ end
42
+
43
+ it "must have a namespace_prefix configurable" do
44
+ Fog::Cache.namespace_prefix = nil
45
+ assert_raises Fog::Cache::CacheDir do
46
+ Fog::Cache.load(Fog::SubFogTestModel, @service)
47
+ end
48
+ end
49
+
50
+ it "can create a namespace" do
51
+ Fog::Cache.expire_cache!(Fog::SubFogTestModel, @service)
52
+ assert_equal File.exist?(Fog::Cache.namespace(Fog::SubFogTestModel, @service)), false
53
+
54
+ Fog::Cache.create_namespace(Fog::SubFogTestModel, @service)
55
+ assert_equal File.exist?(Fog::Cache.namespace(Fog::SubFogTestModel, @service)), true
56
+ end
57
+
58
+ it "will raise if no cache data found" do
59
+ Fog::Cache.expire_cache!(Fog::SubFogTestModel, @service)
60
+
61
+ assert_raises Fog::Cache::CacheNotFound do
62
+ Fog::Cache.load(Fog::SubFogTestModel, @service)
63
+ end
64
+ end
65
+
66
+ it "can be dumped and reloaded back in" do
67
+
68
+ Fog::Cache.expire_cache!(Fog::SubFogTestModel, @service)
69
+
70
+ id = SecureRandom.hex
71
+ a = Fog::SubFogTestModel.new(:id => id, :service => @service)
72
+
73
+ assert_equal File.exist?(Fog::Cache.namespace(Fog::SubFogTestModel, @service)), false
74
+ a.cache.dump
75
+ assert_equal File.exist?(Fog::Cache.namespace(Fog::SubFogTestModel, @service)), true
76
+
77
+ instances = Fog::Cache.load(Fog::SubFogTestModel, @service)
78
+
79
+ assert_equal instances.first.id, a.id
80
+ assert_equal instances.first.class, a.class
81
+ end
82
+
83
+ it "dumping two models that have a duplicate identity" do
84
+ Fog::Cache.expire_cache!(Fog::SubFogTestModel, @service)
85
+
86
+ id = SecureRandom.hex
87
+
88
+ # security gruops on aws for eg can have the same identity group name 'default'.
89
+ # there are no restrictions on `identity` fog attributes to be uniq.
90
+ a = Fog::SubFogTestModel.new(:id => id, :service => @service, :bar => 'bar')
91
+ b = Fog::SubFogTestModel.new(:id => id, :service => @service, :foo => 'foo')
92
+
93
+ a.cache.dump
94
+ b.cache.dump
95
+
96
+ instances = Fog::Cache.load(Fog::SubFogTestModel, @service)
97
+
98
+ assert_equal instances.size, 2
99
+ end
100
+
101
+ it "dumping two models that have a duplicate identity twice" do
102
+ Fog::Cache.expire_cache!(Fog::SubFogTestModel, @service)
103
+
104
+ id = SecureRandom.hex
105
+
106
+ # security gruops on aws for eg can have the same identity group name 'default'.
107
+ # there are no restrictions on `identity` fog attributes to be uniq.
108
+ a = Fog::SubFogTestModel.new(:id => id, :service => @service, :bar => 'bar')
109
+ b = Fog::SubFogTestModel.new(:id => id, :service => @service, :foo => 'foo')
110
+
111
+ a.cache.dump
112
+ b.cache.dump
113
+
114
+ # and then again, w/out expiring cache
115
+ a.cache.dump
116
+ b.cache.dump
117
+
118
+ instances = Fog::Cache.load(Fog::SubFogTestModel, @service)
119
+
120
+ # unique-ify based on the attributes...
121
+ assert_equal instances.size, 2
122
+ end
123
+ end
@@ -171,9 +171,10 @@ describe Fog::Service do
171
171
  end
172
172
 
173
173
  describe "when config object can configure the service itself" do
174
- it "ignores the global and it's values" do
174
+ it "ignores the global and its values" do
175
175
  @config = MiniTest::Mock.new
176
176
  def @config.config_service?; true; end
177
+ def @config.nil?; false; end
177
178
  def @config.==(other); object_id == other.object_id; end
178
179
 
179
180
  unexpected_usage = lambda { raise "Accessing global!" }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fog-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.43.0
4
+ version: 1.44.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evan Light
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-09-28 00:00:00.000000000 Z
12
+ date: 2017-04-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: builder
@@ -53,6 +53,34 @@ dependencies:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
55
  version: '0.2'
56
+ - !ruby/object:Gem::Dependency
57
+ name: xmlrpc
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: tins
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
56
84
  - !ruby/object:Gem::Dependency
57
85
  name: coveralls
58
86
  requirement: !ruby/object:Gem::Requirement
@@ -179,7 +207,8 @@ files:
179
207
  - CONTRIBUTING.md
180
208
  - CONTRIBUTORS.md
181
209
  - Gemfile
182
- - Gemfile18
210
+ - Gemfile.1.8.7
211
+ - Gemfile.1.9.3
183
212
  - LICENSE.md
184
213
  - README.md
185
214
  - Rakefile
@@ -207,6 +236,7 @@ files:
207
236
  - lib/fog/core/attributes/string.rb
208
237
  - lib/fog/core/attributes/time.rb
209
238
  - lib/fog/core/attributes/timestamp.rb
239
+ - lib/fog/core/cache.rb
210
240
  - lib/fog/core/collection.rb
211
241
  - lib/fog/core/connection.rb
212
242
  - lib/fog/core/credentials.rb
@@ -263,6 +293,7 @@ files:
263
293
  - lib/tasks/test_task.rb
264
294
  - spec/compute_spec.rb
265
295
  - spec/connection_spec.rb
296
+ - spec/core/cache_spec.rb
266
297
  - spec/core/model_spec.rb
267
298
  - spec/core/stringify_keys_spec.rb
268
299
  - spec/core/whitelist_keys_spec.rb
@@ -305,13 +336,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
305
336
  version: '0'
306
337
  requirements: []
307
338
  rubyforge_project:
308
- rubygems_version: 2.5.1
339
+ rubygems_version: 2.6.8
309
340
  signing_key:
310
341
  specification_version: 4
311
342
  summary: Shared classes and tests for fog providers and services.
312
343
  test_files:
313
344
  - spec/compute_spec.rb
314
345
  - spec/connection_spec.rb
346
+ - spec/core/cache_spec.rb
315
347
  - spec/core/model_spec.rb
316
348
  - spec/core/stringify_keys_spec.rb
317
349
  - spec/core/whitelist_keys_spec.rb
@@ -334,4 +366,3 @@ test_files:
334
366
  - spec/utils_spec.rb
335
367
  - spec/uuid_spec.rb
336
368
  - spec/wait_for_spec.rb
337
- has_rdoc: