dryv 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []