dryv 0.1.2

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: 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: []