sinatra-param-validator 0.13.0 → 0.14.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: 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