pastore 0.0.4 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.vscode/launch.json +22 -0
- data/CHANGELOG.md +19 -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/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,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].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.1.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-13 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:
|