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.
Files changed (48) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.rubocop.yml +50 -0
  4. data/.ruby-version +1 -0
  5. data/Gemfile +6 -0
  6. data/Gemfile.lock +20 -0
  7. data/README.md +11 -0
  8. data/bin/console +14 -0
  9. data/bin/rails +13 -0
  10. data/bin/setup +8 -0
  11. data/config/initializers/core_ext/string.rb +62 -0
  12. data/lib/dry/errors.rb +77 -0
  13. data/lib/dry/rule.rb +69 -0
  14. data/lib/dry/rules/and.rb +11 -0
  15. data/lib/dry/rules/between.rb +18 -0
  16. data/lib/dry/rules/binary.rb +16 -0
  17. data/lib/dry/rules/collection.rb +16 -0
  18. data/lib/dry/rules/composite.rb +19 -0
  19. data/lib/dry/rules/equal.rb +18 -0
  20. data/lib/dry/rules/format.rb +18 -0
  21. data/lib/dry/rules/greater_than.rb +18 -0
  22. data/lib/dry/rules/greater_than_or_equal.rb +18 -0
  23. data/lib/dry/rules/included.rb +18 -0
  24. data/lib/dry/rules/length_between.rb +18 -0
  25. data/lib/dry/rules/length_equal.rb +18 -0
  26. data/lib/dry/rules/less_than.rb +18 -0
  27. data/lib/dry/rules/less_than_or_equal.rb +18 -0
  28. data/lib/dry/rules/max_length.rb +18 -0
  29. data/lib/dry/rules/min_length.rb +18 -0
  30. data/lib/dry/rules/not_equal.rb +18 -0
  31. data/lib/dry/rules/or.rb +13 -0
  32. data/lib/dry/rules/present.rb +21 -0
  33. data/lib/dry/rules/then.rb +13 -0
  34. data/lib/dry/rules_factory.rb +118 -0
  35. data/lib/dry/schema.rb +148 -0
  36. data/lib/mealib.rb +48 -0
  37. data/lib/mealib/abstract_serializer.rb +28 -0
  38. data/lib/mealib/dict.rb +26 -0
  39. data/lib/mealib/engine.rb +5 -0
  40. data/lib/mealib/fucker/name/first_name_ru_man.txt +64 -0
  41. data/lib/mealib/fucker/name/last_name_ru_man.txt +252 -0
  42. data/lib/mealib/fucker/name/name.rb +27 -0
  43. data/lib/mealib/fucker/name/sur_name_ru_man.txt +53 -0
  44. data/lib/mealib/geo/distance.rb +22 -0
  45. data/lib/mealib/token_generator.rb +7 -0
  46. data/lib/mealib/version.rb +3 -0
  47. data/mealib.gemspec +26 -0
  48. metadata +117 -0
@@ -0,0 +1,18 @@
1
+ module Dry
2
+ module Rules
3
+ class Equal < Dry::Rules::Binary
4
+
5
+ def valid?
6
+ return true if left.eql?(right)
7
+ add_error
8
+ false
9
+ end
10
+
11
+
12
+ def name
13
+ 'eq'
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ module Dry
2
+ module Rules
3
+ class Format < Dry::Rules::Binary
4
+
5
+ def valid?
6
+ return true if left.to_s.match(right).present?
7
+ add_error
8
+ false
9
+ end
10
+
11
+
12
+ def name
13
+ 'format'
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ module Dry
2
+ module Rules
3
+ class GreaterThan < Dry::Rules::Binary
4
+
5
+ def valid?
6
+ return true if left > right
7
+ add_error
8
+ false
9
+ end
10
+
11
+
12
+ def name
13
+ 'gt'
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ module Dry
2
+ module Rules
3
+ class GreaterThanOrEqual < Dry::Rules::Binary
4
+
5
+ def valid?
6
+ return true if left >= right
7
+ add_error
8
+ false
9
+ end
10
+
11
+
12
+ def name
13
+ 'gt_eq'
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ module Dry
2
+ module Rules
3
+ class Included < Dry::Rules::Binary
4
+
5
+ def valid?
6
+ return true if right.include?(left)
7
+ add_error
8
+ false
9
+ end
10
+
11
+
12
+ def name
13
+ 'included'
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ module Dry
2
+ module Rules
3
+ class LengthBetween < Dry::Rules::Binary
4
+
5
+ def valid?
6
+ return true if right.include? left.size
7
+ add_error
8
+ false
9
+ end
10
+
11
+
12
+ def name
13
+ 'length_between'
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ module Dry
2
+ module Rules
3
+ class LengthEqual < Dry::Rules::Binary
4
+
5
+ def valid?
6
+ return true if left.size == right
7
+ add_error
8
+ false
9
+ end
10
+
11
+
12
+ def name
13
+ 'length_equal'
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ module Dry
2
+ module Rules
3
+ class LessThan < Dry::Rules::Binary
4
+
5
+ def valid?
6
+ return true if left < right
7
+ add_error
8
+ false
9
+ end
10
+
11
+
12
+ def name
13
+ 'lt'
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ module Dry
2
+ module Rules
3
+ class LessThanOrEqual < Dry::Rules::Binary
4
+
5
+ def valid?
6
+ return true if left <= right
7
+ add_error
8
+ false
9
+ end
10
+
11
+
12
+ def name
13
+ 'lt_eq'
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ module Dry
2
+ module Rules
3
+ class MaxLength < Dry::Rules::Binary
4
+
5
+ def valid?
6
+ return true if left.size <= right
7
+ add_error
8
+ false
9
+ end
10
+
11
+
12
+ def name
13
+ 'max_length'
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ module Dry
2
+ module Rules
3
+ class MinLength < Dry::Rules::Binary
4
+
5
+ def valid?
6
+ return true if left.size >= right
7
+ add_error
8
+ false
9
+ end
10
+
11
+
12
+ def name
13
+ 'min_length'
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ module Dry
2
+ module Rules
3
+ class NotEqual < Dry::Rules::Binary
4
+
5
+ def valid?
6
+ return true unless left.eql?(right)
7
+ add_error
8
+ false
9
+ end
10
+
11
+
12
+ def name
13
+ 'not_eq'
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,13 @@
1
+ module Dry
2
+ module Rules
3
+ class Or < Dry::Rules::Composite
4
+
5
+ def valid?
6
+ return true if lt.valid? || rt.valid?
7
+ [lt.errors, rt.errors].each { |e| errors.merge!(e) if e.any? }
8
+ false
9
+ end
10
+
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,21 @@
1
+ module Dry
2
+ module Rules
3
+ class Present < Dry::Rule
4
+
5
+ def valid?
6
+ return true if value.present?
7
+ add_error
8
+ false
9
+ end
10
+
11
+
12
+ private
13
+
14
+
15
+ def name
16
+ 'present'
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,13 @@
1
+ module Dry
2
+ module Rules
3
+ class Then < Dry::Rules::Composite
4
+
5
+ def valid?
6
+ return true if (!lt.valid? || rt.valid?)
7
+ errors.merge!(rt.errors)
8
+ false
9
+ end
10
+
11
+ end
12
+ end
13
+ end
@@ -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
@@ -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