mealib 0.1.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 +7 -0
- data/.gitignore +10 -0
- data/.rubocop.yml +50 -0
- data/.ruby-version +1 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +20 -0
- data/README.md +11 -0
- data/bin/console +14 -0
- data/bin/rails +13 -0
- data/bin/setup +8 -0
- data/config/initializers/core_ext/string.rb +62 -0
- data/lib/dry/errors.rb +77 -0
- data/lib/dry/rule.rb +69 -0
- data/lib/dry/rules/and.rb +11 -0
- data/lib/dry/rules/between.rb +18 -0
- data/lib/dry/rules/binary.rb +16 -0
- data/lib/dry/rules/collection.rb +16 -0
- data/lib/dry/rules/composite.rb +19 -0
- data/lib/dry/rules/equal.rb +18 -0
- data/lib/dry/rules/format.rb +18 -0
- data/lib/dry/rules/greater_than.rb +18 -0
- data/lib/dry/rules/greater_than_or_equal.rb +18 -0
- data/lib/dry/rules/included.rb +18 -0
- data/lib/dry/rules/length_between.rb +18 -0
- data/lib/dry/rules/length_equal.rb +18 -0
- data/lib/dry/rules/less_than.rb +18 -0
- data/lib/dry/rules/less_than_or_equal.rb +18 -0
- data/lib/dry/rules/max_length.rb +18 -0
- data/lib/dry/rules/min_length.rb +18 -0
- data/lib/dry/rules/not_equal.rb +18 -0
- data/lib/dry/rules/or.rb +13 -0
- data/lib/dry/rules/present.rb +21 -0
- data/lib/dry/rules/then.rb +13 -0
- data/lib/dry/rules_factory.rb +118 -0
- data/lib/dry/schema.rb +148 -0
- data/lib/mealib.rb +48 -0
- data/lib/mealib/abstract_serializer.rb +28 -0
- data/lib/mealib/dict.rb +26 -0
- data/lib/mealib/engine.rb +5 -0
- data/lib/mealib/fucker/name/first_name_ru_man.txt +64 -0
- data/lib/mealib/fucker/name/last_name_ru_man.txt +252 -0
- data/lib/mealib/fucker/name/name.rb +27 -0
- data/lib/mealib/fucker/name/sur_name_ru_man.txt +53 -0
- data/lib/mealib/geo/distance.rb +22 -0
- data/lib/mealib/token_generator.rb +7 -0
- data/lib/mealib/version.rb +3 -0
- data/mealib.gemspec +26 -0
- metadata +117 -0
data/lib/dry/rules/or.rb
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
module Dry
|
2
|
+
class RulesFactory
|
3
|
+
|
4
|
+
attr_reader :value, :errors, :args
|
5
|
+
|
6
|
+
def initialize(value, errors = Dry::Errors.new, **args)
|
7
|
+
@value = value
|
8
|
+
@errors = errors
|
9
|
+
@args = args.symbolize_keys
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
def present?
|
14
|
+
Dry::Rules::Present.new(value, errors, args)
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
def equal?(right)
|
19
|
+
Dry::Rules::Equal.new(value, errors, build_args(right))
|
20
|
+
end
|
21
|
+
alias :eq? :equal?
|
22
|
+
|
23
|
+
|
24
|
+
def not_equal?(right)
|
25
|
+
Dry::Rules::NotEqual.new(value, errors, build_args(right))
|
26
|
+
end
|
27
|
+
alias :not_eq? :not_equal?
|
28
|
+
|
29
|
+
|
30
|
+
def greater_than?(right)
|
31
|
+
Dry::Rules::GreaterThan.new(value, errors, build_args(right))
|
32
|
+
end
|
33
|
+
alias :gt? :greater_than?
|
34
|
+
|
35
|
+
|
36
|
+
def greater_than_or_equal?(right)
|
37
|
+
Dry::Rules::GreaterThanOrEqual.new(value, errors, build_args(right))
|
38
|
+
end
|
39
|
+
alias :gt_eq? :greater_than_or_equal?
|
40
|
+
|
41
|
+
|
42
|
+
def less_than?(right)
|
43
|
+
Dry::Rules::LessThan.new(value, errors, build_args(right))
|
44
|
+
end
|
45
|
+
alias :lt? :less_than?
|
46
|
+
|
47
|
+
|
48
|
+
def less_than_or_equal?(right)
|
49
|
+
Dry::Rules::LessThanOrEqual.new(value, errors, build_args(right))
|
50
|
+
end
|
51
|
+
alias :lt_eq? :less_than_or_equal?
|
52
|
+
|
53
|
+
|
54
|
+
def included?(right)
|
55
|
+
Dry::Rules::Included.new(value, errors, build_args(right))
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
def length_equal?(right)
|
60
|
+
Dry::Rules::LengthEqual.new(value, errors, build_args(right))
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
def min_length?(right)
|
65
|
+
Dry::Rules::MinLength.new(value, errors, build_args(right))
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
def max_length?(right)
|
70
|
+
Dry::Rules::MaxLength.new(value, errors, build_args(right))
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
def between?(right)
|
75
|
+
Dry::Rules::Between.new(value, errors, build_args(right))
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
def length_between?(right)
|
80
|
+
Dry::Rules::LengthBetween.new(value, errors, build_args(right))
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
def format?(right)
|
85
|
+
Dry::Rules::Format.new(value, errors, build_args(right))
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
def each(&block)
|
90
|
+
return if value.blank?
|
91
|
+
value.inject(nil) do |rule, e|
|
92
|
+
_rule = self.class.new(e, errors, args).instance_exec(&block)
|
93
|
+
rule = rule ? rule & _rule : _rule
|
94
|
+
rule
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
|
99
|
+
def each_value(&block)
|
100
|
+
return if value.blank?
|
101
|
+
value.inject(nil) do |rule, (k, v)|
|
102
|
+
_rule = self.class.new(v, errors, args).instance_exec(&block)
|
103
|
+
rule = rule ? rule & _rule : _rule
|
104
|
+
rule
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
private
|
110
|
+
|
111
|
+
|
112
|
+
def build_args(right)
|
113
|
+
rt = right.is_a?(self.class) ? right.value : right
|
114
|
+
args.merge(right: rt)
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
end
|
data/lib/dry/schema.rb
ADDED
@@ -0,0 +1,148 @@
|
|
1
|
+
module Dry
|
2
|
+
module Schema
|
3
|
+
|
4
|
+
attr_reader :attributes, :errors
|
5
|
+
|
6
|
+
def initialize(params)
|
7
|
+
@errors = Dry::Errors.new
|
8
|
+
@attributes = cast({ wrap: params }.deep_symbolize_keys[:wrap], schema)
|
9
|
+
JSON::Validator.validate!(schema, attributes)
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
def [](key)
|
14
|
+
attributes[key.to_sym]
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
def valid?
|
19
|
+
validate_attributes(attributes, schema)
|
20
|
+
validate_additional
|
21
|
+
!errors.any?
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
def schema
|
26
|
+
raise NotImplemented
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
|
33
|
+
def validate_additional
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
def validate_attributes(props, schema, parents = [], key = nil)
|
38
|
+
case props
|
39
|
+
when Dry::Schema
|
40
|
+
errors.merge!(props.errors, (parents + [key]).compact.join('.')) unless props.valid?
|
41
|
+
else
|
42
|
+
[schema[:rule]].flatten.compact.each do |rule|
|
43
|
+
rule = rule.arity == 0 ? rule(key, parents, &rule) : rule.call(parents)
|
44
|
+
rule.valid? if rule
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
if schema[:properties]
|
49
|
+
(schema[:properties] || {}).each do |_key, data|
|
50
|
+
validate_attributes((props.present? ? props : {})[_key.to_sym], data, (parents + [key]).compact, _key)
|
51
|
+
end
|
52
|
+
elsif schema[:items]
|
53
|
+
(props.present? ? props : []).each_with_index do |e, i|
|
54
|
+
validate_attributes(e, schema[:items], (parents + [key]).compact, i)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
if schema[:oneOf] || schema[:allOf] || schema[:anyOf]
|
59
|
+
[:oneOf, :allOf, :anyOf].each do |k|
|
60
|
+
s = schema[k]
|
61
|
+
case s
|
62
|
+
when Hash
|
63
|
+
validate_attributes(props, s, parents, key)
|
64
|
+
when Array
|
65
|
+
s.each { |_s| validate_attributes(props, _s, parents, key) if _s.is_a?(Hash) }
|
66
|
+
else
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
def cast(params, schema)
|
74
|
+
props = schema.is_a?(Hash) && schema[:cast] ? schema[:cast].call(params) : params
|
75
|
+
|
76
|
+
case props
|
77
|
+
when Hash
|
78
|
+
props.each_with_object({}) do |(key, value), result|
|
79
|
+
result[key] = find_schemas_for_attribute(key, schema).inject((value.dup rescue value)) do
|
80
|
+
|_value, _schema| _value = cast(_value, _schema); _value
|
81
|
+
end
|
82
|
+
end
|
83
|
+
when Array
|
84
|
+
props.map { |e| cast(e, (schema[:items] rescue nil)) }
|
85
|
+
else
|
86
|
+
props
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
|
91
|
+
def rule(attrs, parents, messages = {}, name = nil, &block)
|
92
|
+
if block.arity == 0
|
93
|
+
_attrs = [attrs].flatten.compact
|
94
|
+
raise 'Invalid rule' if _attrs.size > 1
|
95
|
+
single_rule(parents + _attrs, messages, &block)
|
96
|
+
else
|
97
|
+
multi_rule(attrs, parents, messages, name, &block)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
def single_rule(keys, messages = {}, &block)
|
103
|
+
value = attributes.dig(*keys) rescue nil
|
104
|
+
factory = Dry::RulesFactory.new(value, errors, key: keys.join('.'), messages: messages)
|
105
|
+
factory.instance_exec &block
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
def multi_rule(keys, parents, messages = {}, name = nil, &block)
|
110
|
+
_keys = [keys].flatten.compact
|
111
|
+
data = parents.present? ? attributes.dig(*parents) : attributes
|
112
|
+
|
113
|
+
data = _keys.inject({}) do |res, key|
|
114
|
+
res[key.to_sym] = data[key.to_sym] rescue nil; res
|
115
|
+
end
|
116
|
+
|
117
|
+
factories = data.map do |key, value|
|
118
|
+
_key = name || key
|
119
|
+
_key = (parents + [_key]).join('.')
|
120
|
+
Dry::RulesFactory.new(value, errors, key: _key, messages: messages)
|
121
|
+
end
|
122
|
+
|
123
|
+
block.call *factories
|
124
|
+
end
|
125
|
+
|
126
|
+
|
127
|
+
def find_schemas_for_attribute(key, schema, schemas = [])
|
128
|
+
case schema
|
129
|
+
when Hash
|
130
|
+
s = schema[:properties][key] rescue nil
|
131
|
+
schemas << s if s
|
132
|
+
[:allOf, :anyOf, :oneOf].each { |k| find_schemas_for_attribute(key, schema[k], schemas) }
|
133
|
+
when Array
|
134
|
+
schema.each { |s| find_schemas_for_attribute(key, s, schemas) }
|
135
|
+
else
|
136
|
+
end
|
137
|
+
|
138
|
+
|
139
|
+
schemas
|
140
|
+
end
|
141
|
+
|
142
|
+
|
143
|
+
def method_missing(method)
|
144
|
+
attributes[method.to_sym]
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
end
|