artirix_data_models 0.7.5 → 0.8.3

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: 820fdbf70691b6242e145718cc37914b07b629a5
4
- data.tar.gz: b85426c590cd8760348f14a0d31a8f77d4fc143c
3
+ metadata.gz: 2359922337aa2624392a98ae869724c2a3afa640
4
+ data.tar.gz: ec9c7dfcc6fe58d603176940e0e0e4f39314fc41
5
5
  SHA512:
6
- metadata.gz: 2ecbfa86d86bbda5bc24960a1577f3c1040b90ba2196c85761f8641babf58a8a43fe34b093b8e1d39aedb1de7c6d81c46bf9f88c70c64ec05e22d6e0126d110c
7
- data.tar.gz: c7915a3de805272c8562f6d843f562873240be251f278723e9e61935bb4dffd54159d4d806ab494a1b846bb1b12723631dc53363e5df7a64d1b3681e68c93b0e
6
+ metadata.gz: 08cce0d7e14055cc719a79a202266becd424dc9a53689e00c45d788531bd9928f6880a597f28fd9b8c91cf780f33daab2fafefb713c83edfe421b90355046eb9
7
+ data.tar.gz: b68d7c20dc2741561c482917edd897abd97bb80d8bc77d0e9a9a27790a855ca3625657d38a271fa76a12dfa633ba53d0c17039e5f5f8195a4f24524dcde792e9
data/README.md CHANGED
@@ -250,6 +250,17 @@ end
250
250
 
251
251
  ## Changes
252
252
 
253
+ ### 0.8.3
254
+
255
+ - `DataGateway` refactor, plus adding `put` and `delete` support.
256
+ - `BasicModelDAO` with `_put` and `_delete` support.
257
+ - adding gateway mock helpers for `post`, `put` and `delete`, and adapting them to the new behaviour
258
+ - including `ArtirixDataModels::Model::PublicWriters` after `ArtirixDataModels::Model::Attributes` (or after `ArtirixDataModels::Model` or `ArtirixDataModels::Model::OnlyData`) and before calling `attribute` method to make attribute writers public.
259
+
260
+ ### ~0.8.0~, ~0.8.1~, ~0.8.2~ (YANKED)
261
+
262
+ Yanked because of the gateway mock helpers were missing an option, which made them not mocking properly. (moved all to `0.8.3`)
263
+
253
264
  ### 0.7.5
254
265
 
255
266
  - `FakeResponseFactory` using given `_score` if > 0.
@@ -278,6 +289,10 @@ end
278
289
  - changed classes to stop inheriting from `Struct`, had some problems with inheritance.
279
290
  - `Aggregation`, `Aggregation::Value` and `MetricAggregation` now using the same inspection as models.
280
291
 
292
+ ### ~0.7.0~ (YANKED)
293
+
294
+ Yanked because of bug on Aggregations. Released 0.7.1 with the fix. Changeset moved too to 0.7.1
295
+
281
296
  ### 0.6.7
282
297
 
283
298
  - aggregations use `key_as_string` as name of the bucket value if it exists, if not then it uses `key` and if that also does not exist then it uses `name`
@@ -301,26 +316,7 @@ end
301
316
  - Fix in EsCollection's aggregation parsing (nested + single from RAW now work ok)
302
317
  - `SortedBucketAggregationBase` introduced. now `ArtirixDataModels::AggregationsFactory.sorted_aggregation_class_based_on_index_on(index_array)` available to create a class for Aggregations which will sort the buckets based on the position of the elements on a given array.
303
318
 
304
- ### 0.6.2
305
-
306
- *Fixed Breaking Change*: removal of `Aggregation.from_json` static method. Now back but delegating to default factory method is `aggregation_factory.aggregation_from_json` in the Aggregation Factory *instance*.
307
-
308
- - EsCollection's aggregations can now be build based on raw ElasticSearch responses, including nested aggregations. It ignores any aggregation that does not have "buckets", so that nested aggs for `global` or `filtered` are skipped and only the ones with real data are used. (TODO: write docs. In the mean time, have a look at the specs).
309
- - added `aggregation` method to `Aggregation::Value` class, and also the aggs to the `data_hash` if they are present.
310
-
311
- ### 0.5.0
312
-
313
- - opening gem as is to the public.
314
- - still a lot of TODOs in the documentation
315
-
316
-
317
- ## Yanked versions
318
-
319
- ### ~0.7.0~
320
-
321
- Yanked because of bug on Aggregations. Released 0.7.1 with the fix. Changeset moved too to 0.7.1
322
-
323
- ### ~0.6.3~
319
+ ### ~0.6.3~ (YANKED)
324
320
 
325
321
  Yanked because of typo bug on SortedBucketAggregationBase. Released 0.6.3.1 with the fix.
326
322
 
@@ -328,15 +324,27 @@ Yanked because of typo bug on SortedBucketAggregationBase. Released 0.6.3.1 with
328
324
  - Fix in EsCollection's aggregation parsing (nested + single from RAW now work ok)
329
325
  - `SortedBucketAggregationBase` introduced. now `ArtirixDataModels::AggregationsFactory.sorted_aggregation_class_based_on_index_on(index_array)` available to create a class for Aggregations which will sort the buckets based on the position of the elements on a given array.
330
326
 
327
+ ### 0.6.2
328
+
329
+ *Fixed Breaking Change*: removal of `Aggregation.from_json` static method. Now back but delegating to default factory method is `aggregation_factory.aggregation_from_json` in the Aggregation Factory *instance*.
330
+
331
+ - EsCollection's aggregations can now be build based on raw ElasticSearch responses, including nested aggregations. It ignores any aggregation that does not have "buckets", so that nested aggs for `global` or `filtered` are skipped and only the ones with real data are used. (TODO: write docs. In the mean time, have a look at the specs).
332
+ - added `aggregation` method to `Aggregation::Value` class, and also the aggs to the `data_hash` if they are present.
331
333
 
332
- ### ~0.6.1~
334
+ ### ~0.6.1~ (YANKED)
333
335
 
334
336
  Yanked because of breaking change introduction: removal of `Aggregation.from_json` method
335
337
 
336
338
  - added `aggregation` method to `Aggregation::Value` class, and also the aggs to the `data_hash` if they are present.
337
339
 
338
- ### ~v0.6.0~
340
+ ### ~v0.6.0~ (YANKED)
339
341
 
340
342
  Yanked because of breaking change introduction: removal of `Aggregation.from_json` method
341
343
 
342
344
  - EsCollection's aggregations can now be build based on raw ElasticSearch responses, including nested aggregations. It ignores any aggregation that does not have "buckets", so that nested aggs for `global` or `filtered` are skipped and only the ones with real data are used. (TODO: write docs. In the mean time, have a look at the specs).
345
+
346
+ ### 0.5.0
347
+
348
+ - opening gem as is to the public.
349
+ - still a lot of TODOs in the documentation
350
+
@@ -124,6 +124,14 @@ class ArtirixDataModels::BasicModelDAO
124
124
  gateway.post path, response_adaptor: response_adaptor, body: body, fake: fake?, fake_response: fake_response, cache_adaptor: cache_adaptor
125
125
  end
126
126
 
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
129
+ end
130
+
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
133
+ end
134
+
127
135
  def fake?
128
136
  return true if forced_fake_enabled?
129
137
  return false if forced_fake_disabled?
@@ -6,87 +6,93 @@ class ArtirixDataModels::DataGateway
6
6
  @post_as_json = !!post_as_json
7
7
  end
8
8
 
9
- def get(path, response_adaptor: nil, body: nil, fake: false, fake_response: nil, cache_adaptor: nil, **ignored_options)
10
- if fake
11
- response_body = fake_response
12
- elsif cache_adaptor.present?
13
- response_body = cache_adaptor.call { perform_get(path, body) }
14
- else
15
- response_body = perform_get(path, body)
16
- end
17
- parse_get_response(response_body, response_adaptor)
9
+ def get(path, **opts)
10
+ call :get, path, **opts
11
+ end
12
+
13
+ def post(path, **opts)
14
+ call :post, path, **opts
15
+ end
16
+
17
+ def put(path, **opts)
18
+ call :put, path, **opts
19
+ end
20
+
21
+ def delete(path, **opts)
22
+ call :delete, path, **opts
18
23
  end
19
24
 
20
- def post(path, response_adaptor: nil, body: nil, fake: false, fake_response: nil, **ignored_options)
25
+ def call(method, path, json_body: true, response_adaptor: nil, body: nil, fake: false, fake_response: nil, cache_adaptor: nil, **_ignored_options)
21
26
  if fake
22
27
  response_body = fake_response
28
+ elsif cache_adaptor.present?
29
+ response_body = cache_adaptor.call { perform(method, path, body, json_body) }
23
30
  else
24
- response_body = perform_post(path, body)
31
+ response_body = perform(method, path, body, json_body)
25
32
  end
26
- parse_post_response(response_body, response_adaptor)
33
+ parse_response(response_body, response_adaptor)
27
34
  end
28
35
 
29
36
  private
30
37
 
31
- def perform_get(path, body = nil)
32
- response = connect_get(path, body)
33
- if response.success?
34
- response.body
35
- elsif response.status.to_i == 404
36
- raise NotFound, path
37
- else
38
- raise GatewayError, "method: get, path: #{path}, status: #{response.status}, body: #{response.body}"
39
- end
38
+ def perform_get(path, body = nil, json_body = true)
39
+ perform :get, path, body, json_body
40
40
  end
41
41
 
42
- def perform_post(path, body = nil)
43
- response = connect_post(path, body)
44
- if response.success?
45
- response.body
46
- elsif response.status.to_i == 404
47
- raise NotFound, path
48
- else
49
- raise GatewayError, "method: post, path: #{path}, status: #{response.status}, body: #{response.body}"
50
- end
42
+ def perform_post(path, body = nil, json_body = true)
43
+ perform :post, path, body, json_body
51
44
  end
52
45
 
53
- def connect_get(path, body)
54
- connection.get path do |req|
55
- req.body = body_to_json body unless body.nil?
56
- end
57
- rescue Faraday::ConnectionFailed => e
58
- raise ConnectionError, "method: get, path: #{path}, error: #{e}"
46
+ def perform_put(path, body = nil, json_body = true)
47
+ perform :put, path, body, json_body
48
+ end
49
+
50
+ def perform_delete(path, body = nil, json_body = true)
51
+ perform :delete, path, body, json_body
59
52
  end
60
53
 
61
- def connect_post(path, body)
62
- connection.post path do |req|
54
+ def perform(method, path, body = nil, json_body = true)
55
+ response = connect(method, path, body, json_body)
56
+ treat_response(response, method, path)
57
+ end
58
+
59
+ def connect(method, path, body = nil, json_body = true)
60
+ # binding.pry if method == :delete
61
+ connection.send(method, path) do |req|
62
+ # binding.pry if method == :delete
63
63
  unless body.nil?
64
- req.body = body_to_json body
65
- req.headers['Content-Type'] = 'application/json'
64
+ if json_body
65
+ req.body = body_to_json body
66
+ req.headers['Content-Type'] = 'application/json'
67
+ else
68
+ req.body = body
69
+ end
66
70
  end
67
71
  end
68
72
  rescue Faraday::ConnectionFailed => e
69
- raise ConnectionError, "method: post, path: #{path}, error: #{e}"
73
+ raise ConnectionError, "method: #{method}, path: #{path}, error: #{e}"
70
74
  end
71
75
 
72
- def body_to_json(body)
73
- case body
74
- when String
75
- body
76
- else
77
- body.to_json
76
+ def treat_response(response, method, path)
77
+ if response.success?
78
+ response.body
79
+ elsif response.status.to_i == 404
80
+ raise NotFound, path
81
+ else
82
+ raise GatewayError, "method: #{method}, path: #{path}, status: #{response.status}, body: #{response.body}"
78
83
  end
79
84
  end
80
85
 
81
- def parse_post_response(result, response_adaptor)
82
- parse_common_response(result, response_adaptor)
83
- end
84
-
85
- def parse_get_response(result, response_adaptor)
86
- parse_common_response(result, response_adaptor)
86
+ def body_to_json(body)
87
+ case body
88
+ when String
89
+ body
90
+ else
91
+ body.to_json
92
+ end
87
93
  end
88
94
 
89
- def parse_common_response(result, response_adaptor)
95
+ def parse_response(result, response_adaptor)
90
96
  if result.present?
91
97
  parsed_response = Oj.load result, symbol_keys: true
92
98
  else
@@ -51,6 +51,14 @@ module ArtirixDataModels
51
51
  end
52
52
  end
53
53
 
54
+ module PublicWriters
55
+ extend ActiveSupport::Concern
56
+
57
+ included do
58
+ include Attributes::PublicWriters
59
+ end
60
+ end
61
+
54
62
  module WithBaseEntity
55
63
  extend ActiveSupport::Concern
56
64
 
@@ -144,6 +152,15 @@ module ArtirixDataModels
144
152
  child_class.attribute_config.parent_attribute_config = attribute_config
145
153
  end
146
154
 
155
+ def writer_visibility
156
+ @writer_visibility ||= :private
157
+ end
158
+
159
+ def writer_visibility=(visibility)
160
+ raise InvalidArgumentError, "Invalid visibility #{visibility.inspect}" unless [:public, :private, :protected].include? visibility
161
+ @writer_visibility = visibility
162
+ end
163
+
147
164
  private
148
165
  def _define_attribute(attribute)
149
166
  at = attribute.to_sym
@@ -157,7 +174,14 @@ module ArtirixDataModels
157
174
  def _define_writer(attribute)
158
175
  attr_writer attribute
159
176
  writer = "#{attribute}="
160
- private writer
177
+
178
+ if writer_visibility == :private
179
+ private writer
180
+ elsif writer_visibility == :protected
181
+ protected writer
182
+ end
183
+
184
+ writer
161
185
  end
162
186
 
163
187
  def _define_presence(attribute)
@@ -186,6 +210,13 @@ module ArtirixDataModels
186
210
  end
187
211
  end
188
212
 
213
+ module PublicWriters
214
+ extend ActiveSupport::Concern
215
+ included do
216
+ self.writer_visibility = :public
217
+ end
218
+ end
219
+
189
220
  module OnlyData
190
221
  # return nil as it is, we do not have DAO for an OnlyData model
191
222
  def nil_attribute(_)
@@ -11,16 +11,63 @@ def given_gateway_config(connection_url = nil)
11
11
  end
12
12
  end
13
13
 
14
- def mock_gateway_get_response(response:, path:, body: nil, gateway: nil)
14
+
15
+ def mock_gateway_response(response:, method:, path:, body: nil, json_body: true, gateway: nil)
15
16
  gateway ||= ArtirixDataModels::DAORegistry.gateway
17
+ allow(gateway).to receive(:perform).with(method, path, body, json_body).and_return response
16
18
 
17
- allow(gateway).to receive(:perform_get).with(path, body).and_return response
19
+ # check with body already parsed
20
+ unless body.nil?
21
+ body = body.kind_of?(String) ? body : body.to_json
22
+ allow(gateway).to receive(:perform).with(method, path, body, json_body).and_return response
23
+ end
18
24
  end
19
25
 
20
- def mock_gateway_get_not_found_response(path:, body: nil, gateway: nil)
26
+ def mock_gateway_not_found_response(method:, path:, body: nil, json_body: true, gateway: nil)
21
27
  gateway ||= ArtirixDataModels::DAORegistry.gateway
28
+ allow(gateway).to receive(:perform).with(method, path, body, json_body).and_raise ArtirixDataModels::DataGateway::NotFound
29
+
30
+ # check with body already parsed
31
+ unless body.nil?
32
+ body = body.kind_of?(String) ? body : body.to_json
33
+ allow(gateway).to receive(:perform).with(method, path, body, json_body).and_raise ArtirixDataModels::DataGateway::NotFound
34
+ end
35
+ end
36
+
37
+ # GET
38
+ def mock_gateway_get_response(**params)
39
+ mock_gateway_response method: :get, **params
40
+ end
41
+
42
+ def mock_gateway_get_not_found_response(**params)
43
+ mock_gateway_not_found_response method: :get, **params
44
+ end
45
+
46
+ # POST
47
+ def mock_gateway_post_response(**params)
48
+ mock_gateway_response method: :post, **params
49
+ end
50
+
51
+ def mock_gateway_post_not_found_response(**params)
52
+ mock_gateway_not_found_response method: :post, **params
53
+ end
54
+
55
+ # PUT
56
+ def mock_gateway_put_response(**params)
57
+ mock_gateway_response method: :put, **params
58
+ end
59
+
60
+ def mock_gateway_put_not_found_response(**params)
61
+ mock_gateway_not_found_response method: :put, **params
62
+ end
63
+
64
+ # DELETE
65
+ def mock_gateway_delete_response(**params)
66
+ mock_gateway_response method: :delete, **params
67
+ end
22
68
 
23
- allow(gateway).to receive(:perform_get).with(path, body).and_raise ArtirixDataModels::DataGateway::NotFound
69
+ def mock_gateway_delete_not_found_response(**params)
70
+ mock_gateway_not_found_response method: :delete, **params
24
71
  end
25
72
 
26
73
  # :nocov:
@@ -1,3 +1,3 @@
1
1
  module ArtirixDataModels
2
- VERSION = '0.7.5'
2
+ VERSION = '0.8.3'
3
3
  end
@@ -48,7 +48,7 @@ RSpec.describe ArtirixDataModels::DataGateway, type: :model do
48
48
  Given(:connection_stubs) { Faraday::Adapter::Test::Stubs.new }
49
49
  Given(:connection) do
50
50
  Faraday.new(url: connection_url, request: { params_encoder: Faraday::FlatParamsEncoder }) do |faraday|
51
- faraday.request :url_encoded # form-encode POST params
51
+ faraday.request :url_encoded # form-encode without body only path params
52
52
  faraday.response :logger # log requests to STDOUT
53
53
  faraday.adapter :test, connection_stubs
54
54
  end
@@ -101,6 +101,18 @@ RSpec.describe ArtirixDataModels::DataGateway, type: :model do
101
101
  connection_stubs.post(path_to_fail) { |env| [500, {}, ''] }
102
102
  connection_stubs.post(path_to_be_bad_json) { |env| [200, {}, 'oh yeah'] }
103
103
  connection_stubs.post(path_to_be_empty) { |env| [200, {}, ''] }
104
+
105
+ # stub put
106
+ connection_stubs.put(path_to_be_not_found) { |env| [404, {}, ''] }
107
+ connection_stubs.put(path_to_fail) { |env| [500, {}, ''] }
108
+ connection_stubs.put(path_to_be_bad_json) { |env| [200, {}, 'oh yeah'] }
109
+ connection_stubs.put(path_to_be_empty) { |env| [200, {}, ''] }
110
+
111
+ # stub put
112
+ connection_stubs.delete(path_to_be_not_found) { |env| [404, {}, ''] }
113
+ connection_stubs.delete(path_to_fail) { |env| [500, {}, ''] }
114
+ connection_stubs.delete(path_to_be_bad_json) { |env| [200, {}, 'oh yeah'] }
115
+ connection_stubs.delete(path_to_be_empty) { |env| [200, {}, ''] }
104
116
  end
105
117
 
106
118
  describe '#get' do
@@ -236,6 +248,132 @@ RSpec.describe ArtirixDataModels::DataGateway, type: :model do
236
248
  end
237
249
  end
238
250
  end
251
+
252
+ describe '#put' do
253
+ context 'without body' do
254
+ Given do
255
+ connection_stubs.put(path, nil) do |env|
256
+ [200, {}, response_string]
257
+ end
258
+ end
259
+
260
+ context 'when failure (500 error)' do
261
+ When(:result) { gateway.put path_to_fail }
262
+ Then { result == Failure(ArtirixDataModels::DataGateway::GatewayError) }
263
+ end
264
+
265
+ context 'when not found (404 error)' do
266
+ When(:result) { gateway.put path_to_be_not_found }
267
+ Then { result == Failure(ArtirixDataModels::DataGateway::NotFound) }
268
+ end
269
+
270
+ context 'when receiving bad json' do
271
+ When(:result) { gateway.put path_to_be_bad_json }
272
+ Then { result == Failure(ArtirixDataModels::DataGateway::ParseError) }
273
+ end
274
+
275
+ context 'when receiving empty response' do
276
+ When(:result) { gateway.put path_to_be_empty }
277
+ Then { result.nil? }
278
+ end
279
+
280
+ context 'only path given -> return parsed response (JSON -> Hash)' do
281
+ When(:result) { gateway.put path }
282
+ Then { result == response_hash }
283
+ end
284
+
285
+ context 'with adaptor -> call the adaptor with the parsed response (JSON -> Hash -> AdaptedObject)' do
286
+ Given(:model_class) do
287
+ Class.new do
288
+ attr_reader :data
289
+
290
+ def initialize(data)
291
+ @data = { given: data }
292
+ end
293
+ end
294
+ end
295
+
296
+ Given(:adaptor) { ArtirixDataModels::GatewayResponseAdaptors::ModelAdaptor.single model_class }
297
+
298
+ When(:result) { gateway.get path, response_adaptor: adaptor }
299
+ Then { result.class == model_class }
300
+ And { result.data == { given: response_hash } }
301
+ end
302
+
303
+ end
304
+ context 'with body', focus: true do
305
+ Given(:body) { test_hash }
306
+ Given(:body_json) { body.to_json }
307
+
308
+ Given do
309
+ connection_stubs.put(path, body_json, { 'Content-Type' => 'application/json' }) do
310
+ response_body = response_string_with_body.call(body_json)
311
+ [200, {}, response_body]
312
+ end
313
+ end
314
+
315
+ context 'STRING body => use body as is' do
316
+ When(:result) { gateway.put path, body: body_json }
317
+ Then { result == { body: test_hash } }
318
+ end
319
+
320
+ context 'object (or hash) body => use body.to_json' do
321
+ When(:result) { gateway.put path, body: body }
322
+ Then { result == { body: test_hash } }
323
+ end
324
+ end
325
+ end
326
+
327
+ describe '#delete' do
328
+ Given do
329
+ connection_stubs.delete(path) do |env|
330
+ [200, {}, response_string]
331
+ end
332
+ end
333
+
334
+ context 'when failure (500 error)' do
335
+ When(:result) { gateway.delete path_to_fail }
336
+ Then { result == Failure(ArtirixDataModels::DataGateway::GatewayError) }
337
+ end
338
+
339
+ context 'when not found (404 error)' do
340
+ When(:result) { gateway.delete path_to_be_not_found }
341
+ Then { result == Failure(ArtirixDataModels::DataGateway::NotFound) }
342
+ end
343
+
344
+ context 'when receiving bad json' do
345
+ When(:result) { gateway.delete path_to_be_bad_json }
346
+ Then { result == Failure(ArtirixDataModels::DataGateway::ParseError) }
347
+ end
348
+
349
+ context 'when receiving empty response' do
350
+ When(:result) { gateway.delete path_to_be_empty }
351
+ Then { result.nil? }
352
+ end
353
+
354
+ context 'only path given -> return parsed response (JSON -> Hash)' do
355
+ When(:result) { gateway.delete path }
356
+ Then { result == response_hash }
357
+ end
358
+
359
+ context 'with adaptor -> call the adaptor with the parsed response (JSON -> Hash -> AdaptedObject)' do
360
+ Given(:model_class) do
361
+ Class.new do
362
+ attr_reader :data
363
+
364
+ def initialize(data)
365
+ @data = { given: data }
366
+ end
367
+ end
368
+ end
369
+
370
+ Given(:adaptor) { ArtirixDataModels::GatewayResponseAdaptors::ModelAdaptor.single model_class }
371
+
372
+ When(:result) { gateway.delete path, response_adaptor: adaptor }
373
+ Then { result.class == model_class }
374
+ And { result.data == { given: response_hash } }
375
+ end
376
+ end
239
377
  end
240
378
  end
241
379
 
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.7.5
4
+ version: 0.8.3
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-14 00:00:00.000000000 Z
11
+ date: 2016-01-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport