smart_params 2.2.0 → 2.3.0

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
  SHA256:
3
- metadata.gz: 206bff3d4e4763f790bc5d296263c8a458bf76c163280844e752f3ddcf2afda4
4
- data.tar.gz: 18b5369df20904317d59390c2d67d8901418a79505f14cc07a7a61af506f4dab
3
+ metadata.gz: fefed41179430e01ed431251aa5b42a279d21d9e8789500f39c7de54092d72a9
4
+ data.tar.gz: d247325e2b0b1dacdcd6f9680d6fcf8629d81bc1b7416d699efdc5141b5c0660
5
5
  SHA512:
6
- metadata.gz: 24dad20aa68d5931967b8eee4c06b9060694a427cb06c5e6f691f5cb6cf2708e6e62999010f40fd68a92ce56942bca53194028a9fa65f6d79685efae477df11b
7
- data.tar.gz: 7c2c04f1c992610a382cb429d9182ebfdc038a2c49c25b5d25c6a04e5205c1198ed4d4663db385c0179270183ae2afd8cb1cd1deab5cb0da5854bebb7daf9997
6
+ metadata.gz: 384fe2938d4cf4fe73a45c69620d5d5017a5c38358fcb8bd14d617693231571e8bee7dbd19ce6091d3fa3a547199f21db781c7ed9b7633b44c0bbfc5a80a5099
7
+ data.tar.gz: ae916f2a969e10be1fc7cbdfa116a1fb89c3a5b3970fdd6771297b1d7ea56222fa9c9414625bc658d6b50b27d5e10b0ced5af328524455fe5bf5e8ae7c3430cd
data/lib/smart_params.rb CHANGED
@@ -1,8 +1,8 @@
1
- require "ostruct"
2
1
  require "dry-types"
3
2
  require "recursive-open-struct"
4
3
  require "active_support/concern"
5
4
  require "active_support/core_ext/object"
5
+ require "active_support/core_ext/module/delegation"
6
6
 
7
7
  module SmartParams
8
8
  extend ActiveSupport::Concern
@@ -20,15 +20,11 @@ module SmartParams
20
20
  @safe = safe
21
21
  @raw = raw
22
22
  @schema = self.class.instance_variable_get(:@schema)
23
- @fields = [@schema, *unfold(@schema.subfields)]
24
- .sort_by(&:weight)
25
- .each { |field| field.claim(raw) }
23
+ @fields = [@schema, *unfold(@schema.subfields)].sort_by(&:weight).each { |field| field.claim(raw) }
26
24
  rescue SmartParams::Error::InvalidPropertyType => invalid_property_type_exception
27
- if safe?
28
- raise invalid_property_type_exception
29
- else
30
- @exception = invalid_property_type_exception
31
- end
25
+ raise invalid_property_type_exception if safe?
26
+
27
+ @exception = invalid_property_type_exception
32
28
  end
33
29
 
34
30
  def payload
@@ -39,25 +35,27 @@ module SmartParams
39
35
  end
40
36
  end
41
37
 
42
- def as_json(options = nil)
38
+ def to_hash(options = nil)
43
39
  if @exception.present?
44
40
  @exception.as_json(options)
45
41
  else
46
42
  structure.as_json(options)
47
43
  end
48
44
  end
45
+ alias_method :as_json, :to_hash
49
46
 
50
- def fetch(key, default = KeyError)
51
- if default == KeyError
52
- as_json.fetch(key, default)
53
- else
54
- as_json.fetch(key)
55
- end
56
- end
57
-
58
- def dig(*keys)
59
- as_json.dig(*keys)
60
- end
47
+ delegate :[], to: :to_hash
48
+ delegate :fetch, to: :to_hash
49
+ delegate :fetch_values, to: :to_hash
50
+ delegate :merge, to: :to_hash
51
+ delegate :keys, to: :to_hash
52
+ delegate :key?, to: :to_hash
53
+ delegate :has_key?, to: :to_hash
54
+ delegate :values, to: :to_hash
55
+ delegate :value?, to: :to_hash
56
+ delegate :has_value?, to: :to_hash
57
+ delegate :dig, to: :to_hash
58
+ delegate :to_s, to: :to_hash
61
59
 
62
60
  def method_missing(name, *arguments, &block)
63
61
  if payload.respond_to?(name)
@@ -1,3 +1,3 @@
1
1
  module SmartParams
2
- VERSION = "2.2.0"
2
+ VERSION = "2.3.0"
3
3
  end
@@ -34,6 +34,8 @@ RSpec.describe SmartParams do
34
34
  end
35
35
 
36
36
  describe "#payload" do
37
+ subject {schema.payload}
38
+
37
39
  context "with a reasonably good params" do
38
40
  let(:params) do
39
41
  {
@@ -60,27 +62,25 @@ RSpec.describe SmartParams do
60
62
  }
61
63
  end
62
64
 
63
- it "returns the type" do
64
- expect(schema.payload.data.type).to eq("accounts")
65
+ it "has a chain path data.type" do
66
+ expect(subject.data.type).to eq("accounts")
65
67
  end
66
68
 
67
- it "returns the email" do
68
- expect(schema.data.attributes.email).to eq("kurtis@example.com")
69
+ it "has a chain path data.attributes.email" do
70
+ expect(subject.data.attributes.email).to eq("kurtis@example.com")
69
71
  end
70
72
 
71
- it "returns the password" do
72
- expect(schema.data.attributes.password).to be_kind_of(String)
73
+ it "has a chain path data.attributes.password" do
74
+ expect(subject.data.attributes.password).to be_kind_of(String)
73
75
  end
74
76
 
75
- it "returns the jsonapi version" do
76
- expect(schema.meta.jsonapi_version).to eq("1.0")
77
+ it "has a chain path meta.jsonapi_version" do
78
+ expect(subject.meta.jsonapi_version).to eq("1.0")
77
79
  end
78
80
  end
79
81
  end
80
82
 
81
- describe "#as_json" do
82
- subject {schema.as_json}
83
-
83
+ shared_examples "native types" do
84
84
  context "with extra params" do
85
85
  let(:params) do
86
86
  {
@@ -95,7 +95,7 @@ RSpec.describe SmartParams do
95
95
  }
96
96
  end
97
97
 
98
- it "returns as json" do
98
+ it "returns as native data types" do
99
99
  expect(
100
100
  subject
101
101
  ).to match(
@@ -128,7 +128,7 @@ RSpec.describe SmartParams do
128
128
  }
129
129
  end
130
130
 
131
- it "returns as json" do
131
+ it "returns as native data types" do
132
132
  expect(
133
133
  subject
134
134
  ).to match(
@@ -175,7 +175,7 @@ RSpec.describe SmartParams do
175
175
  }
176
176
  end
177
177
 
178
- it "returns as json" do
178
+ it "returns as native data types" do
179
179
  expect(
180
180
  subject
181
181
  ).to match(
@@ -212,4 +212,160 @@ RSpec.describe SmartParams do
212
212
  end
213
213
  end
214
214
  end
215
+
216
+ describe "#to_hash" do
217
+ subject {schema.to_hash}
218
+
219
+ include_examples "native types"
220
+ end
221
+
222
+ describe "#as_json" do
223
+ subject {schema.as_json}
224
+
225
+ include_examples "native types"
226
+ end
227
+
228
+ describe "#fetch" do
229
+ subject {schema.fetch("data")}
230
+
231
+ context "with a reasonably good params" do
232
+ let(:params) do
233
+ {
234
+ data: {
235
+ type: "accounts",
236
+ attributes: {
237
+ email: "kurtis@example.com"
238
+ }
239
+ },
240
+ meta: {
241
+ jsonapi_version: "1.0"
242
+ },
243
+ included: [
244
+ {
245
+ data: {
246
+ id: "a",
247
+ type: "widget",
248
+ attributes: {
249
+ title: "Widget A",
250
+ }
251
+ }
252
+ }
253
+ ]
254
+ }
255
+ end
256
+
257
+ it "returns the native type" do
258
+ expect(
259
+ subject
260
+ ).to match(
261
+ hash_including(
262
+ {
263
+ "type" => "accounts",
264
+ "attributes" => hash_including(
265
+ {
266
+ "email" => "kurtis@example.com",
267
+ "password" => an_instance_of(String)
268
+ }
269
+ )
270
+ }
271
+ )
272
+ )
273
+ end
274
+ end
275
+ end
276
+
277
+ describe "#dig" do
278
+ subject {schema.dig("data", "attributes", "email")}
279
+
280
+ context "with a reasonably good params" do
281
+ let(:params) do
282
+ {
283
+ data: {
284
+ type: "accounts",
285
+ attributes: {
286
+ email: "kurtis@example.com"
287
+ }
288
+ },
289
+ meta: {
290
+ jsonapi_version: "1.0"
291
+ },
292
+ included: [
293
+ {
294
+ data: {
295
+ id: "a",
296
+ type: "widget",
297
+ attributes: {
298
+ title: "Widget A",
299
+ }
300
+ }
301
+ }
302
+ ]
303
+ }
304
+ end
305
+
306
+ it "returns the native type" do
307
+ expect(
308
+ subject
309
+ ).to eq(
310
+ "kurtis@example.com"
311
+ )
312
+ end
313
+ end
314
+ end
315
+
316
+ describe "#fetch_values" do
317
+ subject {schema.fetch_values("data", "meta")}
318
+
319
+ context "with a reasonably good params" do
320
+ let(:params) do
321
+ {
322
+ data: {
323
+ type: "accounts",
324
+ attributes: {
325
+ email: "kurtis@example.com"
326
+ }
327
+ },
328
+ meta: {
329
+ jsonapi_version: "1.0"
330
+ },
331
+ included: [
332
+ {
333
+ data: {
334
+ id: "a",
335
+ type: "widget",
336
+ attributes: {
337
+ title: "Widget A",
338
+ }
339
+ }
340
+ }
341
+ ]
342
+ }
343
+ end
344
+
345
+ it "returns the native type" do
346
+ expect(
347
+ subject
348
+ ).to match(
349
+ [
350
+ hash_including(
351
+ {
352
+ "type" => "accounts",
353
+ "attributes" => hash_including(
354
+ {
355
+ "email" => "kurtis@example.com",
356
+ "password" => an_instance_of(String)
357
+ }
358
+ )
359
+ }
360
+ ),
361
+ hash_including(
362
+ {
363
+ "jsonapi_version" => "1.0"
364
+ }
365
+ )
366
+ ]
367
+ )
368
+ end
369
+ end
370
+ end
215
371
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smart_params
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kurtis Rainbolt-Greene
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-07-30 00:00:00.000000000 Z
11
+ date: 2018-08-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler