yao 0.1.1 → 0.2.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/yao/client.rb +4 -26
- data/lib/yao/faraday_middlewares.rb +13 -0
- data/lib/yao/plugins/default_client_generator.rb +37 -0
- data/lib/yao/plugins/registry.rb +25 -0
- data/lib/yao/plugins.rb +3 -0
- data/lib/yao/resources/action.rb +16 -0
- data/lib/yao/resources/meter.rb +36 -0
- data/lib/yao/resources/resource.rb +54 -0
- data/lib/yao/resources/restfully_accessible.rb +23 -10
- data/lib/yao/resources/sample.rb +43 -0
- data/lib/yao/resources/server.rb +14 -0
- data/lib/yao/resources.rb +4 -0
- data/lib/yao/version.rb +1 -1
- data/lib/yao.rb +1 -0
- data/test/yao/test_client.rb +3 -3
- data/test/yao/test_client_plugin.rb +38 -0
- metadata +14 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 496e37a3be347d2be82ee61a2297dd8bd7271c97
|
4
|
+
data.tar.gz: 920987ae4956f2cc74be462eefd5fcd67c906c4a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8ca3a1ad84d0d95d36aa0802ea71df5455435bcd2eebdfda3b54c9b4bd468b9ed51a36665d063d330dd42e5625f83af73089e4563abd490e7a4b341be6597c8b
|
7
|
+
data.tar.gz: 1ddced2029721ec76beabce11277085d4044b76223e2e3049e19dc9f32e4d8d5cc63dd7935a53dfd8c898bce18594cacb054b169efe4697b2b3c51701817cb26
|
data/lib/yao/client.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
require 'yao'
|
2
2
|
require 'yao/config'
|
3
3
|
require 'faraday'
|
4
|
-
require '
|
5
|
-
require 'yao/faraday_middlewares'
|
4
|
+
require 'yao/plugins/default_client_generator'
|
6
5
|
|
7
6
|
module Yao
|
8
7
|
module Client
|
@@ -42,34 +41,13 @@ module Yao
|
|
42
41
|
class << self
|
43
42
|
attr_accessor :default_client
|
44
43
|
|
45
|
-
def
|
46
|
-
|
47
|
-
f.request :url_encoded
|
48
|
-
f.request :json
|
49
|
-
|
50
|
-
if token
|
51
|
-
f.request :os_token, token
|
52
|
-
end
|
53
|
-
|
54
|
-
f.response :os_error_detector
|
55
|
-
f.response :json, :content_type => /\bjson$/
|
56
|
-
|
57
|
-
if Yao.config.debug
|
58
|
-
f.response :logger
|
59
|
-
f.response :os_dumper
|
60
|
-
end
|
61
|
-
|
62
|
-
if Yao.config.debug_record_response
|
63
|
-
f.response :os_response_recorder
|
64
|
-
end
|
65
|
-
|
66
|
-
f.adapter Faraday.default_adapter
|
67
|
-
end
|
44
|
+
def client_generator
|
45
|
+
Plugins::Registry.instance[:client_generator][Yao.config.client_generator].new
|
68
46
|
end
|
69
47
|
|
70
48
|
def gen_client(endpoint, token: nil)
|
71
49
|
Faraday.new( endpoint ) do |f|
|
72
|
-
|
50
|
+
client_generator.call(f, token)
|
73
51
|
end
|
74
52
|
end
|
75
53
|
|
@@ -1,5 +1,18 @@
|
|
1
1
|
require 'faraday'
|
2
2
|
|
3
|
+
class Faraday::Request::Accept
|
4
|
+
def initialize(app, accept=nil)
|
5
|
+
@app = app
|
6
|
+
@accept = accept || 'application/json'
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
env[:request_headers]['Accept'] = @accept
|
11
|
+
@app.call(env)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
Faraday::Request.register_middleware accept: -> { Faraday::Request::Accept }
|
15
|
+
|
3
16
|
class Faraday::Request::OSToken
|
4
17
|
def initialize(app, token)
|
5
18
|
@app = app
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'yao/plugins'
|
2
|
+
require 'faraday'
|
3
|
+
require 'faraday_middleware'
|
4
|
+
require 'yao/faraday_middlewares'
|
5
|
+
|
6
|
+
module Yao::Plugins
|
7
|
+
class DefaultClientGenerator
|
8
|
+
def call(f, token)
|
9
|
+
f.request :accept, 'application/json'
|
10
|
+
f.request :url_encoded
|
11
|
+
|
12
|
+
if token
|
13
|
+
f.request :os_token, token
|
14
|
+
end
|
15
|
+
|
16
|
+
f.response :os_error_detector
|
17
|
+
f.response :json, :content_type => /\bjson$/
|
18
|
+
|
19
|
+
if Yao.config.debug
|
20
|
+
f.response :logger
|
21
|
+
f.response :os_dumper
|
22
|
+
end
|
23
|
+
|
24
|
+
if Yao.config.debug_record_response
|
25
|
+
f.response :os_response_recorder
|
26
|
+
end
|
27
|
+
|
28
|
+
f.adapter Faraday.default_adapter
|
29
|
+
end
|
30
|
+
|
31
|
+
Yao::Plugins.register(self, type: :client_generator)
|
32
|
+
|
33
|
+
Yao.config.param :client_generator, :default do |v|
|
34
|
+
raise("Invalid client_generator name %s.\nNote: name must be a Symbol" % v.inspect) unless Registry.instance[:client_generator][v]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
module Yao::Plugins
|
4
|
+
class Registry
|
5
|
+
include Singleton
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@types = {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def [](type)
|
12
|
+
@types[type]
|
13
|
+
end
|
14
|
+
|
15
|
+
def register(klass, type: nil, name: :default)
|
16
|
+
raise("Plugin registration requires both type and name.") if !type or !name
|
17
|
+
@types[type] ||= {}
|
18
|
+
@types[type][name] = klass
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.register(*a)
|
23
|
+
Registry.instance.register(*a)
|
24
|
+
end
|
25
|
+
end
|
data/lib/yao/plugins.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
module Yao::Resources
|
2
|
+
module Action
|
3
|
+
def action(id, query)
|
4
|
+
res = POST(action_path(id)) do |req|
|
5
|
+
req.body = query.to_json
|
6
|
+
req.headers['Content-Type'] = 'application/json'
|
7
|
+
end
|
8
|
+
return_resource(res.body[resource_name_in_json])
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
def action_path(id)
|
13
|
+
[resources_name, id, "action"].join("/")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Yao::Resources
|
2
|
+
class Meter < Base
|
3
|
+
friendly_attributes :meter_id, :name, :user_id, :resource_id, :project_id, :source, :type, :unit
|
4
|
+
|
5
|
+
def id
|
6
|
+
meter_id
|
7
|
+
end
|
8
|
+
|
9
|
+
def resource
|
10
|
+
@resource ||= Yao::Resource.get(resource_id)
|
11
|
+
end
|
12
|
+
|
13
|
+
def tenant
|
14
|
+
@tenant ||= Yao::User.get(project_id)
|
15
|
+
end
|
16
|
+
|
17
|
+
def user
|
18
|
+
@user ||= Yao::User.get(user_id)
|
19
|
+
end
|
20
|
+
|
21
|
+
self.service = "metering"
|
22
|
+
self.api_version = "v2"
|
23
|
+
self.resources_name = "meters"
|
24
|
+
|
25
|
+
class << self
|
26
|
+
private
|
27
|
+
def resource_from_json(json)
|
28
|
+
json
|
29
|
+
end
|
30
|
+
|
31
|
+
def resources_from_json(json)
|
32
|
+
json
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'time'
|
2
|
+
module Yao::Resources
|
3
|
+
class Resource < Base
|
4
|
+
friendly_attributes :user_id, :resource_id, :project_id,
|
5
|
+
:last_sample_timestamp, :first_sample_timestamp,
|
6
|
+
:metadata,
|
7
|
+
:links
|
8
|
+
|
9
|
+
def id
|
10
|
+
resource_id
|
11
|
+
end
|
12
|
+
|
13
|
+
def tenant
|
14
|
+
@tenant ||= Yao::User.get(project_id)
|
15
|
+
end
|
16
|
+
|
17
|
+
def user
|
18
|
+
@user ||= Yao::User.get(user_id)
|
19
|
+
end
|
20
|
+
|
21
|
+
def last_sampled_at
|
22
|
+
Time.parse last_sample_timestamp
|
23
|
+
end
|
24
|
+
|
25
|
+
def first_sampled_at
|
26
|
+
Time.parse first_sample_timestamp
|
27
|
+
end
|
28
|
+
|
29
|
+
def get_meter(name)
|
30
|
+
if link = links.find{|l| l["rel"] == name }
|
31
|
+
Yao::Sample.list(link["href"])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def meters
|
36
|
+
links.map{|l| l["rel"] }.delete_if{|n| n == 'self' }
|
37
|
+
end
|
38
|
+
|
39
|
+
self.service = "metering"
|
40
|
+
self.api_version = "v2"
|
41
|
+
self.resources_name = "resources"
|
42
|
+
|
43
|
+
class << self
|
44
|
+
private
|
45
|
+
def resource_from_json(json)
|
46
|
+
json
|
47
|
+
end
|
48
|
+
|
49
|
+
def resources_from_json(json)
|
50
|
+
json
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -18,10 +18,17 @@ module Yao::Resources
|
|
18
18
|
def service=(name)
|
19
19
|
@service = name
|
20
20
|
end
|
21
|
+
attr_reader :service
|
21
22
|
|
22
|
-
def
|
23
|
-
|
23
|
+
def api_version=(v)
|
24
|
+
raise("Set api_version after service is declared") unless service
|
25
|
+
@api_version = v
|
26
|
+
if cli = client
|
27
|
+
cli.url_prefix.path = "/#{api_version}"
|
28
|
+
end
|
29
|
+
api_version
|
24
30
|
end
|
31
|
+
attr_reader :api_version
|
25
32
|
|
26
33
|
def admin=(bool)
|
27
34
|
@admin = bool
|
@@ -71,14 +78,18 @@ module Yao::Resources
|
|
71
78
|
def list(query={})
|
72
79
|
json = GET(resources_path, query).body
|
73
80
|
if @return_single_on_querying && !query.empty?
|
74
|
-
return_resource(json
|
81
|
+
return_resource(resource_from_json(json))
|
75
82
|
else
|
76
|
-
return_resources(json
|
83
|
+
return_resources(resources_from_json(json))
|
77
84
|
end
|
78
85
|
end
|
79
86
|
|
80
87
|
def list_detail(query={})
|
81
|
-
return_resources(
|
88
|
+
return_resources(
|
89
|
+
resources_from_json(
|
90
|
+
GET([resources_path, "detail"].join("/"), query).body
|
91
|
+
)
|
92
|
+
)
|
82
93
|
end
|
83
94
|
|
84
95
|
def get(id_or_permalink, query={})
|
@@ -87,7 +98,7 @@ module Yao::Resources
|
|
87
98
|
else
|
88
99
|
GET([resources_path, id_or_permalink].join("/"), query)
|
89
100
|
end
|
90
|
-
return_resource(res.body
|
101
|
+
return_resource(resource_from_json(res.body))
|
91
102
|
end
|
92
103
|
alias find get
|
93
104
|
|
@@ -99,7 +110,7 @@ module Yao::Resources
|
|
99
110
|
req.body = params.to_json
|
100
111
|
req.headers['Content-Type'] = 'application/json'
|
101
112
|
end
|
102
|
-
return_resource(res.body
|
113
|
+
return_resource(resource_from_json(res.body))
|
103
114
|
end
|
104
115
|
|
105
116
|
def update(id, resource_params)
|
@@ -110,7 +121,7 @@ module Yao::Resources
|
|
110
121
|
req.body = params.to_json
|
111
122
|
req.headers['Content-Type'] = 'application/json'
|
112
123
|
end
|
113
|
-
return_resource(res.body
|
124
|
+
return_resource(resource_from_json(res.body))
|
114
125
|
end
|
115
126
|
|
116
127
|
def destroy(id)
|
@@ -119,12 +130,14 @@ module Yao::Resources
|
|
119
130
|
end
|
120
131
|
|
121
132
|
private
|
122
|
-
def
|
133
|
+
def resource_from_json(json)
|
123
134
|
@resource_name_in_json ||= resource_name.sub(/^os-/, "").tr("-", "_")
|
135
|
+
json[@resource_name_in_json]
|
124
136
|
end
|
125
137
|
|
126
|
-
def
|
138
|
+
def resources_from_json(json)
|
127
139
|
@resources_name_in_json ||= resources_name.sub(/^os-/, "").tr("-", "_")
|
140
|
+
json[@resources_name_in_json]
|
128
141
|
end
|
129
142
|
|
130
143
|
def return_resource(d)
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Yao::Resources
|
2
|
+
class Sample < Base
|
3
|
+
friendly_attributes :counter_name, :counter_type, :counter_unit, :counter_volume,
|
4
|
+
:message_id, :project_id, :resource_id, :timestamp, :resource_metadata, :user_id
|
5
|
+
:source
|
6
|
+
|
7
|
+
def recorded_at
|
8
|
+
Time.parse(self["recorded_at"] || self["timestamp"])
|
9
|
+
end
|
10
|
+
alias timestamp recorded_at
|
11
|
+
|
12
|
+
def id
|
13
|
+
meter_id
|
14
|
+
end
|
15
|
+
|
16
|
+
def resource
|
17
|
+
@resource ||= Yao::Resource.get(resource_id)
|
18
|
+
end
|
19
|
+
|
20
|
+
def tenant
|
21
|
+
@tenant ||= Yao::User.get(project_id)
|
22
|
+
end
|
23
|
+
|
24
|
+
def user
|
25
|
+
@user ||= Yao::User.get(user_id)
|
26
|
+
end
|
27
|
+
|
28
|
+
self.service = "metering"
|
29
|
+
self.api_version = "v2"
|
30
|
+
|
31
|
+
# get /v2/meters/{id} returns samples!
|
32
|
+
def self.list(id_or_url, query={})
|
33
|
+
json = if id_or_url =~ /^https?:\/\//
|
34
|
+
GET(id_or_url).body
|
35
|
+
else
|
36
|
+
GET("meters/#{id_or_url}", query).body
|
37
|
+
end
|
38
|
+
return_resources(json)
|
39
|
+
end
|
40
|
+
|
41
|
+
# TODO: implement `def self.create'
|
42
|
+
end
|
43
|
+
end
|
data/lib/yao/resources/server.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'yao/resources/metadata_available'
|
2
|
+
require 'yao/resources/action'
|
2
3
|
module Yao::Resources
|
3
4
|
class Server < Base
|
4
5
|
friendly_attributes :addresses, :metadata, :name, :progress,
|
@@ -21,6 +22,19 @@ module Yao::Resources
|
|
21
22
|
self.resource_name = "server"
|
22
23
|
self.resources_name = "servers"
|
23
24
|
|
25
|
+
def self.shutoff(id)
|
26
|
+
action(id, "os-stop" => nil)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.reboot(id)
|
30
|
+
action(id,"reboot" => { "type" => "HARD" })
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.resize(id, flavor_id)
|
34
|
+
action(id,"resize" => { "flavorRef" => flavor_id })
|
35
|
+
end
|
36
|
+
|
24
37
|
extend MetadataAvailable
|
38
|
+
extend Action
|
25
39
|
end
|
26
40
|
end
|
data/lib/yao/resources.rb
CHANGED
@@ -17,6 +17,10 @@ module Yao
|
|
17
17
|
autoload :Host, "yao/resources/host"
|
18
18
|
autoload :User, "yao/resources/user"
|
19
19
|
autoload :Role, "yao/resources/role"
|
20
|
+
|
21
|
+
autoload :Resource, "yao/resources/resource"
|
22
|
+
autoload :Meter, "yao/resources/meter"
|
23
|
+
autoload :Sample, "yao/resources/sample"
|
20
24
|
end
|
21
25
|
|
22
26
|
def self.const_missing(name)
|
data/lib/yao/version.rb
CHANGED
data/lib/yao.rb
CHANGED
data/test/yao/test_client.rb
CHANGED
@@ -9,8 +9,8 @@ class TestClient < Test::Unit::TestCase
|
|
9
9
|
assert { cli.url_prefix.to_s == "http://cool-api.example.com:12345/v3.0" }
|
10
10
|
|
11
11
|
handlers = [
|
12
|
+
Faraday::Request::Accept,
|
12
13
|
Faraday::Request::UrlEncoded,
|
13
|
-
FaradayMiddleware::EncodeJson,
|
14
14
|
Faraday::Response::OSErrorDetector,
|
15
15
|
FaradayMiddleware::ParseJson,
|
16
16
|
Faraday::Adapter::NetHttp
|
@@ -21,8 +21,8 @@ class TestClient < Test::Unit::TestCase
|
|
21
21
|
def test_gen_with_token
|
22
22
|
cli = Yao::Client.gen_client("http://cool-api.example.com:12345/v3.0", token: "deadbeaf")
|
23
23
|
handlers = [
|
24
|
+
Faraday::Request::Accept,
|
24
25
|
Faraday::Request::UrlEncoded,
|
25
|
-
FaradayMiddleware::EncodeJson,
|
26
26
|
Faraday::Request::OSToken,
|
27
27
|
Faraday::Response::OSErrorDetector,
|
28
28
|
FaradayMiddleware::ParseJson,
|
@@ -36,8 +36,8 @@ class TestClient < Test::Unit::TestCase
|
|
36
36
|
|
37
37
|
cli = Yao::Client.gen_client("http://cool-api.example.com:12345/v3.0")
|
38
38
|
handlers = [
|
39
|
+
Faraday::Request::Accept,
|
39
40
|
Faraday::Request::UrlEncoded,
|
40
|
-
FaradayMiddleware::EncodeJson,
|
41
41
|
Faraday::Response::OSErrorDetector,
|
42
42
|
FaradayMiddleware::ParseJson,
|
43
43
|
Faraday::Response::Logger,
|
@@ -0,0 +1,38 @@
|
|
1
|
+
class TestClientPlugin < Test::Unit::TestCase
|
2
|
+
def setup
|
3
|
+
stub(Yao.config).debug { false }
|
4
|
+
stub(Yao.config).debug_record_response { false }
|
5
|
+
end
|
6
|
+
|
7
|
+
def teardown
|
8
|
+
Yao.config.set :client_generator, :default
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_raise_invalid_name
|
12
|
+
e = nil
|
13
|
+
begin
|
14
|
+
Yao.config.set :client_generator, :nonexist
|
15
|
+
rescue => e
|
16
|
+
end
|
17
|
+
|
18
|
+
assert { e.is_a? StandardError }
|
19
|
+
assert { e.message == "Invalid client_generator name :nonexist.\nNote: name must be a Symbol" }
|
20
|
+
end
|
21
|
+
|
22
|
+
class ::Yao::Plugins::TestCustomClientGenerator
|
23
|
+
def call(f, t)
|
24
|
+
f.response :xml, :content_type => /\/xml$/
|
25
|
+
end
|
26
|
+
::Yao::Plugins.register self, type: :client_generator, name: :test_custom
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_gen_client_with_custom
|
30
|
+
Yao.config.set :client_generator, :test_custom
|
31
|
+
|
32
|
+
cli = Yao::Client.gen_client("http://cool-api.example.com:12345/v3.0")
|
33
|
+
handlers = [
|
34
|
+
FaradayMiddleware::ParseXml,
|
35
|
+
]
|
36
|
+
assert { cli.builder.handlers == handlers }
|
37
|
+
end
|
38
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yao
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Uchio, KONDO
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -170,7 +170,11 @@ files:
|
|
170
170
|
- lib/yao/config.rb
|
171
171
|
- lib/yao/faraday_middlewares.rb
|
172
172
|
- lib/yao/is_openstack_client.rb
|
173
|
+
- lib/yao/plugins.rb
|
174
|
+
- lib/yao/plugins/default_client_generator.rb
|
175
|
+
- lib/yao/plugins/registry.rb
|
173
176
|
- lib/yao/resources.rb
|
177
|
+
- lib/yao/resources/action.rb
|
174
178
|
- lib/yao/resources/base.rb
|
175
179
|
- lib/yao/resources/flavor.rb
|
176
180
|
- lib/yao/resources/floating_ip.rb
|
@@ -179,10 +183,13 @@ files:
|
|
179
183
|
- lib/yao/resources/image.rb
|
180
184
|
- lib/yao/resources/keypair.rb
|
181
185
|
- lib/yao/resources/metadata_available.rb
|
186
|
+
- lib/yao/resources/meter.rb
|
182
187
|
- lib/yao/resources/network.rb
|
183
188
|
- lib/yao/resources/port.rb
|
189
|
+
- lib/yao/resources/resource.rb
|
184
190
|
- lib/yao/resources/restfully_accessible.rb
|
185
191
|
- lib/yao/resources/role.rb
|
192
|
+
- lib/yao/resources/sample.rb
|
186
193
|
- lib/yao/resources/security_group.rb
|
187
194
|
- lib/yao/resources/security_group_rule.rb
|
188
195
|
- lib/yao/resources/server.rb
|
@@ -195,6 +202,7 @@ files:
|
|
195
202
|
- test/config.rb
|
196
203
|
- test/yao/test_auth.rb
|
197
204
|
- test/yao/test_client.rb
|
205
|
+
- test/yao/test_client_plugin.rb
|
198
206
|
- test/yao/test_config.rb
|
199
207
|
- test/yao/test_server_error.rb
|
200
208
|
- test/yao/test_token.rb
|
@@ -214,12 +222,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
214
222
|
version: '0'
|
215
223
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
216
224
|
requirements:
|
217
|
-
- - "
|
225
|
+
- - ">"
|
218
226
|
- !ruby/object:Gem::Version
|
219
|
-
version:
|
227
|
+
version: 1.3.1
|
220
228
|
requirements: []
|
221
229
|
rubyforge_project:
|
222
|
-
rubygems_version: 2.2.
|
230
|
+
rubygems_version: 2.2.5
|
223
231
|
signing_key:
|
224
232
|
specification_version: 4
|
225
233
|
summary: Yet Another OpenStack API Wrapper that rocks!!
|
@@ -227,6 +235,7 @@ test_files:
|
|
227
235
|
- test/config.rb
|
228
236
|
- test/yao/test_auth.rb
|
229
237
|
- test/yao/test_client.rb
|
238
|
+
- test/yao/test_client_plugin.rb
|
230
239
|
- test/yao/test_config.rb
|
231
240
|
- test/yao/test_server_error.rb
|
232
241
|
- test/yao/test_token.rb
|