sinatra-param-validator 0.13.0 → 0.14.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
  SHA256:
3
- metadata.gz: 5cad00b1174bc3a3c95d063287d27226a96e06994238b4a350b1395316a708b1
4
- data.tar.gz: 5133cf2b22163b3c3aff130f5151f3c249adae54c7c45f60bd02d6299bf6d50d
3
+ metadata.gz: 2f94e83b8a50e45743393eff54f46c692095fbad50942f68e047713b55397512
4
+ data.tar.gz: 1394c62c964ad2e4bc51dbd44abf98313757babbbe13748c09f32dc2a2e8863d
5
5
  SHA512:
6
- metadata.gz: 95c479b20400a9652a011ded28cd2d4d1c470e5acc531c44e1d9f9c2c643e55d0c5f9c09346c800615ab8fe9d46dbe69111077370a41fa154159a699dadc2f72
7
- data.tar.gz: 676ad92c188cbe7d24ba9bbb596e28d79857242df12e572f5376a4b3a2f5c719b41107ab0640b38f6d27bfdf9ebaf4e2a5cea0c292d0a84e2ed0bdd244ac5759
6
+ metadata.gz: '09cd666c97ce8ffd0750361ca52cfa04b2687351bd4db39918ba6d393ce476917943a16311817cddd50507939978687a4820d8aeb2fbda130dfd64d01a12ac72'
7
+ data.tar.gz: 2589470cf72e955854bc68ade46b6ccb1ddf2a5e9d1a7ad142e3fcfa5a2f714aa547b850090ee26caec29d33bf3d8c5b476809cb6ef392e3dad20222588bd6b9
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.14.0] - 2022-07-15
4
+
5
+ - Fix parameter coercion if a parameter is validated multiple times
6
+ - Refactor `param` and `rule` functions into helpers
7
+ - Allow `param` and `rule` to be run independently
8
+
3
9
  ## [0.13.0] - 2022-07-15
4
10
 
5
11
  - Capture `InvalidParameterError`s raised when running the parser
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sinatra-param-validator (0.13.0)
4
+ sinatra-param-validator (0.14.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -13,6 +13,25 @@ module Sinatra
13
13
  raise "Filter params failed: #{e}"
14
14
  end
15
15
 
16
+ def param(key, type, default: nil, message: nil, **args, &block)
17
+ parameter = Parameter.new(params[key], type, **args)
18
+ _update_params_hash key, parameter, default
19
+ if parameter.valid?
20
+ _run_block(key, block) if block
21
+ else
22
+ _handle_error key, message || parameter.errors
23
+ end
24
+ rescue NameError
25
+ raise 'Invalid parameter type'
26
+ end
27
+
28
+ def rule(name, *args, **kwargs)
29
+ rule = Rule.new(name, params, *args, **kwargs)
30
+ _handle_error :rules, rule.errors unless rule.passes?
31
+ rescue NameError
32
+ raise 'Invalid rule type'
33
+ end
34
+
16
35
  def validate(klass, identifier)
17
36
  identifier = Identifier.new(identifier) if identifier.is_a? Symbol
18
37
  definition = settings.validator_definitions.get(identifier.identifier)
@@ -20,6 +39,27 @@ module Sinatra
20
39
  validator.run(self, *identifier.args)
21
40
  validator.handle_failure(self) unless validator.success?
22
41
  end
42
+
43
+ def _handle_error(key, error)
44
+ raise InvalidParameterError unless defined? @_validator_errors
45
+
46
+ @_validator_errors[key] = @_validator_errors.fetch(key, []).concat(Array(error))
47
+ end
48
+
49
+ def _run_block(key, block)
50
+ args = block.arity == 1 ? [self] : []
51
+ instance_exec(*args, &block)
52
+ rescue InvalidParameterError => e
53
+ _handle_error key, e.message
54
+ end
55
+
56
+ def _update_params_hash(key, parameter, default)
57
+ if params.key?(key)
58
+ params[key] = parameter.coerced unless parameter.coerced.nil?
59
+ elsif !default.nil?
60
+ params[key] = default.respond_to?(:call) ? default.call : default
61
+ end
62
+ end
23
63
  end
24
64
  end
25
65
  end
@@ -15,6 +15,7 @@ module Sinatra
15
15
 
16
16
  def coerce(value)
17
17
  return nil if value.nil?
18
+ return value if value.is_a? ::Date
18
19
 
19
20
  ::Date.parse(value)
20
21
  end
@@ -14,6 +14,7 @@ module Sinatra
14
14
 
15
15
  def coerce(value)
16
16
  return nil if value.nil?
17
+ return value if value.is_a? ::Integer
17
18
 
18
19
  Integer(value, 10)
19
20
  end
@@ -15,6 +15,7 @@ module Sinatra
15
15
 
16
16
  def coerce(value)
17
17
  return nil if value.nil?
18
+ return value if value.is_a? ::Time
18
19
 
19
20
  ::Time.parse(value)
20
21
  end
@@ -16,7 +16,9 @@ module Sinatra
16
16
  end
17
17
 
18
18
  def run(context, *args)
19
- @errors = Parser.new(context).parse(@definition, *args).errors
19
+ context.instance_variable_set(:@_validator_errors, {})
20
+ context.instance_exec(*args, &@definition)
21
+ @errors = context.remove_instance_variable(:@_validator_errors)
20
22
  rescue InvalidParameterError => e
21
23
  @errors[:general] = [e.message]
22
24
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Sinatra
4
4
  module ParamValidator
5
- VERSION = '0.13.0'
5
+ VERSION = '0.14.0'
6
6
  end
7
7
  end
@@ -4,7 +4,9 @@ require_relative 'param_validator/camelize'
4
4
  require_relative 'param_validator/definitions'
5
5
  require_relative 'param_validator/helpers'
6
6
  require_relative 'param_validator/identifier'
7
- require_relative 'param_validator/parser'
7
+ require_relative 'param_validator/invalid_parameter_error'
8
+ require_relative 'param_validator/parameter'
9
+ require_relative 'param_validator/rule'
8
10
  require_relative 'param_validator/snake_case'
9
11
  require_relative 'param_validator/validator'
10
12
  require_relative 'param_validator/version'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sinatra-param-validator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.0
4
+ version: 0.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rick Selby
@@ -154,7 +154,6 @@ files:
154
154
  - lib/sinatra/param_validator/parameter/integer.rb
155
155
  - lib/sinatra/param_validator/parameter/string.rb
156
156
  - lib/sinatra/param_validator/parameter/time.rb
157
- - lib/sinatra/param_validator/parser.rb
158
157
  - lib/sinatra/param_validator/rule.rb
159
158
  - lib/sinatra/param_validator/rule/all_or_none_of.rb
160
159
  - lib/sinatra/param_validator/rule/any_of.rb
@@ -1,73 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'delegate'
4
-
5
- require_relative 'invalid_parameter_error'
6
- require_relative 'parameter'
7
- require_relative 'rule'
8
-
9
- module Sinatra
10
- module ParamValidator
11
- # Methods to add to the context for handling parameters
12
- module ValidatorMethods
13
- def _add_error(key, error)
14
- @__validator_errors[key] = @__validator_errors.fetch(key, []).concat(Array(error))
15
- end
16
-
17
- def param(key, type, default: nil, message: nil, **args, &block)
18
- parameter = Parameter.new(params[key], type, **args)
19
- _update_params_hash key, parameter, default
20
- if parameter.valid?
21
- _run_block(key, block) if block
22
- else
23
- _add_error key, message || parameter.errors
24
- end
25
- rescue NameError
26
- raise 'Invalid parameter type'
27
- end
28
-
29
- def rule(name, *args, **kwargs)
30
- rule = Rule.new(name, params, *args, **kwargs)
31
- unless rule.passes?
32
- @__validator_errors[:rules] ||= []
33
- @__validator_errors[:rules].push(rule.errors)
34
- end
35
- rescue NameError
36
- raise 'Invalid rule type'
37
- end
38
-
39
- def _run_block(key, block)
40
- args = block.arity == 1 ? [self] : []
41
- instance_exec(*args, &block)
42
- rescue InvalidParameterError => e
43
- _add_error key, e.message
44
- end
45
-
46
- def _update_params_hash(key, parameter, default)
47
- if params.key?(key)
48
- params[key] = parameter.coerced unless parameter.coerced.nil?
49
- elsif !default.nil?
50
- params[key] = default.respond_to?(:call) ? default.call : default
51
- end
52
- end
53
- end
54
-
55
- # Run the definition in the given scope
56
- class Parser
57
- attr_reader :errors
58
-
59
- def initialize(context)
60
- @context = context
61
- end
62
-
63
- def parse(definition, *args)
64
- @context.extend(ValidatorMethods)
65
- @context.instance_variable_set(:@__validator_errors, {})
66
- @context.instance_exec(*args, &definition)
67
- @errors = @context.instance_variable_get(:@__validator_errors)
68
-
69
- self
70
- end
71
- end
72
- end
73
- end