fog-digitalocean 0.1.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 (152) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.document +3 -0
  4. data/.gitignore +30 -0
  5. data/.irbrc +82 -0
  6. data/.rubocop.yml +20 -0
  7. data/.rubocop_todo.yml +606 -0
  8. data/.travis.yml +35 -0
  9. data/CHANGELOG.md +3 -0
  10. data/CONTRIBUTING.md +276 -0
  11. data/CONTRIBUTORS.md +898 -0
  12. data/Gemfile +5 -0
  13. data/LICENSE.md +20 -0
  14. data/README.md +130 -0
  15. data/RELEASE.md +40 -0
  16. data/Rakefile +12 -0
  17. data/benchs/each_provider.sh +6 -0
  18. data/benchs/each_service.sh +6 -0
  19. data/benchs/fog_vs.rb +106 -0
  20. data/benchs/load_times.rb +37 -0
  21. data/benchs/params.rb +43 -0
  22. data/benchs/parse_vs_push.rb +67 -0
  23. data/bin/fog +78 -0
  24. data/fog-digitalocean.gemspec +61 -0
  25. data/gemfiles/Gemfile-edge +14 -0
  26. data/lib/fog/digitalocean.rb +1 -0
  27. data/lib/fog/digitalocean/CHANGELOG.md +6 -0
  28. data/lib/fog/digitalocean/compute.rb +109 -0
  29. data/lib/fog/digitalocean/core.rb +9 -0
  30. data/lib/fog/digitalocean/examples/getting_started.md +123 -0
  31. data/lib/fog/digitalocean/models/compute/flavor.rb +17 -0
  32. data/lib/fog/digitalocean/models/compute/flavors.rb +21 -0
  33. data/lib/fog/digitalocean/models/compute/image.rb +25 -0
  34. data/lib/fog/digitalocean/models/compute/images.rb +42 -0
  35. data/lib/fog/digitalocean/models/compute/region.rb +13 -0
  36. data/lib/fog/digitalocean/models/compute/regions.rb +21 -0
  37. data/lib/fog/digitalocean/models/compute/server.rb +170 -0
  38. data/lib/fog/digitalocean/models/compute/servers.rb +43 -0
  39. data/lib/fog/digitalocean/models/compute/ssh_key.rb +31 -0
  40. data/lib/fog/digitalocean/models/compute/ssh_keys.rb +40 -0
  41. data/lib/fog/digitalocean/models/paging_collection.rb +42 -0
  42. data/lib/fog/digitalocean/requests/compute/change_kernel.rb +44 -0
  43. data/lib/fog/digitalocean/requests/compute/convert_to_snapshot.rb +44 -0
  44. data/lib/fog/digitalocean/requests/compute/create_server.rb +93 -0
  45. data/lib/fog/digitalocean/requests/compute/create_ssh_key.rb +49 -0
  46. data/lib/fog/digitalocean/requests/compute/delete_ssh_key.rb +32 -0
  47. data/lib/fog/digitalocean/requests/compute/destroy_server.rb +35 -0
  48. data/lib/fog/digitalocean/requests/compute/disable_backups.rb +45 -0
  49. data/lib/fog/digitalocean/requests/compute/enable_ipv6.rb +44 -0
  50. data/lib/fog/digitalocean/requests/compute/enable_private_networking.rb +44 -0
  51. data/lib/fog/digitalocean/requests/compute/get_droplet_action.rb +36 -0
  52. data/lib/fog/digitalocean/requests/compute/get_image_details.rb +42 -0
  53. data/lib/fog/digitalocean/requests/compute/get_server_details.rb +84 -0
  54. data/lib/fog/digitalocean/requests/compute/get_ssh_key.rb +34 -0
  55. data/lib/fog/digitalocean/requests/compute/list_droplet_actions.rb +38 -0
  56. data/lib/fog/digitalocean/requests/compute/list_flavors.rb +132 -0
  57. data/lib/fog/digitalocean/requests/compute/list_images.rb +51 -0
  58. data/lib/fog/digitalocean/requests/compute/list_regions.rb +95 -0
  59. data/lib/fog/digitalocean/requests/compute/list_servers.rb +33 -0
  60. data/lib/fog/digitalocean/requests/compute/list_ssh_keys.rb +41 -0
  61. data/lib/fog/digitalocean/requests/compute/password_reset.rb +44 -0
  62. data/lib/fog/digitalocean/requests/compute/power_cycle.rb +44 -0
  63. data/lib/fog/digitalocean/requests/compute/power_off.rb +44 -0
  64. data/lib/fog/digitalocean/requests/compute/power_on.rb +44 -0
  65. data/lib/fog/digitalocean/requests/compute/reboot_server.rb +44 -0
  66. data/lib/fog/digitalocean/requests/compute/rebuild.rb +44 -0
  67. data/lib/fog/digitalocean/requests/compute/rename.rb +44 -0
  68. data/lib/fog/digitalocean/requests/compute/resize.rb +48 -0
  69. data/lib/fog/digitalocean/requests/compute/restore.rb +44 -0
  70. data/lib/fog/digitalocean/requests/compute/shutdown.rb +44 -0
  71. data/lib/fog/digitalocean/requests/compute/snapshot.rb +44 -0
  72. data/lib/fog/digitalocean/requests/compute/transfer_image.rb +44 -0
  73. data/lib/fog/digitalocean/requests/compute/update_ssh_key.rb +46 -0
  74. data/lib/fog/digitalocean/requests/compute/upgrade.rb +44 -0
  75. data/lib/fog/digitalocean/service.rb +51 -0
  76. data/lib/fog/digitalocean/version.rb +5 -0
  77. data/spec/fog/account_spec.rb +14 -0
  78. data/spec/fog/billing_spec.rb +14 -0
  79. data/spec/fog/bin/atmos_spec.rb +33 -0
  80. data/spec/fog/bin/aws_spec.rb +98 -0
  81. data/spec/fog/bin/baremetalcloud_spec.rb +33 -0
  82. data/spec/fog/bin/bluebox_spec.rb +55 -0
  83. data/spec/fog/bin/brightbox_spec.rb +30 -0
  84. data/spec/fog/bin/clodo_spec.rb +9 -0
  85. data/spec/fog/bin/cloudsigma_spec.rb +9 -0
  86. data/spec/fog/bin/cloudstack_spec.rb +9 -0
  87. data/spec/fog/bin/digitalocean_spec.rb +9 -0
  88. data/spec/fog/bin/dnsimple_spec.rb +9 -0
  89. data/spec/fog/bin/dnsmadeeasy_spec.rb +9 -0
  90. data/spec/fog/bin/dreamhost_spec.rb +9 -0
  91. data/spec/fog/bin/dynect_spec.rb +9 -0
  92. data/spec/fog/bin/ecloud_spec.rb +10 -0
  93. data/spec/fog/bin/fogdocker_spec.rb +10 -0
  94. data/spec/fog/bin/glesys_spec.rb +10 -0
  95. data/spec/fog/bin/gogrid_spec.rb +10 -0
  96. data/spec/fog/bin/google_spec.rb +10 -0
  97. data/spec/fog/bin/ibm_spec.rb +10 -0
  98. data/spec/fog/bin/internetarchive_spec.rb +10 -0
  99. data/spec/fog/bin/joyent_spec.rb +10 -0
  100. data/spec/fog/bin/linode_spec.rb +10 -0
  101. data/spec/fog/bin/local_spec.rb +10 -0
  102. data/spec/fog/bin/ninefold_spec.rb +10 -0
  103. data/spec/fog/bin/opennebula_spec.rb +10 -0
  104. data/spec/fog/bin/openstack_spec.rb +10 -0
  105. data/spec/fog/bin/openvz_spec.rb +10 -0
  106. data/spec/fog/bin/ovirt_spec.rb +10 -0
  107. data/spec/fog/bin/powerdns_spec.rb +9 -0
  108. data/spec/fog/bin/profitbricks_spec.rb +10 -0
  109. data/spec/fog/bin/rackspace_spec.rb +10 -0
  110. data/spec/fog/bin/rage4_spec.rb +10 -0
  111. data/spec/fog/bin/riakcs_spec.rb +10 -0
  112. data/spec/fog/bin/sakuracloud_spec.rb +10 -0
  113. data/spec/fog/bin/serverlove_spec.rb +10 -0
  114. data/spec/fog/bin/softlayer_spec.rb +10 -0
  115. data/spec/fog/bin/stormondemand_spec.rb +10 -0
  116. data/spec/fog/bin/vcloud_spec.rb +10 -0
  117. data/spec/fog/bin/vclouddirector_spec.rb +10 -0
  118. data/spec/fog/bin/vmfusion_spec.rb +10 -0
  119. data/spec/fog/bin/voxel_spec.rb +10 -0
  120. data/spec/fog/bin/vsphere_spec.rb +10 -0
  121. data/spec/fog/bin/xenserver_spec.rb +10 -0
  122. data/spec/fog/bin/zerigo_spec.rb +10 -0
  123. data/spec/fog/bin_spec.rb +161 -0
  124. data/spec/fog/cdn_spec.rb +14 -0
  125. data/spec/fog/compute_spec.rb +19 -0
  126. data/spec/fog/dns_spec.rb +19 -0
  127. data/spec/fog/identity_spec.rb +14 -0
  128. data/spec/fog/image_spec.rb +14 -0
  129. data/spec/fog/metering_spec.rb +14 -0
  130. data/spec/fog/monitoring_spec.rb +14 -0
  131. data/spec/fog/network_spec.rb +14 -0
  132. data/spec/fog/orchestration_spec.rb +14 -0
  133. data/spec/fog/storage_spec.rb +14 -0
  134. data/spec/fog/support_spec.rb +14 -0
  135. data/spec/fog/volume_spec.rb +14 -0
  136. data/spec/fog/vpn_spec.rb +14 -0
  137. data/spec/fog/xml/connection_spec.rb +33 -0
  138. data/spec/helpers/bin.rb +34 -0
  139. data/spec/spec_helper.rb +18 -0
  140. data/tests/digitalocean/helper.rb +56 -0
  141. data/tests/digitalocean/requests/compute/list_flavors_tests.rb +25 -0
  142. data/tests/digitalocean/requests/compute/list_images_tests.rb +25 -0
  143. data/tests/digitalocean/requests/compute/list_regions_tests.rb +21 -0
  144. data/tests/digitalocean/requests/compute/server_tests.rb +77 -0
  145. data/tests/digitalocean/requests/compute_v2/list_ssh_keys_tests.rb +20 -0
  146. data/tests/helper.rb +25 -0
  147. data/tests/helpers/format_helper.rb +100 -0
  148. data/tests/helpers/mock_helper.rb +14 -0
  149. data/tests/helpers/succeeds_helper.rb +10 -0
  150. data/tests/lorem.txt +1 -0
  151. data/tests/watchr.rb +22 -0
  152. metadata +428 -0
@@ -0,0 +1,14 @@
1
+ require "spec_helper"
2
+
3
+ describe Fog::Support do
4
+ Fog::Support.providers.each do |provider|
5
+ describe "when #{provider} is passed with no available credentials" do
6
+ it "returns ArgumentError" do
7
+ # Stub credentials so you still see errors where the tester really has credentials
8
+ Fog.stub :credentials, {} do
9
+ assert_raises(ArgumentError) { Fog::Support[provider] }
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require "spec_helper"
2
+
3
+ describe Fog::Volume do
4
+ Fog::Volume.providers.each do |provider|
5
+ describe "when #{provider} is passed with no available credentials" do
6
+ it "returns ArgumentError" do
7
+ # Stub credentials so you still see errors where the tester really has credentials
8
+ Fog.stub :credentials, {} do
9
+ assert_raises(ArgumentError) { Fog::Volume[provider] }
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require "spec_helper"
2
+
3
+ describe Fog::VPN do
4
+ Fog::VPN.providers.each do |provider|
5
+ describe "when #{provider} is passed with no available credentials" do
6
+ it "returns ArgumentError" do
7
+ # Stub credentials so you still see errors where the tester really has credentials
8
+ Fog.stub :credentials, {} do
9
+ assert_raises(ArgumentError) { Fog::VPN[provider] }
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,33 @@
1
+ require "spec_helper"
2
+
3
+ # @note This is going to be part of fog-xml eventually
4
+ describe Fog::XML::Connection do
5
+ before do
6
+ @connection = Fog::XML::Connection.new("http://localhost")
7
+ end
8
+
9
+ after do
10
+ Excon.stubs.clear
11
+ end
12
+
13
+ it "responds to #request" do
14
+ assert_respond_to @connection, :request
15
+ end
16
+
17
+ describe "when request is passed a parser" do
18
+ it "returns the body after parsing" do
19
+ @parser = Fog::ToHashDocument.new
20
+ Excon.stub({}, { :status => 200, :body => "<xml></xml>" })
21
+ response = @connection.request(:parser => @parser, :mock => true)
22
+ assert_equal({ :xml => "" }, response.body)
23
+ end
24
+ end
25
+
26
+ describe "when request excludes a parser" do
27
+ it "returns the response body without change" do
28
+ Excon.stub({}, { :status => 200, :body => "<xml></xml>" })
29
+ response = @connection.request(:mock => true)
30
+ assert_equal("<xml></xml>", response.body)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,34 @@
1
+ module Fog
2
+ module BinSpec
3
+ extend Minitest::Spec::DSL
4
+
5
+ it "responds to available?" do
6
+ assert_respond_to subject, :available?
7
+ end
8
+
9
+ it "responds to class_for" do
10
+ assert_respond_to subject, :class_for
11
+ end
12
+
13
+ it "#class_for raises ArgumentError for unknown services" do
14
+ assert_raises(ArgumentError) { subject.class_for(:unknown) }
15
+ end
16
+
17
+ it "responds to collections" do
18
+ skip if subject == ::Google
19
+ assert_respond_to subject, :collections
20
+ end
21
+
22
+ it "responds to []" do
23
+ assert_respond_to subject, :[]
24
+ end
25
+
26
+ it "#[] when unknown service is passed raises ArgumentError" do
27
+ assert_raises(ArgumentError) { subject[:bad_service] }
28
+ end
29
+
30
+ it "responds to services" do
31
+ assert_respond_to subject, :services
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,18 @@
1
+ require 'coveralls'
2
+ Coveralls.wear!
3
+
4
+ if ENV["COVERAGE"]
5
+ require "simplecov"
6
+
7
+ SimpleCov.start do
8
+ add_filter "/spec/"
9
+ end
10
+ end
11
+
12
+ require "minitest/autorun"
13
+ require "minitest/spec"
14
+ require "minitest/stub_const"
15
+
16
+ $LOAD_PATH.unshift "lib"
17
+
18
+ require "fog/digitalocean"
@@ -0,0 +1,56 @@
1
+
2
+ # Shortcut for Fog::Compute[:digitalocean]
3
+ def service
4
+ Fog::Compute[:digitalocean]
5
+ end
6
+
7
+ def fog_test_server_attributes
8
+ # Hard coding numbers because requests from tests are sometimes failing.
9
+ # TODO: Mock properly instead
10
+ image = service.images.find { |i| i.name == 'Ubuntu 13.10 x64' }
11
+ image_id = image.nil? ? 1505447 : image.id
12
+ region = service.regions.find { |r| r.name == 'New York 1' }
13
+ region_id = region.nil? ? 4 : region.id
14
+ flavor = service.flavors.find { |r| r.name == '512MB' }
15
+ flavor_id = flavor.nil? ? 66 : flavor.id
16
+
17
+ {
18
+ :image_id => image_id,
19
+ :region_id => region_id,
20
+ :flavor_id => flavor_id
21
+ }
22
+ end
23
+
24
+ def fog_server_name
25
+ "fog-server-test"
26
+ end
27
+
28
+ # Create a long lived server for the tests
29
+ def fog_test_server
30
+ server = service.servers.find { |s| s.name == fog_server_name }
31
+ unless server
32
+ server = service.servers.create({
33
+ :name => fog_server_name
34
+ }.merge(fog_test_server_attributes))
35
+ server.wait_for { ready? }
36
+ end
37
+ server
38
+ end
39
+
40
+ # Destroy the long lived server
41
+ def fog_test_server_destroy
42
+ server = service.servers.find { |s| s.name == fog_server_name }
43
+ server.destroy if server
44
+ end
45
+
46
+ at_exit do
47
+ unless Fog.mocking? || Fog.credentials[:digitalocean_api_key].nil?
48
+ server = service.servers.find { |s| s.name == fog_server_name }
49
+ if server
50
+ server.wait_for(120) do
51
+ reload rescue nil; ready?
52
+ end
53
+ end
54
+ fog_test_server_destroy
55
+ end
56
+ end
@@ -0,0 +1,25 @@
1
+ Shindo.tests('Fog::Compute::DigitalOcean | list_flavors request', ['digitalocean', 'compute']) do
2
+ service = Fog::Compute.new(:provider => 'DigitalOcean')
3
+
4
+ size_format = {
5
+ 'slug' => String,
6
+ 'memory' => Integer,
7
+ 'vcpus' => Integer,
8
+ 'disk' => Integer,
9
+ 'transfer' => Float,
10
+ 'price_monthly' => Float,
11
+ 'price_hourly' => Float,
12
+ 'regions' => Array,
13
+ 'available' => Fog::Boolean,
14
+ }
15
+
16
+ tests('success') do
17
+ tests('#list_flavors') do
18
+ service.list_flavors.body['sizes'].each do |size|
19
+ tests('format').data_matches_schema(size_format) do
20
+ size
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ Shindo.tests('Fog::Compute::DigitalOcean | list_images request', ['digitalocean', 'compute']) do
2
+ service = Fog::Compute.new(:provider => 'DigitalOcean')
3
+
4
+ image_format = {
5
+ 'id' => Integer,
6
+ 'name' => String,
7
+ 'type' => String,
8
+ 'distribution' => String,
9
+ 'slug' => Fog::Nullable::String,
10
+ 'public' => Fog::Boolean,
11
+ 'regions' => Array,
12
+ 'min_disk_size' => Fog::Nullable::Integer,
13
+ 'created_at' => String,
14
+ }
15
+
16
+ tests('success') do
17
+ tests('#list_images') do
18
+ service.list_images.body['images'].each do |image|
19
+ tests('format').data_matches_schema(image_format) do
20
+ image
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,21 @@
1
+ Shindo.tests('Fog::Compute::DigitalOcean | list_regions request', ['digitalocean', 'compute']) do
2
+ service = Fog::Compute.new(:provider => 'DigitalOcean')
3
+
4
+ region_format = {
5
+ 'slug' => String,
6
+ 'name' => String,
7
+ 'sizes' => Array,
8
+ 'available' => Fog::Boolean,
9
+ 'features' => Array,
10
+ }
11
+
12
+ tests('success') do
13
+ tests('#list_regions') do
14
+ service.list_regions.body['regions'].each do |region|
15
+ tests('format').data_matches_schema(region_format) do
16
+ region
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,77 @@
1
+ Shindo.tests('Fog::Compute::DigitalOcean | create_server request', ['digitalocean', 'compute']) do
2
+ service = Fog::Compute.new(:provider => 'DigitalOcean')
3
+
4
+ server_format = {
5
+ 'id' => Integer,
6
+ 'name' => String,
7
+ 'memory' => Integer,
8
+ 'vcpus' => Integer,
9
+ 'disk' => Integer,
10
+ 'locked' => Fog::Boolean,
11
+ 'created_at' => String,
12
+ }
13
+
14
+ create_server_format = {
15
+ 'droplet' => {
16
+ 'id' => Integer,
17
+ 'name' => String,
18
+ 'memory' => Integer,
19
+ 'vcpus' => Integer,
20
+ 'disk' => Integer,
21
+ 'locked' => Fog::Boolean,
22
+ 'status' => String,
23
+ 'kernel' => Hash,
24
+ "created_at" => String,
25
+ "features" => Array,
26
+ "backup_ids" => Array,
27
+ "snapshot_ids" => Array,
28
+ "image" => Hash,
29
+ "size" => Hash,
30
+ "size_slug" => String,
31
+ "networks" => Hash,
32
+ "region" => Hash,
33
+ },
34
+
35
+ 'links' => {
36
+ "actions" => Array,
37
+ }
38
+
39
+ }
40
+
41
+ tests('success') do
42
+
43
+ server_id = nil
44
+ server_name = "fog-#{Time.now.to_i.to_s}"
45
+ image = "ubuntu-14-04-x64"
46
+ region = "nyc3"
47
+ size = "512mb"
48
+
49
+ tests("#create_server(#{server_name}, #{size}, #{image}, #{region})").formats(create_server_format) do
50
+ body = service.create_server(server_name, size, image, region).body
51
+ server_id = body['droplet']['id']
52
+ body
53
+ end
54
+
55
+ test('#get_server_details can retrieve by id') do
56
+ body = service.get_server_details(server_id).body
57
+ tests('format').data_matches_schema(server_format) do
58
+ body['droplet']
59
+ end
60
+ end
61
+
62
+ server = service.servers.get(server_id)
63
+ server.wait_for { ready? }
64
+
65
+ tests('#delete_server').succeeds do
66
+ server.delete
67
+ end
68
+
69
+ tests('#list_servers') do
70
+ service.list_servers.body['droplets'].each do |droplet|
71
+ tests('format').data_matches_schema(server_format) do
72
+ droplet
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,20 @@
1
+ Shindo.tests('Fog::Compute::DigitalOceanV2 | list_ssh_keys request', ['digitalocean', 'compute']) do
2
+ service = Fog::Compute.new(:provider => 'DigitalOcean', :version => 'V2')
3
+
4
+ ssh_key_format = {
5
+ 'id' => Integer,
6
+ 'fingerprint' => String,
7
+ 'public_key' => String,
8
+ 'name' => String,
9
+ }
10
+
11
+ tests('success') do
12
+ tests('#list_ssh_keys') do
13
+ service.list_ssh_keys.body['ssh_keys'].each do |ssh_key|
14
+ tests('format').data_matches_schema(ssh_key_format) do
15
+ ssh_key
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,25 @@
1
+ require 'coveralls'
2
+ Coveralls.wear!
3
+
4
+ require File.expand_path('../../lib/fog/digitalocean', __FILE__)
5
+
6
+ Bundler.require(:test)
7
+
8
+ Excon.defaults.merge!(:debug_request => true, :debug_response => true)
9
+
10
+ require File.expand_path(File.join(File.dirname(__FILE__), 'helpers', 'mock_helper'))
11
+ require File.expand_path(File.join(File.dirname(__FILE__), 'helpers', 'format_helper'))
12
+
13
+ # This overrides the default 600 seconds timeout during live test runs
14
+ unless Fog.mocking?
15
+ Fog.timeout = ENV['FOG_TEST_TIMEOUT'] || 2_000
16
+ Fog::Logger.warning "Setting default fog timeout to #{Fog.timeout} seconds"
17
+ end
18
+
19
+ def lorem_file
20
+ File.open(File.dirname(__FILE__) + '/lorem.txt', 'r')
21
+ end
22
+
23
+ def array_differences(array_a, array_b)
24
+ (array_a - array_b) | (array_b - array_a)
25
+ end
@@ -0,0 +1,100 @@
1
+ ### Taken from https://github.com/fog/fog/blob/master/tests/helpers/formats_helper.rb
2
+
3
+ require "fog/schema/data_validator"
4
+
5
+ # format related hackery
6
+ # allows both true.is_a?(Fog::Boolean) and false.is_a?(Fog::Boolean)
7
+ # allows both nil.is_a?(Fog::Nullable::String) and ''.is_a?(Fog::Nullable::String)
8
+ module Fog
9
+ module Boolean; end
10
+ module Nullable
11
+ module Boolean; end
12
+ module Integer; end
13
+ module String; end
14
+ module Time; end
15
+ module Float; end
16
+ module Hash; end
17
+ module Array; end
18
+ end
19
+ end
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)}
28
+
29
+ module Shindo
30
+ class Tests
31
+ # Generates a Shindo test that compares a hash schema to the result
32
+ # of the passed in block returning true if they match.
33
+ #
34
+ # The schema that is passed in is a Hash or Array of hashes that
35
+ # have Classes in place of values. When checking the schema the
36
+ # value should match the Class.
37
+ #
38
+ # Strict mode will fail if the data has additional keys. Setting
39
+ # +strict+ to +false+ will allow additional keys to appear.
40
+ #
41
+ # @param [Hash] schema A Hash schema
42
+ # @param [Hash] options Options to change validation rules
43
+ # @option options [Boolean] :allow_extra_keys
44
+ # If +true+ does not fail when keys are in the data that are
45
+ # not specified in the schema. This allows new values to
46
+ # appear in API output without breaking the check.
47
+ # @option options [Boolean] :allow_optional_rules
48
+ # If +true+ does not fail if extra keys are in the schema
49
+ # that do not match the data. Not recommended!
50
+ # @yield Data to check with schema
51
+ #
52
+ # @example Using in a test
53
+ # Shindo.tests("comparing welcome data against schema") do
54
+ # data = {:welcome => "Hello" }
55
+ # data_matches_schema(:welcome => String) { data }
56
+ # end
57
+ #
58
+ # comparing welcome data against schema
59
+ # + data matches schema
60
+ #
61
+ # @example Example schema
62
+ # {
63
+ # "id" => String,
64
+ # "ram" => Integer,
65
+ # "disks" => [
66
+ # {
67
+ # "size" => Float
68
+ # }
69
+ # ],
70
+ # "dns_name" => Fog::Nullable::String,
71
+ # "active" => Fog::Boolean,
72
+ # "created" => DateTime
73
+ # }
74
+ #
75
+ # @return [Boolean]
76
+ def data_matches_schema(schema, options = {})
77
+ test('data matches schema') do
78
+ validator = Fog::Schema::DataValidator.new
79
+ valid = validator.validate(yield, schema, options)
80
+ @message = validator.message unless valid
81
+ valid
82
+ end
83
+ end
84
+
85
+ # @deprecated #formats is deprecated. Use #data_matches_schema instead
86
+ def formats(format, strict = true)
87
+ test('has proper format') do
88
+ if strict
89
+ options = {:allow_extra_keys => false, :allow_optional_rules => true}
90
+ else
91
+ options = {:allow_extra_keys => true, :allow_optional_rules => true}
92
+ end
93
+ validator = Fog::Schema::DataValidator.new
94
+ valid = validator.validate(yield, format, options)
95
+ @message = validator.message unless valid
96
+ valid
97
+ end
98
+ end
99
+ end
100
+ end