dryv 0.1.2

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: 0b47e2133a21617abd5a55c2a24f1dea6db1e3a11dd359dde2a4785b58d05d03
4
+ data.tar.gz: 213b03940da088ec0113b7828beb8e002d5c03c136746700a107c33c630499cd
5
+ SHA512:
6
+ metadata.gz: ad70c98a5fc9a17b63522bbdbfa842eba8216eb83e35496f9ed49ccba54d19f47ddc889a3a392d95caf1052d9ee819613913273f309a9ed257e9fa7f767a6d53
7
+ data.tar.gz: c224eb1ea60b68a68be888c16a8e51cc2d951aeaea5fcb1aee054002e175a1647eebd99c404e804803b11faf2e4b7a5f1116f3afff929e43c5d3c9958ed3f639
@@ -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,26 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ dryv (0.1.1)
5
+ json-schema
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ addressable (2.7.0)
11
+ public_suffix (>= 2.0.2, < 5.0)
12
+ json-schema (2.8.1)
13
+ addressable (>= 2.4)
14
+ public_suffix (4.0.5)
15
+ rake (13.0.1)
16
+
17
+ PLATFORMS
18
+ ruby
19
+
20
+ DEPENDENCIES
21
+ bundler
22
+ dryv!
23
+ rake
24
+
25
+ BUNDLED WITH
26
+ 2.1.4
File without changes
@@ -0,0 +1,27 @@
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
+ spec.add_dependency 'json-schema'
27
+ end
@@ -0,0 +1,33 @@
1
+ # order matters
2
+
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,148 @@
1
+ module Dryv
2
+ module Schema
3
+
4
+ attr_reader :attributes, :errors
5
+
6
+ def initialize(params)
7
+ @errors = Dryv::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 Dryv::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 = Dryv::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
+ Dryv::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
@@ -0,0 +1,3 @@
1
+ module Dryv
2
+ VERSION = "0.1.2"
3
+ end
metadata ADDED
@@ -0,0 +1,117 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dryv
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
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
+ - !ruby/object:Gem::Dependency
42
+ name: json-schema
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description:
56
+ email:
57
+ - c080609a@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".gitignore"
63
+ - ".rubocop.yml"
64
+ - Gemfile
65
+ - Gemfile.lock
66
+ - README.md
67
+ - dryv.gemspec
68
+ - lib/dryv.rb
69
+ - lib/dryv/errors.rb
70
+ - lib/dryv/rule.rb
71
+ - lib/dryv/rules/and.rb
72
+ - lib/dryv/rules/between.rb
73
+ - lib/dryv/rules/binary.rb
74
+ - lib/dryv/rules/collection.rb
75
+ - lib/dryv/rules/composite.rb
76
+ - lib/dryv/rules/equal.rb
77
+ - lib/dryv/rules/format.rb
78
+ - lib/dryv/rules/greater_than.rb
79
+ - lib/dryv/rules/greater_than_or_equal.rb
80
+ - lib/dryv/rules/included.rb
81
+ - lib/dryv/rules/length_between.rb
82
+ - lib/dryv/rules/length_equal.rb
83
+ - lib/dryv/rules/less_than.rb
84
+ - lib/dryv/rules/less_than_or_equal.rb
85
+ - lib/dryv/rules/max_length.rb
86
+ - lib/dryv/rules/min_length.rb
87
+ - lib/dryv/rules/not_equal.rb
88
+ - lib/dryv/rules/or.rb
89
+ - lib/dryv/rules/present.rb
90
+ - lib/dryv/rules/then.rb
91
+ - lib/dryv/rules_factory.rb
92
+ - lib/dryv/schema.rb
93
+ - lib/dryv/version.rb
94
+ homepage: http://google.com
95
+ licenses:
96
+ - MIT
97
+ metadata: {}
98
+ post_install_message:
99
+ rdoc_options: []
100
+ require_paths:
101
+ - lib
102
+ required_ruby_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ required_rubygems_version: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ requirements: []
113
+ rubygems_version: 3.0.8
114
+ signing_key:
115
+ specification_version: 4
116
+ summary: JSON Schema Validator
117
+ test_files: []