fog-core 2.3.0 → 2.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 (67) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +2 -0
  3. data/.github/workflows/ruby.yml +1 -1
  4. data/.github/workflows/stale.yml +1 -1
  5. data/.rubocop.yml +16 -12
  6. data/.rubocop_todo.yml +724 -0
  7. data/Gemfile +1 -1
  8. data/Rakefile +2 -14
  9. data/changelog.md +14 -0
  10. data/fog-core.gemspec +10 -7
  11. data/lib/fog/compute/models/server.rb +7 -3
  12. data/lib/fog/compute.rb +2 -2
  13. data/lib/fog/core/association.rb +1 -0
  14. data/lib/fog/core/attributes/default.rb +7 -0
  15. data/lib/fog/core/attributes.rb +28 -3
  16. data/lib/fog/core/cache.rb +58 -55
  17. data/lib/fog/core/collection.rb +9 -3
  18. data/lib/fog/core/connection.rb +1 -1
  19. data/lib/fog/core/current_machine.rb +1 -1
  20. data/lib/fog/core/errors.rb +1 -1
  21. data/lib/fog/core/logger.rb +2 -2
  22. data/lib/fog/core/mock.rb +6 -1
  23. data/lib/fog/core/model.rb +34 -5
  24. data/lib/fog/core/provider.rb +7 -7
  25. data/lib/fog/core/scp.rb +15 -11
  26. data/lib/fog/core/service.rb +4 -4
  27. data/lib/fog/core/services_mixin.rb +9 -9
  28. data/lib/fog/core/ssh.rb +3 -2
  29. data/lib/fog/core/stringify_keys.rb +0 -2
  30. data/lib/fog/core/time.rb +2 -2
  31. data/lib/fog/core/uuid.rb +2 -8
  32. data/lib/fog/core/version.rb +1 -1
  33. data/lib/fog/core/wait_for.rb +2 -1
  34. data/lib/fog/core/wait_for_defaults.rb +2 -0
  35. data/lib/fog/core.rb +57 -58
  36. data/lib/fog/formatador.rb +7 -6
  37. data/lib/fog/schema/data_validator.rb +1 -0
  38. data/lib/fog/storage.rb +15 -15
  39. data/lib/fog/test_helpers/collection_helper.rb +2 -0
  40. data/lib/fog/test_helpers/formats_helper.rb +2 -2
  41. data/lib/fog/test_helpers/helper.rb +3 -3
  42. data/lib/fog/test_helpers/minitest/assertions.rb +1 -1
  43. data/lib/fog/test_helpers/minitest/expectations.rb +1 -1
  44. data/lib/fog/test_helpers/mock_helper.rb +84 -84
  45. data/lib/fog/test_helpers/types_helper.rb +1 -0
  46. data/lib/tasks/test_task.rb +2 -2
  47. data/spec/compute/models/server_spec.rb +7 -7
  48. data/spec/compute_spec.rb +6 -6
  49. data/spec/connection_spec.rb +11 -9
  50. data/spec/core/cache_spec.rb +51 -15
  51. data/spec/core/collection_spec.rb +24 -0
  52. data/spec/core/model_spec.rb +36 -3
  53. data/spec/core/stringify_keys_spec.rb +3 -3
  54. data/spec/core/whitelist_keys_spec.rb +2 -2
  55. data/spec/current_machine_spec.rb +2 -2
  56. data/spec/fog_attribute_spec.rb +183 -163
  57. data/spec/formatador_spec.rb +7 -7
  58. data/spec/identity_spec.rb +6 -6
  59. data/spec/mocking_spec.rb +3 -3
  60. data/spec/service_spec.rb +19 -19
  61. data/spec/spec_helper.rb +3 -8
  62. data/spec/storage_spec.rb +6 -6
  63. data/spec/test_helpers/formats_helper_spec.rb +8 -8
  64. data/spec/test_helpers/schema_validator_spec.rb +8 -8
  65. data/spec/utils_spec.rb +6 -6
  66. data/spec/wait_for_spec.rb +2 -2
  67. metadata +44 -53
@@ -9,91 +9,91 @@ Fog.mock! if ENV["FOG_MOCK"] == "true"
9
9
  # if in mocked mode, fill in some fake credentials for us
10
10
  if Fog.mock?
11
11
  Fog.credentials = {
12
- :aws_access_key_id => "aws_access_key_id",
13
- :aws_secret_access_key => "aws_secret_access_key",
14
- :ia_access_key_id => "aws_access_key_id",
15
- :ia_secret_access_key => "aws_secret_access_key",
16
- :bluebox_api_key => "bluebox_api_key",
17
- :bluebox_customer_id => "bluebox_customer_id",
18
- :brightbox_client_id => "brightbox_client_id",
19
- :brightbox_secret => "brightbox_secret",
20
- :cloudstack_disk_offering_id => "",
21
- :cloudstack_host => "http://cloudstack.example.org",
22
- :cloudstack_network_ids => "",
23
- :cloudstack_service_offering_id => "4437ac6c-9fe3-477a-57ec-60a5a45896a4",
24
- :cloudstack_template_id => "8a31cf9c-f248-0588-256e-9dbf58785216",
25
- :cloudstack_zone_id => "c554c592-e09c-9df5-7688-4a32754a4305",
26
- :clodo_api_key => "clodo_api_key",
27
- :clodo_username => "clodo_username",
28
- :digitalocean_api_key => "digitalocean_api_key",
29
- :digitalocean_client_id => "digitalocean_client_id",
30
- :dnsimple_token => "dnsimple_token",
31
- :dnsimple_account => "dnsimple_account",
32
- :dnsmadeeasy_api_key => "dnsmadeeasy_api_key",
33
- :dnsmadeeasy_secret_key => "dnsmadeeasy_secret_key",
34
- :glesys_username => "glesys_username",
35
- :glesys_api_key => "glesys_api_key",
36
- :go_grid_api_key => "go_grid_api_key",
37
- :go_grid_shared_secret => "go_grid_shared_secret",
38
- :google_storage_access_key_id => "google_storage_access_key_id",
39
- :google_storage_secret_access_key => "google_storage_secret_access_key",
40
- :google_project => "google_project_name",
41
- :google_client_email => "fake@developer.gserviceaccount.com",
42
- :google_key_location => "~/fake.p12",
43
- :hp_access_key => "hp_access_key",
44
- :hp_secret_key => "hp_secret_key",
45
- :hp_tenant_id => "hp_tenant_id",
46
- :hp_avl_zone => "hp_avl_zone",
47
- :os_account_meta_temp_url_key => "os_account_meta_temp_url_key",
48
- :ibm_username => "ibm_username",
49
- :ibm_password => "ibm_password",
50
- :joyent_username => "joyentuser",
51
- :joyent_password => "joyentpass",
52
- :linode_api_key => "linode_api_key",
53
- :local_root => "~/.fog",
54
- :bare_metal_cloud_password => "bare_metal_cloud_password",
55
- :bare_metal_cloud_username => "bare_metal_cloud_username",
56
- :ninefold_compute_key => "ninefold_compute_key",
57
- :ninefold_compute_secret => "ninefold_compute_secret",
58
- :ninefold_storage_secret => "ninefold_storage_secret",
59
- :ninefold_storage_token => "ninefold_storage_token",
12
+ aws_access_key_id: "aws_access_key_id",
13
+ aws_secret_access_key: "aws_secret_access_key",
14
+ ia_access_key_id: "aws_access_key_id",
15
+ ia_secret_access_key: "aws_secret_access_key",
16
+ bluebox_api_key: "bluebox_api_key",
17
+ bluebox_customer_id: "bluebox_customer_id",
18
+ brightbox_client_id: "brightbox_client_id",
19
+ brightbox_secret: "brightbox_secret",
20
+ cloudstack_disk_offering_id: "",
21
+ cloudstack_host: "http://cloudstack.example.org",
22
+ cloudstack_network_ids: "",
23
+ cloudstack_service_offering_id: "4437ac6c-9fe3-477a-57ec-60a5a45896a4",
24
+ cloudstack_template_id: "8a31cf9c-f248-0588-256e-9dbf58785216",
25
+ cloudstack_zone_id: "c554c592-e09c-9df5-7688-4a32754a4305",
26
+ clodo_api_key: "clodo_api_key",
27
+ clodo_username: "clodo_username",
28
+ digitalocean_api_key: "digitalocean_api_key",
29
+ digitalocean_client_id: "digitalocean_client_id",
30
+ dnsimple_token: "dnsimple_token",
31
+ dnsimple_account: "dnsimple_account",
32
+ dnsmadeeasy_api_key: "dnsmadeeasy_api_key",
33
+ dnsmadeeasy_secret_key: "dnsmadeeasy_secret_key",
34
+ glesys_username: "glesys_username",
35
+ glesys_api_key: "glesys_api_key",
36
+ go_grid_api_key: "go_grid_api_key",
37
+ go_grid_shared_secret: "go_grid_shared_secret",
38
+ google_storage_access_key_id: "google_storage_access_key_id",
39
+ google_storage_secret_access_key: "google_storage_secret_access_key",
40
+ google_project: "google_project_name",
41
+ google_client_email: "fake@developer.gserviceaccount.com",
42
+ google_key_location: "~/fake.p12",
43
+ hp_access_key: "hp_access_key",
44
+ hp_secret_key: "hp_secret_key",
45
+ hp_tenant_id: "hp_tenant_id",
46
+ hp_avl_zone: "hp_avl_zone",
47
+ os_account_meta_temp_url_key: "os_account_meta_temp_url_key",
48
+ ibm_username: "ibm_username",
49
+ ibm_password: "ibm_password",
50
+ joyent_username: "joyentuser",
51
+ joyent_password: "joyentpass",
52
+ linode_api_key: "linode_api_key",
53
+ local_root: "~/.fog",
54
+ bare_metal_cloud_password: "bare_metal_cloud_password",
55
+ bare_metal_cloud_username: "bare_metal_cloud_username",
56
+ ninefold_compute_key: "ninefold_compute_key",
57
+ ninefold_compute_secret: "ninefold_compute_secret",
58
+ ninefold_storage_secret: "ninefold_storage_secret",
59
+ ninefold_storage_token: "ninefold_storage_token",
60
60
  # :public_key_path => "~/.ssh/id_rsa.pub",
61
61
  # :private_key_path => "~/.ssh/id_rsa",
62
- :openstack_api_key => "openstack_api_key",
63
- :openstack_username => "openstack_username",
64
- :openstack_tenant => "openstack_tenant",
65
- :openstack_auth_url => "http://openstack:35357/v2.0/tokens",
66
- :ovirt_url => "http://ovirt:8080/api",
67
- :ovirt_username => "admin@internal",
68
- :ovirt_password => "123123",
69
- :rackspace_api_key => "rackspace_api_key",
70
- :rackspace_username => "rackspace_username",
71
- :riakcs_access_key_id => "riakcs_access_key_id",
72
- :riakcs_secret_access_key => "riakcs_secret_access_key",
73
- :vcloud_host => "vcloud_host",
74
- :vcloud_password => "vcloud_password",
75
- :vcloud_username => "vcloud_username",
76
- :vcloud_director_host => "vcloud-director-host",
77
- :vcloud_director_password => "vcloud_director_password",
78
- :vcloud_director_username => "vcd_user@vcd_org_name",
79
- :voxel_api_key => "voxel_api_key",
80
- :voxel_api_secret => "voxel_api_secret",
81
- :zerigo_email => "zerigo_email",
82
- :zerigo_token => "zerigo_token",
83
- :dynect_customer => "dynect_customer",
84
- :dynect_username => "dynect_username",
85
- :dynect_password => "dynect_password",
86
- :vsphere_server => "virtualcenter.lan",
87
- :vsphere_username => "apiuser",
88
- :vsphere_password => "apipassword",
89
- :vsphere_expected_pubkey_hash => "abcdef1234567890",
90
- :libvirt_uri => "qemu:///system",
91
- :libvirt_username => "root",
92
- :libvirt_password => "password",
93
- :cloudsigma_username => "csuname",
94
- :cloudsigma_password => "cspass",
95
- :kubevirt_token => "[TOKEN]",
96
- :kubevirt_hostname => "localhost",
97
- :kubevirt_port => "6443"
62
+ openstack_api_key: "openstack_api_key",
63
+ openstack_username: "openstack_username",
64
+ openstack_tenant: "openstack_tenant",
65
+ openstack_auth_url: "http://openstack:35357/v2.0/tokens",
66
+ ovirt_url: "http://ovirt:8080/api",
67
+ ovirt_username: "admin@internal",
68
+ ovirt_password: "123123",
69
+ rackspace_api_key: "rackspace_api_key",
70
+ rackspace_username: "rackspace_username",
71
+ riakcs_access_key_id: "riakcs_access_key_id",
72
+ riakcs_secret_access_key: "riakcs_secret_access_key",
73
+ vcloud_host: "vcloud_host",
74
+ vcloud_password: "vcloud_password",
75
+ vcloud_username: "vcloud_username",
76
+ vcloud_director_host: "vcloud-director-host",
77
+ vcloud_director_password: "vcloud_director_password",
78
+ vcloud_director_username: "vcd_user@vcd_org_name",
79
+ voxel_api_key: "voxel_api_key",
80
+ voxel_api_secret: "voxel_api_secret",
81
+ zerigo_email: "zerigo_email",
82
+ zerigo_token: "zerigo_token",
83
+ dynect_customer: "dynect_customer",
84
+ dynect_username: "dynect_username",
85
+ dynect_password: "dynect_password",
86
+ vsphere_server: "virtualcenter.lan",
87
+ vsphere_username: "apiuser",
88
+ vsphere_password: "apipassword",
89
+ vsphere_expected_pubkey_hash: "abcdef1234567890",
90
+ libvirt_uri: "qemu:///system",
91
+ libvirt_username: "root",
92
+ libvirt_password: "password",
93
+ cloudsigma_username: "csuname",
94
+ cloudsigma_password: "cspass",
95
+ kubevirt_token: "[TOKEN]",
96
+ kubevirt_hostname: "localhost",
97
+ kubevirt_port: "6443"
98
98
  }.merge(Fog.credentials)
99
99
  end
@@ -3,6 +3,7 @@
3
3
  # allows both nil.is_a?(Fog::Nullable::String) and ''.is_a?(Fog::Nullable::String)
4
4
  module Fog
5
5
  module Boolean; end
6
+
6
7
  module Nullable
7
8
  module Boolean; end
8
9
  module Integer; end
@@ -27,8 +27,8 @@ module Fog
27
27
  Fog.providers.each do |key, value|
28
28
  threads << Thread.new do
29
29
  Thread.main[:results] << {
30
- :provider => value,
31
- :success => sh("export FOG_MOCK=#{mocked} && bundle exec shindont +#{key}")
30
+ provider: value,
31
+ success: sh("export FOG_MOCK=#{mocked} && bundle exec shindont +#{key}")
32
32
  }
33
33
  end
34
34
  end
@@ -26,13 +26,13 @@ describe Fog::Compute::Server do
26
26
  end
27
27
  end
28
28
 
29
-
30
29
  describe "when the ssh_ip_address exists" do
31
30
  # Define these constants which would be imported by net-ssh once loaded
32
31
  module Net
33
32
  module SSH
34
33
  class AuthenticationFailed < RuntimeError
35
34
  end
35
+
36
36
  class Disconnect < RuntimeError
37
37
  end
38
38
  end
@@ -55,7 +55,7 @@ describe Fog::Compute::Server do
55
55
  it "is false" do
56
56
  @server.stub(:ready?, true) do
57
57
  @server.stub(:ssh_ip_address, "10.0.0.1") do
58
- raise_error = lambda { |_cmd, _options| raise Net::SSH::AuthenticationFailed.new }
58
+ raise_error = lambda { |_cmd, _options={}| raise Net::SSH::AuthenticationFailed.new }
59
59
  @server.stub(:ssh, raise_error) do
60
60
  refute @server.sshable?
61
61
  end
@@ -67,7 +67,7 @@ describe Fog::Compute::Server do
67
67
  @server.instance_variable_set(:@sshable_timeout, 8)
68
68
  @server.stub(:ready?, true) do
69
69
  @server.stub(:ssh_ip_address, "10.0.0.1") do
70
- raise_error = lambda { |_cmd, _options| raise Net::SSH::AuthenticationFailed.new }
70
+ raise_error = lambda { |_cmd, _options={}| raise Net::SSH::AuthenticationFailed.new }
71
71
  @server.stub(:ssh, raise_error) do
72
72
  @server.sshable?
73
73
  assert_nil @server.instance_variable_get(:@sshable_timeout), nil
@@ -81,7 +81,7 @@ describe Fog::Compute::Server do
81
81
  it "is false" do
82
82
  @server.stub(:ready?, true) do
83
83
  @server.stub(:ssh_ip_address, "10.0.0.1") do
84
- raise_error = lambda { |_cmd, _options| raise Net::SSH::Disconnect.new }
84
+ raise_error = lambda { |_cmd, _options={}| raise Net::SSH::Disconnect.new }
85
85
  @server.stub(:ssh, raise_error) do
86
86
  refute @server.sshable?
87
87
  end
@@ -93,7 +93,7 @@ describe Fog::Compute::Server do
93
93
  @server.instance_variable_set(:@sshable_timeout, 8)
94
94
  @server.stub(:ready?, true) do
95
95
  @server.stub(:ssh_ip_address, "10.0.0.1") do
96
- raise_error = lambda { |_cmd, _options| raise Net::SSH::Disconnect.new }
96
+ raise_error = lambda { |_cmd, _options={}| raise Net::SSH::Disconnect.new }
97
97
  @server.stub(:ssh, raise_error) do
98
98
  @server.sshable?
99
99
  assert_nil @server.instance_variable_get(:@sshable_timeout), nil
@@ -107,7 +107,7 @@ describe Fog::Compute::Server do
107
107
  it "is false" do
108
108
  @server.stub(:ready?, true) do
109
109
  @server.stub(:ssh_ip_address, "10.0.0.1") do
110
- raise_error = lambda { |_cmd, _options| raise SystemCallError.new("message, 0") }
110
+ raise_error = lambda { |_cmd, _options={}| raise SystemCallError.new("message, 0") }
111
111
  @server.stub(:ssh, raise_error) do
112
112
  refute @server.sshable?
113
113
  end
@@ -118,7 +118,7 @@ describe Fog::Compute::Server do
118
118
  it "does not increase SSH timeout" do
119
119
  @server.stub(:ready?, true) do
120
120
  @server.stub(:ssh_ip_address, "10.0.0.1") do
121
- raise_error = lambda { |_cmd, _options| raise SystemCallError.new("message, 0") }
121
+ raise_error = lambda { |_cmd, _options={}| raise SystemCallError.new("message, 0") }
122
122
  @server.stub(:ssh, raise_error) do
123
123
  @server.sshable?
124
124
  assert_equal @server.instance_variable_get(:@sshable_timeout), 8
data/spec/compute_spec.rb CHANGED
@@ -24,7 +24,7 @@ describe "Fog::Compute" do
24
24
  end
25
25
 
26
26
  it "instantiates an instance of Fog::Compute::<Provider> from the :provider keyword arg" do
27
- compute = Fog::Compute.new(:provider => :therightway)
27
+ compute = Fog::Compute.new(provider: :therightway)
28
28
  assert_instance_of(Fog::TheRightWay::Compute, compute)
29
29
  end
30
30
 
@@ -44,7 +44,7 @@ describe "Fog::Compute" do
44
44
  end
45
45
 
46
46
  it "instantiates an instance of Fog::<Provider>::Compute from the :provider keyword arg" do
47
- compute = Fog::Compute.new(:provider => :thewrongway)
47
+ compute = Fog::Compute.new(provider: :thewrongway)
48
48
  assert_instance_of(Fog::Compute::TheWrongWay, compute)
49
49
  end
50
50
 
@@ -76,19 +76,19 @@ describe "Fog::Compute" do
76
76
 
77
77
  describe "when both Fog::Compute::<Provider> and Fog::<Provider>::Compute exist" do
78
78
  it "prefers Fog::<Provider>::Compute" do
79
- compute = Fog::Compute.new(:provider => :bothways)
79
+ compute = Fog::Compute.new(provider: :bothways)
80
80
  assert_instance_of(Fog::BothWays::Compute, compute)
81
81
  end
82
82
  end
83
83
 
84
84
  it "passes the supplied keyword args less :provider to Fog::Compute::<Provider>#new" do
85
- compute = Fog::Compute.new(:provider => :bothways, :extra => :stuff)
86
- assert_equal({ :extra => :stuff }, compute.args)
85
+ compute = Fog::Compute.new(provider: :bothways, extra: :stuff)
86
+ assert_equal({ extra: :stuff }, compute.args)
87
87
  end
88
88
 
89
89
  it "raises ArgumentError when given a :provider where a Fog::Compute::Provider that does not exist" do
90
90
  assert_raises(ArgumentError) do
91
- Fog::Compute.new(:provider => :wat)
91
+ Fog::Compute.new(provider: :wat)
92
92
  end
93
93
  end
94
94
  end
@@ -15,7 +15,7 @@ describe Fog::Core::Connection do
15
15
  end
16
16
 
17
17
  it "adds custom user-agents to Fog requests" do
18
- Fog::VERSION = 'Version'
18
+ Fog::VERSION = "Version".freeze
19
19
  Fog::Core::Connection.add_user_agent("my-app/1.2")
20
20
 
21
21
  connection = Fog::Core::Connection.new("http://example.com")
@@ -31,7 +31,7 @@ describe Fog::Core::Connection do
31
31
 
32
32
  it "doesn't error when persistence is enabled and debug_response is disabled" do
33
33
  options = {
34
- :debug_response => false
34
+ debug_response: false
35
35
  }
36
36
  Fog::Core::Connection.new("http://example.com", true, options)
37
37
  end
@@ -40,14 +40,14 @@ describe Fog::Core::Connection do
40
40
  it "does not emit a warning when provided this argument in the initializer" do
41
41
  $stderr = StringIO.new
42
42
 
43
- Fog::Core::Connection.new("http://example.com", false, :path_prefix => "foo")
43
+ Fog::Core::Connection.new("http://example.com", false, path_prefix: "foo")
44
44
 
45
45
  assert_empty($stderr.string)
46
46
  end
47
47
 
48
48
  it "raises when the 'path' arg is present and this arg is supplied" do
49
49
  assert_raises(ArgumentError) do
50
- Fog::Core::Connection.new("http://example.com", false, :path_prefix => "foo", :path => "bar")
50
+ Fog::Core::Connection.new("http://example.com", false, path_prefix: "foo", path: "bar")
51
51
  end
52
52
  end
53
53
  end
@@ -60,13 +60,14 @@ describe Fog::Core::Connection do
60
60
  def params
61
61
  @params
62
62
  end
63
+
63
64
  def new(_, params)
64
65
  @params = params
65
66
  end
66
67
  end
67
68
 
68
69
  Object.stub_const("Excon", spy) do
69
- Fog::Core::Connection.new("http://example.com", false, :path => "bar")
70
+ Fog::Core::Connection.new("http://example.com", false, path: "bar")
70
71
  assert_equal("bar", spy.params[:path])
71
72
  end
72
73
  end
@@ -78,6 +79,7 @@ describe Fog::Core::Connection do
78
79
  spy.instance_eval do
79
80
  def new(*_args); self; end
80
81
  def params; @params; end
82
+
81
83
  def request(params)
82
84
  @params = params
83
85
  end
@@ -87,16 +89,16 @@ describe Fog::Core::Connection do
87
89
 
88
90
  it "uses the initializer-supplied :path_prefix arg with #request :arg to formulate a path to send to Excon.request" do
89
91
  Object.stub_const("Excon", spy) do
90
- c = Fog::Core::Connection.new("http://example.com", false, :path_prefix => "foo")
91
- c.request(:path => "bar")
92
+ c = Fog::Core::Connection.new("http://example.com", false, path_prefix: "foo")
93
+ c.request(path: "bar")
92
94
  assert_equal("foo/bar", spy.params[:path])
93
95
  end
94
96
  end
95
97
 
96
98
  it "does not introduce consecutive '/'s into the path if 'path' starts with a '/'" do
97
99
  Object.stub_const("Excon", spy) do
98
- c = Fog::Core::Connection.new("http://example.com", false, :path_prefix => "foo")
99
- c.request(:path => "/bar")
100
+ c = Fog::Core::Connection.new("http://example.com", false, path_prefix: "foo")
101
+ c.request(path: "/bar")
100
102
  assert_equal("foo/bar", spy.params[:path])
101
103
  end
102
104
  end
@@ -1,10 +1,33 @@
1
1
  require "spec_helper"
2
2
  require "securerandom"
3
- require "tmpdir"
4
3
 
5
4
  module Fog
6
5
  class SubFogTestModel < Fog::Model
7
6
  identity :id
7
+
8
+ attribute :config
9
+ attribute :subconfig
10
+
11
+ def initialize(new_attributes = {})
12
+ super
13
+
14
+ # This way we make YAML to use aliases
15
+ self.config = {
16
+ "users" => [
17
+ { "user1" => "user1@email" },
18
+ { "user2" => "user2@email" }
19
+ ]
20
+ }
21
+ self.subconfig = config["users"][0]
22
+ end
23
+ end
24
+ end
25
+
26
+ module Fog
27
+ class SubFogTestCollection < Fog::Collection
28
+ model Fog::SubFogTestModel
29
+
30
+ attribute :spec_attribute
8
31
  end
9
32
  end
10
33
 
@@ -44,7 +67,7 @@ describe Fog::Cache do
44
67
  # nothing exists, nothing comes back
45
68
  assert_equal Fog::Cache.metadata, {}
46
69
  # write/read
47
- Fog::Cache.write_metadata({:last_dumped => "Tuesday, November 8, 2016"})
70
+ Fog::Cache.write_metadata({last_dumped: "Tuesday, November 8, 2016"})
48
71
  assert_equal Fog::Cache.metadata[:last_dumped], "Tuesday, November 8, 2016"
49
72
 
50
73
  # diff namespace, diff metadata
@@ -52,10 +75,10 @@ describe Fog::Cache do
52
75
  assert_nil Fog::Cache.metadata[:last_dumped]
53
76
  # still accessible per namespace
54
77
  Fog::Cache.namespace_prefix = "for-service-user-region-foo"
55
- assert_equal Fog::Cache.metadata[:last_dumped], "Tuesday, November 8, 2016"
78
+ assert_equal Fog::Cache.metadata[:last_dumped], "Tuesday, November 8, 2016"
56
79
  # can overwrite
57
- Fog::Cache.write_metadata({:last_dumped => "Diff date"})
58
- assert_equal Fog::Cache.metadata[:last_dumped], "Diff date"
80
+ Fog::Cache.write_metadata({last_dumped: "Diff date"})
81
+ assert_equal Fog::Cache.metadata[:last_dumped], "Diff date"
59
82
 
60
83
  # can't write a non-hash/data entry.
61
84
  assert_raises Fog::Cache::CacheDir do
@@ -65,10 +88,9 @@ describe Fog::Cache do
65
88
  # namespace must be set as well.
66
89
  assert_raises Fog::Cache::CacheDir do
67
90
  Fog::Cache.namespace_prefix = nil
68
- Fog::Cache.write_metadata({:a => "b"})
91
+ Fog::Cache.write_metadata({a: "b"})
69
92
  end
70
-
71
- end
93
+ end
72
94
 
73
95
  it "can load cache data from disk" do
74
96
  path = File.expand_path("~/.fog-cache-test-#{Time.now.to_i}.yml")
@@ -116,7 +138,7 @@ describe Fog::Cache do
116
138
  it "Fog cache ignores bad cache data - empty file, from disk" do
117
139
  Fog::Cache.expire_cache!(Fog::SubFogTestModel, @service)
118
140
  id = SecureRandom.hex
119
- a = Fog::SubFogTestModel.new(:id => id, :service => @service)
141
+ a = Fog::SubFogTestModel.new(id: id, service: @service)
120
142
  a.cache.dump
121
143
 
122
144
  # input bad data
@@ -130,13 +152,12 @@ describe Fog::Cache do
130
152
  assert_equal 1, Fog::Cache.load(Fog::SubFogTestModel, @service).size
131
153
  end
132
154
 
133
-
134
155
  it "can be dumped and reloaded back in" do
135
156
 
136
157
  Fog::Cache.expire_cache!(Fog::SubFogTestModel, @service)
137
158
 
138
159
  id = SecureRandom.hex
139
- a = Fog::SubFogTestModel.new(:id => id, :service => @service)
160
+ a = Fog::SubFogTestModel.new(id: id, service: @service)
140
161
 
141
162
  assert_equal File.exist?(Fog::Cache.namespace(Fog::SubFogTestModel, @service)), false
142
163
  a.cache.dump
@@ -155,8 +176,8 @@ describe Fog::Cache do
155
176
 
156
177
  # security groups on aws for eg can have the same identity group name 'default'.
157
178
  # there are no restrictions on `identity` fog attributes to be uniq.
158
- a = Fog::SubFogTestModel.new(:id => id, :service => @service, :bar => 'bar')
159
- b = Fog::SubFogTestModel.new(:id => id, :service => @service, :foo => 'foo')
179
+ a = Fog::SubFogTestModel.new(id: id, service: @service, bar: "bar")
180
+ b = Fog::SubFogTestModel.new(id: id, service: @service, foo: "foo")
160
181
 
161
182
  a.cache.dump
162
183
  b.cache.dump
@@ -173,8 +194,8 @@ describe Fog::Cache do
173
194
 
174
195
  # security groups on aws for eg can have the same identity group name 'default'.
175
196
  # there are no restrictions on `identity` fog attributes to be uniq.
176
- a = Fog::SubFogTestModel.new(:id => id, :service => @service, :bar => 'bar')
177
- b = Fog::SubFogTestModel.new(:id => id, :service => @service, :foo => 'foo')
197
+ a = Fog::SubFogTestModel.new(id: id, service: @service, bar: "bar")
198
+ b = Fog::SubFogTestModel.new(id: id, service: @service, foo: "foo")
178
199
 
179
200
  a.cache.dump
180
201
  b.cache.dump
@@ -188,4 +209,19 @@ describe Fog::Cache do
188
209
  # unique-ify based on the attributes...
189
210
  assert_equal instances.size, 2
190
211
  end
212
+
213
+ it "dumps model with collection attributes and reloads them" do
214
+ Fog::Cache.expire_cache!(Fog::SubFogTestModel, @service)
215
+
216
+ c = Fog::SubFogTestCollection.new(service: @service, spec_attribute: 42)
217
+
218
+ id = SecureRandom.hex
219
+ a = Fog::SubFogTestModel.new(id: id, service: @service, collection: c)
220
+
221
+ a.cache.dump
222
+
223
+ instances = Fog::Cache.load(Fog::SubFogTestModel, @service)
224
+ assert_equal instances.first.id, id
225
+ assert_equal instances.first.collection.spec_attribute, 42
226
+ end
191
227
  end
@@ -0,0 +1,24 @@
1
+ require "spec_helper"
2
+ require "securerandom"
3
+
4
+ class FogTestModelForCollection < Fog::Model
5
+ identity :id
6
+ end
7
+
8
+ class FogTestCollection < Fog::Collection
9
+ model FogTestModelForCollection
10
+
11
+ def all
12
+ self
13
+ end
14
+ end
15
+
16
+ describe Fog::Collection do
17
+ describe "array delegation" do
18
+ it "delegates methods with keywords to Array" do
19
+ c = FogTestCollection.new
20
+ c << FogTestModelForCollection.new(id: SecureRandom.hex)
21
+ assert_equal c.sample(1, random: Random)[0], c[0]
22
+ end
23
+ end
24
+ end
@@ -3,6 +3,17 @@ require "securerandom"
3
3
 
4
4
  class FogTestModel < Fog::Model
5
5
  identity :id
6
+ attribute :value
7
+
8
+ def create
9
+ self.identity = SecureRandom.hex
10
+ self
11
+ end
12
+
13
+ def update
14
+ self.value = 42
15
+ self
16
+ end
6
17
  end
7
18
 
8
19
  describe Fog::Model do
@@ -21,7 +32,7 @@ describe Fog::Model do
21
32
 
22
33
  it "is equal if it has the same non-nil identity and the same class" do
23
34
  id = SecureRandom.hex
24
- assert_equal FogTestModel.new(:id => id), FogTestModel.new(:id => id)
35
+ assert_equal FogTestModel.new(id: id), FogTestModel.new(id: id)
25
36
  end
26
37
 
27
38
  it "is not equal if both have nil identity, but are different objects" do
@@ -29,8 +40,30 @@ describe Fog::Model do
29
40
  end
30
41
 
31
42
  it "is not equal if it has a different identity" do
32
- refute_equal FogTestModel.new(:id => SecureRandom.hex),
33
- FogTestModel.new(:id => SecureRandom.hex)
43
+ refute_equal FogTestModel.new(id: SecureRandom.hex),
44
+ FogTestModel.new(id: SecureRandom.hex)
45
+ end
46
+ end
47
+
48
+ describe "#save" do
49
+ describe "on a non persisted object" do
50
+ it "creates a new resource" do
51
+ a = FogTestModel.new
52
+ a.stub(:persisted?, false) do
53
+ a.save
54
+ refute_nil(a.identity)
55
+ end
56
+ end
57
+ end
58
+
59
+ describe "on a persisted object" do
60
+ it "updates resource" do
61
+ a = FogTestModel.new
62
+ a.stub(:persisted?, true) do
63
+ a.save
64
+ assert_equal(a.value, 42)
65
+ end
66
+ end
34
67
  end
35
68
  end
36
69
  end
@@ -4,7 +4,7 @@ describe "Fog::StringifyKeys" do
4
4
  describe ".stringify" do
5
5
  describe "when key is a Symbol" do
6
6
  it "replaces key with String" do
7
- input = { :key => "value" }
7
+ input = { key: "value" }
8
8
  output = Fog::StringifyKeys.stringify(input)
9
9
  assert(output.key?("key"))
10
10
  end
@@ -26,11 +26,11 @@ describe "Fog::StringifyKeys" do
26
26
 
27
27
  describe "when keys are deeply nested" do
28
28
  it "updates only top level key" do
29
- input = { :key1 => { :key2 => { :key3 => nil }}}
29
+ input = { key1: { key2: { key3: nil }}}
30
30
 
31
31
  output = Fog::StringifyKeys.stringify(input)
32
32
 
33
- expected = { "key1" => { :key2 => { :key3 => nil }}}
33
+ expected = { "key1" => { key2: { key3: nil }}}
34
34
  assert_equal(expected, output)
35
35
  end
36
36
  end
@@ -4,7 +4,7 @@ describe "Fog::WhitelistKeys" do
4
4
  describe ".whitelist" do
5
5
  describe "when other keys are present" do
6
6
  it "returns Hash with only allowed keys" do
7
- input = { :name => "name", :type => "type", :size => 80 }
7
+ input = { name: "name", type: "type", size: 80 }
8
8
  valid_keys = %w(name size)
9
9
 
10
10
  output = Fog::WhitelistKeys.whitelist(input, valid_keys)
@@ -16,7 +16,7 @@ describe "Fog::WhitelistKeys" do
16
16
 
17
17
  describe "when key is a Symbol" do
18
18
  it "returns a String" do
19
- input = { :name => "name" }
19
+ input = { name: "name" }
20
20
  valid_keys = %w(name)
21
21
 
22
22
  output = Fog::WhitelistKeys.whitelist(input, valid_keys)