stacker_bee 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +7 -0
  5. data/.travis.yml +9 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +112 -0
  9. data/Rakefile +6 -0
  10. data/bin/stacker_bee +97 -0
  11. data/config.default.yml +3 -0
  12. data/config/4.2.json +67126 -0
  13. data/lib/stacker_bee.rb +16 -0
  14. data/lib/stacker_bee/api.rb +44 -0
  15. data/lib/stacker_bee/body_parser.rb +23 -0
  16. data/lib/stacker_bee/client.rb +105 -0
  17. data/lib/stacker_bee/configuration.rb +6 -0
  18. data/lib/stacker_bee/connection.rb +31 -0
  19. data/lib/stacker_bee/middleware/logger.rb +48 -0
  20. data/lib/stacker_bee/middleware/signed_query.rb +29 -0
  21. data/lib/stacker_bee/rash.rb +95 -0
  22. data/lib/stacker_bee/request.rb +41 -0
  23. data/lib/stacker_bee/request_error.rb +39 -0
  24. data/lib/stacker_bee/response.rb +29 -0
  25. data/lib/stacker_bee/utilities.rb +18 -0
  26. data/lib/stacker_bee/version.rb +3 -0
  27. data/spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/.yml +33 -0
  28. data/spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/a_nil_request_parameter/properly_executes_the_request.yml +33 -0
  29. data/spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/a_request_parameter_with_an_Array/.yml +35 -0
  30. data/spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/a_request_parameter_with_and_empty_string/properly_executes_the_request.yml +33 -0
  31. data/spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/containing_an_error/.yml +37 -0
  32. data/spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/containing_an_error/should_log_response_as_error.yml +37 -0
  33. data/spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/first/.yml +33 -0
  34. data/spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/first_item/.yml +33 -0
  35. data/spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/first_item/_account_type_/.yml +33 -0
  36. data/spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/first_item/_accounttype_/.yml +33 -0
  37. data/spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/should_log_request.yml +33 -0
  38. data/spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/should_not_log_response_as_error.yml +33 -0
  39. data/spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/space_character_in_a_request_parameter/properly_signs_the_request.yml +32 -0
  40. data/spec/fixtures/4.2.json +67126 -0
  41. data/spec/fixtures/simple.json +871 -0
  42. data/spec/integration/request_spec.rb +116 -0
  43. data/spec/spec_helper.rb +58 -0
  44. data/spec/units/stacker_bee/api_spec.rb +24 -0
  45. data/spec/units/stacker_bee/client_spec.rb +181 -0
  46. data/spec/units/stacker_bee/configuration_spec.rb +7 -0
  47. data/spec/units/stacker_bee/connection_spec.rb +45 -0
  48. data/spec/units/stacker_bee/middleware/logger_spec.rb +55 -0
  49. data/spec/units/stacker_bee/rash_spec.rb +87 -0
  50. data/spec/units/stacker_bee/request_error_spec.rb +44 -0
  51. data/spec/units/stacker_bee/request_spec.rb +49 -0
  52. data/spec/units/stacker_bee/response_spec.rb +79 -0
  53. data/spec/units/stacker_bee/utilities_spec.rb +25 -0
  54. data/spec/units/stacker_bee_spec.rb +6 -0
  55. data/stacker_bee.gemspec +30 -0
  56. metadata +225 -0
@@ -0,0 +1,87 @@
1
+ require "spec_helper"
2
+
3
+ shared_examples_for "a Rash" do |mapping|
4
+ mapping.each_pair { |key, value| its([key]) { should == value } }
5
+ end
6
+
7
+ describe StackerBee::Rash do
8
+ let(:wiz) { [{ "aB_C" => "abc" }, { "X_yZ" => "xyz" }] }
9
+ let(:ziz) do
10
+ {
11
+ "M-om" => {
12
+ "kI_d" => 2
13
+ }
14
+ }
15
+ end
16
+ let(:hash) do
17
+ {
18
+ "foo" => "foo",
19
+ "b_iz" => "biz",
20
+ "WiZ" => wiz,
21
+ :ziz => ziz
22
+ }
23
+ end
24
+ let(:similar_hash) do
25
+ hash.dup.tap do |loud|
26
+ value = loud.delete "foo"
27
+ loud["FOO"] = value
28
+ end
29
+ end
30
+ let(:dissimilar_hash) { hash.dup.tap { |loud| loud.delete "foo" } }
31
+ let(:rash) { StackerBee::Rash.new hash }
32
+ subject { rash }
33
+
34
+ it { should include "FOO" }
35
+
36
+ it { should == subject }
37
+ it { should == subject.dup }
38
+ it { should == hash }
39
+ it { should == StackerBee::Rash.new(hash) }
40
+ it { should == similar_hash }
41
+ it { should_not == dissimilar_hash }
42
+
43
+ it_behaves_like "a Rash",
44
+ "FOO" => "foo",
45
+ :foo => "foo",
46
+ "foo" => "foo",
47
+ "f_oo" => "foo",
48
+ "BIZ" => "biz",
49
+ :biz => "biz",
50
+ "biz" => "biz",
51
+ "b_iz" => "biz"
52
+
53
+ context "enumerable value" do
54
+ subject { rash["wiz"].first }
55
+ it_behaves_like "a Rash", "ab_c" => "abc"
56
+ end
57
+
58
+ context "nested hash value" do
59
+ subject { rash["ziz"] }
60
+ it_behaves_like "a Rash", "mom" => { "kid" => 2 }
61
+
62
+ context "deeply nested hash value" do
63
+ subject { rash["ziz"]["mom"] }
64
+ it_behaves_like "a Rash", "kid" => 2
65
+ end
66
+ end
67
+
68
+ describe "#select" do
69
+ subject { rash.select { |key, value| value.is_a? String } }
70
+ it { should be_a StackerBee::Rash }
71
+ it { should include "FOO" }
72
+ it { should_not include "WIZ" }
73
+ end
74
+
75
+ describe "#reject" do
76
+ subject { rash.reject { |key, value| value.is_a? String } }
77
+ it { should be_a StackerBee::Rash }
78
+ it { should include "WIZ" }
79
+ it { should_not include "FOO" }
80
+ end
81
+
82
+ describe "#values_at" do
83
+ subject { rash.values_at "FOO", "WIZ", "WRONG" }
84
+ it { should == ["foo", wiz, nil] }
85
+ end
86
+
87
+ end
@@ -0,0 +1,44 @@
1
+ require "spec_helper"
2
+
3
+ describe StackerBee::RequestError, ".for" do
4
+ let(:raw_response) { double status: status, body: '{"foo": "bar"}' }
5
+ subject { StackerBee::RequestError.for raw_response }
6
+
7
+ context "HTTP status in the 400s" do
8
+ let(:status) { 431 }
9
+ it { should be_a StackerBee::ClientError }
10
+ end
11
+ context "HTTP status in the 500s" do
12
+ let(:status) { 500 }
13
+ it { should be_a StackerBee::ServerError }
14
+ end
15
+ context "HTTP status > 599" do
16
+ let(:status) { 999 }
17
+ it { should be_a StackerBee::RequestError }
18
+ end
19
+ end
20
+
21
+ describe StackerBee::RequestError do
22
+ let(:http_status) { 431 }
23
+ let(:message) do
24
+ "Unable to execute API command deployvirtualmachine " +
25
+ "due to missing parameter zoneid"
26
+ end
27
+ let(:raw_body) do
28
+ <<-EOS
29
+ {
30
+ "deployvirtualmachineresponse": {
31
+ "uuidList": [],
32
+ "errorcode": #{http_status},
33
+ "cserrorcode": 9999,
34
+ "errortext": "#{message}"
35
+ }
36
+ }
37
+ EOS
38
+ end
39
+ let(:raw_response) { double body: raw_body, :success? => false, status: 431 }
40
+ let(:client_error) { StackerBee::ClientError.new raw_response }
41
+ subject { client_error }
42
+ its(:status) { should eq http_status }
43
+ its(:to_s) { should eq message }
44
+ end
@@ -0,0 +1,49 @@
1
+ require "spec_helper"
2
+
3
+ describe StackerBee::Request do
4
+ let(:endpoint) { "listStuff" }
5
+ let(:api_key) { "this_guy" }
6
+ let(:params) do
7
+ {
8
+ list: :all,
9
+ nothing: nil,
10
+ deets: [:things, :stuff],
11
+ blank: ''
12
+ }
13
+ end
14
+ let(:request) { StackerBee::Request.new endpoint, api_key, params }
15
+ subject { request }
16
+ its(:params) do
17
+ should == {
18
+ list: :all,
19
+ api_key: api_key,
20
+ command: "listStuff",
21
+ nothing: nil,
22
+ blank: '',
23
+ deets: [:things, :stuff],
24
+ response: "json"
25
+ }
26
+ end
27
+
28
+ describe "#query_params" do
29
+ subject { request.query_params }
30
+ it { should include ["list", :all] }
31
+ it { should include %W(apiKey #{api_key}) }
32
+ it { should include %w(command listStuff) }
33
+ it { should include %w(response json) }
34
+ it { should include %w(deets things,stuff) }
35
+ it "removes params with nil values" do
36
+ subject.map(&:first).should_not include "nothing"
37
+ end
38
+ it "removes params with blank values" do
39
+ subject.map(&:first).should_not include "blank"
40
+ end
41
+
42
+ context "allowing blank strings" do
43
+ before do
44
+ request.allow_empty_string_params = true
45
+ end
46
+ it { should include ['blank', ''] }
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,79 @@
1
+ require "spec_helper"
2
+
3
+ describe StackerBee::Response do
4
+ let(:raw_body) { '{ "json": "here" }' }
5
+ let(:raw_response) { double body: raw_body, :success? => true }
6
+ let(:response) { StackerBee::Response.new raw_response }
7
+ subject { response }
8
+ its(:body) { should == 'here' }
9
+
10
+ context "raw response for list endpoint" do
11
+ let(:raw_body) do
12
+ '{ "listvirtualmachinesresponse":
13
+ { "count": 1, "virtualmachine": [{"ohai": "there"}] }
14
+ }'
15
+ end
16
+ its(:body) { should == [{ "ohai" => "there" }] }
17
+
18
+ context "first item" do
19
+ subject { response.first }
20
+ it { should == { "ohai" => "there" } }
21
+ its(["o_hai"]) { should == "there" }
22
+ end
23
+ end
24
+
25
+ context "raw response for list endpoint with no records" do
26
+ let(:raw_body) { '{ "listvirtualmachinesresponse": {} }' }
27
+ its(:body) { should == {} }
28
+ end
29
+
30
+ context "raw response for async endpoint" do
31
+ let(:raw_body) do
32
+ '{ "deployvirtualmachineresponse": { "id": 123, "jobid": 321 } }'
33
+ end
34
+ its(:body) { should == { "id" => 123, "jobid" => 321 } }
35
+ end
36
+
37
+ context "raw response for create endpoint" do
38
+ let(:raw_body) { '{ "register_ssh_keypair": { "fingerprint": 456 } }' }
39
+ its(:body) { should == { "fingerprint" => 456 } }
40
+ end
41
+
42
+ context "for failed request" do
43
+ let(:raw_response) do
44
+ double(
45
+ :body => '{ "foo": "bar" }',
46
+ :success? => false,
47
+ :status => 431
48
+ )
49
+ end
50
+ it { expect { subject }.to raise_exception StackerBee::ClientError }
51
+ end
52
+
53
+ context "for response with single key that's an object" do
54
+ let(:raw_body) { '{ "getuserresponse": { "user": { "id": 1 } } }' }
55
+ its(:body) { should == { "id" => 1 } }
56
+ end
57
+
58
+ context "for request with invalid credentials" do
59
+ let(:raw_response) do
60
+ double(
61
+ body: %[
62
+ { "createprojectresponse" :
63
+ {"uuidList":[],"errorcode":401,"errortext":"#{message}"} } ],
64
+ success?: false,
65
+ status: 401
66
+ )
67
+ end
68
+ let(:client_error) { StackerBee::AuthenticationError.new raw_response }
69
+ let(:message) do
70
+ "unable to verify user credentials and/or request signature"
71
+ end
72
+ it "raises an AuthenticationError" do
73
+ expect { subject }.to raise_exception(
74
+ StackerBee::AuthenticationError, message
75
+ )
76
+ end
77
+ end
78
+
79
+ end
@@ -0,0 +1,25 @@
1
+ require "spec_helper"
2
+
3
+ describe StackerBee::Utilities, "#uncase" do
4
+ include StackerBee::Utilities
5
+ it { uncase("Foo Bar").should eq "foobar" }
6
+ it { uncase("foo_bar").should eq "foobar" }
7
+ it { uncase("foo-bar").should eq "foobar" }
8
+ it { uncase("fooBar").should eq "foobar" }
9
+
10
+ it { snake_case("Foo Bar").should eq "foo_bar" }
11
+ it { snake_case("foo_bar").should eq "foo_bar" }
12
+ it { snake_case("foo-bar").should eq "foo_bar" }
13
+ it { snake_case("fooBar").should eq "foo_bar" }
14
+
15
+ it { camel_case("Foo Bar").should eq "FooBar" }
16
+ it { camel_case("foo_bar").should eq "FooBar" }
17
+ it { camel_case("foo-bar").should eq "FooBar" }
18
+ it { camel_case("fooBar").should eq "FooBar" }
19
+
20
+ it { camel_case("Foo Bar", true).should eq "fooBar" }
21
+ it { camel_case("foo_bar", true).should eq "fooBar" }
22
+ it { camel_case("foo-bar", true).should eq "fooBar" }
23
+ it { camel_case("fooBar", true).should eq "fooBar" }
24
+ it { camel_case("fooBar", false).should eq "FooBar" }
25
+ end
@@ -0,0 +1,6 @@
1
+ require "spec_helper"
2
+
3
+ describe StackerBee, "VERSION" do
4
+ subject { StackerBee::VERSION }
5
+ it { should_not be_nil }
6
+ end
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'stacker_bee/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "stacker_bee"
8
+ spec.version = StackerBee::VERSION
9
+ spec.platform = Gem::Platform::RUBY
10
+ spec.authors = ["Greg Sterndale"]
11
+ spec.email = ["greg@promptworks.com"]
12
+ spec.summary = %q{Ruby CloudStack client}
13
+ spec.description = %q{Ruby CloudStack client and CLI}
14
+ spec.homepage = "http://github.com/promptworks/stacker_bee"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files`.split($/)
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_runtime_dependency "faraday", "~> 0.8"
23
+ spec.add_runtime_dependency 'multi_json', "~> 1.8"
24
+
25
+ spec.add_development_dependency "bundler", "~> 1.3"
26
+ spec.add_development_dependency "rake", "~> 10.0"
27
+ spec.add_development_dependency "rspec", "~> 2.1"
28
+ spec.add_development_dependency "webmock", "~> 1.15"
29
+ spec.add_development_dependency "vcr", "~> 2.6"
30
+ end
metadata ADDED
@@ -0,0 +1,225 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: stacker_bee
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Greg Sterndale
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-11-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '0.8'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '0.8'
27
+ - !ruby/object:Gem::Dependency
28
+ name: multi_json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1.8'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '1.8'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: '2.1'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: '2.1'
83
+ - !ruby/object:Gem::Dependency
84
+ name: webmock
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: '1.15'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: '1.15'
97
+ - !ruby/object:Gem::Dependency
98
+ name: vcr
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: '2.6'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: '2.6'
111
+ description: Ruby CloudStack client and CLI
112
+ email:
113
+ - greg@promptworks.com
114
+ executables:
115
+ - stacker_bee
116
+ extensions: []
117
+ extra_rdoc_files: []
118
+ files:
119
+ - .gitignore
120
+ - .rspec
121
+ - .rubocop.yml
122
+ - .travis.yml
123
+ - Gemfile
124
+ - LICENSE.txt
125
+ - README.md
126
+ - Rakefile
127
+ - bin/stacker_bee
128
+ - config.default.yml
129
+ - config/4.2.json
130
+ - lib/stacker_bee.rb
131
+ - lib/stacker_bee/api.rb
132
+ - lib/stacker_bee/body_parser.rb
133
+ - lib/stacker_bee/client.rb
134
+ - lib/stacker_bee/configuration.rb
135
+ - lib/stacker_bee/connection.rb
136
+ - lib/stacker_bee/middleware/logger.rb
137
+ - lib/stacker_bee/middleware/signed_query.rb
138
+ - lib/stacker_bee/rash.rb
139
+ - lib/stacker_bee/request.rb
140
+ - lib/stacker_bee/request_error.rb
141
+ - lib/stacker_bee/response.rb
142
+ - lib/stacker_bee/utilities.rb
143
+ - lib/stacker_bee/version.rb
144
+ - spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/.yml
145
+ - spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/a_nil_request_parameter/properly_executes_the_request.yml
146
+ - spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/a_request_parameter_with_an_Array/.yml
147
+ - spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/a_request_parameter_with_and_empty_string/properly_executes_the_request.yml
148
+ - spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/containing_an_error/.yml
149
+ - spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/containing_an_error/should_log_response_as_error.yml
150
+ - spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/first/.yml
151
+ - spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/first_item/.yml
152
+ - spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/first_item/_account_type_/.yml
153
+ - spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/first_item/_accounttype_/.yml
154
+ - spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/should_log_request.yml
155
+ - spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/should_not_log_response_as_error.yml
156
+ - spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/space_character_in_a_request_parameter/properly_signs_the_request.yml
157
+ - spec/fixtures/4.2.json
158
+ - spec/fixtures/simple.json
159
+ - spec/integration/request_spec.rb
160
+ - spec/spec_helper.rb
161
+ - spec/units/stacker_bee/api_spec.rb
162
+ - spec/units/stacker_bee/client_spec.rb
163
+ - spec/units/stacker_bee/configuration_spec.rb
164
+ - spec/units/stacker_bee/connection_spec.rb
165
+ - spec/units/stacker_bee/middleware/logger_spec.rb
166
+ - spec/units/stacker_bee/rash_spec.rb
167
+ - spec/units/stacker_bee/request_error_spec.rb
168
+ - spec/units/stacker_bee/request_spec.rb
169
+ - spec/units/stacker_bee/response_spec.rb
170
+ - spec/units/stacker_bee/utilities_spec.rb
171
+ - spec/units/stacker_bee_spec.rb
172
+ - stacker_bee.gemspec
173
+ homepage: http://github.com/promptworks/stacker_bee
174
+ licenses:
175
+ - MIT
176
+ metadata: {}
177
+ post_install_message:
178
+ rdoc_options: []
179
+ require_paths:
180
+ - lib
181
+ required_ruby_version: !ruby/object:Gem::Requirement
182
+ requirements:
183
+ - - '>='
184
+ - !ruby/object:Gem::Version
185
+ version: '0'
186
+ required_rubygems_version: !ruby/object:Gem::Requirement
187
+ requirements:
188
+ - - '>='
189
+ - !ruby/object:Gem::Version
190
+ version: '0'
191
+ requirements: []
192
+ rubyforge_project:
193
+ rubygems_version: 2.0.3
194
+ signing_key:
195
+ specification_version: 4
196
+ summary: Ruby CloudStack client
197
+ test_files:
198
+ - spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/.yml
199
+ - spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/a_nil_request_parameter/properly_executes_the_request.yml
200
+ - spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/a_request_parameter_with_an_Array/.yml
201
+ - spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/a_request_parameter_with_and_empty_string/properly_executes_the_request.yml
202
+ - spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/containing_an_error/.yml
203
+ - spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/containing_an_error/should_log_response_as_error.yml
204
+ - spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/first/.yml
205
+ - spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/first_item/.yml
206
+ - spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/first_item/_account_type_/.yml
207
+ - spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/first_item/_accounttype_/.yml
208
+ - spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/should_log_request.yml
209
+ - spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/should_not_log_response_as_error.yml
210
+ - spec/cassettes/A_response_to_a_request_sent_to_the_CloudStack_API/space_character_in_a_request_parameter/properly_signs_the_request.yml
211
+ - spec/fixtures/4.2.json
212
+ - spec/fixtures/simple.json
213
+ - spec/integration/request_spec.rb
214
+ - spec/spec_helper.rb
215
+ - spec/units/stacker_bee/api_spec.rb
216
+ - spec/units/stacker_bee/client_spec.rb
217
+ - spec/units/stacker_bee/configuration_spec.rb
218
+ - spec/units/stacker_bee/connection_spec.rb
219
+ - spec/units/stacker_bee/middleware/logger_spec.rb
220
+ - spec/units/stacker_bee/rash_spec.rb
221
+ - spec/units/stacker_bee/request_error_spec.rb
222
+ - spec/units/stacker_bee/request_spec.rb
223
+ - spec/units/stacker_bee/response_spec.rb
224
+ - spec/units/stacker_bee/utilities_spec.rb
225
+ - spec/units/stacker_bee_spec.rb