schemacop 2.4.7 → 3.0.0.rc4

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