pastore 0.0.4 → 0.2.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 +4 -4
- data/.vscode/launch.json +22 -0
- data/CHANGELOG.md +27 -2
- data/Gemfile +8 -5
- data/Gemfile.lock +10 -4
- data/README.md +20 -205
- data/docs/Guards.md +203 -0
- data/docs/Params.md +122 -0
- data/lib/pastore/guards.rb +4 -0
- data/lib/pastore/params/action_param.rb +158 -0
- data/lib/pastore/params/settings.rb +117 -0
- data/lib/pastore/params/validation.rb +118 -0
- data/lib/pastore/params/validations/boolean_validation.rb +48 -0
- data/lib/pastore/params/validations/date_validation.rb +74 -0
- data/lib/pastore/params/validations/number_validation.rb +66 -0
- data/lib/pastore/params/validations/object_validation.rb +49 -0
- data/lib/pastore/params/validations/string_validation.rb +50 -0
- data/lib/pastore/params.rb +66 -0
- data/lib/pastore/version.rb +1 -1
- data/lib/pastore.rb +1 -1
- metadata +14 -3
- data/lib/pastore/params_validators.rb +0 -7
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pastore
|
4
|
+
module Params
|
5
|
+
# Implements the validation logic for number parameters.
|
6
|
+
class NumberValidation < Validation
|
7
|
+
def initialize(name, value, modifier, **options)
|
8
|
+
@min = options[:min]
|
9
|
+
@max = options[:max]
|
10
|
+
@clamp = options[:clamp] || [-Float::INFINITY, Float::INFINITY]
|
11
|
+
|
12
|
+
super(name, 'number', value, modifier, **options)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def validate!
|
18
|
+
# check for value presence and if it's allowed to be blank
|
19
|
+
check_presence!
|
20
|
+
|
21
|
+
# don't go further if value is blank
|
22
|
+
return if value.to_s.strip == ''
|
23
|
+
|
24
|
+
# check if value is a number
|
25
|
+
# check if number is between min and max
|
26
|
+
# check if value is within specified clamping range, and correct if necessary
|
27
|
+
return unless check_if_number! && check_min_max! && check_clamp!
|
28
|
+
|
29
|
+
# check if value is in the list of allowed values
|
30
|
+
check_allowed_values!
|
31
|
+
|
32
|
+
# apply the modifier
|
33
|
+
apply_modifier!
|
34
|
+
end
|
35
|
+
|
36
|
+
def check_if_number!
|
37
|
+
return true if value.is_a?(Integer) || value.is_a?(Float)
|
38
|
+
|
39
|
+
if value.is_a?(String) && numeric?
|
40
|
+
@value = value.to_f
|
41
|
+
@value = value.to_i if value.modulo(1).zero?
|
42
|
+
|
43
|
+
return true
|
44
|
+
end
|
45
|
+
|
46
|
+
add_error(:invalid_type, "#{@name} has invalid type: #{@type} expected")
|
47
|
+
|
48
|
+
false
|
49
|
+
end
|
50
|
+
|
51
|
+
def check_min_max!
|
52
|
+
min_invalid = @min && value < @min
|
53
|
+
max_invalid = @max && value > @max
|
54
|
+
|
55
|
+
add_error(:too_small, "#{@name} should be greater than #{@min}") if min_invalid
|
56
|
+
add_error(:too_large, "#{@name} should be smaller than #{@max}") if max_invalid
|
57
|
+
|
58
|
+
min_invalid || max_invalid ? false : true
|
59
|
+
end
|
60
|
+
|
61
|
+
def check_clamp!
|
62
|
+
@value = @value.clamp(@clamp.first || -Float::INFINITY, @clamp.last || Float::INFINITY)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pastore
|
4
|
+
module Params
|
5
|
+
# Implements the validation logic for object parameters.
|
6
|
+
class ObjectValidation < Validation
|
7
|
+
def initialize(name, value, modifier, **options)
|
8
|
+
super(name, 'object', value, modifier, **options)
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def validate!
|
14
|
+
# check for value presence and if it's allowed to be blank
|
15
|
+
check_presence!
|
16
|
+
|
17
|
+
# don't go further if value is blank
|
18
|
+
return if value.to_s.strip == ''
|
19
|
+
|
20
|
+
# check if value is a boolean
|
21
|
+
return unless check_if_object!
|
22
|
+
|
23
|
+
# check if value is in the list of allowed values
|
24
|
+
check_allowed_values!
|
25
|
+
|
26
|
+
# apply the modifier
|
27
|
+
apply_modifier!
|
28
|
+
end
|
29
|
+
|
30
|
+
def check_if_object!
|
31
|
+
return true if [Hash, HashWithIndifferentAccess, ActionController::Parameters, Array].include?(value.class)
|
32
|
+
|
33
|
+
# When value is a string, try to parse it as JSON
|
34
|
+
if value.is_a?(String)
|
35
|
+
begin
|
36
|
+
@value = JSON.parse(value)
|
37
|
+
return true
|
38
|
+
rescue JSON::ParserError
|
39
|
+
# Do nothing
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
add_error(:invalid_type, "#{@name} has invalid type: #{@type} expected")
|
44
|
+
|
45
|
+
false
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pastore
|
4
|
+
module Params
|
5
|
+
# Implements the validation logic for string parameters.
|
6
|
+
class StringValidation < Validation
|
7
|
+
def initialize(name, value, modifier, **options)
|
8
|
+
@format = options[:format]
|
9
|
+
|
10
|
+
super(name, 'string', value, modifier, **options)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def validate!
|
16
|
+
# check for value presence and if it's allowed to be blank
|
17
|
+
check_presence!
|
18
|
+
|
19
|
+
# don't go further if value is blank
|
20
|
+
return if value.to_s.strip == ''
|
21
|
+
|
22
|
+
# check if value is a string
|
23
|
+
return unless check_if_string! && check_format!
|
24
|
+
|
25
|
+
# check if value is in the list of allowed values
|
26
|
+
check_allowed_values!
|
27
|
+
|
28
|
+
# apply the modifier
|
29
|
+
apply_modifier!
|
30
|
+
end
|
31
|
+
|
32
|
+
def check_if_string!
|
33
|
+
return true if value.is_a?(String)
|
34
|
+
|
35
|
+
@value = @value.to_s
|
36
|
+
|
37
|
+
true
|
38
|
+
end
|
39
|
+
|
40
|
+
# Check if the value matches the specified format
|
41
|
+
def check_format!
|
42
|
+
return true if @format.nil?
|
43
|
+
|
44
|
+
add_error(:invalid_format, "#{@name} has invalid format") if value.match(@format).nil?
|
45
|
+
|
46
|
+
true
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_support/concern'
|
4
|
+
require_relative 'params/settings'
|
5
|
+
|
6
|
+
module Pastore
|
7
|
+
# Implements the features for Rails controller params validation.
|
8
|
+
module Params
|
9
|
+
class ParamAlreadyDefinedError < StandardError; end
|
10
|
+
class ScopeConflictError < StandardError; end
|
11
|
+
class InvalidValidationTypeError < StandardError; end
|
12
|
+
class InvalidParamTypeError < StandardError; end
|
13
|
+
class InvalidValueError < StandardError; end
|
14
|
+
|
15
|
+
extend ActiveSupport::Concern
|
16
|
+
|
17
|
+
included do
|
18
|
+
before_action do
|
19
|
+
pastore_params = self.class.pastore_params
|
20
|
+
validation_errors = pastore_params.validate(params, action_name)
|
21
|
+
next if validation_errors.empty?
|
22
|
+
|
23
|
+
if pastore_params.invalid_params_cbk.present?
|
24
|
+
instance_eval(&pastore_params.invalid_params_cbk)
|
25
|
+
response.status = pastore_params.response_status
|
26
|
+
else
|
27
|
+
render json: { message: 'Unprocessable Entity', errors: validation_errors }, status: pastore_params.response_status
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Implement Pastore::Params class methods
|
33
|
+
module ClassMethods
|
34
|
+
attr_accessor :_pastore_params
|
35
|
+
|
36
|
+
def pastore_params
|
37
|
+
self._pastore_params ||= Settings.new(superclass)
|
38
|
+
end
|
39
|
+
|
40
|
+
def on_invalid_params(&block)
|
41
|
+
pastore_params.invalid_params_cbk = block
|
42
|
+
end
|
43
|
+
|
44
|
+
def invalid_params_status(status)
|
45
|
+
pastore_params.response_status = status
|
46
|
+
end
|
47
|
+
|
48
|
+
def param(name, **options)
|
49
|
+
pastore_params.add(name, **options)
|
50
|
+
end
|
51
|
+
|
52
|
+
def scope(*keys, &block)
|
53
|
+
return unless block_given?
|
54
|
+
|
55
|
+
pastore_params.set_scope(*keys)
|
56
|
+
block.call
|
57
|
+
pastore_params.reset_scope!
|
58
|
+
end
|
59
|
+
|
60
|
+
def method_added(name, *args, &block)
|
61
|
+
pastore_params.save_for(name)
|
62
|
+
super
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/lib/pastore/version.rb
CHANGED
data/lib/pastore.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pastore
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Groza Sergiu
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-02-
|
11
|
+
date: 2023-02-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -42,6 +42,7 @@ extra_rdoc_files: []
|
|
42
42
|
files:
|
43
43
|
- ".rspec"
|
44
44
|
- ".rubocop.yml"
|
45
|
+
- ".vscode/launch.json"
|
45
46
|
- CHANGELOG.md
|
46
47
|
- CODE_OF_CONDUCT.md
|
47
48
|
- Gemfile
|
@@ -49,10 +50,20 @@ files:
|
|
49
50
|
- LICENSE
|
50
51
|
- README.md
|
51
52
|
- Rakefile
|
53
|
+
- docs/Guards.md
|
54
|
+
- docs/Params.md
|
52
55
|
- lib/pastore.rb
|
53
56
|
- lib/pastore/guards.rb
|
54
57
|
- lib/pastore/guards/settings.rb
|
55
|
-
- lib/pastore/
|
58
|
+
- lib/pastore/params.rb
|
59
|
+
- lib/pastore/params/action_param.rb
|
60
|
+
- lib/pastore/params/settings.rb
|
61
|
+
- lib/pastore/params/validation.rb
|
62
|
+
- lib/pastore/params/validations/boolean_validation.rb
|
63
|
+
- lib/pastore/params/validations/date_validation.rb
|
64
|
+
- lib/pastore/params/validations/number_validation.rb
|
65
|
+
- lib/pastore/params/validations/object_validation.rb
|
66
|
+
- lib/pastore/params/validations/string_validation.rb
|
56
67
|
- lib/pastore/version.rb
|
57
68
|
homepage: https://github.com/demetra-it/pastore
|
58
69
|
licenses:
|