dryv 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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: ea6a92361c037ae3ac99890821dff8c97717587d094902fc483403863ffed6b0
4
+ data.tar.gz: 6fa2b06a1645d5f0524cdfe1b021b9abb2575efe171aff856811f507eb21de99
5
+ SHA512:
6
+ metadata.gz: a441b2662f82f084944d7d48c303576cfffc635c03c9efbb1958a55005bb50236db4efac226b0ebaa70bba1e5920cb97d3980927306f8fa37a57431d6da4fbf4
7
+ data.tar.gz: bfc3265f5003bc27c2eccadd668f72a3c85593cb2f1f9e21dbf0230f177ec30b3ebcdcf7aa4c0f01fadfb162bd69b3ab4f5bd5f989224192e89a1f0b3991a269
@@ -0,0 +1,10 @@
1
+ /.idea/
2
+ /.bundle/
3
+ /.yardoc
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.gem
@@ -0,0 +1,50 @@
1
+ Style/AsciiComments:
2
+ Description: 'Use only ascii symbols in comments.'
3
+ StyleGuide: '#english-comments'
4
+ Enabled: false
5
+ Style/FrozenStringLiteralComment:
6
+ Enabled: false
7
+ Style/CommentedKeyword:
8
+ Enabled: false
9
+ Style/SymbolArray:
10
+ Enabled: false
11
+ Metrics/LineLength:
12
+ Max: 120
13
+ Enabled: false
14
+ Metrics/MethodLength:
15
+ Enabled: false
16
+ Metrics/ModuleLength:
17
+ Enabled: false
18
+ Metrics/ParameterLists:
19
+ Max: 3
20
+ CountKeywordArgs: true
21
+ Layout/LeadingCommentSpace:
22
+ Enabled: false
23
+ Layout/SpaceBeforeComment:
24
+ Enabled: false
25
+ Layout/ExtraSpacing:
26
+ Enabled: false
27
+ Layout/CaseIndentation:
28
+ Enabled: false
29
+ Layout/SpaceAroundOperators:
30
+ Enabled: false
31
+ Style/FormatString:
32
+ Enabled: false
33
+ Style/FormatStringToken:
34
+ Enabled: false
35
+ Layout/AlignParameters:
36
+ Enabled: false
37
+ Metrics/BlockNesting:
38
+ Enabled: false
39
+ Layout/TrailingWhitespace:
40
+ Enabled: false
41
+ Metrics/AbcSize:
42
+ Enabled: false
43
+ Style/Documentation:
44
+ Enabled: false
45
+ Layout/AlignHash:
46
+ Enabled: false
47
+ Metrics/ClassLength:
48
+ Enabled: false
49
+ Lint/Syntax:
50
+ Enabled: false
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in dryv.gemspec
6
+ gemspec
@@ -0,0 +1,20 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ dryv (0.1.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ rake (13.0.1)
10
+
11
+ PLATFORMS
12
+ ruby
13
+
14
+ DEPENDENCIES
15
+ bundler
16
+ dryv!
17
+ rake
18
+
19
+ BUNDLED WITH
20
+ 2.1.4
File without changes
@@ -0,0 +1,26 @@
1
+ lib = File.expand_path("../lib", __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "dryv/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "dryv"
7
+ spec.version = Dryv::VERSION
8
+ spec.authors = ["C80609A"]
9
+ spec.email = ["c080609a@gmail.com"]
10
+
11
+ spec.summary = %q{JSON Schema Validator}
12
+ spec.homepage = "http://google.com"
13
+ spec.license = 'MIT'
14
+
15
+ # Specify which files should be added to the gem when it is released.
16
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
17
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
18
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
19
+ end
20
+ spec.bindir = "exe"
21
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
+ spec.require_paths = ["lib"]
23
+
24
+ spec.add_development_dependency "bundler"
25
+ spec.add_development_dependency "rake"
26
+ end
@@ -0,0 +1,33 @@
1
+ # order matters
2
+ puts '1'*1000
3
+ lambda do
4
+ require_relative 'dryv/errors'
5
+ require_relative 'dryv/schema'
6
+ require_relative 'dryv/rule'
7
+
8
+ require_relative 'dryv/rules/binary'
9
+ require_relative 'dryv/rules/composite'
10
+ require_relative 'dryv/rules/between'
11
+ require_relative 'dryv/rules/min_length'
12
+ require_relative 'dryv/rules/greater_than'
13
+ require_relative 'dryv/rules/not_equal'
14
+ require_relative 'dryv/rules/less_than'
15
+ require_relative 'dryv/rules/greater_than_or_equal'
16
+ require_relative 'dryv/rules/collection'
17
+ require_relative 'dryv/rules/length_between'
18
+ require_relative 'dryv/rules/or'
19
+ require_relative 'dryv/rules/and'
20
+ require_relative 'dryv/rules/less_than_or_equal'
21
+ require_relative 'dryv/rules/then'
22
+ require_relative 'dryv/rules/format'
23
+ require_relative 'dryv/rules/present'
24
+ require_relative 'dryv/rules/length_equal'
25
+ require_relative 'dryv/rules/included'
26
+ require_relative 'dryv/rules/equal'
27
+ require_relative 'dryv/rules/max_length'
28
+
29
+ require_relative 'dryv/rules_factory'
30
+ end.call
31
+
32
+ module Dryv
33
+ end
@@ -0,0 +1,77 @@
1
+ module Dryv
2
+ class Errors
3
+
4
+ attr_reader :messages
5
+
6
+ def initialize(messages = {})
7
+ @messages = messages
8
+ end
9
+
10
+
11
+ def add(key, message)
12
+ keys = key.to_s.split('.').map!(&:to_sym)
13
+ old = messages.dig(*keys[0...-1]) rescue {}
14
+ old = {} unless old.is_a?(Hash)
15
+ new = keys[0...-1].inject(messages) { |h, k| h[k] ||= {} rescue h = {}; h[k] = {} }
16
+ new[keys.last] = [] unless new.is_a?(Array)
17
+ new[keys.last] << message
18
+ new.merge!(old)
19
+ end
20
+
21
+
22
+ def merge!(error, parent_key = nil)
23
+ hash_to_dots(error.messages, {}, parent_key).each do |key, messages|
24
+ messages.each { |message| add(key, message) }
25
+ end
26
+ messages
27
+ end
28
+
29
+
30
+ def any?
31
+ messages.any?
32
+ end
33
+
34
+
35
+ def has_key?(key)
36
+ keys = key.to_s.split('.').map!(&:to_sym)
37
+ keys.size == 1 ? messages[keys.first].present? : (messages.dig(*keys[0...-1])[keys.last].present? rescue false)
38
+ end
39
+
40
+
41
+ def first_message
42
+ fetch_messages(messages.values.first).first
43
+ end
44
+
45
+
46
+ def clone
47
+ self.class.new(messages.clone)
48
+ end
49
+
50
+
51
+ private
52
+
53
+
54
+ def hash_to_dots(hash, results = {}, start_key = '')
55
+ hash.each do |key, value|
56
+ key = key.to_s
57
+ key_value = start_key.present? ? sprintf('%s.%s', start_key, key) : key
58
+ if value.is_a?(Hash)
59
+ results.merge!(hash_to_dots(value, results, key_value))
60
+ else
61
+ results[key_value] = value
62
+ end
63
+ end
64
+ results
65
+ end
66
+
67
+
68
+ def fetch_messages(value)
69
+ if value.is_a?(Hash)
70
+ fetch_messages(value.values.first)
71
+ else
72
+ value
73
+ end
74
+ end
75
+
76
+ end
77
+ end
@@ -0,0 +1,69 @@
1
+ module Dryv
2
+ class Rule
3
+
4
+ attr_reader :value, :errors, :args
5
+
6
+ def initialize(value, errors = Dryv::Errors.new, **args)
7
+ @value = value
8
+ @errors = errors
9
+ @args = args.symbolize_keys
10
+ end
11
+
12
+
13
+ def name
14
+ args[:name]
15
+ end
16
+
17
+
18
+ def add_error
19
+ errors.add(key, messages[name.to_s] || 'invalid')
20
+ end
21
+
22
+
23
+ def clone
24
+ self.class.new(value, errors.clone, args)
25
+ end
26
+
27
+
28
+ def and(right)
29
+ Dryv::Rules::And.new(self, errors, args.merge(right: right))
30
+ end
31
+ alias :& :and
32
+
33
+
34
+ def then(right)
35
+ Dryv::Rules::Then.new(self, errors, args.merge(right: right))
36
+ end
37
+ alias :> :then
38
+
39
+
40
+ def or(right)
41
+ Dryv::Rules::Or.new(self, errors, args.merge(right: right))
42
+ end
43
+ alias :| :or
44
+
45
+
46
+ def +(right)
47
+ Dryv::Rules::Collection.new(self, errors, args.merge(right: right))
48
+ end
49
+
50
+
51
+ def valid?
52
+ raise NotImplementedError
53
+ end
54
+
55
+
56
+ private
57
+
58
+
59
+ def messages
60
+ @messages ||= (args[:messages] || {}).deep_stringify_keys
61
+ end
62
+
63
+
64
+ def key
65
+ @key ||= args[:key] || (raise 'Missing required param "key"')
66
+ end
67
+
68
+ end
69
+ end
@@ -0,0 +1,11 @@
1
+ module Dryv
2
+ module Rules
3
+ class And < Dryv::Rules::Composite
4
+
5
+ def valid?
6
+ left.valid? && right.valid? ? true : false
7
+ end
8
+
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,18 @@
1
+ module Dryv
2
+ module Rules
3
+ class Between < Dryv::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
+ 'between'
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,16 @@
1
+ module Dryv
2
+ module Rules
3
+ class Binary < Dryv::Rule
4
+
5
+ def right
6
+ args[:right]
7
+ end
8
+
9
+
10
+ def left
11
+ value
12
+ end
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module Dryv
2
+ module Rules
3
+ class Collection < Dryv::Rules::Binary
4
+
5
+ def valid?
6
+ is_valid = true
7
+ [left, right].each do |rule|
8
+ res = rule.valid?
9
+ is_valid = res unless res
10
+ end
11
+ is_valid
12
+ end
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,19 @@
1
+ module Dryv
2
+ module Rules
3
+ class Composite < Dryv::Rules::Binary
4
+
5
+ private
6
+
7
+
8
+ def lt
9
+ @lt ||= left.clone
10
+ end
11
+
12
+
13
+ def rt
14
+ @rt ||= right.clone
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,18 @@
1
+ module Dryv
2
+ module Rules
3
+ class Equal < Dryv::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 Dryv
2
+ module Rules
3
+ class Format < Dryv::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 Dryv
2
+ module Rules
3
+ class GreaterThan < Dryv::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 Dryv
2
+ module Rules
3
+ class GreaterThanOrEqual < Dryv::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 Dryv
2
+ module Rules
3
+ class Included < Dryv::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 Dryv
2
+ module Rules
3
+ class LengthBetween < Dryv::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 Dryv
2
+ module Rules
3
+ class LengthEqual < Dryv::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 Dryv
2
+ module Rules
3
+ class LessThan < Dryv::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 Dryv
2
+ module Rules
3
+ class LessThanOrEqual < Dryv::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 Dryv
2
+ module Rules
3
+ class MaxLength < Dryv::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 Dryv
2
+ module Rules
3
+ class MinLength < Dryv::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 Dryv
2
+ module Rules
3
+ class NotEqual < Dryv::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 Dryv
2
+ module Rules
3
+ class Or < Dryv::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 Dryv
2
+ module Rules
3
+ class Present < Dryv::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 Dryv
2
+ module Rules
3
+ class Then < Dryv::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 Dryv
2
+ class RulesFactory
3
+
4
+ attr_reader :value, :errors, :args
5
+
6
+ def initialize(value, errors = Dryv::Errors.new, **args)
7
+ @value = value
8
+ @errors = errors
9
+ @args = args.symbolize_keys
10
+ end
11
+
12
+
13
+ def present?
14
+ Dryv::Rules::Present.new(value, errors, args)
15
+ end
16
+
17
+
18
+ def equal?(right)
19
+ Dryv::Rules::Equal.new(value, errors, build_args(right))
20
+ end
21
+ alias :eq? :equal?
22
+
23
+
24
+ def not_equal?(right)
25
+ Dryv::Rules::NotEqual.new(value, errors, build_args(right))
26
+ end
27
+ alias :not_eq? :not_equal?
28
+
29
+
30
+ def greater_than?(right)
31
+ Dryv::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
+ Dryv::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
+ Dryv::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
+ Dryv::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
+ Dryv::Rules::Included.new(value, errors, build_args(right))
56
+ end
57
+
58
+
59
+ def length_equal?(right)
60
+ Dryv::Rules::LengthEqual.new(value, errors, build_args(right))
61
+ end
62
+
63
+
64
+ def min_length?(right)
65
+ Dryv::Rules::MinLength.new(value, errors, build_args(right))
66
+ end
67
+
68
+
69
+ def max_length?(right)
70
+ Dryv::Rules::MaxLength.new(value, errors, build_args(right))
71
+ end
72
+
73
+
74
+ def between?(right)
75
+ Dryv::Rules::Between.new(value, errors, build_args(right))
76
+ end
77
+
78
+
79
+ def length_between?(right)
80
+ Dryv::Rules::LengthBetween.new(value, errors, build_args(right))
81
+ end
82
+
83
+
84
+ def format?(right)
85
+ Dryv::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,149 @@
1
+ puts '1'*1000
2
+ module Dryv
3
+ module Schema
4
+
5
+ attr_reader :attributes, :errors
6
+
7
+ def initialize(params)
8
+ @errors = Dryv::Errors.new
9
+ @attributes = cast({ wrap: params }.deep_symbolize_keys[:wrap], schema)
10
+ JSON::Validator.validate!(schema, attributes)
11
+ end
12
+
13
+
14
+ def [](key)
15
+ attributes[key.to_sym]
16
+ end
17
+
18
+
19
+ def valid?
20
+ validate_attributes(attributes, schema)
21
+ validate_additional
22
+ !errors.any?
23
+ end
24
+
25
+
26
+ def schema
27
+ raise NotImplemented
28
+ end
29
+
30
+
31
+ private
32
+
33
+
34
+ def validate_additional
35
+ end
36
+
37
+
38
+ def validate_attributes(props, schema, parents = [], key = nil)
39
+ case props
40
+ when Dryv::Schema
41
+ errors.merge!(props.errors, (parents + [key]).compact.join('.')) unless props.valid?
42
+ else
43
+ [schema[:rule]].flatten.compact.each do |rule|
44
+ rule = rule.arity == 0 ? rule(key, parents, &rule) : rule.call(parents)
45
+ rule.valid? if rule
46
+ end
47
+ end
48
+
49
+ if schema[:properties]
50
+ (schema[:properties] || {}).each do |_key, data|
51
+ validate_attributes((props.present? ? props : {})[_key.to_sym], data, (parents + [key]).compact, _key)
52
+ end
53
+ elsif schema[:items]
54
+ (props.present? ? props : []).each_with_index do |e, i|
55
+ validate_attributes(e, schema[:items], (parents + [key]).compact, i)
56
+ end
57
+ end
58
+
59
+ if schema[:oneOf] || schema[:allOf] || schema[:anyOf]
60
+ [:oneOf, :allOf, :anyOf].each do |k|
61
+ s = schema[k]
62
+ case s
63
+ when Hash
64
+ validate_attributes(props, s, parents, key)
65
+ when Array
66
+ s.each { |_s| validate_attributes(props, _s, parents, key) if _s.is_a?(Hash) }
67
+ else
68
+ end
69
+ end
70
+ end
71
+ end
72
+
73
+
74
+ def cast(params, schema)
75
+ props = schema.is_a?(Hash) && schema[:cast] ? schema[:cast].call(params) : params
76
+
77
+ case props
78
+ when Hash
79
+ props.each_with_object({}) do |(key, value), result|
80
+ result[key] = find_schemas_for_attribute(key, schema).inject((value.dup rescue value)) do
81
+ |_value, _schema| _value = cast(_value, _schema); _value
82
+ end
83
+ end
84
+ when Array
85
+ props.map { |e| cast(e, (schema[:items] rescue nil)) }
86
+ else
87
+ props
88
+ end
89
+ end
90
+
91
+
92
+ def rule(attrs, parents, messages = {}, name = nil, &block)
93
+ if block.arity == 0
94
+ _attrs = [attrs].flatten.compact
95
+ raise 'Invalid rule' if _attrs.size > 1
96
+ single_rule(parents + _attrs, messages, &block)
97
+ else
98
+ multi_rule(attrs, parents, messages, name, &block)
99
+ end
100
+ end
101
+
102
+
103
+ def single_rule(keys, messages = {}, &block)
104
+ value = attributes.dig(*keys) rescue nil
105
+ factory = Dryv::RulesFactory.new(value, errors, key: keys.join('.'), messages: messages)
106
+ factory.instance_exec &block
107
+ end
108
+
109
+
110
+ def multi_rule(keys, parents, messages = {}, name = nil, &block)
111
+ _keys = [keys].flatten.compact
112
+ data = parents.present? ? attributes.dig(*parents) : attributes
113
+
114
+ data = _keys.inject({}) do |res, key|
115
+ res[key.to_sym] = data[key.to_sym] rescue nil; res
116
+ end
117
+
118
+ factories = data.map do |key, value|
119
+ _key = name || key
120
+ _key = (parents + [_key]).join('.')
121
+ Dryv::RulesFactory.new(value, errors, key: _key, messages: messages)
122
+ end
123
+
124
+ block.call *factories
125
+ end
126
+
127
+
128
+ def find_schemas_for_attribute(key, schema, schemas = [])
129
+ case schema
130
+ when Hash
131
+ s = schema[:properties][key] rescue nil
132
+ schemas << s if s
133
+ [:allOf, :anyOf, :oneOf].each { |k| find_schemas_for_attribute(key, schema[k], schemas) }
134
+ when Array
135
+ schema.each { |s| find_schemas_for_attribute(key, s, schemas) }
136
+ else
137
+ end
138
+
139
+
140
+ schemas
141
+ end
142
+
143
+
144
+ def method_missing(method)
145
+ attributes[method.to_sym]
146
+ end
147
+
148
+ end
149
+ end
@@ -0,0 +1,3 @@
1
+ module Dryv
2
+ VERSION = "0.1.0"
3
+ end
metadata ADDED
@@ -0,0 +1,103 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dryv
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - C80609A
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-07-25 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: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description:
42
+ email:
43
+ - c080609a@gmail.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - ".gitignore"
49
+ - ".rubocop.yml"
50
+ - Gemfile
51
+ - Gemfile.lock
52
+ - README.md
53
+ - dryv.gemspec
54
+ - lib/dryv.rb
55
+ - lib/dryv/errors.rb
56
+ - lib/dryv/rule.rb
57
+ - lib/dryv/rules/and.rb
58
+ - lib/dryv/rules/between.rb
59
+ - lib/dryv/rules/binary.rb
60
+ - lib/dryv/rules/collection.rb
61
+ - lib/dryv/rules/composite.rb
62
+ - lib/dryv/rules/equal.rb
63
+ - lib/dryv/rules/format.rb
64
+ - lib/dryv/rules/greater_than.rb
65
+ - lib/dryv/rules/greater_than_or_equal.rb
66
+ - lib/dryv/rules/included.rb
67
+ - lib/dryv/rules/length_between.rb
68
+ - lib/dryv/rules/length_equal.rb
69
+ - lib/dryv/rules/less_than.rb
70
+ - lib/dryv/rules/less_than_or_equal.rb
71
+ - lib/dryv/rules/max_length.rb
72
+ - lib/dryv/rules/min_length.rb
73
+ - lib/dryv/rules/not_equal.rb
74
+ - lib/dryv/rules/or.rb
75
+ - lib/dryv/rules/present.rb
76
+ - lib/dryv/rules/then.rb
77
+ - lib/dryv/rules_factory.rb
78
+ - lib/dryv/schema.rb
79
+ - lib/dryv/version.rb
80
+ homepage: http://google.com
81
+ licenses:
82
+ - MIT
83
+ metadata: {}
84
+ post_install_message:
85
+ rdoc_options: []
86
+ require_paths:
87
+ - lib
88
+ required_ruby_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ requirements: []
99
+ rubygems_version: 3.0.8
100
+ signing_key:
101
+ specification_version: 4
102
+ summary: JSON Schema Validator
103
+ test_files: []