schemacop 2.4.7 → 3.0.0.rc4

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.
Files changed (173) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.releaser_config +0 -1
  4. data/.rubocop.yml +25 -1
  5. data/.travis.yml +3 -1
  6. data/CHANGELOG.md +37 -0
  7. data/README.md +53 -710
  8. data/README_V2.md +775 -0
  9. data/README_V3.md +1253 -0
  10. data/Rakefile +8 -12
  11. data/VERSION +1 -1
  12. data/lib/schemacop.rb +35 -37
  13. data/lib/schemacop/base_schema.rb +37 -0
  14. data/lib/schemacop/railtie.rb +10 -0
  15. data/lib/schemacop/schema.rb +1 -60
  16. data/lib/schemacop/schema2.rb +22 -0
  17. data/lib/schemacop/schema3.rb +21 -0
  18. data/lib/schemacop/scoped_env.rb +25 -13
  19. data/lib/schemacop/v2.rb +25 -0
  20. data/lib/schemacop/{caster.rb → v2/caster.rb} +17 -2
  21. data/lib/schemacop/{collector.rb → v2/collector.rb} +5 -2
  22. data/lib/schemacop/{dupper.rb → v2/dupper.rb} +1 -1
  23. data/lib/schemacop/{field_node.rb → v2/field_node.rb} +4 -3
  24. data/lib/schemacop/v2/node.rb +142 -0
  25. data/lib/schemacop/{node_resolver.rb → v2/node_resolver.rb} +1 -1
  26. data/lib/schemacop/v2/node_supporting_field.rb +70 -0
  27. data/lib/schemacop/{node_supporting_type.rb → v2/node_supporting_type.rb} +8 -5
  28. data/lib/schemacop/{node_with_block.rb → v2/node_with_block.rb} +3 -2
  29. data/lib/schemacop/v2/validator/array_validator.rb +32 -0
  30. data/lib/schemacop/{validator → v2/validator}/boolean_validator.rb +1 -1
  31. data/lib/schemacop/v2/validator/float_validator.rb +7 -0
  32. data/lib/schemacop/v2/validator/hash_validator.rb +37 -0
  33. data/lib/schemacop/v2/validator/integer_validator.rb +7 -0
  34. data/lib/schemacop/{validator → v2/validator}/nil_validator.rb +1 -1
  35. data/lib/schemacop/v2/validator/number_validator.rb +21 -0
  36. data/lib/schemacop/v2/validator/object_validator.rb +29 -0
  37. data/lib/schemacop/v2/validator/string_validator.rb +39 -0
  38. data/lib/schemacop/{validator → v2/validator}/symbol_validator.rb +1 -1
  39. data/lib/schemacop/v3.rb +45 -0
  40. data/lib/schemacop/v3/all_of_node.rb +27 -0
  41. data/lib/schemacop/v3/any_of_node.rb +28 -0
  42. data/lib/schemacop/v3/array_node.rb +218 -0
  43. data/lib/schemacop/v3/boolean_node.rb +16 -0
  44. data/lib/schemacop/v3/combination_node.rb +45 -0
  45. data/lib/schemacop/v3/context.rb +17 -0
  46. data/lib/schemacop/v3/dsl_scope.rb +46 -0
  47. data/lib/schemacop/v3/global_context.rb +114 -0
  48. data/lib/schemacop/v3/hash_node.rb +267 -0
  49. data/lib/schemacop/v3/integer_node.rb +13 -0
  50. data/lib/schemacop/v3/is_not_node.rb +32 -0
  51. data/lib/schemacop/v3/node.rb +219 -0
  52. data/lib/schemacop/v3/node_registry.rb +45 -0
  53. data/lib/schemacop/v3/number_node.rb +18 -0
  54. data/lib/schemacop/v3/numeric_node.rb +76 -0
  55. data/lib/schemacop/v3/object_node.rb +40 -0
  56. data/lib/schemacop/v3/one_of_node.rb +28 -0
  57. data/lib/schemacop/v3/reference_node.rb +55 -0
  58. data/lib/schemacop/v3/result.rb +58 -0
  59. data/lib/schemacop/v3/string_node.rb +132 -0
  60. data/lib/schemacop/v3/symbol_node.rb +13 -0
  61. data/schemacop.gemspec +24 -27
  62. data/test/lib/test_helper.rb +167 -0
  63. data/test/schemas/nested/group.rb +6 -0
  64. data/test/schemas/user.rb +7 -0
  65. data/test/unit/schemacop/v2/casting_test.rb +157 -0
  66. data/test/unit/schemacop/v2/collector_test.rb +47 -0
  67. data/test/unit/schemacop/v2/custom_check_test.rb +95 -0
  68. data/test/unit/schemacop/v2/custom_if_test.rb +97 -0
  69. data/test/unit/schemacop/v2/defaults_test.rb +95 -0
  70. data/test/unit/schemacop/v2/empty_test.rb +16 -0
  71. data/test/unit/schemacop/v2/nil_dis_allow_test.rb +43 -0
  72. data/test/unit/schemacop/v2/node_resolver_test.rb +28 -0
  73. data/test/unit/schemacop/v2/short_forms_test.rb +351 -0
  74. data/test/unit/schemacop/v2/types_test.rb +88 -0
  75. data/test/unit/schemacop/v2/validator_array_test.rb +99 -0
  76. data/test/unit/schemacop/v2/validator_boolean_test.rb +17 -0
  77. data/test/unit/schemacop/v2/validator_float_test.rb +59 -0
  78. data/test/unit/schemacop/v2/validator_hash_test.rb +106 -0
  79. data/test/unit/schemacop/v2/validator_integer_test.rb +48 -0
  80. data/test/unit/schemacop/v2/validator_nil_test.rb +15 -0
  81. data/test/unit/schemacop/v2/validator_number_test.rb +62 -0
  82. data/test/unit/schemacop/v2/validator_object_test.rb +141 -0
  83. data/test/unit/schemacop/v2/validator_string_test.rb +78 -0
  84. data/test/unit/schemacop/v2/validator_symbol_test.rb +18 -0
  85. data/test/unit/schemacop/v3/all_of_node_test.rb +198 -0
  86. data/test/unit/schemacop/v3/any_of_node_test.rb +218 -0
  87. data/test/unit/schemacop/v3/array_node_test.rb +815 -0
  88. data/test/unit/schemacop/v3/boolean_node_test.rb +126 -0
  89. data/test/unit/schemacop/v3/global_context_test.rb +166 -0
  90. data/test/unit/schemacop/v3/hash_node_test.rb +972 -0
  91. data/test/unit/schemacop/v3/integer_node_test.rb +323 -0
  92. data/test/unit/schemacop/v3/is_not_node_test.rb +173 -0
  93. data/test/unit/schemacop/v3/node_test.rb +162 -0
  94. data/test/unit/schemacop/v3/number_node_test.rb +292 -0
  95. data/test/unit/schemacop/v3/object_node_test.rb +170 -0
  96. data/test/unit/schemacop/v3/one_of_node_test.rb +187 -0
  97. data/test/unit/schemacop/v3/reference_node_test.rb +367 -0
  98. data/test/unit/schemacop/v3/string_node_test.rb +372 -0
  99. data/test/unit/schemacop/v3/symbol_node_test.rb +75 -0
  100. metadata +151 -145
  101. data/doc/Schemacop.html +0 -146
  102. data/doc/Schemacop/ArrayValidator.html +0 -329
  103. data/doc/Schemacop/BooleanValidator.html +0 -145
  104. data/doc/Schemacop/Caster.html +0 -379
  105. data/doc/Schemacop/Collector.html +0 -787
  106. data/doc/Schemacop/Dupper.html +0 -214
  107. data/doc/Schemacop/Exceptions.html +0 -115
  108. data/doc/Schemacop/Exceptions/InvalidSchemaError.html +0 -124
  109. data/doc/Schemacop/Exceptions/ValidationError.html +0 -124
  110. data/doc/Schemacop/FieldNode.html +0 -421
  111. data/doc/Schemacop/FloatValidator.html +0 -158
  112. data/doc/Schemacop/HashValidator.html +0 -293
  113. data/doc/Schemacop/IntegerValidator.html +0 -158
  114. data/doc/Schemacop/NilValidator.html +0 -145
  115. data/doc/Schemacop/Node.html +0 -1438
  116. data/doc/Schemacop/NodeResolver.html +0 -258
  117. data/doc/Schemacop/NodeSupportingField.html +0 -590
  118. data/doc/Schemacop/NodeSupportingType.html +0 -612
  119. data/doc/Schemacop/NodeWithBlock.html +0 -289
  120. data/doc/Schemacop/NumberValidator.html +0 -232
  121. data/doc/Schemacop/ObjectValidator.html +0 -298
  122. data/doc/Schemacop/RootNode.html +0 -171
  123. data/doc/Schemacop/Schema.html +0 -699
  124. data/doc/Schemacop/StringValidator.html +0 -295
  125. data/doc/Schemacop/SymbolValidator.html +0 -145
  126. data/doc/ScopedEnv.html +0 -351
  127. data/doc/_index.html +0 -379
  128. data/doc/class_list.html +0 -51
  129. data/doc/css/common.css +0 -1
  130. data/doc/css/full_list.css +0 -58
  131. data/doc/css/style.css +0 -496
  132. data/doc/file.README.html +0 -833
  133. data/doc/file_list.html +0 -56
  134. data/doc/frames.html +0 -17
  135. data/doc/index.html +0 -833
  136. data/doc/inheritance.graphml +0 -524
  137. data/doc/inheritance.pdf +0 -825
  138. data/doc/js/app.js +0 -303
  139. data/doc/js/full_list.js +0 -216
  140. data/doc/js/jquery.js +0 -4
  141. data/doc/method_list.html +0 -587
  142. data/doc/top-level-namespace.html +0 -112
  143. data/lib/schemacop/node.rb +0 -139
  144. data/lib/schemacop/node_supporting_field.rb +0 -58
  145. data/lib/schemacop/root_node.rb +0 -4
  146. data/lib/schemacop/validator/array_validator.rb +0 -30
  147. data/lib/schemacop/validator/float_validator.rb +0 -5
  148. data/lib/schemacop/validator/hash_validator.rb +0 -35
  149. data/lib/schemacop/validator/integer_validator.rb +0 -5
  150. data/lib/schemacop/validator/number_validator.rb +0 -19
  151. data/lib/schemacop/validator/object_validator.rb +0 -27
  152. data/lib/schemacop/validator/string_validator.rb +0 -37
  153. data/test/casting_test.rb +0 -118
  154. data/test/collector_test.rb +0 -45
  155. data/test/custom_check_test.rb +0 -93
  156. data/test/custom_if_test.rb +0 -95
  157. data/test/defaults_test.rb +0 -93
  158. data/test/empty_test.rb +0 -14
  159. data/test/nil_dis_allow_test.rb +0 -41
  160. data/test/node_resolver_test.rb +0 -26
  161. data/test/short_forms_test.rb +0 -349
  162. data/test/test_helper.rb +0 -13
  163. data/test/types_test.rb +0 -84
  164. data/test/validator_array_test.rb +0 -97
  165. data/test/validator_boolean_test.rb +0 -15
  166. data/test/validator_float_test.rb +0 -57
  167. data/test/validator_hash_test.rb +0 -93
  168. data/test/validator_integer_test.rb +0 -46
  169. data/test/validator_nil_test.rb +0 -13
  170. data/test/validator_number_test.rb +0 -60
  171. data/test/validator_object_test.rb +0 -139
  172. data/test/validator_string_test.rb +0 -76
  173. data/test/validator_symbol_test.rb +0 -16
@@ -0,0 +1,58 @@
1
+ module Schemacop
2
+ class Result
3
+ attr_reader :current_path
4
+ attr_reader :errors
5
+
6
+ def initialize(root = nil, original_data = nil)
7
+ @current_path = []
8
+ @errors = {}
9
+ @root = root
10
+ @original_data = original_data
11
+ end
12
+
13
+ def valid?
14
+ errors.empty?
15
+ end
16
+
17
+ def data
18
+ if errors.any?
19
+ return nil
20
+ else
21
+ return @data ||= @root.cast(@original_data)
22
+ end
23
+ end
24
+
25
+ def error(message)
26
+ @errors[current_path] ||= []
27
+ @errors[current_path] << message
28
+ end
29
+
30
+ def messages_by_path
31
+ @errors.transform_keys { |k| "/#{k.join('/')}" }
32
+ end
33
+
34
+ def exception_message
35
+ messages.join("\n")
36
+ end
37
+
38
+ def messages
39
+ messages = []
40
+
41
+ @errors.each do |path, path_messages|
42
+ messages += path_messages.map do |path_message|
43
+ "/#{path.join('/')}: #{path_message}"
44
+ end
45
+ end
46
+
47
+ return messages
48
+ end
49
+
50
+ def in_path(segment)
51
+ prev_path = @current_path
52
+ @current_path += [segment]
53
+ yield
54
+ ensure
55
+ @current_path = prev_path
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,132 @@
1
+ module Schemacop
2
+ module V3
3
+ class StringNode < Node
4
+ ATTRIBUTES = %i[
5
+ min_length
6
+ max_length
7
+ pattern
8
+ format
9
+ ].freeze
10
+
11
+ # rubocop:disable Layout/LineLength
12
+ FORMAT_PATTERNS = {
13
+ date: /^([0-9]{4})-?(1[0-2]|0[1-9])-?(3[01]|0[1-9]|[12][0-9])$/,
14
+ 'date-time': /^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\.[0-9]+)?(Z|[+-](?:2[0-3]|[01][0-9]):[0-5][0-9])?$/,
15
+ time: /^(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\.[0-9]+)?(Z|[+-](?:2[0-3]|[01][0-9]):[0-5][0-9])?$/,
16
+ email: URI::MailTo::EMAIL_REGEXP,
17
+ boolean: /^(true|false)$/,
18
+ binary: nil,
19
+ integer: /^-?[0-9]+$/,
20
+ number: /^-?[0-9]+(\.[0-9]+)?$/
21
+ }.freeze
22
+ # rubocop:enable Layout/LineLength
23
+
24
+ def self.allowed_options
25
+ super + ATTRIBUTES - %i[cast_str] + %i[format_options]
26
+ end
27
+
28
+ def allowed_types
29
+ { String => :string }
30
+ end
31
+
32
+ def as_json
33
+ process_json(ATTRIBUTES, type: :string)
34
+ end
35
+
36
+ def _validate(data, result:)
37
+ super_data = super
38
+ return if super_data.nil?
39
+
40
+ # Validate length #
41
+ length = super_data.size
42
+
43
+ if options[:min_length] && length < options[:min_length]
44
+ result.error "String is #{length} characters long but must be at least #{options[:min_length]}."
45
+ end
46
+
47
+ if options[:max_length] && length > options[:max_length]
48
+ result.error "String is #{length} characters long but must be at most #{options[:max_length]}."
49
+ end
50
+
51
+ # Validate pattern #
52
+ if options[:pattern] && !super_data.match?(Regexp.compile(options[:pattern]))
53
+ result.error "String does not match pattern #{options[:pattern].inspect}."
54
+ end
55
+
56
+ # Validate format #
57
+ if options[:format] && FORMAT_PATTERNS.include?(options[:format])
58
+ pattern = FORMAT_PATTERNS[options[:format]]
59
+ if pattern && !super_data.match?(pattern)
60
+ result.error "String does not match format #{options[:format].to_s.inspect}."
61
+ elsif options[:format_options] && Node.resolve_class(options[:format])
62
+ node = create(options[:format], **options[:format_options])
63
+ node._validate(cast(super_data), result: result)
64
+ end
65
+ end
66
+ end
67
+
68
+ def cast(value)
69
+ if value.present?
70
+ to_cast = value
71
+ elsif default.present?
72
+ to_cast = default
73
+ else
74
+ return nil
75
+ end
76
+
77
+ case options[:format]
78
+ when :boolean
79
+ return to_cast == 'true'
80
+ when :date
81
+ return Date.parse(to_cast)
82
+ when :'date-time'
83
+ return DateTime.parse(to_cast)
84
+ when :time
85
+ Time.parse(to_cast)
86
+ when :integer
87
+ return Integer(to_cast)
88
+ when :number
89
+ return Float(to_cast)
90
+ else
91
+ return to_cast
92
+ end
93
+ end
94
+
95
+ protected
96
+
97
+ def init
98
+ if options.include?(:format)
99
+ options[:format] = options[:format].to_s.dasherize.to_sym
100
+ end
101
+ end
102
+
103
+ def validate_self
104
+ if options.include?(:format) && !FORMAT_PATTERNS.include?(options[:format])
105
+ fail "Format #{options[:format].to_s.inspect} is not supported."
106
+ end
107
+
108
+ unless options[:min_length].nil? || options[:min_length].is_a?(Integer)
109
+ fail 'Option "min_length" must be an "integer"'
110
+ end
111
+
112
+ unless options[:max_length].nil? || options[:max_length].is_a?(Integer)
113
+ fail 'Option "max_length" must be an "integer"'
114
+ end
115
+
116
+ if options[:min_length] && options[:max_length] && options[:min_length] > options[:max_length]
117
+ fail 'Option "min_length" can\'t be greater than "max_length".'
118
+ end
119
+
120
+ if options[:pattern]
121
+ fail 'Option "pattern" must be a string.' unless options[:pattern].is_a?(String)
122
+
123
+ begin
124
+ Regexp.compile(options[:pattern])
125
+ rescue RegexpError => e
126
+ fail "Option \"pattern\" can't be parsed: #{e.message}."
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,13 @@
1
+ module Schemacop
2
+ module V3
3
+ class SymbolNode < Node
4
+ def as_json
5
+ {} # Not supported by Json Schema
6
+ end
7
+
8
+ def allowed_types
9
+ { Symbol => 'Symbol' }
10
+ end
11
+ end
12
+ end
13
+ end
data/schemacop.gemspec CHANGED
@@ -1,60 +1,57 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: schemacop 2.4.7 ruby lib
2
+ # stub: schemacop 3.0.0.rc4 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "schemacop".freeze
6
- s.version = "2.4.7"
6
+ s.version = "3.0.0.rc4"
7
7
 
8
- s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
8
+ s.required_rubygems_version = Gem::Requirement.new("> 1.3.1".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
10
10
  s.authors = ["Sitrox".freeze]
11
- s.date = "2020-07-02"
12
- s.files = [".gitignore".freeze, ".releaser_config".freeze, ".rubocop.yml".freeze, ".travis.yml".freeze, ".yardopts".freeze, "CHANGELOG.md".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "RUBY_VERSION".freeze, "Rakefile".freeze, "VERSION".freeze, "doc/Schemacop.html".freeze, "doc/Schemacop/ArrayValidator.html".freeze, "doc/Schemacop/BooleanValidator.html".freeze, "doc/Schemacop/Caster.html".freeze, "doc/Schemacop/Collector.html".freeze, "doc/Schemacop/Dupper.html".freeze, "doc/Schemacop/Exceptions.html".freeze, "doc/Schemacop/Exceptions/InvalidSchemaError.html".freeze, "doc/Schemacop/Exceptions/ValidationError.html".freeze, "doc/Schemacop/FieldNode.html".freeze, "doc/Schemacop/FloatValidator.html".freeze, "doc/Schemacop/HashValidator.html".freeze, "doc/Schemacop/IntegerValidator.html".freeze, "doc/Schemacop/NilValidator.html".freeze, "doc/Schemacop/Node.html".freeze, "doc/Schemacop/NodeResolver.html".freeze, "doc/Schemacop/NodeSupportingField.html".freeze, "doc/Schemacop/NodeSupportingType.html".freeze, "doc/Schemacop/NodeWithBlock.html".freeze, "doc/Schemacop/NumberValidator.html".freeze, "doc/Schemacop/ObjectValidator.html".freeze, "doc/Schemacop/RootNode.html".freeze, "doc/Schemacop/Schema.html".freeze, "doc/Schemacop/StringValidator.html".freeze, "doc/Schemacop/SymbolValidator.html".freeze, "doc/ScopedEnv.html".freeze, "doc/_index.html".freeze, "doc/class_list.html".freeze, "doc/css/common.css".freeze, "doc/css/full_list.css".freeze, "doc/css/style.css".freeze, "doc/file.README.html".freeze, "doc/file_list.html".freeze, "doc/frames.html".freeze, "doc/index.html".freeze, "doc/inheritance.graphml".freeze, "doc/inheritance.pdf".freeze, "doc/js/app.js".freeze, "doc/js/full_list.js".freeze, "doc/js/jquery.js".freeze, "doc/method_list.html".freeze, "doc/top-level-namespace.html".freeze, "lib/schemacop.rb".freeze, "lib/schemacop/caster.rb".freeze, "lib/schemacop/collector.rb".freeze, "lib/schemacop/dupper.rb".freeze, "lib/schemacop/exceptions.rb".freeze, "lib/schemacop/field_node.rb".freeze, "lib/schemacop/node.rb".freeze, "lib/schemacop/node_resolver.rb".freeze, "lib/schemacop/node_supporting_field.rb".freeze, "lib/schemacop/node_supporting_type.rb".freeze, "lib/schemacop/node_with_block.rb".freeze, "lib/schemacop/root_node.rb".freeze, "lib/schemacop/schema.rb".freeze, "lib/schemacop/scoped_env.rb".freeze, "lib/schemacop/validator/array_validator.rb".freeze, "lib/schemacop/validator/boolean_validator.rb".freeze, "lib/schemacop/validator/float_validator.rb".freeze, "lib/schemacop/validator/hash_validator.rb".freeze, "lib/schemacop/validator/integer_validator.rb".freeze, "lib/schemacop/validator/nil_validator.rb".freeze, "lib/schemacop/validator/number_validator.rb".freeze, "lib/schemacop/validator/object_validator.rb".freeze, "lib/schemacop/validator/string_validator.rb".freeze, "lib/schemacop/validator/symbol_validator.rb".freeze, "schemacop.gemspec".freeze, "test/casting_test.rb".freeze, "test/collector_test.rb".freeze, "test/custom_check_test.rb".freeze, "test/custom_if_test.rb".freeze, "test/defaults_test.rb".freeze, "test/empty_test.rb".freeze, "test/nil_dis_allow_test.rb".freeze, "test/node_resolver_test.rb".freeze, "test/short_forms_test.rb".freeze, "test/test_helper.rb".freeze, "test/types_test.rb".freeze, "test/validator_array_test.rb".freeze, "test/validator_boolean_test.rb".freeze, "test/validator_float_test.rb".freeze, "test/validator_hash_test.rb".freeze, "test/validator_integer_test.rb".freeze, "test/validator_nil_test.rb".freeze, "test/validator_number_test.rb".freeze, "test/validator_object_test.rb".freeze, "test/validator_string_test.rb".freeze, "test/validator_symbol_test.rb".freeze]
11
+ s.date = "2021-02-02"
12
+ s.files = [".gitignore".freeze, ".releaser_config".freeze, ".rubocop.yml".freeze, ".travis.yml".freeze, ".yardopts".freeze, "CHANGELOG.md".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "README_V2.md".freeze, "README_V3.md".freeze, "RUBY_VERSION".freeze, "Rakefile".freeze, "VERSION".freeze, "lib/schemacop.rb".freeze, "lib/schemacop/base_schema.rb".freeze, "lib/schemacop/exceptions.rb".freeze, "lib/schemacop/railtie.rb".freeze, "lib/schemacop/schema.rb".freeze, "lib/schemacop/schema2.rb".freeze, "lib/schemacop/schema3.rb".freeze, "lib/schemacop/scoped_env.rb".freeze, "lib/schemacop/v2.rb".freeze, "lib/schemacop/v2/caster.rb".freeze, "lib/schemacop/v2/collector.rb".freeze, "lib/schemacop/v2/dupper.rb".freeze, "lib/schemacop/v2/field_node.rb".freeze, "lib/schemacop/v2/node.rb".freeze, "lib/schemacop/v2/node_resolver.rb".freeze, "lib/schemacop/v2/node_supporting_field.rb".freeze, "lib/schemacop/v2/node_supporting_type.rb".freeze, "lib/schemacop/v2/node_with_block.rb".freeze, "lib/schemacop/v2/validator/array_validator.rb".freeze, "lib/schemacop/v2/validator/boolean_validator.rb".freeze, "lib/schemacop/v2/validator/float_validator.rb".freeze, "lib/schemacop/v2/validator/hash_validator.rb".freeze, "lib/schemacop/v2/validator/integer_validator.rb".freeze, "lib/schemacop/v2/validator/nil_validator.rb".freeze, "lib/schemacop/v2/validator/number_validator.rb".freeze, "lib/schemacop/v2/validator/object_validator.rb".freeze, "lib/schemacop/v2/validator/string_validator.rb".freeze, "lib/schemacop/v2/validator/symbol_validator.rb".freeze, "lib/schemacop/v3.rb".freeze, "lib/schemacop/v3/all_of_node.rb".freeze, "lib/schemacop/v3/any_of_node.rb".freeze, "lib/schemacop/v3/array_node.rb".freeze, "lib/schemacop/v3/boolean_node.rb".freeze, "lib/schemacop/v3/combination_node.rb".freeze, "lib/schemacop/v3/context.rb".freeze, "lib/schemacop/v3/dsl_scope.rb".freeze, "lib/schemacop/v3/global_context.rb".freeze, "lib/schemacop/v3/hash_node.rb".freeze, "lib/schemacop/v3/integer_node.rb".freeze, "lib/schemacop/v3/is_not_node.rb".freeze, "lib/schemacop/v3/node.rb".freeze, "lib/schemacop/v3/node_registry.rb".freeze, "lib/schemacop/v3/number_node.rb".freeze, "lib/schemacop/v3/numeric_node.rb".freeze, "lib/schemacop/v3/object_node.rb".freeze, "lib/schemacop/v3/one_of_node.rb".freeze, "lib/schemacop/v3/reference_node.rb".freeze, "lib/schemacop/v3/result.rb".freeze, "lib/schemacop/v3/string_node.rb".freeze, "lib/schemacop/v3/symbol_node.rb".freeze, "schemacop.gemspec".freeze, "test/lib/test_helper.rb".freeze, "test/schemas/nested/group.rb".freeze, "test/schemas/user.rb".freeze, "test/unit/schemacop/v2/casting_test.rb".freeze, "test/unit/schemacop/v2/collector_test.rb".freeze, "test/unit/schemacop/v2/custom_check_test.rb".freeze, "test/unit/schemacop/v2/custom_if_test.rb".freeze, "test/unit/schemacop/v2/defaults_test.rb".freeze, "test/unit/schemacop/v2/empty_test.rb".freeze, "test/unit/schemacop/v2/nil_dis_allow_test.rb".freeze, "test/unit/schemacop/v2/node_resolver_test.rb".freeze, "test/unit/schemacop/v2/short_forms_test.rb".freeze, "test/unit/schemacop/v2/types_test.rb".freeze, "test/unit/schemacop/v2/validator_array_test.rb".freeze, "test/unit/schemacop/v2/validator_boolean_test.rb".freeze, "test/unit/schemacop/v2/validator_float_test.rb".freeze, "test/unit/schemacop/v2/validator_hash_test.rb".freeze, "test/unit/schemacop/v2/validator_integer_test.rb".freeze, "test/unit/schemacop/v2/validator_nil_test.rb".freeze, "test/unit/schemacop/v2/validator_number_test.rb".freeze, "test/unit/schemacop/v2/validator_object_test.rb".freeze, "test/unit/schemacop/v2/validator_string_test.rb".freeze, "test/unit/schemacop/v2/validator_symbol_test.rb".freeze, "test/unit/schemacop/v3/all_of_node_test.rb".freeze, "test/unit/schemacop/v3/any_of_node_test.rb".freeze, "test/unit/schemacop/v3/array_node_test.rb".freeze, "test/unit/schemacop/v3/boolean_node_test.rb".freeze, "test/unit/schemacop/v3/global_context_test.rb".freeze, "test/unit/schemacop/v3/hash_node_test.rb".freeze, "test/unit/schemacop/v3/integer_node_test.rb".freeze, "test/unit/schemacop/v3/is_not_node_test.rb".freeze, "test/unit/schemacop/v3/node_test.rb".freeze, "test/unit/schemacop/v3/number_node_test.rb".freeze, "test/unit/schemacop/v3/object_node_test.rb".freeze, "test/unit/schemacop/v3/one_of_node_test.rb".freeze, "test/unit/schemacop/v3/reference_node_test.rb".freeze, "test/unit/schemacop/v3/string_node_test.rb".freeze, "test/unit/schemacop/v3/symbol_node_test.rb".freeze]
13
13
  s.homepage = "https://github.com/sitrox/schemacop".freeze
14
14
  s.licenses = ["MIT".freeze]
15
15
  s.rubygems_version = "3.0.3".freeze
16
16
  s.summary = "Schemacop validates ruby structures consisting of nested hashes and arrays against simple schema definitions.".freeze
17
- s.test_files = ["test/casting_test.rb".freeze, "test/collector_test.rb".freeze, "test/custom_check_test.rb".freeze, "test/custom_if_test.rb".freeze, "test/defaults_test.rb".freeze, "test/empty_test.rb".freeze, "test/nil_dis_allow_test.rb".freeze, "test/node_resolver_test.rb".freeze, "test/short_forms_test.rb".freeze, "test/test_helper.rb".freeze, "test/types_test.rb".freeze, "test/validator_array_test.rb".freeze, "test/validator_boolean_test.rb".freeze, "test/validator_float_test.rb".freeze, "test/validator_hash_test.rb".freeze, "test/validator_integer_test.rb".freeze, "test/validator_nil_test.rb".freeze, "test/validator_number_test.rb".freeze, "test/validator_object_test.rb".freeze, "test/validator_string_test.rb".freeze, "test/validator_symbol_test.rb".freeze]
17
+ s.test_files = ["test/lib/test_helper.rb".freeze, "test/schemas/nested/group.rb".freeze, "test/schemas/user.rb".freeze, "test/unit/schemacop/v2/casting_test.rb".freeze, "test/unit/schemacop/v2/collector_test.rb".freeze, "test/unit/schemacop/v2/custom_check_test.rb".freeze, "test/unit/schemacop/v2/custom_if_test.rb".freeze, "test/unit/schemacop/v2/defaults_test.rb".freeze, "test/unit/schemacop/v2/empty_test.rb".freeze, "test/unit/schemacop/v2/nil_dis_allow_test.rb".freeze, "test/unit/schemacop/v2/node_resolver_test.rb".freeze, "test/unit/schemacop/v2/short_forms_test.rb".freeze, "test/unit/schemacop/v2/types_test.rb".freeze, "test/unit/schemacop/v2/validator_array_test.rb".freeze, "test/unit/schemacop/v2/validator_boolean_test.rb".freeze, "test/unit/schemacop/v2/validator_float_test.rb".freeze, "test/unit/schemacop/v2/validator_hash_test.rb".freeze, "test/unit/schemacop/v2/validator_integer_test.rb".freeze, "test/unit/schemacop/v2/validator_nil_test.rb".freeze, "test/unit/schemacop/v2/validator_number_test.rb".freeze, "test/unit/schemacop/v2/validator_object_test.rb".freeze, "test/unit/schemacop/v2/validator_string_test.rb".freeze, "test/unit/schemacop/v2/validator_symbol_test.rb".freeze, "test/unit/schemacop/v3/all_of_node_test.rb".freeze, "test/unit/schemacop/v3/any_of_node_test.rb".freeze, "test/unit/schemacop/v3/array_node_test.rb".freeze, "test/unit/schemacop/v3/boolean_node_test.rb".freeze, "test/unit/schemacop/v3/global_context_test.rb".freeze, "test/unit/schemacop/v3/hash_node_test.rb".freeze, "test/unit/schemacop/v3/integer_node_test.rb".freeze, "test/unit/schemacop/v3/is_not_node_test.rb".freeze, "test/unit/schemacop/v3/node_test.rb".freeze, "test/unit/schemacop/v3/number_node_test.rb".freeze, "test/unit/schemacop/v3/object_node_test.rb".freeze, "test/unit/schemacop/v3/one_of_node_test.rb".freeze, "test/unit/schemacop/v3/reference_node_test.rb".freeze, "test/unit/schemacop/v3/string_node_test.rb".freeze, "test/unit/schemacop/v3/symbol_node_test.rb".freeze]
18
18
 
19
19
  if s.respond_to? :specification_version then
20
20
  s.specification_version = 4
21
21
 
22
22
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
23
23
  s.add_runtime_dependency(%q<activesupport>.freeze, [">= 4.0"])
24
- s.add_development_dependency(%q<bundler>.freeze, ["~> 1.3"])
24
+ s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
25
25
  s.add_development_dependency(%q<rake>.freeze, [">= 0"])
26
- s.add_development_dependency(%q<ci_reporter>.freeze, ["~> 2.0"])
27
- s.add_development_dependency(%q<ci_reporter_minitest>.freeze, [">= 0"])
28
- s.add_development_dependency(%q<haml>.freeze, [">= 0"])
26
+ s.add_development_dependency(%q<minitest>.freeze, [">= 0"])
27
+ s.add_development_dependency(%q<minitest-reporters>.freeze, [">= 0"])
29
28
  s.add_development_dependency(%q<colorize>.freeze, [">= 0"])
30
- s.add_development_dependency(%q<yard>.freeze, [">= 0"])
31
- s.add_development_dependency(%q<rubocop>.freeze, ["= 0.35.1"])
32
- s.add_development_dependency(%q<redcarpet>.freeze, [">= 0"])
29
+ s.add_development_dependency(%q<rubocop>.freeze, ["= 0.92.0"])
33
30
  s.add_development_dependency(%q<pry>.freeze, [">= 0"])
31
+ s.add_development_dependency(%q<byebug>.freeze, [">= 0"])
32
+ s.add_development_dependency(%q<simplecov>.freeze, ["= 0.21.2"])
34
33
  else
35
34
  s.add_dependency(%q<activesupport>.freeze, [">= 4.0"])
36
- s.add_dependency(%q<bundler>.freeze, ["~> 1.3"])
35
+ s.add_dependency(%q<bundler>.freeze, [">= 0"])
37
36
  s.add_dependency(%q<rake>.freeze, [">= 0"])
38
- s.add_dependency(%q<ci_reporter>.freeze, ["~> 2.0"])
39
- s.add_dependency(%q<ci_reporter_minitest>.freeze, [">= 0"])
40
- s.add_dependency(%q<haml>.freeze, [">= 0"])
37
+ s.add_dependency(%q<minitest>.freeze, [">= 0"])
38
+ s.add_dependency(%q<minitest-reporters>.freeze, [">= 0"])
41
39
  s.add_dependency(%q<colorize>.freeze, [">= 0"])
42
- s.add_dependency(%q<yard>.freeze, [">= 0"])
43
- s.add_dependency(%q<rubocop>.freeze, ["= 0.35.1"])
44
- s.add_dependency(%q<redcarpet>.freeze, [">= 0"])
40
+ s.add_dependency(%q<rubocop>.freeze, ["= 0.92.0"])
45
41
  s.add_dependency(%q<pry>.freeze, [">= 0"])
42
+ s.add_dependency(%q<byebug>.freeze, [">= 0"])
43
+ s.add_dependency(%q<simplecov>.freeze, ["= 0.21.2"])
46
44
  end
47
45
  else
48
46
  s.add_dependency(%q<activesupport>.freeze, [">= 4.0"])
49
- s.add_dependency(%q<bundler>.freeze, ["~> 1.3"])
47
+ s.add_dependency(%q<bundler>.freeze, [">= 0"])
50
48
  s.add_dependency(%q<rake>.freeze, [">= 0"])
51
- s.add_dependency(%q<ci_reporter>.freeze, ["~> 2.0"])
52
- s.add_dependency(%q<ci_reporter_minitest>.freeze, [">= 0"])
53
- s.add_dependency(%q<haml>.freeze, [">= 0"])
49
+ s.add_dependency(%q<minitest>.freeze, [">= 0"])
50
+ s.add_dependency(%q<minitest-reporters>.freeze, [">= 0"])
54
51
  s.add_dependency(%q<colorize>.freeze, [">= 0"])
55
- s.add_dependency(%q<yard>.freeze, [">= 0"])
56
- s.add_dependency(%q<rubocop>.freeze, ["= 0.35.1"])
57
- s.add_dependency(%q<redcarpet>.freeze, [">= 0"])
52
+ s.add_dependency(%q<rubocop>.freeze, ["= 0.92.0"])
58
53
  s.add_dependency(%q<pry>.freeze, [">= 0"])
54
+ s.add_dependency(%q<byebug>.freeze, [">= 0"])
55
+ s.add_dependency(%q<simplecov>.freeze, ["= 0.21.2"])
59
56
  end
60
57
  end
@@ -0,0 +1,167 @@
1
+ require 'simplecov'
2
+ SimpleCov.start do
3
+ add_group 'v3', 'lib/schemacop/v3'
4
+ add_group 'v2', 'lib/schemacop/v2'
5
+
6
+ # We don't care about the test coverage for the
7
+ # tests themselves
8
+ add_filter 'test'
9
+
10
+ # Also enable branch coverage reporting
11
+ enable_coverage :branch
12
+ end
13
+
14
+ # TODO: Move to more sensible location
15
+ def assert_verr(&block)
16
+ assert_raises(Schemacop::V2::Exceptions::ValidationError, &block)
17
+ end
18
+
19
+ # TODO: Move to more sensible location
20
+ def assert_nothing_raised(&_block)
21
+ yield
22
+ assert true
23
+ end
24
+
25
+ require 'minitest/autorun'
26
+ require 'minitest/reporters'
27
+ require 'schemacop'
28
+ require 'pry'
29
+ require 'colorize'
30
+ require 'byebug'
31
+
32
+ Minitest::Reporters.use! [Minitest::Reporters::DefaultReporter.new(color: true)]
33
+
34
+ class SchemacopTest < Minitest::Test
35
+ def assert_is_a(klass, object)
36
+ assert object.is_a?(klass),
37
+ "Expected object with class #{object.class.inspect} to be a #{klass.inspect}."
38
+ end
39
+ end
40
+
41
+ class V2Test < SchemacopTest
42
+ def setup
43
+ Schemacop.default_schema_version = 2
44
+ end
45
+ end
46
+
47
+ class V3Test < SchemacopTest
48
+ class ValidationAssertion
49
+ attr_reader :errors
50
+
51
+ def initialize(&block)
52
+ @errors = {}
53
+ instance_exec(&block)
54
+ end
55
+
56
+ def error(path, exp)
57
+ @errors[path] ||= []
58
+ @errors[path] << exp
59
+ end
60
+ end
61
+
62
+ def setup
63
+ Schemacop.default_schema_version = 3
64
+ end
65
+
66
+ # Help test raise errors message
67
+ # https://ruby-doc.org/stdlib-2.1.5/libdoc/test/unit/rdoc/Test/Unit/Assertions.html#method-i-assert_raise
68
+ def assert_raises_with_message(exception, expected, msg = nil, &block)
69
+ case expected
70
+ when String
71
+ assert = :assert_equal
72
+ when Regexp
73
+ assert = :assert_match
74
+ else
75
+ fail TypeError, "Expected #{expected.inspect} to be a kind of String or Regexp, not #{expected.class}"
76
+ end
77
+
78
+ ex = assert_raises(exception, *msg, &block)
79
+ msg = message(msg, '') { "Expected Exception(#{exception}) was raised, but the message doesn't match" }
80
+
81
+ if assert == :assert_equal
82
+ assert_equal(expected, ex.message, msg)
83
+ else
84
+ msg = message(msg) { "Expected #{mu_pp expected} to match #{mu_pp ex.message}" }
85
+ assert expected =~ ex.message, msg
86
+ block.binding.eval('proc{|_|$~=_}').call($LAST_MATCH_INFO)
87
+ end
88
+ return ex
89
+ end
90
+
91
+ def schema(type = :hash, **options, &block)
92
+ @schema = Schemacop::Schema3.new(type, **options, &block)
93
+ end
94
+
95
+ def with_context(context, &block)
96
+ Schemacop.with_context(context, &block)
97
+ end
98
+
99
+ def assert_validation(data, &block)
100
+ result = @schema.validate(data)
101
+
102
+ if block_given?
103
+ assertion = ValidationAssertion.new(&block)
104
+
105
+ assert_equal assertion.errors.keys.sort,
106
+ result.messages_by_path.keys.sort,
107
+ 'Unexpected validation error paths'
108
+
109
+ assertion.errors.each do |path, expected_errors|
110
+ actual_errors = result.messages_by_path[path].dup
111
+
112
+ assert_equal expected_errors.size,
113
+ actual_errors.size,
114
+ "Unexpected number of messages for path #{path}"
115
+
116
+ expected_errors.each do |expected_error|
117
+ match = actual_errors.find do |ae|
118
+ if expected_error.is_a?(Regexp)
119
+ expected_error.match?(ae)
120
+ else
121
+ expected_error == ae
122
+ end
123
+ end
124
+
125
+ if match
126
+ actual_errors.delete(match)
127
+ else
128
+ assert match,
129
+ "Did not find error #{expected_error.inspect} in path #{path}, errors: " \
130
+ + result.messages_by_path[path].inspect
131
+ end
132
+ end
133
+ end
134
+ else
135
+ assert result.errors.empty?,
136
+ "Expected data #{data.inspect} to match schema #{@schema.as_json}, but got errors: #{result.messages}."
137
+ end
138
+ end
139
+
140
+ def assert_json(expected_json)
141
+ # TODO: Double "as_json" should not be necessary
142
+ assert_equal expected_json.as_json, @schema.as_json.as_json
143
+ end
144
+
145
+ def assert_match_any(array, exp)
146
+ assert array.any? { |element| element.match?(exp) },
147
+ "Expected any of #{array.inspect} to match #{exp}."
148
+ end
149
+
150
+ def assert_cast(input_data, expected_data)
151
+ input_data_was = Marshal.load(Marshal.dump(input_data))
152
+ result = @schema.validate(input_data)
153
+ assert_empty result.errors
154
+
155
+ if expected_data.nil?
156
+ assert_nil result.data, 'Unexpected result data.'
157
+ else
158
+ assert_equal expected_data, result.data, 'Unexpected result data.'
159
+ end
160
+
161
+ if input_data.nil?
162
+ assert_nil input_data_was, 'Expected input_data to stay the same.'
163
+ else
164
+ assert_equal input_data, input_data_was, 'Expected input_data to stay the same.'
165
+ end
166
+ end
167
+ end