artirix_data_models 0.9.0 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 713d558fd789e3af896c2621897a347ec1493f34
4
- data.tar.gz: 95f5c0b37d134fb771f28442000849a9b605011c
3
+ metadata.gz: f52a06bf80abd71040a8661490da1421091e39b7
4
+ data.tar.gz: 37fc26419d9f609a85a4911d80914e10d17193d8
5
5
  SHA512:
6
- metadata.gz: 549184151747d15673c69d9798adce02d61f8afe80d850c34f33d4f14755105a0b51ce7f03bfd771c8ea3b9ea14ea4c4dd8f9022f42b18051711d90f1d02331a
7
- data.tar.gz: eb5c9f12149a61af0db1218ca221da1a8816be668194e429511b4210abd4e1446967476f95534010870b477a6e176f8b1d7608502fc601ebea7d30b40c238e03
6
+ metadata.gz: 8f73b885df6a65abca53fd08529c044d08b0bdfcd11158bc36ef447dda3e9b2c70acc72a3a2cff9d39b9c16701b7fdca98b15597882535c1e98f1a232a49a23a
7
+ data.tar.gz: a6bbe32acdb54513ae625e60ef36b6c60276a7e46724be2af0f3e08dd20f61fedea33a09f58f2539c6449919b6f0426b951b990f8330cd405dbd6c51df7161d5
data/README.md CHANGED
@@ -250,6 +250,27 @@ end
250
250
 
251
251
  ## Changes
252
252
 
253
+ ### 0.10.0
254
+
255
+ - Gateways:
256
+ -- added `gateway_factory` besides `gateway` as a creation argument for a DAO and BasicModelDAO. Now, when using a gateway in BasicModelDAO, it will use the given gateway if present, or it will call `gateway_factory.call` and use it. It won't save the result of the gateway factory, so the factory will be called every time a gateway is used.
257
+ -- `BasicModelDAO` methods can receive a `gateway` option to be used instead of the normal gateway for the particular request. Used in `_get`, `_post`, `_put` and `_delete` methods. If no override is passed, then it will use the preloaded gateway (using either `gateway` or `gateway_factory` creation arguments, see above).
258
+ -- `DAO` creation accepts an option `ignore_default_gateway` (`false` by default). If it is false, and no `gateway` or `gateway_factory` is passed, the gateway used will be `DAORegistry.gateway` (same as before). This allows to create DAOs without any gateway configured, making it necessary to instantiate it and pass it to `BasicModelDAO` on each request.
259
+
260
+ - Response Adaptors
261
+ -- `DAO`'s `get_full` method now can pass to `BasicModelDAO` a `response_adaptor` option. `BasicModelDAO` will use `BasicModelDAO`'s `response_adaptor_for_reload` if no response adaptor is passed.
262
+ -- `DAO`'s `find` and `get` methods now can pass to `BasicModelDAO` a `response_adaptor` option. `BasicModelDAO` will use `BasicModelDAO`'s `response_adaptor_for_single` if no response adaptor is passed.
263
+ -- `DAO`'s `find` and `get_some` methods now can pass to `BasicModelDAO` a `response_adaptor` option. `BasicModelDAO` will use `BasicModelDAO`'s `response_adaptor_for_some` if no response adaptor is passed.
264
+
265
+ - `DAO`s now delegate `model_adaptor_factory` to `BasicModelDAO`
266
+ - created `IllegalActionError` error class inside of `ArtirixDataModels` module
267
+
268
+ - `ArtirixDataModels::Model` with another module `WithoutDefaultAttributes`, same as `CompleteModel` but without default attributes.
269
+
270
+ - `ArtirixDataModels::DataGateway::Error` subclass now for status `409`: `Conflict`
271
+
272
+ - in `ArtirixDataModels::DataGateway`, methods `treat_response` and `exception_for_status` are now static. They can still be used in an instance level (it delegates to class methods)
273
+
253
274
  ### 0.9.0
254
275
 
255
276
  - Fake Responses now can be a callable object (if it responds to `call` it will invoke it)
@@ -17,6 +17,7 @@ module ArtirixDataModels
17
17
  :forced_fake_disabled?,
18
18
  :empty_collection,
19
19
  :empty_collection_for,
20
+ :model_adaptor_factory
20
21
  ]
21
22
 
22
23
  included do
@@ -25,13 +26,21 @@ module ArtirixDataModels
25
26
  end
26
27
 
27
28
 
28
- def initialize(gateway: nil, model_name: nil, model_class: nil, paths_factory: nil, fake_mode_factory: nil)
29
- model_class = model_class || default_model_class
30
- gateway = gateway || ArtirixDataModels::DAORegistry.gateway
31
- model_name = model_name || default_model_name
32
- paths_factory = paths_factory || default_path_factory
33
- fake_mode_factory = fake_mode_factory || default_fake_mode_factory
34
- @basic_model_dao = ArtirixDataModels::DAORegistry.basic_class.new model_name, model_class, paths_factory, gateway, fake_mode_factory
29
+ def initialize(gateway: nil, gateway_factory: nil, ignore_default_gateway: false, model_name: nil, model_class: nil, paths_factory: nil, fake_mode_factory: nil)
30
+ if gateway.blank? && gateway_factory.blank? && !ignore_default_gateway
31
+ gateway = ArtirixDataModels::DAORegistry.gateway
32
+ end
33
+
34
+ model_name ||= default_model_name
35
+ model_class ||= default_model_class
36
+ paths_factory ||= default_path_factory
37
+ fake_mode_factory ||= default_fake_mode_factory
38
+ @basic_model_dao = ArtirixDataModels::DAORegistry.basic_class.new model_name: model_name,
39
+ model_class: model_class,
40
+ fake_mode_factory: fake_mode_factory,
41
+ paths_factory: paths_factory,
42
+ gateway: gateway,
43
+ gateway_factory: gateway_factory
35
44
  end
36
45
 
37
46
  def default_model_name
@@ -75,7 +84,7 @@ module ArtirixDataModels
75
84
 
76
85
  def get_full(model_pk, model_to_reload: nil, cache_adaptor: nil, **extra_options)
77
86
  model_to_reload ||= new_model_with_pk(model_pk)
78
- cache_adaptor ||= cache_model_adaptor_for_get_full(model_pk, model_to_reload: model_to_reload, **extra_options)
87
+ cache_adaptor ||= cache_model_adaptor_for_get_full(model_pk, model_to_reload: model_to_reload, **extra_options)
79
88
  basic_model_dao.get_full(model_pk, model_to_reload: model_to_reload, cache_adaptor: cache_adaptor, **extra_options)
80
89
  end
81
90
 
@@ -1,14 +1,21 @@
1
1
  class ArtirixDataModels::BasicModelDAO
2
- attr_reader :model_name, :model_class, :paths_factory, :gateway, :fake_mode_factory
2
+ attr_reader :model_name, :model_class, :paths_factory, :fake_mode_factory, :gateway_factory, :loaded_gateway
3
3
 
4
- def initialize(model_name, model_class, paths_factory, gateway, fake_mode_factory)
4
+ def initialize(model_name:, model_class:, paths_factory:, gateway:, fake_mode_factory:, gateway_factory:)
5
5
  @model_name = model_name
6
6
  @model_class = model_class
7
7
  @paths_factory = paths_factory
8
- @gateway = gateway
8
+ @loaded_gateway = gateway
9
+ @gateway_factory = gateway_factory
9
10
  @fake_mode_factory = fake_mode_factory
10
11
  end
11
12
 
13
+ def preloaded_gateway
14
+ loaded_gateway.presence || gateway_factory.call
15
+ end
16
+
17
+ alias_method :gateway, :preloaded_gateway
18
+
12
19
  def partial_mode_fields
13
20
  if fake?
14
21
  fake_mode_factory.partial_mode_fields
@@ -17,11 +24,11 @@ class ArtirixDataModels::BasicModelDAO
17
24
  end
18
25
  end
19
26
 
20
- def get_full(model_pk, model_to_reload:, cache_adaptor: nil, **extra_options)
21
- path = paths_factory.get_full model_pk
22
- adaptor = response_adaptor_for_reload(model_to_reload)
27
+ def get_full(model_pk, model_to_reload:, response_adaptor: nil, cache_adaptor: nil, **extra_options)
28
+ path = paths_factory.get_full model_pk
29
+ response_adaptor ||= response_adaptor_for_reload(model_to_reload)
23
30
 
24
- _get path, response_adaptor: adaptor, fake_response: fake_get_full_response(model_pk, model_to_reload), cache_adaptor: cache_adaptor, **extra_options
31
+ _get path, response_adaptor: response_adaptor, fake_response: fake_get_full_response(model_pk, model_to_reload), cache_adaptor: cache_adaptor, **extra_options
25
32
 
26
33
  model_to_reload.mark_full_mode
27
34
  model_to_reload
@@ -33,18 +40,18 @@ class ArtirixDataModels::BasicModelDAO
33
40
  nil
34
41
  end
35
42
 
36
- def find(model_pk, cache_adaptor: nil, **extra_options)
37
- path = paths_factory.get model_pk
38
- adaptor = response_adaptor_for_single
43
+ def find(model_pk, cache_adaptor: nil, response_adaptor: nil, **extra_options)
44
+ path = paths_factory.get model_pk
45
+ response_adaptor ||= response_adaptor_for_single
39
46
 
40
- _get(path, response_adaptor: adaptor, fake_response: fake_get_response(model_pk), cache_adaptor: cache_adaptor, **extra_options)
47
+ _get(path, response_adaptor: response_adaptor, fake_response: fake_get_response(model_pk), cache_adaptor: cache_adaptor, **extra_options)
41
48
  end
42
49
 
43
- def get_some(model_pks, cache_adaptor: nil, **extra_options)
44
- path = paths_factory.get_some(model_pks)
45
- adaptor = response_adaptor_for_some
50
+ def get_some(model_pks, cache_adaptor: nil, response_adaptor: nil, **extra_options)
51
+ path = paths_factory.get_some(model_pks)
52
+ response_adaptor ||= response_adaptor_for_some
46
53
 
47
- _get(path, response_adaptor: adaptor, fake_response: fake_get_some_response(model_pks), cache_adaptor: cache_adaptor, **extra_options)
54
+ _get(path, response_adaptor: response_adaptor, fake_response: fake_get_some_response(model_pks), cache_adaptor: cache_adaptor, **extra_options)
48
55
  rescue ArtirixDataModels::DataGateway::NotFound
49
56
  []
50
57
  end
@@ -116,20 +123,28 @@ class ArtirixDataModels::BasicModelDAO
116
123
  ArtirixDataModels::GatewayResponseAdaptors::ModelAdaptor
117
124
  end
118
125
 
119
- def _get(path, response_adaptor: nil, body: nil, fake_response: nil, cache_adaptor: nil)
120
- gateway.get path, response_adaptor: response_adaptor, body: body, fake: fake?, fake_response: fake_response, cache_adaptor: cache_adaptor
126
+ def _get(path, response_adaptor: nil, body: nil, fake_response: nil, cache_adaptor: nil, gateway: nil)
127
+ g = gateway.presence || preloaded_gateway
128
+ raise_no_gateway unless g.present?
129
+ g.get path, response_adaptor: response_adaptor, body: body, fake: fake?, fake_response: fake_response, cache_adaptor: cache_adaptor
121
130
  end
122
131
 
123
- def _post(path, response_adaptor: nil, body: nil, fake_response: nil, cache_adaptor: nil)
124
- gateway.post path, response_adaptor: response_adaptor, body: body, fake: fake?, fake_response: fake_response, cache_adaptor: cache_adaptor
132
+ def _post(path, response_adaptor: nil, body: nil, fake_response: nil, cache_adaptor: nil, gateway: nil)
133
+ g = gateway.presence || preloaded_gateway
134
+ raise_no_gateway unless g.present?
135
+ g.post path, response_adaptor: response_adaptor, body: body, fake: fake?, fake_response: fake_response, cache_adaptor: cache_adaptor
125
136
  end
126
137
 
127
- def _put(path, response_adaptor: nil, body: nil, fake_response: nil, cache_adaptor: nil)
128
- gateway.put path, response_adaptor: response_adaptor, body: body, fake: fake?, fake_response: fake_response, cache_adaptor: cache_adaptor
138
+ def _put(path, response_adaptor: nil, body: nil, fake_response: nil, cache_adaptor: nil, gateway: nil)
139
+ g = gateway.presence || preloaded_gateway
140
+ raise_no_gateway unless g.present?
141
+ g.put path, response_adaptor: response_adaptor, body: body, fake: fake?, fake_response: fake_response, cache_adaptor: cache_adaptor
129
142
  end
130
143
 
131
- def _delete(path, response_adaptor: nil, body: nil, fake_response: nil, cache_adaptor: nil)
132
- gateway.delete path, response_adaptor: response_adaptor, body: body, fake: fake?, fake_response: fake_response, cache_adaptor: cache_adaptor
144
+ def _delete(path, response_adaptor: nil, body: nil, fake_response: nil, cache_adaptor: nil, gateway: nil)
145
+ g = gateway.presence || preloaded_gateway
146
+ raise_no_gateway unless g.present?
147
+ g.delete path, response_adaptor: response_adaptor, body: body, fake: fake?, fake_response: fake_response, cache_adaptor: cache_adaptor
133
148
  end
134
149
 
135
150
  def fake?
@@ -137,4 +152,19 @@ class ArtirixDataModels::BasicModelDAO
137
152
  return false if forced_fake_disabled?
138
153
  fake_mode_factory.enabled?
139
154
  end
155
+
156
+ def raise_no_gateway
157
+ msg = 'no gateway passed to request, no gateway configured on creation'
158
+ if gateway_factory.present?
159
+ msg = "#{msg}, and no gateway returned by the factory"
160
+ else
161
+ msg = "#{msg}, and no gateway factory configured on creation"
162
+ end
163
+
164
+ raise NoGatewayConfiguredError, msg
165
+ end
166
+
167
+ class NoGatewayConfiguredError < StandardError
168
+ end
169
+
140
170
  end
@@ -77,13 +77,6 @@ class ArtirixDataModels::DataGateway
77
77
  raise ConnectionError.new(path: path, method: method), "method: #{method}, path: #{path}, error: #{e}"
78
78
  end
79
79
 
80
- def treat_response(response, method, path)
81
- return response.body if response.success?
82
-
83
- klass = exception_for_status(response.status)
84
- raise klass.new(path: path, method: method, response_body: response.body, response_status: response.status)
85
- end
86
-
87
80
  def body_to_json(body)
88
81
  case body
89
82
  when String
@@ -110,7 +103,26 @@ class ArtirixDataModels::DataGateway
110
103
  raise ParseError.new(path: path, method: method, response_body: result), e.message
111
104
  end
112
105
 
106
+ #######################
107
+ # EXCEPTION TREATMENT #
108
+ #######################
109
+
110
+ def treat_response(response, method, path)
111
+ self.class.treat_response(response, method, path)
112
+ end
113
+
113
114
  def exception_for_status(response_status)
115
+ self.class.exception_for_status(response_status)
116
+ end
117
+
118
+ def self.treat_response(response, method, path)
119
+ return response.body if response.success?
120
+
121
+ klass = exception_for_status(response.status)
122
+ raise klass.new(path: path, method: method, response_body: response.body, response_status: response.status)
123
+ end
124
+
125
+ def self.exception_for_status(response_status)
114
126
  case response_status.to_i
115
127
  when 404
116
128
  NotFound
@@ -118,6 +130,8 @@ class ArtirixDataModels::DataGateway
118
130
  NotAcceptable
119
131
  when 422
120
132
  UnprocessableEntity
133
+ when 409
134
+ Conflict
121
135
  when 401
122
136
  Unauthorized
123
137
  when 403
@@ -223,6 +237,10 @@ class ArtirixDataModels::DataGateway
223
237
  class UnprocessableEntity < Error
224
238
  end
225
239
 
240
+ # 409
241
+ class Conflict < Error
242
+ end
243
+
226
244
  ##############################
227
245
  # subclasses of GatewayError #
228
246
  ##############################
@@ -25,6 +25,19 @@ module ArtirixDataModels
25
25
  end
26
26
  end
27
27
 
28
+ module WithoutDefaultAttributes
29
+ extend ActiveSupport::Concern
30
+
31
+ included do
32
+ include ActiveModelCompliant
33
+ include Attributes
34
+ include PrimaryKey
35
+ include WithDAO
36
+ include CacheKey
37
+ include PartialMode
38
+ end
39
+ end
40
+
28
41
  module CompleteModel
29
42
  extend ActiveSupport::Concern
30
43
 
@@ -1,3 +1,3 @@
1
1
  module ArtirixDataModels
2
- VERSION = '0.9.0'
2
+ VERSION = '0.10.0'
3
3
  end
@@ -128,4 +128,7 @@ module ArtirixDataModels
128
128
  @disabled_cache ||= DisabledCache.new
129
129
  end
130
130
 
131
+ class IllegalActionError < StandardError
132
+ end
133
+
131
134
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: artirix_data_models
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eduardo Turiño
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-29 00:00:00.000000000 Z
11
+ date: 2016-02-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -304,7 +304,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
304
304
  version: '0'
305
305
  requirements: []
306
306
  rubyforge_project:
307
- rubygems_version: 2.2.2
307
+ rubygems_version: 2.2.5
308
308
  signing_key:
309
309
  specification_version: 4
310
310
  summary: Data Models (read only model) and Data Layer connection lib