easy_json_matcher 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/lib/easy_json_matcher/array_content_validator.rb +22 -0
  3. data/lib/easy_json_matcher/array_generator.rb +41 -0
  4. data/lib/easy_json_matcher/array_validator.rb +11 -76
  5. data/lib/easy_json_matcher/attribute_generator.rb +37 -0
  6. data/lib/easy_json_matcher/attribute_type_methods.rb +29 -0
  7. data/lib/easy_json_matcher/coercion_error.rb +10 -0
  8. data/lib/easy_json_matcher/content_wrapper.rb +2 -4
  9. data/lib/easy_json_matcher/{validation_error.rb → easy_json_matcher_error.rb} +2 -1
  10. data/lib/easy_json_matcher/json_coercer.rb +34 -0
  11. data/lib/easy_json_matcher/node.rb +10 -114
  12. data/lib/easy_json_matcher/node_generator.rb +58 -0
  13. data/lib/easy_json_matcher/schema_generator.rb +47 -71
  14. data/lib/easy_json_matcher/schema_library.rb +8 -11
  15. data/lib/easy_json_matcher/unknown_validation_step_error.rb +10 -0
  16. data/lib/easy_json_matcher/validation_chain_factory.rb +48 -0
  17. data/lib/easy_json_matcher/validation_rules.rb +59 -0
  18. data/lib/easy_json_matcher/validation_step.rb +36 -0
  19. data/lib/easy_json_matcher/validator.rb +12 -87
  20. data/lib/easy_json_matcher/validator_set.rb +31 -0
  21. data/lib/easy_json_matcher/version.rb +1 -1
  22. data/lib/easy_json_matcher.rb +6 -2
  23. data/lib/easy_json_matcher.rb~ +5 -0
  24. data/test/array_content_validator_test.rb +17 -0
  25. data/test/custom_validations_test.rb +17 -17
  26. data/test/global_validation_options_test.rb +39 -44
  27. data/test/json_coercer_test.rb +25 -0
  28. data/test/managing_schemas_test.rb +53 -52
  29. data/test/node_test.rb +28 -0
  30. data/test/primitives_boolean_test.rb +27 -0
  31. data/test/primitives_date_test.rb +28 -0
  32. data/test/primitives_number_test.rb +27 -0
  33. data/test/primitives_object_test.rb +27 -0
  34. data/test/primitives_string_test.rb +27 -0
  35. data/test/primtives_value_test.rb +23 -0
  36. data/test/required_validation_test.rb +7 -7
  37. data/test/schema_generator_test.rb +23 -0
  38. data/test/strict_mode_test.rb +25 -54
  39. data/test/test_helper.rb +8 -6
  40. data/test/validating_arrays_test.rb +40 -132
  41. data/test/validation_chain_factory_test.rb +45 -0
  42. data/test/validation_chain_test_helper.rb +13 -0
  43. data/test/validation_step_array_test.rb +27 -0
  44. data/test/validation_step_boolean_test.rb +19 -0
  45. data/test/validation_step_date_test.rb +20 -0
  46. data/test/validation_step_not_required_test.rb +35 -0
  47. data/test/validation_step_number_test.rb +23 -0
  48. data/test/validation_step_object_test.rb +20 -0
  49. data/test/validation_step_required_test.rb +19 -0
  50. data/test/validation_step_string_test.rb +20 -0
  51. data/test/validation_step_test.rb +55 -0
  52. data/test/validation_step_value_test.rb +15 -0
  53. data/test/validator_set_test.rb +49 -0
  54. data/test/validator_test.rb +44 -0
  55. metadata +64 -26
  56. data/lib/easy_json_matcher/boolean_validator.rb +0 -14
  57. data/lib/easy_json_matcher/date_validator.rb +0 -44
  58. data/lib/easy_json_matcher/node.rb~ +0 -121
  59. data/lib/easy_json_matcher/number_validator.rb +0 -22
  60. data/lib/easy_json_matcher/object_validator.rb +0 -12
  61. data/lib/easy_json_matcher/schema_generator.rb~ +0 -104
  62. data/lib/easy_json_matcher/string_validator.rb +0 -16
  63. data/lib/easy_json_matcher/validator.rb~ +0 -99
  64. data/lib/easy_json_matcher/validator_factory.rb +0 -76
  65. data/lib/easy_json_matcher/value_validator.rb +0 -10
  66. data/lib/easy_json_matcher/version.rb~ +0 -3
  67. data/test/custom_validations_test.rb~ +0 -25
  68. data/test/easy_json_matcher_test.rb +0 -262
  69. data/test/easy_json_matcher_test.rb~ +0 -262
  70. data/test/error_messages_test.rb +0 -148
  71. data/test/reset_test.rb +0 -32
  72. data/test/reset_test.rb~ +0 -32
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 29eb515cf0aae680f37f2c881b061c8d56fa5cc0
4
- data.tar.gz: 5f617e24d4270c30f26e6bed85692402adad047e
3
+ metadata.gz: 55ae99f6f7c4b6ccee8c50a57555d58a5a4bd2b2
4
+ data.tar.gz: 713dc82d9dce7912117f6a59b419c3cfeff92441
5
5
  SHA512:
6
- metadata.gz: 317e11578a3bd7420e88fa30ab294941a6d644a2303ecd2412cb2650973ed466ea565357455052bd0323acf4a1b30b4b9b63d89ce6b5266cb2205b09aadd6551
7
- data.tar.gz: 5e12a27e3f4f436afec4951e26e8136df61662859a3b240c617b7c70d2d7aa891072724a976b1c6383334245446c654762b50da35652b88053feafb9c6b41ba9
6
+ metadata.gz: 012365ce1754864733914fcfcf7dd341d168168977e341014fd8804a7426a3c7e9bf005708e1c6f8e50d1c96a39dc82e048e303a0b30bfe98d445e0d718a270b
7
+ data.tar.gz: 51ecd2c9ca6f601ab1894da188fb1feecce8fb32a2d4ecd55c0001b2399b8c97a37a2a9c9cd3642630c732b283f8af8087faefa237f352ab65c90173dcae4a9c
@@ -0,0 +1,22 @@
1
+ module EasyJSONMatcher
2
+ class ArrayContentValidator
3
+
4
+ attr_reader :next_step, :verifier
5
+
6
+ def initialize(verify_with:)
7
+ @verifier = verify_with
8
+ end
9
+
10
+ def check(value:)
11
+ errors = []
12
+ value.each do |val|
13
+ errors += verifier.check(value: val)
14
+ end
15
+ errors
16
+ end
17
+
18
+ def >> (step)
19
+ @next_step = step
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,41 @@
1
+ module EasyJSONMatcher
2
+ class ArrayGenerator
3
+
4
+ WHITELIST = [:required, :not_required]
5
+
6
+ attr_reader :opts, :content_opts, :target_class
7
+
8
+ def initialize(local_opts:, global_opts:, target_class: ArrayValidator)
9
+ @target_class = target_class
10
+ @opts = extract_opts(locals: local_opts, globals: global_opts)
11
+ @content_opts = []
12
+ end
13
+
14
+ def generate_array
15
+ target_class.new(opts: opts, verify_content_as: content_opts)
16
+ end
17
+
18
+ def elements_should(be:)
19
+ @content_opts = be
20
+ end
21
+
22
+ def extract_opts(locals:, globals:)
23
+ (globals.select(&array_options_filter) + locals).map(&override_local_values(locals: locals))
24
+ end
25
+
26
+ def array_options_filter
27
+ ->(opt) { WHITELIST.include?(opt) }
28
+ end
29
+
30
+ def override_local_values(locals:)
31
+ conflicts = { required: :not_required }
32
+ ->(opt) {
33
+ if conflicts.keys.include? opt
34
+ locals.include?(conflicts[opt]) ? conflicts[opt] : opt
35
+ else
36
+ opt
37
+ end
38
+ }
39
+ end
40
+ end
41
+ end
@@ -1,84 +1,19 @@
1
- require 'easy_json_matcher/validator'
2
- module EasyJSONMatcher
3
- class ArrayValidator < Validator
4
- attr_reader :validators, :validator_results
5
- ######################### Methods for requiring values by type #################
6
-
7
- def should_only_contain_strings(opts: {})
8
- should_only_contain type: :string, opts: opts
9
- end
10
-
11
- def should_only_contain_objects(opts: {})
12
- should_only_contain type: :object, opts: opts
13
- end
14
-
15
- def should_only_contain_values(opts: {})
16
- should_only_contain type: :value, opts: opts
17
- end
18
-
19
- def should_only_contain_numbers(opts: {})
20
- should_only_contain type: :number, opts: opts
21
- end
22
-
23
- def should_only_contain_booleans(opts: {})
24
- should_only_contain type: :boolean, opts: opts
25
- end
26
-
27
- def should_only_contain_dates(opts: {})
28
- should_only_contain type: :date, opts: opts
29
- end
30
-
31
- def should_only_contain_schema(name:, opts: {})
32
- should_only_contain type: :schema, opts: opts.merge({name: name})
33
- end
1
+ require "easy_json_matcher/validator"
2
+ require "easy_json_matcher/array_content_validator"
34
3
 
35
- def should_only_contain(type:,opts: {})
36
- _clear_validators
37
- _add_validator(_create_validator(type: type, opts: opts))
38
- end
39
-
40
- ######################## Private methods #######################################
41
-
42
- def _validate
43
- errors << "#{content} is not an Array" unless _content_is_array?
44
- _validate_content
45
- end
46
-
47
- def _content_is_array?
48
- content.is_a? Array
49
- end
50
-
51
- def _validate_content
52
- validators.each do |val|
53
- _accumulate_errors val
54
- end
55
- end
56
-
57
- def _clear_validators
58
- validators.clear
59
- end
60
-
61
- def _add_validator(validator)
62
- validators << validator
63
- end
64
-
65
- def validators
66
- @validators ||= []
67
- end
4
+ module EasyJSONMatcher
5
+ class ArrayValidator
68
6
 
69
- def _accumulate_errors(validator)
70
- content.each do |candidate|
71
- _run_validator(validator, candidate)
72
- end
73
- errors << validator.errors unless validator._no_errors?
74
- end
7
+ attr_reader :verifier
75
8
 
76
- def _run_validator(validator, candidate)
77
- validator.valid? candidate
9
+ def initialize(opts: [], verify_content_as:, container: ArrayContentValidator, factory: ValidationChainFactory)
10
+ chain = factory.get_chain(steps: verify_content_as)
11
+ @verifier = factory.get_chain(steps: opts + [:array])
12
+ @verifier.concat(container.new(verify_with: chain))
78
13
  end
79
14
 
80
- def _validation_result
81
- !validator_results.include? false
15
+ def check(value:, errors: [])
16
+ verifier.check(value: value)
82
17
  end
83
18
  end
84
19
  end
@@ -0,0 +1,37 @@
1
+ module EasyJSONMatcher
2
+ class AttributeGenerator
3
+
4
+ attr_reader :opts, :factory
5
+
6
+ def initialize(attribute_factory: ValidationChainFactory, local_opts:, global_opts:)
7
+ @factory = attribute_factory
8
+ @opts = extract_opts(locals: local_opts, globals: global_opts)
9
+ end
10
+
11
+ def generate_attribute
12
+ factory.get_chain(steps: opts)
13
+ end
14
+
15
+ def extract_opts(locals:, globals:)
16
+ (globals.reject(&non_attribute_options_filter) + locals).map(&override_local_values(locals: locals))
17
+ end
18
+
19
+ #TODO this method should whitelist the options, and the options should be in a constant
20
+ # Remember to change extract_ops so that it uses globals.select afterwards
21
+ def non_attribute_options_filter
22
+ non_attribute_options = [:strict]
23
+ ->(opt) { non_attribute_options.include? opt }
24
+ end
25
+
26
+ def override_local_values(locals:)
27
+ conflicts = { required: :not_required }
28
+ ->(opt) {
29
+ if conflicts.keys.include? opt
30
+ locals.include?(conflicts[opt]) ? conflicts[opt] : opt
31
+ else
32
+ opt
33
+ end
34
+ }
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,29 @@
1
+ module AttributeTypeMethods
2
+
3
+
4
+
5
+ def has_boolean(key:, opts: [])
6
+ has_attribute(key: key, opts: opts + [:boolean])
7
+ end
8
+
9
+ def has_number(key: , opts: [])
10
+ has_attribute(key: key, opts: opts + [:number] )
11
+ end
12
+
13
+ def has_date(key:, opts: [])
14
+ has_attribute(key: key, opts: opts + [:date])
15
+ end
16
+
17
+ def has_object(key:, opts: [])
18
+ has_attribute(key: key, opts: opts + [:object])
19
+ end
20
+
21
+ def has_value(key:, opts: [])
22
+ has_attribute(key: key, opts: opts + [:value])
23
+ end
24
+
25
+ def has_string(key:, opts: [])
26
+ has_attribute(key: key, opts: opts + [:string])
27
+ end
28
+
29
+ end
@@ -0,0 +1,10 @@
1
+ require "easy_json_matcher/easy_json_matcher_error"
2
+
3
+ module EasyJSONMatcher
4
+ class CoercionError < EasyJSONMatcherError
5
+
6
+ def initialize(invalid_string:)
7
+ super "#{invalid_string} is not a valid json string"
8
+ end
9
+ end
10
+ end
@@ -1,14 +1,12 @@
1
1
  module EasyJSONMatcher
2
2
  module ContentWrapper
3
3
 
4
+ attr_reader :content
5
+
4
6
  def [](key)
5
7
  content[key.to_s]
6
8
  end
7
9
 
8
- def method_missing(method, *args, &block)
9
- content.send(method, *args, &block)
10
- end
11
-
12
10
  def keys
13
11
  content.keys.map(&:to_sym)
14
12
  end
@@ -1,5 +1,6 @@
1
+
1
2
  module EasyJSONMatcher
2
- class ValidationError < Error
3
+ class EasyJSONMatcherError < RuntimeError
3
4
 
4
5
  def initialize(error_details)
5
6
  super(error_details)
@@ -0,0 +1,34 @@
1
+ require "json"
2
+ require "easy_json_matcher/coercion_error"
3
+
4
+ module EasyJSONMatcher
5
+ class JsonCoercer
6
+
7
+ def coerce(json:)
8
+ begin
9
+ coerced = JSON.parse(json)
10
+ symbolize_keys(hash: coerced)
11
+ rescue JSON::ParserError, TypeError
12
+ raise CoercionError.new invalid_string: json
13
+ end
14
+ end
15
+
16
+ def symbolize_keys(hash:)
17
+ hash.keys.each do |key|
18
+ value = hash.delete(key)
19
+ convert_value(value)
20
+ hash[key.to_sym] = value
21
+ end
22
+ hash
23
+ end
24
+
25
+ def convert_value(value)
26
+ case value
27
+ when Hash
28
+ symbolize_keys(hash: value) if value.is_a? Hash
29
+ when Array
30
+ value.select {|val| val.is_a? Hash}.each {|h| symbolize_keys(hash: h) }
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,122 +1,18 @@
1
- require 'easy_json_matcher/validator_factory'
2
- require 'json'
3
- require 'easy_json_matcher/content_wrapper'
4
- module EasyJSONMatcher
5
- class Node < Validator
6
- include ContentWrapper
7
-
8
- attr_reader :validators, :validity, :strict
9
-
10
- def initialize(opts: {})
11
- super(options: opts)
12
- @validators = []
13
- @validity = true
14
- end
15
-
16
- def add_validator(validator)
17
- validators << validator
18
- end
1
+ require "easy_json_matcher/validation_step"
19
2
 
20
- def _post_initialise(options)
21
- @strict = options[:strict]
22
- end
23
-
24
- def _validate
25
- _validate_strict_keyset
26
- validators.each do |val|
27
- @validity = false unless _use_validator val
28
- end
29
- end
30
-
31
- def reset!
32
- @validity = true
33
- errors.clear
34
- validators.each(&:reset!)
35
- end
36
-
37
- def _validate_strict_keyset
38
- _validate_keyset if strict
39
- end
40
-
41
- def _validate_keyset
42
- unexpected_keys = keys - _expected_keys
43
- errors << "#{unexpected_keys} found in addition to expected keys" unless unexpected_keys.empty?
44
- end
45
-
46
- def _expected_keys
47
- validators.each_with_object([]) do |validator, keyset|
48
- keyset << validator.key
49
- end
50
- end
51
-
52
- def _use_validator(validator)
53
- validator.valid? self
54
- end
55
-
56
- def _get_content_for(key)
57
- content[key]
58
- end
59
-
60
- def _get_validator_for(key)
61
- validators[key]
62
- end
63
-
64
- def _set_content(candidate)
65
- @content = _is_root? ? _prep_root_content(candidate) : candidate[key]
66
- end
67
-
68
- def _is_root?
69
- key.nil?
70
- end
71
-
72
- def get_errors
73
- child_errors = _collect_child_errors
74
- _wrap_errors(child_errors)
75
- end
76
-
77
- def _collect_child_errors
78
- validators.each_with_object({}) do |val, container|
79
- container.merge!(val.get_errors)
80
- end
81
- end
82
-
83
- def _wrap_errors(child_errors)
84
- _add_local_errors_to child_errors
85
- unless _is_root?
86
- _wrap_child_errors(child_errors)
87
- else
88
- _root_errors(child_errors)
89
- end
90
- end
91
-
92
- def _add_local_errors_to(child_errors)
93
- child_errors.merge!({node_errors_: errors}) unless errors.empty?
94
- end
95
-
96
- def _wrap_child_errors(child_errors)
97
- errors_wrapper = {}
98
- errors_wrapper[key] = child_errors
99
- errors_wrapper
100
- end
101
-
102
- def _root_errors(child_errors)
103
- errors.length > 0 ? {root: errors} : child_errors
104
- end
3
+ module EasyJSONMatcher
4
+ class Node
105
5
 
106
- def _prep_root_content(candidate)
107
- candidate.is_a?(String) ? _parse_and_verify_json(candidate) : candidate
108
- end
6
+ attr_reader :node_validator, :validators
109
7
 
110
- def _parse_and_verify_json(json)
111
- begin
112
- JSON.parse(json)
113
- rescue JSON::ParserError
114
- errors << '#{json} is not a valid JSON String'
115
- end
8
+ def initialize(opts: [], strict: false, validators:, content_handler: ValidatorSet, factory: ValidationChainFactory)
9
+ @node_validator = factory.get_chain(steps: opts + [:object])
10
+ @validators = content_handler.new(validators: validators, strict: strict)
11
+ @node_validator.concat(@validators)
116
12
  end
117
13
 
118
- def _no_errors?
119
- validity && errors.empty?
14
+ def check(value:)
15
+ node_validator.check(value: value)
120
16
  end
121
17
  end
122
18
  end
@@ -0,0 +1,58 @@
1
+ require "easy_json_matcher/validation_chain_factory"
2
+ require "easy_json_matcher/node"
3
+ require "easy_json_matcher/schema_library"
4
+ require "easy_json_matcher/attribute_type_methods"
5
+ require "easy_json_matcher/attribute_generator"
6
+ require "easy_json_matcher/array_generator"
7
+
8
+ module EasyJSONMatcher
9
+ class NodeGenerator
10
+ include AttributeTypeMethods
11
+
12
+ attr_reader :validators, :attribute_opts, :node_opts, :array_opts, :global_opts
13
+
14
+ def initialize(opts: [], global_opts: [])
15
+ @validators = {}
16
+ @node_opts = extract_opts(local: opts, global: global_opts)
17
+ @global_opts = global_opts
18
+ end
19
+
20
+ def generate_node
21
+ strict = node_opts.delete(:strict)
22
+ Node.new(opts: node_opts, strict: strict, validators: validators)
23
+ end
24
+
25
+ def has_attribute(key:, opts:)
26
+ validator = AttributeGenerator.new(local_opts: opts, global_opts: global_opts)
27
+ validators[key] = validator.generate_attribute
28
+ end
29
+
30
+ def contains_node(key:, opts: [])
31
+ generator = self.class.new(opts: opts, global_opts: global_opts)
32
+ yield generator if block_given?
33
+ validators[key] = generator.generate_node
34
+ end
35
+
36
+ def contains_array(key:, opts: [])
37
+ validator = ArrayGenerator.new(local_opts: opts, global_opts: global_opts)
38
+ yield validator if block_given?
39
+ validators[key] = validator.generate_array
40
+ end
41
+
42
+ def has_schema(key:, name:)
43
+ schema = SchemaLibrary.get_schema(name: name)
44
+ validators[key] = schema
45
+ end
46
+
47
+ def extract_opts(local:, global:)
48
+ conflicts = { required: :not_required }
49
+ opts = global.map do |opt|
50
+ if conflicts.keys.include? opt
51
+ local.include?(conflicts[opt]) ? conflicts[opt] : opt
52
+ else
53
+ opt
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -1,104 +1,80 @@
1
- require 'easy_json_matcher/validator_factory'
2
- require 'easy_json_matcher/node'
3
- require 'easy_json_matcher/schema_library'
4
- require 'easy_json_matcher/exceptions'
1
+ require "easy_json_matcher/validation_chain_factory"
2
+ require "easy_json_matcher/node"
3
+ require "easy_json_matcher/schema_library"
4
+ require "easy_json_matcher/validator"
5
+ require "easy_json_matcher/attribute_type_methods"
6
+ require "easy_json_matcher/node_generator"
7
+
5
8
  module EasyJSONMatcher
6
9
  class SchemaGenerator
10
+ include AttributeTypeMethods
7
11
 
8
- attr_reader :node, :name, :options, :glob_opts
12
+ attr_reader :node, :glob_opts, :att_glob_opts
9
13
 
10
- def initialize(opts: {}, global_opts: {})
11
- @name = opts.delete(:key)
12
- @options = opts
14
+ def initialize(opts: [], global_opts: [])
13
15
  @glob_opts = global_opts
14
- yield self if block_given?
16
+ @att_glob_opts = glob_opts.dup
17
+ @att_glob_opts.delete(:strict)
18
+ @node = node_generator(opts: opts, globals: global_opts)
19
+ yield node if block_given?
15
20
  end
16
21
 
17
- def has_attribute(key:, opts: {})
18
- node.add_validator(_create_validator(key, opts))
22
+ def create_node(opts:)
23
+ Node.new(opts: opts)
19
24
  end
20
25
 
21
- ################ Methods for adding specific attribute types ##############
22
-
23
- def contains_node(key:, opts: {})
24
- generator = _node_generator _validator_opts(key, opts)
25
- yield generator if block_given?
26
- node.add_validator generator.generate_schema
26
+ def has_attribute(key:, opts:)
27
+ opts = override_globals(local_opts: opts)
28
+ opts = opts - [:strict]
29
+ validator = ValidationChainFactory.get_chain(steps: opts)
30
+ node.add_validator key: key, validator: validator
27
31
  end
28
32
 
29
- def has_boolean(key:, opts: {})
30
- has_attribute(key: key, opts: opts.merge({type: :boolean}))
33
+ # TODO pretty hacky but can be cleaned later
34
+ def override_globals(local_opts:)
35
+ if local_opts.include?(:not_required) && glob_opts.include?(:required)
36
+ (local_opts + (glob_opts - [:required]))
37
+ else
38
+ local_opts + glob_opts
39
+ end
31
40
  end
32
41
 
33
- def has_number(key: , opts: {})
34
- has_attribute(key: key, opts: opts.merge({type: :number}))
35
- end
36
-
37
- def has_date(key:, opts: {})
38
- has_attribute(key: key, opts: opts.merge({type: :date}))
39
- end
40
-
41
- def has_object(key:, opts: {})
42
- has_attribute(key: key, opts: opts.merge({type: :object}))
43
- end
44
-
45
- def has_value(key:, opts: {})
46
- has_attribute(key: key, opts: opts.merge({type: :value}))
47
- end
42
+ ################ Methods for adding specific attribute types ##############
48
43
 
49
- def has_string(key:, opts: {})
50
- has_attribute(key: key, opts: opts.merge({type: :string}))
44
+ def contains_node(key:, opts: [])
45
+ generator = node_generator(opts: opts)
46
+ yield generator if block_given?
47
+ node.add_validator key: key, validator: generator.node
51
48
  end
52
49
 
53
- def contains_array(key:, opts: {})
54
- opts = opts.merge!({type: :array})
55
- array_validator = _create_validator(key, opts)
50
+ def contains_array(key:, opts: [], with_content:)
51
+ array_validator = ArrayValidator.new opts: opts, verify_content_as: with_content
56
52
  yield array_validator if block_given?
57
- node.add_validator array_validator
53
+ node.add_validator key: key, validator: array_validator
58
54
  end
59
55
 
60
- def has_schema(key:, opts: {})
61
- has_attribute(key: key, opts: opts.merge({type: :schema}))
56
+ def has_schema(key:, name:)
57
+ schema = SchemaLibrary.get_schema(name: name)
58
+ node.add_validator key: key, validator: schema
62
59
  end
63
60
 
64
61
  ################ Methods for generating the schema #########################
65
62
 
63
+ def generate_node
64
+ node.generate_node
65
+ end
66
+
66
67
  def generate_schema
67
- node
68
+ Validator.new validate_with: generate_node
68
69
  end
69
70
 
70
71
  def register(as:)
71
- SchemaLibrary.add_schema(name: as, schema: generate_schema)
72
+ SchemaLibrary.add_schema(name: as, schema: generate_node)
72
73
  generate_schema
73
74
  end
74
75
 
75
- ################## Private methods #########################################
76
-
77
- def _prep_schema_opts(schema_name, opts)
78
- opts[:type] = :schema
79
- opts[:name] = schema_name
80
- opts
81
- end
82
-
83
- def _set_validator_key(validator, key)
84
- validator.key = key
85
- end
86
-
87
- def _validator_opts(key, opts)
88
- opts[:key] = key
89
- glob_opts.merge(opts)
90
- end
91
-
92
- def _create_validator(key, opts)
93
- ValidatorFactory.get_instance type: opts[:type], opts: _validator_opts(key, opts)
94
- end
95
-
96
- def _node_generator(opts = {})
97
- self.class.new opts: opts, global_opts: glob_opts
98
- end
99
-
100
- def node
101
- @node ||= Node.new(opts: _validator_opts(name, options))
76
+ def node_generator(opts:, globals:)
77
+ NodeGenerator.new(opts: opts, global_opts: globals)
102
78
  end
103
79
  end
104
80
  end