gate 0.2.0 → 0.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
  SHA1:
3
- metadata.gz: 09c3db4ff831be9cbcee9a0fc5c4666cf25e0fd6
4
- data.tar.gz: b8fe4ff7b05976382e00b91dca04496b330cd0a0
3
+ metadata.gz: c1951613a4b68d99db41f71852db4e2b100ded40
4
+ data.tar.gz: 1112aaf87c2fa1453e31be28aa38149b6ad167ed
5
5
  SHA512:
6
- metadata.gz: f2e1837f27d8e33f1f73365c9a231f465b3e3abdcca1b036f22b7194dfd1d918341de980d492115b5e1feac1b797450d2b83356e303d4633ccd06414e77d50b1
7
- data.tar.gz: 32fd22c8502b461615a89d6fe4b8edf6592218083ead3d796d627593b84b6fa990d1c23926c32eb557b41b8a04eba90eedff0f70446e8f439a060d16a1fa5ac6
6
+ metadata.gz: 99c9230b9aae1f1cd7bd319ad08d93671423ab4bb11f807118a20139d4578eb420cd9399f147045025565ba3380474a6f362637957c4bc7af0bd227bc100863b
7
+ data.tar.gz: ad095bcd11b76c9fa802fc8e0b145dd9d0086a0e0f466231809136bbbd7f9da111b817764f0daa5ed5a5689e4a504dd6ab80f516c343a194bbd08750a8d9f596
data/README.md CHANGED
@@ -47,6 +47,19 @@ result.attributes # => hash with only allowed parameters
47
47
  result.errors # => hash { key => error }
48
48
  ```
49
49
 
50
+ If you need to handle `nil` values you can use `allow_nil` flag:
51
+
52
+ ```ruby
53
+ gate = Gate.rules do
54
+ required :id, :Integer, allow_nil: true
55
+ required :message, allow_nil: true do
56
+ required :title
57
+ optional :value, :Decimal
58
+ end
59
+ end
60
+ ```
61
+
62
+
50
63
  ## Development
51
64
 
52
65
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -1,12 +1,13 @@
1
1
  module Gate
2
2
  class Coercer
3
- def initialize(engine, type)
3
+ def initialize(engine, type, allow_nil: false)
4
4
  unless Axiom::Types.const_defined?(type)
5
5
  fail CoercionError, "Doesn't know how to coerce into #{type}"
6
6
  end
7
7
 
8
8
  @engine = engine
9
9
  @type = type
10
+ @allow_nil = allow_nil
10
11
  @coercion_method = Axiom::Types.const_get(type).coercion_method
11
12
  end
12
13
 
@@ -16,6 +17,10 @@ module Gate
16
17
  raise CoercionError, "Doesn't know how to coerce #{input} into #{type}"
17
18
  end
18
19
 
20
+ def allow_nil?
21
+ @allow_nil
22
+ end
23
+
19
24
  private
20
25
 
21
26
  attr_reader :engine, :type, :coercion_method
@@ -8,12 +8,13 @@ module Gate
8
8
 
9
9
  def_delegator :@rules, :reduce
10
10
 
11
- def initialize(coercer = Coercible::Coercer.new, &block)
11
+ def initialize(coercer: Coercible::Coercer.new, allow_nil: false, &block)
12
12
  @coercer = coercer
13
13
  @required_set = Set.new
14
14
  @optional_set = Set.new
15
15
  @nested_set = Set.new
16
16
  @rules = {}
17
+ @allow_nil = allow_nil
17
18
 
18
19
  instance_eval(&block)
19
20
  end
@@ -22,28 +23,32 @@ module Gate
22
23
  required_set.include?(name)
23
24
  end
24
25
 
26
+ def allow_nil?
27
+ @allow_nil
28
+ end
29
+
25
30
  private
26
31
 
27
- def required(name, type = :String, &block)
32
+ def required(name, type = :String, allow_nil: false, &block)
28
33
  required_set.add(name)
29
- register(name, type, &block)
34
+ register(name, type, allow_nil: allow_nil, &block)
30
35
  end
31
36
 
32
- def optional(name, type = :String, &block)
37
+ def optional(name, type = :String, allow_nil: false, &block)
33
38
  optional_set.add(name)
34
- register(name, type, &block)
39
+ register(name, type, allow_nil: allow_nil, &block)
35
40
  end
36
41
 
37
- def register(name, type, &block)
38
- @rules[name] = setup_rule(name, type, &block)
42
+ def register(name, type, allow_nil:, &block)
43
+ @rules[name] = setup_rule(name, type, allow_nil: allow_nil, &block)
39
44
  end
40
45
 
41
- def setup_rule(name, type, &block)
46
+ def setup_rule(name, type, allow_nil:, &block)
42
47
  if block_given?
43
48
  nested_set.add(name)
44
- Configuration.new(coercer, &block)
49
+ Configuration.new(coercer: coercer, allow_nil: allow_nil, &block)
45
50
  else
46
- Coercer.new(coercer, type)
51
+ Coercer.new(coercer, type, allow_nil: allow_nil)
47
52
  end
48
53
  end
49
54
  end
@@ -28,10 +28,11 @@ module Gate
28
28
  end
29
29
 
30
30
  def handle(input, name, rule)
31
- if rule.is_a?(Gate::Configuration)
32
- result = Gate::Guard.new(rule).verify(input)
33
- { attributes: { name => result.attributes },
34
- errors: { name => result.errors } }
31
+ case
32
+ when input.nil?
33
+ coerce_nil(name, rule)
34
+ when rule.is_a?(Gate::Configuration)
35
+ coerce_nested(input, name, rule)
35
36
  else
36
37
  coerce(input, name, rule)
37
38
  end
@@ -44,6 +45,20 @@ module Gate
44
45
  { errors: { name => :coercion_error } }
45
46
  end
46
47
 
48
+ def coerce_nested(input, name, rule)
49
+ result = Gate::Guard.new(rule).verify(input)
50
+ { attributes: { name => result.attributes },
51
+ errors: { name => result.errors } }
52
+ end
53
+
54
+ def coerce_nil(name, rule)
55
+ if rule.allow_nil?
56
+ { attributes: { name => nil } }
57
+ else
58
+ { errors: { name => :nil_not_allowed } }
59
+ end
60
+ end
61
+
47
62
  def update(result, attributes: {}, errors: {})
48
63
  { attributes: result.attributes.merge(attributes),
49
64
  errors: result.errors.merge(errors) }
@@ -1,3 +1,3 @@
1
1
  module Gate
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Dudulski
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-21 00:00:00.000000000 Z
11
+ date: 2015-10-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: coercible