parametric 0.2.16 → 0.2.17

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
  SHA256:
3
- metadata.gz: 2f6f417ecf3ae9196ec9dc4757df98b21716c71ee43909e7f47a12d0885c983a
4
- data.tar.gz: aae3258b0c564f98554a6de742aec9f25279c4352180c09b109add7587ab2977
3
+ metadata.gz: 71e71a5ddf414bb333a499f425d68e891f60a2e0610a8a57d8362f6481da16e6
4
+ data.tar.gz: 5c13b835147015f11f66591d311612139b16c4001891451d299c39358045725c
5
5
  SHA512:
6
- metadata.gz: fffc57a0087500348370a0f4fe71744076eed77c9493e16638e21a457af66bc381865630bee84374c164b41909396e150e2e991480f97b2d8cac2017e512b84c
7
- data.tar.gz: 8d24b5272d916ea58a1aa1f425d0261d948fe2c83957ec39a4156795de636f8c9a8e0e2fce1e166bb0a0f669c1ead5d864a65295b50ad7fb1f1d5077a450dc48
6
+ metadata.gz: 8cd1bb404bb5bcf24fc7b4826dcf360d367efb23cbe0e1d300a25f3e0a709ee5fb4e9d17db5820803a9e8f2f0b65e68ddae5c27325573f7fc213c7814a8f4e04
7
+ data.tar.gz: 0fd11bca14c7c75decb6dcc9781ef1b26a3ecc7bed3b4348b30f5c8c06ad57237b10beb7d3acd6a5b1f0e8989823da29e2f3bc3956f51856b1e57b852a7bdd5d
data/README.md CHANGED
@@ -275,6 +275,14 @@ Useful for parsing comma-separated query-string parameters.
275
275
  field(:status).policy(:split) # turns "pending,confirmed" into ["pending", "confirmed"]
276
276
  ```
277
277
 
278
+ ### :value
279
+
280
+ A policy to return a static value
281
+
282
+ ```ruby
283
+ field(:currency).policy(:value, 'gbp') # this field always resolves to 'gbp'
284
+ ```
285
+
278
286
  ## Custom policies
279
287
 
280
288
  You can also register your own custom policy objects. A policy must implement the following methods:
@@ -61,7 +61,7 @@ module Parametric
61
61
 
62
62
  def visit(meta_key = nil, &visitor)
63
63
  if sc = meta_data[:schema]
64
- r = sc.visit(meta_key, &visitor)
64
+ r = sc.schema.visit(meta_key, &visitor)
65
65
  (meta_data[:type] == :array) ? [r] : r
66
66
  else
67
67
  meta_key ? meta_data[meta_key] : yield(self)
@@ -26,6 +26,31 @@ module Parametric
26
26
  {}
27
27
  end
28
28
  end
29
+
30
+ class Value
31
+ attr_reader :message
32
+
33
+ def initialize(val, msg = 'invalid value')
34
+ @message = msg
35
+ @val = val
36
+ end
37
+
38
+ def eligible?(value, key, payload)
39
+ payload.key?(key)
40
+ end
41
+
42
+ def coerce(_value, _key, _context)
43
+ @val
44
+ end
45
+
46
+ def valid?(value, key, payload)
47
+ !payload.key?(key) || !!(value == @val)
48
+ end
49
+
50
+ def meta_data
51
+ { value: @val }
52
+ end
53
+ end
29
54
  end
30
55
 
31
56
  # Default validators
@@ -33,6 +58,7 @@ module Parametric
33
58
 
34
59
  Parametric.policy :format, Policies::Format
35
60
  Parametric.policy :email, Policies::Format.new(EMAIL_REGEXP, 'invalid email')
61
+ Parametric.policy :value, Policies::Value
36
62
 
37
63
  Parametric.policy :noop do
38
64
  eligible do |value, key, payload|
@@ -75,7 +75,7 @@ module Parametric
75
75
  fields.each_with_object({}) do |(_, field), obj|
76
76
  meta = field.meta_data.dup
77
77
  sc = meta.delete(:schema)
78
- meta[:structure] = sc.structure if sc
78
+ meta[:structure] = sc.schema.structure if sc
79
79
  obj[field.key] = meta
80
80
  end
81
81
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Parametric
4
- VERSION = '0.2.16'
4
+ VERSION = '0.2.17'
5
5
  end
data/spec/field_spec.rb CHANGED
@@ -264,6 +264,16 @@ describe Parametric::Field do
264
264
  end
265
265
  end
266
266
 
267
+ describe ":value policy" do
268
+ it 'always resolves to static value' do
269
+ resolve(subject.policy(:value, 'hello'), a_key: "tag1,tag2").tap do |r|
270
+ expect(r.eligible?).to be true
271
+ no_errors
272
+ expect(r.value).to eq 'hello'
273
+ end
274
+ end
275
+ end
276
+
267
277
  describe ":declared policy" do
268
278
  it "is eligible if key exists" do
269
279
  resolve(subject.policy(:declared).present, a_key: "").tap do |r|
data/spec/struct_spec.rb CHANGED
@@ -2,8 +2,8 @@ require 'spec_helper'
2
2
  require 'parametric/struct'
3
3
 
4
4
  describe Parametric::Struct do
5
- it "works" do
6
- friend_class = Class.new do
5
+ let(:friend_class) do
6
+ Class.new do
7
7
  include Parametric::Struct
8
8
 
9
9
  schema do
@@ -11,16 +11,19 @@ describe Parametric::Struct do
11
11
  field(:age).type(:integer)
12
12
  end
13
13
  end
14
+ end
15
+ let(:klass) do
16
+ Class.new.tap do |cl|
17
+ cl.send(:include, Parametric::Struct)
14
18
 
15
- klass = Class.new do
16
- include Parametric::Struct
17
-
18
- schema do
19
- field(:title).type(:string).present
20
- field(:friends).type(:array).default([]).schema friend_class
19
+ cl.schema do |sc, _|
20
+ sc.field(:title).type(:string).present
21
+ sc.field(:friends).type(:array).default([]).schema friend_class
21
22
  end
22
23
  end
24
+ end
23
25
 
26
+ it "works" do
24
27
  new_instance = klass.new
25
28
  expect(new_instance.title).to eq ''
26
29
  expect(new_instance.friends).to eq []
@@ -57,6 +60,18 @@ describe Parametric::Struct do
57
60
  expect(invalid_instance.friends[1].errors['$.name']).not_to be_nil
58
61
  end
59
62
 
63
+ it 'supports #structure' do
64
+ st = klass.schema.structure
65
+ expect(st[:title][:type]).to eq(:string)
66
+ expect(st[:friends][:structure][:age][:type]).to eq(:integer)
67
+ end
68
+
69
+ it 'supports #walk' do
70
+ output = klass.schema.walk(:type).output
71
+ expect(output[:title]).to eq(:string)
72
+ expect(output[:friends][0][:name]).to eq(:string)
73
+ end
74
+
60
75
  it "is inmutable by default" do
61
76
  klass = Class.new do
62
77
  include Parametric::Struct
@@ -9,6 +9,13 @@ describe 'default validators' do
9
9
  expect(validator.valid?(payload[key], key, payload)).to eq valid
10
10
  end
11
11
 
12
+ describe ':value' do
13
+ it {
14
+ test_validator({key: 'Foobar'}, :key, :value, true, true, 'Foobar')
15
+ test_validator({key: 'Nope'}, :key, :value, true, false, 'Foobar')
16
+ }
17
+ end
18
+
12
19
  describe ':format' do
13
20
  it {
14
21
  test_validator({key: 'Foobar'}, :key, :format, true, true, /^Foo/)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parametric
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.16
4
+ version: 0.2.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ismael Celis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-09 00:00:00.000000000 Z
11
+ date: 2022-04-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake