yao 0.2.7 → 0.2.8

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 53df9cfa1f201d10e411a9ec3214c6efd8126c5d
4
- data.tar.gz: 4ffd45745dcb4e292128acd8fb1a660928fbf65c
3
+ metadata.gz: 1265dc90ca7a24dc73c1bea6f56dd54170ca1cd2
4
+ data.tar.gz: ae58d2f7e8b5c8830f2965e072e726bed04c982c
5
5
  SHA512:
6
- metadata.gz: a7cba58804c3718d3de59e3d314a5ab41021a2c0274397a14e8d83185bae1f9c1b8a708afa87729d6389641cf776a05f644f5f729eaa3050ed9d941b15d9e060
7
- data.tar.gz: 2c6d0e4aeabb425076e1fa4597079620489419ecfbc33ad0106c1e8696d617c454efc2aca4e60edb75f388bb181215ffc516d8cb5459255eb7f30b33d5582790
6
+ metadata.gz: 4c27613a24e52a2e1397e73a18d44d54335cf249a5eed33be21a5f37ec91f8ab9a33ebc8be030a8fa0ecc0faf4a83831c5d46d804f2c2287ff3d4215fb69629a
7
+ data.tar.gz: f6879388cb203aa0b481d24a5597fffd628e351f253c50ad1d173292ab5e541bcf20e72c0613fee73627a064f1edf7d7fba1542e53cfb2336cb5049c36ac09f2
data/lib/yao/client.rb CHANGED
@@ -69,6 +69,9 @@ module Yao
69
69
  Yao::Client.default_client
70
70
  end
71
71
 
72
+ Yao.config.param :noop_on_write, false
73
+ Yao.config.param :raise_on_write, false
74
+
72
75
  Yao.config.param :debug, false
73
76
  Yao.config.param :debug_record_response, false
74
77
  end
@@ -1,4 +1,6 @@
1
1
  module Yao
2
+ class ReadOnlyViolationError < ::StandardError; end
3
+
2
4
  class ServerError < ::StandardError
3
5
  def initialize(message, requested_env)
4
6
  @status = requested_env.status
@@ -1,4 +1,5 @@
1
1
  require 'faraday'
2
+ require 'yao/error'
2
3
 
3
4
  class Faraday::Request::Accept
4
5
  def initialize(app, accept=nil)
@@ -30,6 +31,39 @@ class Faraday::Request::OSToken
30
31
  end
31
32
  Faraday::Request.register_middleware os_token: -> { Faraday::Request::OSToken }
32
33
 
34
+ class Faraday::Request::ReadOnly
35
+ def initialize(app)
36
+ @app = app
37
+ end
38
+
39
+ def call(env)
40
+ return @app.call(env) if allowed_request?(env)
41
+
42
+ if Yao.config.raise_on_write
43
+ raise Yao::ReadOnlyViolationError
44
+ elsif Yao.config.noop_on_write
45
+ env
46
+ else
47
+ @app.call(env)
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+ ALLOWED_REQUESTS = [
54
+ {method: :post, path: "/v2.0/tokens"}
55
+ ]
56
+
57
+ def allowed_request?(env)
58
+ return true if env[:method] == :get
59
+
60
+ ALLOWED_REQUESTS.any? do |allowed|
61
+ env[:method] == allowed[:method] && env[:url].path == allowed[:path]
62
+ end
63
+ end
64
+ end
65
+ Faraday::Request.register_middleware read_only: -> { Faraday::Request::ReadOnly }
66
+
33
67
  class Faraday::Response::OSDumper < Faraday::Response::Middleware
34
68
  def on_complete(env)
35
69
  require 'pp'
@@ -74,6 +108,8 @@ class Faraday::Response::OSResponseRecorder < Faraday::Response::Middleware
74
108
  def on_complete(env)
75
109
  require 'pathname'
76
110
  root = Pathname.new(File.expand_path('../../../tmp', __FILE__))
111
+ Dir.mkdir(root) unless File.exist?(root)
112
+
77
113
  path = [env.method.to_s.upcase, env.url.path.gsub('/', '-')].join("-") + ".json"
78
114
 
79
115
  puts root.join(path)
@@ -84,7 +120,6 @@ class Faraday::Response::OSResponseRecorder < Faraday::Response::Middleware
84
120
  end
85
121
  Faraday::Response.register_middleware os_response_recorder: -> { Faraday::Response::OSResponseRecorder }
86
122
 
87
- require 'yao/server_error'
88
123
  class Faraday::Response::OSErrorDetector < Faraday::Response::Middleware
89
124
  # TODO: Better handling, respecting official doc
90
125
  def on_complete(env)
data/lib/yao/mode.rb ADDED
@@ -0,0 +1,35 @@
1
+ module Yao
2
+ module Mode
3
+ def read_only!(&blk)
4
+ raise unless block_given?
5
+
6
+ raise_on_write_org = Yao.config.raise_on_write
7
+ noop_on_write_org = Yao.config.noop_on_write
8
+
9
+ Yao.config.set :noop_on_write, false if noop_on_write_org
10
+ Yao.config.set :raise_on_write, true
11
+ begin
12
+ yield
13
+ ensure
14
+ Yao.config.set :raise_on_write, raise_on_write_org
15
+ Yao.config.set :noop_on_write, noop_on_write_org
16
+ end
17
+ end
18
+
19
+ def read_only(&blk)
20
+ raise unless block_given?
21
+
22
+ noop_on_write_org = Yao.config.noop_on_write
23
+ raise_on_write_org = Yao.config.raise_on_write
24
+
25
+ Yao.config.set :raise_on_write, false if raise_on_write_org
26
+ Yao.config.set :noop_on_write, true
27
+ begin
28
+ yield
29
+ ensure
30
+ Yao.config.set :noop_on_write, noop_on_write_org
31
+ Yao.config.set :raise_on_write, raise_on_write_org
32
+ end
33
+ end
34
+ end
35
+ end
@@ -13,6 +13,8 @@ module Yao::Plugins
13
13
  f.request :os_token, token
14
14
  end
15
15
 
16
+ f.request :read_only
17
+
16
18
  f.response :os_error_detector
17
19
  f.response :json, :content_type => /\bjson$/
18
20
 
@@ -57,18 +57,18 @@ module Yao::Resources
57
57
  def as_member(&blk)
58
58
  if @admin
59
59
  @admin = false
60
- result = yield(blk)
60
+ result = yield
61
61
  @admin = true
62
62
  result
63
63
  else
64
- yield blk
64
+ yield
65
65
  end
66
66
  end
67
67
 
68
68
  def with_resources_path(path, &blk)
69
69
  original = @resources_path
70
70
  @resources_path = path
71
- result = yield(blk)
71
+ result = yield
72
72
  @resources_path = original
73
73
 
74
74
  result
data/lib/yao/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Yao
2
- VERSION = "0.2.7"
2
+ VERSION = "0.2.8"
3
3
  end
data/lib/yao.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  require "yao/version"
2
+ require 'yao/mode'
2
3
 
3
4
  module Yao
5
+ extend Mode
4
6
  end
5
7
 
6
8
  require 'yao/config'
data/test/config.rb CHANGED
@@ -3,6 +3,8 @@ require 'test/unit/rr'
3
3
  require 'power_assert'
4
4
  require 'yao'
5
5
 
6
+ require 'support/auth_stub'
7
+
6
8
  require 'webmock/test_unit'
7
9
 
8
10
  WebMock.disable_net_connect!
@@ -0,0 +1,117 @@
1
+ module AuthStub
2
+ def stub_auth_request(auth_url, username, password, tenant)
3
+ stub_request(:post, "#{auth_url}/v2.0/tokens")
4
+ .with(
5
+ body: auth_json(username, password, tenant)
6
+ ).to_return(
7
+ :status => 200,
8
+ :body => response_json(auth_url, username, tenant),
9
+ :headers => {'Content-Type' => 'application/json'}
10
+ )
11
+ end
12
+
13
+ private
14
+
15
+ def auth_json(username, password, tenant)
16
+ json = <<-JSON
17
+ {"auth":{"passwordCredentials":{"username":"#{username}","password":"#{password}"},"tenantName":"#{tenant}"}}
18
+ JSON
19
+
20
+ json.strip
21
+ end
22
+
23
+ def response_json(auth_url, username, tenant)
24
+ <<-JSON
25
+ {
26
+ "access": {
27
+ "token": {
28
+ "issued_at": "#{Time.now.iso8601}",
29
+ "expires": "#{(Time.now + 3600).utc.iso8601}",
30
+ "id": "aaaa166533fd49f3b11b1cdce2430000",
31
+ "tenant": {
32
+ "description": "Testing",
33
+ "enabled": true,
34
+ "id": "aaaa166533fd49f3b11b1cdce2430000",
35
+ "name": "#{tenant}"
36
+ }
37
+ },
38
+ "serviceCatalog": [
39
+ {
40
+ "endpoints": [
41
+ {
42
+ "adminURL": "http://nova-endpoint.example.com:8774/v2/b598bf98671c47e1b955f8c9660e3c44",
43
+ "region": "RegionOne",
44
+ "internalURL": "http://nova-endpoint.example.com:8774/v2/b598bf98671c47e1b955f8c9660e3c44",
45
+ "id": "1a66e6af97c440b2a7bbc4f9735923d9",
46
+ "publicURL": "http://nova-endpoint.example.com:8774/v2/b598bf98671c47e1b955f8c9660e3c44"
47
+ }
48
+ ],
49
+ "endpoints_links": [],
50
+ "type": "compute",
51
+ "name": "nova"
52
+ },
53
+ {
54
+ "endpoints": [
55
+ {
56
+ "adminURL": "http://neutron-endpoint.example.com:9696/",
57
+ "region": "RegionOne",
58
+ "internalURL": "http://neutron-endpoint.example.com:9696/",
59
+ "id": "0418104da877468ca65d739142fa3454",
60
+ "publicURL": "http://neutron-endpoint.example.com:9696/"
61
+ }
62
+ ],
63
+ "endpoints_links": [],
64
+ "type": "network",
65
+ "name": "neutron"
66
+ },
67
+ {
68
+ "endpoints": [
69
+ {
70
+ "adminURL": "http://glance-endpoint.example.com:9292",
71
+ "region": "RegionOne",
72
+ "internalURL": "http://glance-endpoint.example.com:9292",
73
+ "id": "246f33509ff64802b86eb081307ecec0",
74
+ "publicURL": "http://glance-endpoint.example.com:9292"
75
+ }
76
+ ],
77
+ "endpoints_links": [],
78
+ "type": "image",
79
+ "name": "glance"
80
+ },
81
+ {
82
+ "endpoints": [
83
+ {
84
+ "adminURL": "#{auth_url}/v2.0",
85
+ "region": "RegionOne",
86
+ "internalURL": "http://endpoint.example.com:5000/v2.0",
87
+ "id": "2b982236cc084128bf42b647c1b7fb49",
88
+ "publicURL": "http://endpoint.example.com:5000/v2.0"
89
+ }
90
+ ],
91
+ "endpoints_links": [],
92
+ "type": "identity",
93
+ "name": "keystone"
94
+ }
95
+ ],
96
+ "user": {
97
+ "username": "#{username}",
98
+ "roles_links": [],
99
+ "id": "a9994b2dee82423da7da572397d3157a",
100
+ "roles": [
101
+ {
102
+ "name": "admin"
103
+ }
104
+ ],
105
+ "name": "#{username}"
106
+ },
107
+ "metadata": {
108
+ "is_admin": 0,
109
+ "roles": [
110
+ "ce5330c512cc4bd289b3a725ad1106b7"
111
+ ]
112
+ }
113
+ }
114
+ }
115
+ JSON
116
+ end
117
+ end
@@ -1,107 +1,16 @@
1
1
  class TestAuth < Test::Unit::TestCase
2
-
3
- AUTH_JSON = \
4
- "{\"auth\":{\"passwordCredentials\":{\"username\":\"udzura\",\"password\":\"XXXXXXXX\"},\"tenantName\":\"example\"}}"
5
-
6
- RESPONSE_JSON = <<-JSON
7
- {
8
- "access": {
9
- "token": {
10
- "issued_at": "2015-08-31T03:58:36.073232",
11
- "expires": "2015-09-01T03:58:36Z",
12
- "id": "aaaa166533fd49f3b11b1cdce2430000",
13
- "tenant": {
14
- "description": "Testing",
15
- "enabled": true,
16
- "id": "aaaa166533fd49f3b11b1cdce2430000",
17
- "name": "example"
18
- }
19
- },
20
- "serviceCatalog": [
21
- {
22
- "endpoints": [
23
- {
24
- "adminURL": "http://nova-endpoint.example.com:8774/v2/b598bf98671c47e1b955f8c9660e3c44",
25
- "region": "RegionOne",
26
- "internalURL": "http://nova-endpoint.example.com:8774/v2/b598bf98671c47e1b955f8c9660e3c44",
27
- "id": "1a66e6af97c440b2a7bbc4f9735923d9",
28
- "publicURL": "http://nova-endpoint.example.com:8774/v2/b598bf98671c47e1b955f8c9660e3c44"
29
- }
30
- ],
31
- "endpoints_links": [],
32
- "type": "compute",
33
- "name": "nova"
34
- },
35
- {
36
- "endpoints": [
37
- {
38
- "adminURL": "http://neutron-endpoint.example.com:9696/",
39
- "region": "RegionOne",
40
- "internalURL": "http://neutron-endpoint.example.com:9696/",
41
- "id": "0418104da877468ca65d739142fa3454",
42
- "publicURL": "http://neutron-endpoint.example.com:9696/"
43
- }
44
- ],
45
- "endpoints_links": [],
46
- "type": "network",
47
- "name": "neutron"
48
- },
49
- {
50
- "endpoints": [
51
- {
52
- "adminURL": "http://glance-endpoint.example.com:9292",
53
- "region": "RegionOne",
54
- "internalURL": "http://glance-endpoint.example.com:9292",
55
- "id": "246f33509ff64802b86eb081307ecec0",
56
- "publicURL": "http://glance-endpoint.example.com:9292"
57
- }
58
- ],
59
- "endpoints_links": [],
60
- "type": "image",
61
- "name": "glance"
62
- },
63
- {
64
- "endpoints": [
65
- {
66
- "adminURL": "http://endpoint.example.com:12345/v2.0",
67
- "region": "RegionOne",
68
- "internalURL": "http://endpoint.example.com:5000/v2.0",
69
- "id": "2b982236cc084128bf42b647c1b7fb49",
70
- "publicURL": "http://endpoint.example.com:5000/v2.0"
71
- }
72
- ],
73
- "endpoints_links": [],
74
- "type": "identity",
75
- "name": "keystone"
76
- }
77
- ],
78
- "user": {
79
- "username": "udzura",
80
- "roles_links": [],
81
- "id": "a9994b2dee82423da7da572397d3157a",
82
- "roles": [
83
- {
84
- "name": "admin"
85
- }
86
- ],
87
- "name": "udzura"
88
- },
89
- "metadata": {
90
- "is_admin": 0,
91
- "roles": [
92
- "ce5330c512cc4bd289b3a725ad1106b7"
93
- ]
94
- }
95
- }
96
- }
97
- JSON
2
+ include AuthStub
98
3
 
99
4
  def setup
100
- stub_request(:post, "http://endpoint.example.com:12345/v2.0/tokens").with(body: AUTH_JSON)
101
- .to_return(:status => 200, :body => RESPONSE_JSON, :headers => {'Content-Type' => 'application/json'})
5
+ @auth_url = "http://endpoint.example.com:12345"
6
+ username = "udzura"
7
+ tenant = "example"
8
+ password = "XXXXXXXX"
9
+
10
+ stub_auth_request(@auth_url, username, password, tenant)
102
11
 
103
- Yao.config.set :auth_url, "http://endpoint.example.com:12345"
104
- @token = Yao::Auth.new(tenant_name: "example", username: "udzura", password: "XXXXXXXX")
12
+ Yao.config.set :auth_url, @auth_url
13
+ @token = Yao::Auth.new(tenant_name: tenant, username: username, password: password)
105
14
  end
106
15
 
107
16
  def teardown
@@ -132,8 +41,7 @@ class TestAuth < Test::Unit::TestCase
132
41
 
133
42
  def test_token_is_valid
134
43
  assert { @token.token == "aaaa166533fd49f3b11b1cdce2430000" }
135
- assert { @token.issued_at == Time.parse("2015-08-31T03:58:36.073232") }
136
- assert { @token.expire_at == Time.parse("2015-09-01T03:58:36Z") }
44
+ assert { @token.expire_at - @token.issued_at == 3600 }
137
45
  assert { @token.endpoints.size == 4 }
138
46
  end
139
47
 
@@ -11,6 +11,7 @@ class TestClient < Test::Unit::TestCase
11
11
  handlers = [
12
12
  Faraday::Request::Accept,
13
13
  Faraday::Request::UrlEncoded,
14
+ Faraday::Request::ReadOnly,
14
15
  Faraday::Response::OSErrorDetector,
15
16
  FaradayMiddleware::ParseJson,
16
17
  Faraday::Adapter::NetHttp
@@ -24,6 +25,7 @@ class TestClient < Test::Unit::TestCase
24
25
  Faraday::Request::Accept,
25
26
  Faraday::Request::UrlEncoded,
26
27
  Faraday::Request::OSToken,
28
+ Faraday::Request::ReadOnly,
27
29
  Faraday::Response::OSErrorDetector,
28
30
  FaradayMiddleware::ParseJson,
29
31
  Faraday::Adapter::NetHttp
@@ -38,6 +40,7 @@ class TestClient < Test::Unit::TestCase
38
40
  handlers = [
39
41
  Faraday::Request::Accept,
40
42
  Faraday::Request::UrlEncoded,
43
+ Faraday::Request::ReadOnly,
41
44
  Faraday::Response::OSErrorDetector,
42
45
  FaradayMiddleware::ParseJson,
43
46
  Faraday::Response::Logger,
@@ -0,0 +1,114 @@
1
+ class TestOnly < Test::Unit::TestCase
2
+ include AuthStub
3
+
4
+ def setup
5
+ auth_url = "http://endpoint.example.com:12345"
6
+ username = "udzura"
7
+ tenant = "example"
8
+ password = "XXXXXXXX"
9
+
10
+ stub_auth_request(auth_url, username, password, tenant)
11
+
12
+ Yao.configure do
13
+ auth_url auth_url
14
+ username username
15
+ tenant_name tenant
16
+ password password
17
+ end
18
+
19
+ @username = username
20
+ @get_stub = stub_request(:get, "#{auth_url}/v2.0/users?name=#{username}")
21
+ @post_stub = stub_request(:post, "#{auth_url}/v2.0/users")
22
+ end
23
+
24
+ def test_read_only
25
+ Yao.read_only do
26
+ Yao::User.get_by_name(@username)
27
+ Yao::User.create(name: "foo", email: "bar", password: "baz")
28
+ end
29
+
30
+ assert_requested @get_stub
31
+ assert_not_requested @post_stub
32
+ end
33
+
34
+ def test_read_only!
35
+ assert_raise Yao::ReadOnlyViolationError do
36
+ Yao.read_only! do
37
+ Yao::User.get_by_name(@username)
38
+ Yao::User.create(name: "foo", email: "bar", password: "baz")
39
+ end
40
+ end
41
+
42
+ assert_requested @get_stub
43
+ assert_not_requested @post_stub
44
+ end
45
+
46
+ def test_read_only_flags_life_cycle
47
+ assert_false Yao.config.noop_on_write
48
+ assert_false Yao.config.raise_on_write
49
+
50
+ assert_raise RuntimeError do
51
+ Yao.read_only do
52
+ assert_true Yao.config.noop_on_write
53
+ raise
54
+ end
55
+ end
56
+
57
+ assert_false Yao.config.noop_on_write
58
+ assert_false Yao.config.raise_on_write
59
+
60
+ assert_raise RuntimeError do
61
+ Yao.read_only! do
62
+ assert_true Yao.config.raise_on_write
63
+ raise
64
+ end
65
+ end
66
+
67
+ assert_false Yao.config.noop_on_write
68
+ assert_false Yao.config.raise_on_write
69
+ end
70
+
71
+ def test_reentrant_condition
72
+ Yao.read_only do
73
+ assert_true Yao.config.noop_on_write
74
+
75
+ Yao.read_only do
76
+ assert_true Yao.config.noop_on_write
77
+ end
78
+
79
+ assert_true Yao.config.noop_on_write
80
+ end
81
+
82
+ Yao.read_only! do
83
+ assert_true Yao.config.raise_on_write
84
+
85
+ Yao.read_only! do
86
+ assert_true Yao.config.raise_on_write
87
+ end
88
+
89
+ assert_true Yao.config.raise_on_write
90
+ end
91
+
92
+ Yao.read_only! do
93
+ assert_true Yao.config.raise_on_write
94
+
95
+ Yao.read_only do
96
+ assert_true Yao.config.noop_on_write
97
+ assert_false Yao.config.raise_on_write
98
+ end
99
+
100
+ assert_true Yao.config.raise_on_write
101
+ end
102
+
103
+ Yao.read_only do
104
+ assert_true Yao.config.noop_on_write
105
+
106
+ Yao.read_only! do
107
+ assert_true Yao.config.raise_on_write
108
+ assert_false Yao.config.noop_on_write
109
+ end
110
+
111
+ assert_true Yao.config.noop_on_write
112
+ end
113
+ end
114
+ end
@@ -1,4 +1,6 @@
1
1
  class TestToken < Test::Unit::TestCase
2
+ include AuthStub
3
+
2
4
  def setup
3
5
  stub(Yao.config).debug { false }
4
6
  stub(Yao.config).debug_record_response { false }
@@ -22,37 +24,18 @@ class TestToken < Test::Unit::TestCase
22
24
  assert { ! t.expired? }
23
25
  end
24
26
 
25
- AUTH_JSON = \
26
- "{\"auth\":{\"passwordCredentials\":{\"username\":\"udzura\",\"password\":\"XXXXXXXX\"},\"tenantName\":\"example\"}}"
27
-
28
- def gen_response_json
29
- <<-JSON
30
- {
31
- "access": {
32
- "token": {
33
- "issued_at": "#{Time.now.iso8601}",
34
- "expires": "#{(Time.now + 3600).utc.iso8601}",
35
- "id": "aaaa166533fd49f3b11b1cdce2430000",
36
- "tenant": {
37
- "description": "Testing",
38
- "enabled": true,
39
- "id": "aaaa166533fd49f3b11b1cdce2430000",
40
- "name": "example"
41
- }
42
- },
43
- "serviceCatalog": []
44
- }
45
- }
46
- JSON
47
- end
48
-
49
27
  def test_reflesh
28
+ auth_url = "http://endpoint.example.com:12345"
29
+ username = "udzura"
30
+ tenant = "example"
31
+ password = "XXXXXXXX"
32
+
50
33
  auth_info = {
51
34
  auth: {
52
35
  passwordCredentials: {
53
- username: "udzura", password: "XXXXXXXX"
36
+ username: username, password: password
54
37
  },
55
- tenantName: "example"
38
+ tenantName: tenant
56
39
  }
57
40
  }
58
41
  t = Yao::Token.new(auth_info)
@@ -63,10 +46,9 @@ class TestToken < Test::Unit::TestCase
63
46
  })
64
47
  assert { t.token == "old_token" }
65
48
 
66
- stub_request(:post, "http://endpoint.example.com:12345/v2.0/tokens").with(body: AUTH_JSON)
67
- .to_return(:status => 200, :body => gen_response_json, :headers => {'Content-Type' => 'application/json'})
49
+ stub_auth_request(auth_url, username, password, tenant)
68
50
 
69
- Yao.config.auth_url "http://endpoint.example.com:12345"
51
+ Yao.config.auth_url auth_url
70
52
  t.reflesh(Yao.default_client.default)
71
53
 
72
54
  assert { t.token == "aaaa166533fd49f3b11b1cdce2430000" }
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.2.7
4
+ version: 0.2.8
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-12-08 00:00:00.000000000 Z
11
+ date: 2016-01-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -169,8 +169,10 @@ files:
169
169
  - lib/yao/auth.rb
170
170
  - lib/yao/client.rb
171
171
  - lib/yao/config.rb
172
+ - lib/yao/error.rb
172
173
  - lib/yao/faraday_middlewares.rb
173
174
  - lib/yao/is_openstack_client.rb
175
+ - lib/yao/mode.rb
174
176
  - lib/yao/plugins.rb
175
177
  - lib/yao/plugins/default_client_generator.rb
176
178
  - lib/yao/plugins/registry.rb
@@ -198,14 +200,15 @@ files:
198
200
  - lib/yao/resources/subnet.rb
199
201
  - lib/yao/resources/tenant.rb
200
202
  - lib/yao/resources/user.rb
201
- - lib/yao/server_error.rb
202
203
  - lib/yao/token.rb
203
204
  - lib/yao/version.rb
204
205
  - test/config.rb
206
+ - test/support/auth_stub.rb
205
207
  - test/yao/test_auth.rb
206
208
  - test/yao/test_client.rb
207
209
  - test/yao/test_client_plugin.rb
208
210
  - test/yao/test_config.rb
211
+ - test/yao/test_read_only.rb
209
212
  - test/yao/test_server_error.rb
210
213
  - test/yao/test_token.rb
211
214
  - yao-logo.png
@@ -230,15 +233,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
230
233
  version: '0'
231
234
  requirements: []
232
235
  rubyforge_project:
233
- rubygems_version: 2.5.0
236
+ rubygems_version: 2.2.3
234
237
  signing_key:
235
238
  specification_version: 4
236
239
  summary: Yet Another OpenStack API Wrapper that rocks!!
237
240
  test_files:
238
241
  - test/config.rb
242
+ - test/support/auth_stub.rb
239
243
  - test/yao/test_auth.rb
240
244
  - test/yao/test_client.rb
241
245
  - test/yao/test_client_plugin.rb
242
246
  - test/yao/test_config.rb
247
+ - test/yao/test_read_only.rb
243
248
  - test/yao/test_server_error.rb
244
249
  - test/yao/test_token.rb