valideizer 1.0.2
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 +7 -0
- data/lib/valideizer/core.rb +80 -0
- data/lib/valideizer/error_printer.rb +52 -0
- data/lib/valideizer/rails.rb +32 -0
- data/lib/valideizer/rules.rb +160 -0
- data/lib/valideizer/version.rb +3 -0
- data/lib/valideizer.rb +8 -0
- metadata +64 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f3229a51579000464c6d27a4a08ad6d7a76e8634efae33b5e6beff9cbc239ed1
|
4
|
+
data.tar.gz: f252e175f557360fc875538340b1bf381d7169a724c4f5117c6af89bfd405928
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a6682014a99bb3cdc5b5a72764e132498fb3eb8347e9bd50468bac55d320b03c312d8dd3eb454872a31abdc2dc51638eb46f01bb07767629b198b6034ad022c7
|
7
|
+
data.tar.gz: 167c1b26d637267bc9ba90f999d9b56b3d9f60b74be60f20d5878c8fbe972fc8efd8c1e301a38bbbc95a2457ccb53e93a520fa7a1e81532eb1334984d40dd4fe
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'valideizer/rules'
|
2
|
+
require 'valideizer/error_printer'
|
3
|
+
|
4
|
+
module Valideizer
|
5
|
+
class Core
|
6
|
+
include Valideizer::Rules
|
7
|
+
include Valideizer::ErrorPrinter
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@rules = {}
|
11
|
+
reinit_errrors
|
12
|
+
end
|
13
|
+
|
14
|
+
def add_rule(param, *rules)
|
15
|
+
@rules[param] = rules[0]
|
16
|
+
end
|
17
|
+
|
18
|
+
alias valideize add_rule
|
19
|
+
|
20
|
+
def valideized?(params)
|
21
|
+
reinit_errrors
|
22
|
+
setup_defaults(params)
|
23
|
+
params.each do |param, value|
|
24
|
+
next unless nil_check(param, value)
|
25
|
+
|
26
|
+
@rules[param].each do |type, constraint|
|
27
|
+
begin
|
28
|
+
push_error(param, value, type, constraint) unless validate(value, type, constraint)
|
29
|
+
rescue ArgumentError => ex
|
30
|
+
puts ex
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
@errors.empty?
|
36
|
+
end
|
37
|
+
|
38
|
+
def errors
|
39
|
+
build_error_messages
|
40
|
+
@error_messages
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def reinit_errrors
|
46
|
+
@errors = {}
|
47
|
+
@error_messages = []
|
48
|
+
end
|
49
|
+
|
50
|
+
def push_error(param, value, type, constraint)
|
51
|
+
@errors[param] = [] unless @errors.member? param
|
52
|
+
@errors[param].push(type: type, value: value, constraint: constraint)
|
53
|
+
end
|
54
|
+
|
55
|
+
def setup_defaults(params)
|
56
|
+
@rules.each do |param, rules|
|
57
|
+
default_rule = rules.find { |r, _c| r == :default }
|
58
|
+
params[param] = default_rule.last unless default_rule.nil?
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def nil_check(param, value)
|
63
|
+
if !value.nil? || value.nil? && has_allow_nil_rule(param)
|
64
|
+
true
|
65
|
+
else
|
66
|
+
push_error(param, :nil, nil, nil)
|
67
|
+
false
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def has_allow_nil_rule(param)
|
72
|
+
nil_rule = @rules[param].find { |r, _c| r == :nil }
|
73
|
+
nil_rule.nil? ? false : nil_rule.last
|
74
|
+
end
|
75
|
+
|
76
|
+
def build_error_messages
|
77
|
+
@error_messages = print_errors
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Valideizer
|
2
|
+
module ErrorPrinter
|
3
|
+
PREFIX = "Validation error:".freeze
|
4
|
+
|
5
|
+
protected
|
6
|
+
|
7
|
+
def print_errors
|
8
|
+
@errors.map { |param_name, errors| errors.each { |error| { message: print_error(param_name, error) }}}
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def print_option(type, constraint, value)
|
14
|
+
case type
|
15
|
+
when :eql then "Should be equal to #{constraint}."
|
16
|
+
when :gt then "Should be greater than #{constraint}."
|
17
|
+
when :gte then "Should be greater than or equal to #{constraint}."
|
18
|
+
when :lt then "Should be less than #{constraint}."
|
19
|
+
when :lte then "Should be less than or equal to #{constraint}."
|
20
|
+
when :ot then "Should be other than #{constraint}."
|
21
|
+
when :range then "Out of range. Should be in #{constraint.to_s} range."
|
22
|
+
when :enum then "Out of enum. Possible values #{constraint.to_s}."
|
23
|
+
when :type then "Should be #{constraint} type. Current type: `#{value}`."
|
24
|
+
when :array_type then "Should be array of #{constraint} type."
|
25
|
+
when :custom_type then "Should be #{constraint} type."
|
26
|
+
when :regexp then "Couldn't be matched by #{constraint}."
|
27
|
+
when :length then "Length must be #{constraint}. Current value: `#{value}`, length: #{value.length}."
|
28
|
+
when :active_record then "Couldn't find #{constraint} with ID=#{value}."
|
29
|
+
when :nil then "Can not be nil or empty."
|
30
|
+
else ''
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def print_postfix(type, value)
|
35
|
+
"Current value: `#{value}`." if %i[type array_type custom_type active_record length].include?(type)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Validation error: :some param. Should be greater or equal than 200. Current value (100).
|
39
|
+
|
40
|
+
def print_error(param_name, error)
|
41
|
+
message = ""
|
42
|
+
message << PREFIX
|
43
|
+
message << "`#{param_name}`" + "\s" + "param."
|
44
|
+
message << "\s"
|
45
|
+
message << print_option(error[:type], error[:constraint], error[:value])
|
46
|
+
message << "\s"
|
47
|
+
message << (print_postfix(error[:type], error[:value]) || '')
|
48
|
+
|
49
|
+
message
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'valideizer/core'
|
2
|
+
|
3
|
+
module Valideizer
|
4
|
+
module Rails
|
5
|
+
def valideize(method, &options_block)
|
6
|
+
@valideizers = {} unless @valideizers.present?
|
7
|
+
|
8
|
+
@valideizers[method] = Valideizer::Core.new
|
9
|
+
@valideizers[method].instance_exec(options_block)
|
10
|
+
end
|
11
|
+
|
12
|
+
def valideize!
|
13
|
+
valideizer = @valideizers[action_name]
|
14
|
+
if valideizer.present? && @valideizer_callback.present?
|
15
|
+
redirect_to(controller: controller_name,
|
16
|
+
action: @valideizer_callback, errors: valideizer.errors) unless validiezer.valideize?(params)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def valideized?(params)
|
21
|
+
@valideizers[action_name].valideized? params
|
22
|
+
end
|
23
|
+
|
24
|
+
def valideizer_errors
|
25
|
+
@valideizers[action_name].errors
|
26
|
+
end
|
27
|
+
|
28
|
+
def validezier_callback(method_name)
|
29
|
+
@valideizer_callback = method_name
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,160 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module Valideizer
|
4
|
+
module Rules
|
5
|
+
RULES = %i[
|
6
|
+
eql
|
7
|
+
gt
|
8
|
+
gte
|
9
|
+
lt
|
10
|
+
lte
|
11
|
+
ot
|
12
|
+
range
|
13
|
+
enum
|
14
|
+
type
|
15
|
+
array_type
|
16
|
+
custom_type
|
17
|
+
active_record
|
18
|
+
length
|
19
|
+
regexp
|
20
|
+
nil
|
21
|
+
default
|
22
|
+
]
|
23
|
+
|
24
|
+
def validate(param, rule, constraint)
|
25
|
+
case rule
|
26
|
+
when :eql then validate_eql param, constraint
|
27
|
+
when :gt then validate_gt param, constraint
|
28
|
+
when :gte then validate_gte param, constraint
|
29
|
+
when :lt then validate_lt param, constraint
|
30
|
+
when :lte then validate_lte param, constraint
|
31
|
+
when :ot then validate_ot param, constraint
|
32
|
+
when :range then validate_range param, constraint
|
33
|
+
when :enum then validate_enum param, constraint
|
34
|
+
when :type then validate_type param, constraint
|
35
|
+
when :array_type then validate_array_type param, constraint
|
36
|
+
when :custom_type then validate_custom_type param, constraint
|
37
|
+
when :regexp then validate_regexp param, constraint
|
38
|
+
when :length then validate_length param, constraint
|
39
|
+
when :active_record then validate_active_record param, constraint
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def validate_eql(param, constraint)
|
46
|
+
param == constraint
|
47
|
+
end
|
48
|
+
|
49
|
+
def validate_gt(param, constraint)
|
50
|
+
param > constraint
|
51
|
+
end
|
52
|
+
|
53
|
+
def validate_gte(param, constraint)
|
54
|
+
param >= constraint
|
55
|
+
end
|
56
|
+
|
57
|
+
def validate_lt(param, constraint)
|
58
|
+
param < constraint
|
59
|
+
end
|
60
|
+
|
61
|
+
def validate_lte(param, constraint)
|
62
|
+
param <= constraint
|
63
|
+
end
|
64
|
+
|
65
|
+
def validate_ot(param, constraint)
|
66
|
+
param != constraint
|
67
|
+
end
|
68
|
+
|
69
|
+
def validate_range(param, constraint)
|
70
|
+
raise 'Must be a range' unless constraint.is_a? Range
|
71
|
+
constraint.include? param
|
72
|
+
end
|
73
|
+
|
74
|
+
def validate_enum(param, constraint)
|
75
|
+
raise 'Must be an array' unless constraint.is_a? Array
|
76
|
+
constraint.include? param
|
77
|
+
end
|
78
|
+
|
79
|
+
def validate_type(param, constraint)
|
80
|
+
if constraint.is_a? Array
|
81
|
+
constraint.each { |type| return true if type_check(param, type)}
|
82
|
+
else
|
83
|
+
type_check(param, constraint)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def type_check(param, type)
|
88
|
+
res = case type
|
89
|
+
when :integer then param.is_a? Integer
|
90
|
+
when :float then param.is_a? Float
|
91
|
+
when :string then param.is_a? String
|
92
|
+
when :array then param.is_a? Array
|
93
|
+
when :hash then param.is_a? Hash
|
94
|
+
when :bool then bool_check(param)
|
95
|
+
when :json then json_check(param)
|
96
|
+
else raise "Wrong check type #{param}"
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def bool_check(param)
|
101
|
+
[0, 1].include?(param) || ['true', 'false'].include?(param.to_s.downcase)
|
102
|
+
end
|
103
|
+
|
104
|
+
def json_check(param)
|
105
|
+
[Hash, Array].include?((JSON.parse param rescue nil).class)
|
106
|
+
end
|
107
|
+
|
108
|
+
def validate_array_type(param, constraint)
|
109
|
+
if param.is_a? Array
|
110
|
+
param.each do |v|
|
111
|
+
if v.is_a?(Array)
|
112
|
+
validate_array_type(v, constraint)
|
113
|
+
else
|
114
|
+
return false unless validate_type(v, constraint)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
true
|
119
|
+
else
|
120
|
+
false
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def validate_regexp(param, regexp)
|
125
|
+
raise 'Must be a string' unless param.is_a? String
|
126
|
+
param.match? regexp
|
127
|
+
end
|
128
|
+
|
129
|
+
def validate_custom_type(param, constraint)
|
130
|
+
param.is_a? constraint
|
131
|
+
end
|
132
|
+
|
133
|
+
def validate_length(param, constraint)
|
134
|
+
if [Array, Hash, String].include? param.class
|
135
|
+
if constraint.is_a? Hash
|
136
|
+
raise 'Hash params can not be empty.' if constraint.empty?
|
137
|
+
res = true
|
138
|
+
res &= param.length >= constraint[:min] unless constraint[:min].nil?
|
139
|
+
res &= param.length <= constraint[:max] unless constraint[:max].nil?
|
140
|
+
res
|
141
|
+
elsif constraint.is_a? Range
|
142
|
+
constraint.include? param.length
|
143
|
+
else
|
144
|
+
raise 'Wrong constraint for :length option. Must be range or hash {min: 0, max: 10}'
|
145
|
+
end
|
146
|
+
else
|
147
|
+
raise 'Must be Array, Hash or String'
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def validate_active_record(param, constraint)
|
152
|
+
klass = constraint
|
153
|
+
if klass.is_a? ActiveModel || (klass = constraint.to_s.constantize).is_a?(ActiveModel)
|
154
|
+
klass.find_by_id(param).present?
|
155
|
+
else
|
156
|
+
raise "#{constraint} is not a valid ActiveRecord model"
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
data/lib/valideizer.rb
ADDED
metadata
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: valideizer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Arthur 'ArtK0DE' Korochansky
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-08-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.15'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.15'
|
27
|
+
description: Small Gem to validate parameters. Can be integrated with Rails controllers
|
28
|
+
email:
|
29
|
+
- art2rik.desperado@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- lib/valideizer.rb
|
35
|
+
- lib/valideizer/core.rb
|
36
|
+
- lib/valideizer/error_printer.rb
|
37
|
+
- lib/valideizer/rails.rb
|
38
|
+
- lib/valideizer/rules.rb
|
39
|
+
- lib/valideizer/version.rb
|
40
|
+
homepage: https://github.com/artk0de/valideizer
|
41
|
+
licenses:
|
42
|
+
- MIT
|
43
|
+
metadata: {}
|
44
|
+
post_install_message:
|
45
|
+
rdoc_options: []
|
46
|
+
require_paths:
|
47
|
+
- lib
|
48
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
58
|
+
requirements: []
|
59
|
+
rubyforge_project:
|
60
|
+
rubygems_version: 2.7.9
|
61
|
+
signing_key:
|
62
|
+
specification_version: 4
|
63
|
+
summary: Small Gem to validate parameters
|
64
|
+
test_files: []
|