fog-aws 3.3.0 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +10 -12
  3. data/fog-aws.gemspec +1 -1
  4. data/lib/fog/aws/compute.rb +2 -0
  5. data/lib/fog/aws/models/compute/address.rb +1 -0
  6. data/lib/fog/aws/models/compute/flavors.rb +440 -0
  7. data/lib/fog/aws/models/rds/cluster.rb +9 -1
  8. data/lib/fog/aws/models/rds/server.rb +3 -3
  9. data/lib/fog/aws/models/storage/directory.rb +35 -0
  10. data/lib/fog/aws/parsers/compute/describe_addresses.rb +30 -9
  11. data/lib/fog/aws/parsers/compute/describe_image_attribute.rb +122 -0
  12. data/lib/fog/aws/parsers/compute/describe_security_groups.rb +1 -1
  13. data/lib/fog/aws/requests/compute/describe_image_attribute.rb +74 -0
  14. data/lib/fog/aws/requests/compute/describe_security_groups.rb +12 -1
  15. data/lib/fog/aws/requests/compute/modify_instance_placement.rb +33 -0
  16. data/lib/fog/aws/requests/dns/change_resource_record_sets.rb +1 -1
  17. data/lib/fog/aws/requests/dynamodb/update_item.rb +6 -5
  18. data/lib/fog/aws/requests/storage/get_bucket_location.rb +2 -3
  19. data/lib/fog/aws/requests/storage/get_service.rb +2 -2
  20. data/lib/fog/aws/requests/storage/put_object.rb +5 -3
  21. data/lib/fog/aws/storage.rb +9 -2
  22. data/lib/fog/aws/version.rb +1 -1
  23. data/tests/credentials_tests.rb +38 -37
  24. data/tests/helper.rb +2 -2
  25. data/tests/helpers/collection_helper.rb +3 -4
  26. data/tests/helpers/compute/flavors_helper.rb +1 -5
  27. data/tests/helpers/compute/server_helper.rb +1 -3
  28. data/tests/helpers/compute/servers_helper.rb +0 -2
  29. data/tests/helpers/dns_helper.rb +32 -31
  30. data/tests/helpers/formats_helper.rb +58 -56
  31. data/tests/helpers/formats_helper_tests.rb +22 -25
  32. data/tests/helpers/mock_helper.rb +96 -96
  33. data/tests/helpers/model_helper.rb +4 -5
  34. data/tests/helpers/responds_to_helper.rb +1 -1
  35. data/tests/helpers/schema_validator_tests.rb +21 -24
  36. data/tests/helpers/succeeds_helper.rb +1 -1
  37. data/tests/parsers/compute/describe_images_tests.rb +1 -1
  38. data/tests/parsers/elb/describe_load_balancers.rb +1 -1
  39. data/tests/requests/compute/image_tests.rb +9 -0
  40. data/tests/requests/sts/assume_role_with_web_identity_tests.rb +2 -0
  41. data/tests/signaturev4_tests.rb +21 -22
  42. data/tests/signed_params_tests.rb +7 -7
  43. data/tests/storage_tests.rb +1 -1
  44. metadata +8 -6
@@ -12,7 +12,7 @@ module Fog
12
12
  # * body [Hash]:
13
13
  # * LocationConstraint [String] - Location constraint of the bucket
14
14
  #
15
- # @see http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketGETlocation.html
15
+ # @see https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETlocation.html
16
16
 
17
17
  def get_bucket_location(bucket_name)
18
18
  request({
@@ -22,8 +22,7 @@ module Fog
22
22
  :idempotent => true,
23
23
  :method => 'GET',
24
24
  :parser => Fog::Parsers::AWS::Storage::GetBucketLocation.new,
25
- :query => {'location' => nil},
26
- :path_style => true
25
+ :query => {'location' => nil}
27
26
  })
28
27
  end
29
28
  end
@@ -15,13 +15,13 @@ module Fog
15
15
  # * DisplayName [String] - Display name of bucket owner
16
16
  # * ID [String] - Id of bucket owner
17
17
  #
18
- # @see http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTServiceGET.html
18
+ # @see https://docs.aws.amazon.com/AmazonS3/latest/API/RESTServiceGET.html
19
19
  #
20
20
  def get_service
21
21
  request({
22
22
  :expects => 200,
23
23
  :headers => {},
24
- :host => @host,
24
+ :host => 's3.amazonaws.com',
25
25
  :idempotent => true,
26
26
  :method => 'GET',
27
27
  :parser => Fog::Parsers::AWS::Storage::GetService.new
@@ -18,8 +18,10 @@ module Fog
18
18
  # @option options x-amz-acl [String] Permissions, must be in ['private', 'public-read', 'public-read-write', 'authenticated-read']
19
19
  # @option options x-amz-storage-class [String] Default is 'STANDARD', set to 'REDUCED_REDUNDANCY' for non-critical, reproducable data
20
20
  # @option options x-amz-meta-#{name} Headers to be returned with object, note total size of request without body must be less than 8 KB. Each name, value pair must conform to US-ASCII.
21
- # @option options encryption [String] Sets HTTP header for server-side encryption. Set to 'AES256' for SSE-S3 and SSE-C. Set to 'aws:kms' for SSE-KMS
22
- # @option options encryption_key [String] Encryption customer key for SSE-C
21
+ # @option options x-amz-server-side-encryption [String] Sets HTTP header for server-side encryption. Set to 'AES256' for SSE-S3 and SSE-C. Set to 'aws:kms' for SSE-KMS
22
+ # @option options x-amz-server-side​-encryption​-customer-algorithm [String] Algorithm to use to when encrypting the object for SSE-C.
23
+ # @option options x-amz-server-side​-encryption​-customer-key [String] Encryption customer key for SSE-C
24
+ # @option options x-amz-server-side​-encryption​-customer-key-MD5 [String] MD5 digest of the encryption key for SSE-C
23
25
  # @option options x-amz-server-side-encryption-aws-kms-key-id [String] KMS key ID of the encryption key for SSE-KMS
24
26
  # @option options x-amz-server-side-encryption-context [String] Encryption context for SSE-KMS
25
27
  #
@@ -27,7 +29,7 @@ module Fog
27
29
  # * headers [Hash]:
28
30
  # * ETag [String] etag of new object
29
31
  #
30
- # @see http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectPUT.html
32
+ # @see https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html
31
33
 
32
34
  def self.conforming_to_us_ascii!(keys, hash)
33
35
  keys.each do |k|
@@ -6,6 +6,7 @@ module Fog
6
6
  COMPLIANT_BUCKET_NAMES = /^(?:[a-z]|\d(?!\d{0,2}(?:\.\d{1,3}){3}$))(?:[a-z0-9]|\.(?![\.\-])|\-(?![\.])){1,61}[a-z0-9]$/
7
7
 
8
8
  DEFAULT_REGION = 'us-east-1'
9
+ ACCELERATION_HOST = 's3-accelerate.amazonaws.com'
9
10
 
10
11
  DEFAULT_SCHEME = 'https'
11
12
  DEFAULT_SCHEME_PORT = {
@@ -42,7 +43,7 @@ module Fog
42
43
  ]
43
44
 
44
45
  requires :aws_access_key_id, :aws_secret_access_key
45
- recognizes :endpoint, :region, :host, :port, :scheme, :persistent, :use_iam_profile, :aws_session_token, :aws_credentials_expire_at, :path_style, :instrumentor, :instrumentor_name, :aws_signature_version
46
+ recognizes :endpoint, :region, :host, :port, :scheme, :persistent, :use_iam_profile, :aws_session_token, :aws_credentials_expire_at, :path_style, :acceleration, :instrumentor, :instrumentor_name, :aws_signature_version, :virtual_host, :cname
46
47
 
47
48
  secrets :aws_secret_access_key, :hmac
48
49
 
@@ -288,7 +289,11 @@ module Fog
288
289
  end
289
290
  end
290
291
 
291
- if path_style
292
+ # uses the bucket name as host if `virtual_host: true`, you can also
293
+ # manually specify the cname if required.
294
+ if params[:virtual_host]
295
+ host = params.fetch(:cname, bucket_name)
296
+ elsif path_style
292
297
  path = bucket_to_path bucket_name, path
293
298
  else
294
299
  host = [bucket_name, host].join('.')
@@ -499,6 +504,7 @@ module Fog
499
504
  @instrumentor_name = options[:instrumentor_name] || 'fog.aws.storage'
500
505
  @connection_options = options[:connection_options] || {}
501
506
  @persistent = options.fetch(:persistent, false)
507
+ @acceleration = options.fetch(:acceleration, false)
502
508
  @signature_version = options.fetch(:aws_signature_version, 4)
503
509
  validate_signature_version!
504
510
  @path_style = options[:path_style] || false
@@ -516,6 +522,7 @@ module Fog
516
522
  @port = options[:port] || DEFAULT_SCHEME_PORT[@scheme]
517
523
  end
518
524
 
525
+ @host = ACCELERATION_HOST if @acceleration
519
526
  setup_credentials(options)
520
527
  end
521
528
 
@@ -1,5 +1,5 @@
1
1
  module Fog
2
2
  module AWS
3
- VERSION = "3.3.0"
3
+ VERSION = "3.4.0"
4
4
  end
5
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Shindo.tests('AWS | credentials', ['aws']) do
2
4
  old_mock_value = Excon.defaults[:mock]
3
5
  fog_was_mocked = Fog.mocking?
@@ -5,8 +7,8 @@ Shindo.tests('AWS | credentials', ['aws']) do
5
7
  Fog.unmock!
6
8
  begin
7
9
  Excon.defaults[:mock] = true
8
- Excon.stub({:method => :get, :path => "/latest/meta-data/iam/security-credentials/"}, {:status => 200, :body => 'arole'})
9
- Excon.stub({:method => :get, :path => "/latest/meta-data/placement/availability-zone/"}, {:status => 200, :body => 'us-west-1a'})
10
+ Excon.stub({ method: :get, path: '/latest/meta-data/iam/security-credentials/' }, { status: 200, body: 'arole' })
11
+ Excon.stub({ method: :get, path: '/latest/meta-data/placement/availability-zone/' }, { status: 200, body: 'us-west-1a' })
10
12
 
11
13
  expires_at = Time.at(Time.now.to_i + 500)
12
14
  credentials = {
@@ -16,69 +18,68 @@ Shindo.tests('AWS | credentials', ['aws']) do
16
18
  'Expiration' => expires_at.xmlschema
17
19
  }
18
20
 
19
- Excon.stub({:method => :get, :path => "/latest/meta-data/iam/security-credentials/arole"}, {:status => 200, :body => Fog::JSON.encode(credentials)})
21
+ Excon.stub({ method: :get, path: '/latest/meta-data/iam/security-credentials/arole' }, { status: 200, body: Fog::JSON.encode(credentials) })
20
22
 
21
- tests("#fetch_credentials") do
22
- returns({:aws_access_key_id => 'dummykey',
23
- :aws_secret_access_key => 'dummysecret',
24
- :aws_session_token => 'dummytoken',
25
- :region => "us-west-1",
26
- :aws_credentials_expire_at => expires_at}) { Fog::AWS::Compute.fetch_credentials(:use_iam_profile => true) }
23
+ tests('#fetch_credentials') do
24
+ returns(aws_access_key_id: 'dummykey',
25
+ aws_secret_access_key: 'dummysecret',
26
+ aws_session_token: 'dummytoken',
27
+ region: 'us-west-1',
28
+ aws_credentials_expire_at: expires_at) { Fog::AWS::Compute.fetch_credentials(use_iam_profile: true) }
27
29
  end
28
30
 
29
- ENV["AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"] = '/v1/credentials?id=task_id'
30
- Excon.stub({:method => :get, :path => '/v1/credentials?id=task_id'}, {:status => 200, :body => Fog::JSON.encode(credentials)})
31
+ ENV['AWS_CONTAINER_CREDENTIALS_RELATIVE_URI'] = '/v1/credentials?id=task_id'
32
+ Excon.stub({ method: :get, path: '/v1/credentials?id=task_id' }, { status: 200, body: Fog::JSON.encode(credentials) })
31
33
 
32
- tests("#fetch_credentials") do
33
- returns({:aws_access_key_id => 'dummykey',
34
- :aws_secret_access_key => 'dummysecret',
35
- :aws_session_token => 'dummytoken',
36
- :region => "us-west-1",
37
- :aws_credentials_expire_at => expires_at}) { Fog::AWS::Compute.fetch_credentials(:use_iam_profile => true) }
34
+ tests('#fetch_credentials') do
35
+ returns(aws_access_key_id: 'dummykey',
36
+ aws_secret_access_key: 'dummysecret',
37
+ aws_session_token: 'dummytoken',
38
+ region: 'us-west-1',
39
+ aws_credentials_expire_at: expires_at) { Fog::AWS::Compute.fetch_credentials(use_iam_profile: true) }
38
40
  end
39
41
 
40
- ENV["AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"] = nil
42
+ ENV['AWS_CONTAINER_CREDENTIALS_RELATIVE_URI'] = nil
41
43
 
42
- compute = Fog::AWS::Compute.new(:use_iam_profile => true)
44
+ compute = Fog::AWS::Compute.new(use_iam_profile: true)
43
45
 
44
- tests("#refresh_credentials_if_expired") do
45
- returns(nil){compute.refresh_credentials_if_expired}
46
+ tests('#refresh_credentials_if_expired') do
47
+ returns(nil) { compute.refresh_credentials_if_expired }
46
48
  end
47
49
 
48
50
  credentials['AccessKeyId'] = 'newkey'
49
51
  credentials['SecretAccessKey'] = 'newsecret'
50
52
  credentials['Expiration'] = (expires_at + 10).xmlschema
51
53
 
52
- Excon.stub({:method => :get, :path => "/latest/meta-data/iam/security-credentials/arole"}, {:status => 200, :body => Fog::JSON.encode(credentials)})
54
+ Excon.stub({ method: :get, path: '/latest/meta-data/iam/security-credentials/arole' }, { status: 200, body: Fog::JSON.encode(credentials) })
53
55
 
54
56
  Fog::Time.now = expires_at + 1
55
- tests("#refresh_credentials_if_expired") do
56
- returns(true){compute.refresh_credentials_if_expired}
57
- returns("newkey"){ compute.instance_variable_get(:@aws_access_key_id)}
57
+ tests('#refresh_credentials_if_expired') do
58
+ returns(true) { compute.refresh_credentials_if_expired }
59
+ returns('newkey') { compute.instance_variable_get(:@aws_access_key_id) }
58
60
  end
59
61
  Fog::Time.now = Time.now
60
62
 
61
63
  default_credentials = Fog::AWS::Compute.fetch_credentials({})
62
- tests("#fetch_credentials when the url 404s") do
63
- Excon.stub({:method => :get, :path => "/latest/meta-data/iam/security-credentials/"}, {:status => 404, :body => 'not bound'})
64
- Excon.stub({:method => :get, :path => "/latest/meta-data/placement/availability-zone/"}, {:status => 400, :body => 'not found'})
65
- returns(default_credentials) {Fog::AWS::Compute.fetch_credentials(:use_iam_profile => true)}
64
+ tests('#fetch_credentials when the url 404s') do
65
+ Excon.stub({ method: :get, path: '/latest/meta-data/iam/security-credentials/' }, { status: 404, body: 'not bound' })
66
+ Excon.stub({ method: :get, path: '/latest/meta-data/placement/availability-zone/' }, { status: 400, body: 'not found' })
67
+ returns(default_credentials) { Fog::AWS::Compute.fetch_credentials(use_iam_profile: true) }
66
68
  end
67
69
 
68
70
  mocked_credentials = {
69
- :aws_access_key_id => "access-key-id",
70
- :aws_secret_access_key => "secret-access-key",
71
- :aws_session_token => "session-token",
72
- :aws_credentials_expire_at => Time.at(Time.now.to_i + 500).xmlschema
71
+ aws_access_key_id: 'access-key-id',
72
+ aws_secret_access_key: 'secret-access-key',
73
+ aws_session_token: 'session-token',
74
+ aws_credentials_expire_at: Time.at(Time.now.to_i + 500).xmlschema
73
75
  }
74
- tests("#fetch_credentials when mocking") do
76
+ tests('#fetch_credentials when mocking') do
75
77
  Fog.mock!
76
78
  Fog::AWS::Compute::Mock.data[:iam_role_based_creds] = mocked_credentials
77
- returns(mocked_credentials) {Fog::AWS::Compute.fetch_credentials(:use_iam_profile => true)}
79
+ returns(mocked_credentials) { Fog::AWS::Compute.fetch_credentials(use_iam_profile: true) }
78
80
  end
79
-
80
81
  ensure
81
- ENV["AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"] = nil
82
+ ENV['AWS_CONTAINER_CREDENTIALS_RELATIVE_URI'] = nil
82
83
  Excon.stubs.clear
83
84
  Excon.defaults[:mock] = old_mock_value
84
85
  Fog.mock! if fog_was_mocked
@@ -1,7 +1,7 @@
1
1
  begin
2
2
  require 'simplecov'
3
3
  SimpleCov.start
4
- SimpleCov.command_name "Shindo"
4
+ SimpleCov.command_name 'Shindo'
5
5
  rescue LoadError => e
6
6
  $stderr.puts "not recording test coverage: #{e.inspect}"
7
7
  end
@@ -10,7 +10,7 @@ require File.expand_path('../../lib/fog/aws', __FILE__)
10
10
 
11
11
  Bundler.require(:test)
12
12
 
13
- Excon.defaults.merge!(:debug_request => true, :debug_response => true)
13
+ Excon.defaults.merge!(debug_request: true, debug_response: true)
14
14
 
15
15
  require File.expand_path(File.join(File.dirname(__FILE__), 'helpers', 'mock_helper'))
16
16
 
@@ -1,6 +1,5 @@
1
1
  def collection_tests(collection, params = {}, mocks_implemented = true)
2
2
  tests('success') do
3
-
4
3
  tests("#new(#{params.inspect})").succeeds do
5
4
  pending if Fog.mocking? && !mocks_implemented
6
5
  collection.new(params)
@@ -34,7 +33,7 @@ def collection_tests(collection, params = {}, mocks_implemented = true)
34
33
  pending if Fog.mocking? && !mocks_implemented
35
34
 
36
35
  methods = [
37
- 'all?', 'any?', 'find', 'detect', 'collect', 'map',
36
+ 'all?', 'any?', 'find', 'detect', 'collect', 'map',
38
37
  'find_index', 'flat_map', 'collect_concat', 'group_by',
39
38
  'none?', 'one?'
40
39
  ]
@@ -43,7 +42,7 @@ def collection_tests(collection, params = {}, mocks_implemented = true)
43
42
  if collection.respond_to?(enum_method)
44
43
  tests("##{enum_method}").succeeds do
45
44
  block_called = false
46
- collection.send(enum_method) {|x| block_called = true }
45
+ collection.send(enum_method) { block_called = true }
47
46
  block_called
48
47
  end
49
48
  end
@@ -55,7 +54,7 @@ def collection_tests(collection, params = {}, mocks_implemented = true)
55
54
  if collection.respond_to?(enum_method)
56
55
  tests("##{enum_method}").succeeds do
57
56
  block_called = false
58
- collection.send(enum_method) {|x| block_called = true; 0 }
57
+ collection.send(enum_method) { block_called = true; 0 }
59
58
  block_called
60
59
  end
61
60
  end
@@ -1,7 +1,6 @@
1
1
  def flavors_tests(connection, params = {}, mocks_implemented = true)
2
2
  tests('success') do
3
-
4
- tests("#all").succeeds do
3
+ tests('#all').succeeds do
5
4
  pending if Fog.mocking? && !mocks_implemented
6
5
  connection.flavors.all
7
6
  end
@@ -14,11 +13,9 @@ def flavors_tests(connection, params = {}, mocks_implemented = true)
14
13
  pending if Fog.mocking? && !mocks_implemented
15
14
  connection.flavors.get(@identity)
16
15
  end
17
-
18
16
  end
19
17
 
20
18
  tests('failure') do
21
-
22
19
  if !Fog.mocking? || mocks_implemented
23
20
  invalid_flavor_identity = connection.flavors.first.identity.to_s.gsub(/\w/, '0')
24
21
  end
@@ -27,6 +24,5 @@ def flavors_tests(connection, params = {}, mocks_implemented = true)
27
24
  pending if Fog.mocking? && !mocks_implemented
28
25
  connection.flavors.get(invalid_flavor_identity)
29
26
  end
30
-
31
27
  end
32
28
  end
@@ -1,6 +1,5 @@
1
1
  def server_tests(connection, params = {}, mocks_implemented = true)
2
2
  model_tests(connection.servers, params, mocks_implemented) do
3
-
4
3
  tests('#reload').returns(true) do
5
4
  pending if Fog.mocking? && !mocks_implemented
6
5
  @instance.wait_for { ready? }
@@ -8,7 +7,7 @@ def server_tests(connection, params = {}, mocks_implemented = true)
8
7
  !identity.nil? && identity == @instance.reload.identity
9
8
  end
10
9
 
11
- responds_to([:ready?, :state])
10
+ responds_to(%i[ready state])
12
11
  yield if block_given?
13
12
 
14
13
  tests('#reboot').succeeds do
@@ -20,6 +19,5 @@ def server_tests(connection, params = {}, mocks_implemented = true)
20
19
  if !Fog.mocking? || mocks_implemented
21
20
  @instance.wait_for { ready? }
22
21
  end
23
-
24
22
  end
25
23
  end
@@ -1,10 +1,8 @@
1
1
  def servers_tests(connection, params = {}, mocks_implemented = true)
2
2
  collection_tests(connection.servers, params, mocks_implemented) do
3
-
4
3
  if !Fog.mocking? || mocks_implemented
5
4
  @instance.wait_for { ready? }
6
5
  yield if block_given?
7
6
  end
8
-
9
7
  end
10
8
  end
@@ -1,54 +1,55 @@
1
1
  def dns_providers
2
2
  {
3
- :aws => {
4
- :mocked => false
3
+ aws: {
4
+ mocked: false
5
5
  },
6
- :bluebox => {
7
- :mocked => false,
8
- :zone_attributes => {
9
- :ttl => 60
6
+ bluebox: {
7
+ mocked: false,
8
+ zone_attributes: {
9
+ ttl: 60
10
10
  }
11
11
  },
12
- :dnsimple => {
13
- :mocked => false
12
+ dnsimple: {
13
+ mocked: false
14
14
  },
15
- :dnsmadeeasy => {
16
- :mocked => false
15
+ dnsmadeeasy: {
16
+ mocked: false
17
17
  },
18
- :dynect => {
19
- :mocked => false,
20
- :zone_attributes => {
21
- :email => 'fog@example.com'
18
+ dynect: {
19
+ mocked: false,
20
+ zone_attributes: {
21
+ email: 'fog@example.com'
22
22
  }
23
23
  },
24
- :linode => {
25
- :mocked => false,
26
- :zone_attributes => {
27
- :email => 'fog@example.com'
24
+ linode: {
25
+ mocked: false,
26
+ zone_attributes: {
27
+ email: 'fog@example.com'
28
28
  }
29
29
  },
30
- :zerigo => {
31
- :mocked => false
30
+ zerigo: {
31
+ mocked: false
32
32
  },
33
- :rackspace => {
34
- :mocked => false,
35
- :zone_attributes => {
36
- :email => 'fog@example.com'
33
+ rackspace: {
34
+ mocked: false,
35
+ zone_attributes: {
36
+ email: 'fog@example.com'
37
37
  }
38
38
  },
39
- :rage4 => {
40
- :mocked => false
39
+ rage4: {
40
+ mocked: false
41
41
  }
42
42
  }
43
43
  end
44
44
 
45
- def generate_unique_domain( with_trailing_dot = false)
46
- #get time (with 1/100th of sec accuracy)
47
- #want unique domain name and if provider is fast, this can be called more than once per second
48
- time= (Time.now.to_f * 100).to_i
45
+ def generate_unique_domain(with_trailing_dot = false)
46
+ # get time (with 1/100th of sec accuracy)
47
+ # want unique domain name and if provider is fast,
48
+ # this can be called more than once per second
49
+ time = (Time.now.to_f * 100).to_i
49
50
  domain = 'test-' + time.to_s + '.com'
50
51
  if with_trailing_dot
51
- domain+= '.'
52
+ domain += '.'
52
53
  end
53
54
 
54
55
  domain
@@ -1,4 +1,6 @@
1
- require "fog/schema/data_validator"
1
+ # frozen_string_literal: true
2
+
3
+ require 'fog/schema/data_validator'
2
4
 
3
5
  # format related hackery
4
6
  # allows both true.is_a?(Fog::Boolean) and false.is_a?(Fog::Boolean)
@@ -15,62 +17,62 @@ module Fog
15
17
  module Array; end
16
18
  end
17
19
  end
18
- [FalseClass, TrueClass].each {|klass| klass.send(:include, Fog::Boolean)}
19
- [FalseClass, TrueClass, NilClass, Fog::Boolean].each {|klass| klass.send(:include, Fog::Nullable::Boolean)}
20
- [NilClass, String].each {|klass| klass.send(:include, Fog::Nullable::String)}
21
- [NilClass, Time].each {|klass| klass.send(:include, Fog::Nullable::Time)}
22
- [Integer, NilClass].each {|klass| klass.send(:include, Fog::Nullable::Integer)}
23
- [Float, NilClass].each {|klass| klass.send(:include, Fog::Nullable::Float)}
24
- [Hash, NilClass].each {|klass| klass.send(:include, Fog::Nullable::Hash)}
25
- [Array, NilClass].each {|klass| klass.send(:include, Fog::Nullable::Array)}
20
+ [FalseClass, TrueClass].each { |klass| klass.send(:include, Fog::Boolean) }
21
+ [FalseClass, TrueClass, NilClass, Fog::Boolean].each { |klass| klass.send(:include, Fog::Nullable::Boolean) }
22
+ [NilClass, String].each { |klass| klass.send(:include, Fog::Nullable::String) }
23
+ [NilClass, Time].each { |klass| klass.send(:include, Fog::Nullable::Time) }
24
+ [Integer, NilClass].each { |klass| klass.send(:include, Fog::Nullable::Integer) }
25
+ [Float, NilClass].each { |klass| klass.send(:include, Fog::Nullable::Float) }
26
+ [Hash, NilClass].each { |klass| klass.send(:include, Fog::Nullable::Hash) }
27
+ [Array, NilClass].each { |klass| klass.send(:include, Fog::Nullable::Array) }
26
28
 
27
29
  module Shindo
30
+ # Generates a Shindo test that compares a hash schema to the result
31
+ # of the passed in block returning true if they match.
32
+ #
33
+ # The schema that is passed in is a Hash or Array of hashes that
34
+ # have Classes in place of values. When checking the schema the
35
+ # value should match the Class.
36
+ #
37
+ # Strict mode will fail if the data has additional keys. Setting
38
+ # +strict+ to +false+ will allow additional keys to appear.
39
+ #
40
+ # @param [Hash] schema A Hash schema
41
+ # @param [Hash] options Options to change validation rules
42
+ # @option options [Boolean] :allow_extra_keys
43
+ # If +true+ does not fail when keys are in the data that are
44
+ # not specified in the schema. This allows new values to
45
+ # appear in API output without breaking the check.
46
+ # @option options [Boolean] :allow_optional_rules
47
+ # If +true+ does not fail if extra keys are in the schema
48
+ # that do not match the data. Not recommended!
49
+ # @yield Data to check with schema
50
+ #
51
+ # @example Using in a test
52
+ # Shindo.tests("comparing welcome data against schema") do
53
+ # data = {:welcome => "Hello" }
54
+ # data_matches_schema(:welcome => String) { data }
55
+ # end
56
+ #
57
+ # comparing welcome data against schema
58
+ # + data matches schema
59
+ #
60
+ # @example Example schema
61
+ # {
62
+ # "id" => String,
63
+ # "ram" => Integer,
64
+ # "disks" => [
65
+ # {
66
+ # "size" => Float
67
+ # }
68
+ # ],
69
+ # "dns_name" => Fog::Nullable::String,
70
+ # "active" => Fog::Boolean,
71
+ # "created" => DateTime
72
+ # }
73
+ #
74
+ # @return [Boolean]
28
75
  class Tests
29
- # Generates a Shindo test that compares a hash schema to the result
30
- # of the passed in block returning true if they match.
31
- #
32
- # The schema that is passed in is a Hash or Array of hashes that
33
- # have Classes in place of values. When checking the schema the
34
- # value should match the Class.
35
- #
36
- # Strict mode will fail if the data has additional keys. Setting
37
- # +strict+ to +false+ will allow additional keys to appear.
38
- #
39
- # @param [Hash] schema A Hash schema
40
- # @param [Hash] options Options to change validation rules
41
- # @option options [Boolean] :allow_extra_keys
42
- # If +true+ does not fail when keys are in the data that are
43
- # not specified in the schema. This allows new values to
44
- # appear in API output without breaking the check.
45
- # @option options [Boolean] :allow_optional_rules
46
- # If +true+ does not fail if extra keys are in the schema
47
- # that do not match the data. Not recommended!
48
- # @yield Data to check with schema
49
- #
50
- # @example Using in a test
51
- # Shindo.tests("comparing welcome data against schema") do
52
- # data = {:welcome => "Hello" }
53
- # data_matches_schema(:welcome => String) { data }
54
- # end
55
- #
56
- # comparing welcome data against schema
57
- # + data matches schema
58
- #
59
- # @example Example schema
60
- # {
61
- # "id" => String,
62
- # "ram" => Integer,
63
- # "disks" => [
64
- # {
65
- # "size" => Float
66
- # }
67
- # ],
68
- # "dns_name" => Fog::Nullable::String,
69
- # "active" => Fog::Boolean,
70
- # "created" => DateTime
71
- # }
72
- #
73
- # @return [Boolean]
74
76
  def data_matches_schema(schema, options = {})
75
77
  test('data matches schema') do
76
78
  validator = Fog::Schema::DataValidator.new
@@ -84,9 +86,9 @@ module Shindo
84
86
  def formats(format, strict = true)
85
87
  test('has proper format') do
86
88
  if strict
87
- options = {:allow_extra_keys => false, :allow_optional_rules => true}
89
+ options = { allow_extra_keys: false, allow_optional_rules: true }
88
90
  else
89
- options = {:allow_extra_keys => true, :allow_optional_rules => true}
91
+ options = { allow_extra_keys: true, allow_optional_rules: true }
90
92
  end
91
93
  validator = Fog::Schema::DataValidator.new
92
94
  valid = validator.validate(yield, format, options)