schemacop 2.0.0 → 2.3.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.
Files changed (57) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +1 -17
  3. data/.travis.yml +0 -2
  4. data/CHANGELOG.md +49 -0
  5. data/LICENSE +1 -1
  6. data/README.md +66 -17
  7. data/Rakefile +5 -1
  8. data/VERSION +1 -1
  9. data/doc/Schemacop.html +5 -5
  10. data/doc/Schemacop/ArrayValidator.html +3 -3
  11. data/doc/Schemacop/BooleanValidator.html +4 -4
  12. data/doc/Schemacop/Collector.html +208 -32
  13. data/doc/Schemacop/Exceptions.html +3 -3
  14. data/doc/Schemacop/Exceptions/InvalidSchemaError.html +3 -3
  15. data/doc/Schemacop/Exceptions/ValidationError.html +3 -3
  16. data/doc/Schemacop/FieldNode.html +3 -3
  17. data/doc/Schemacop/FloatValidator.html +4 -4
  18. data/doc/Schemacop/HashValidator.html +33 -7
  19. data/doc/Schemacop/IntegerValidator.html +4 -4
  20. data/doc/Schemacop/NilValidator.html +4 -4
  21. data/doc/Schemacop/Node.html +4 -4
  22. data/doc/Schemacop/NodeResolver.html +3 -3
  23. data/doc/Schemacop/NodeSupportingField.html +4 -4
  24. data/doc/Schemacop/NodeSupportingType.html +4 -4
  25. data/doc/Schemacop/NodeWithBlock.html +4 -4
  26. data/doc/Schemacop/NumberValidator.html +4 -4
  27. data/doc/Schemacop/ObjectValidator.html +20 -10
  28. data/doc/Schemacop/RootNode.html +4 -4
  29. data/doc/Schemacop/Schema.html +4 -4
  30. data/doc/Schemacop/StringValidator.html +3 -3
  31. data/doc/Schemacop/SymbolValidator.html +145 -0
  32. data/doc/ScopedEnv.html +3 -3
  33. data/doc/_index.html +11 -4
  34. data/doc/class_list.html +1 -1
  35. data/doc/css/style.css +10 -6
  36. data/doc/file.README.html +76 -30
  37. data/doc/frames.html +1 -1
  38. data/doc/index.html +76 -30
  39. data/doc/js/app.js +55 -0
  40. data/doc/method_list.html +57 -41
  41. data/doc/top-level-namespace.html +3 -3
  42. data/lib/schemacop.rb +2 -0
  43. data/lib/schemacop/collector.rb +21 -2
  44. data/lib/schemacop/node.rb +6 -2
  45. data/lib/schemacop/node_supporting_field.rb +2 -6
  46. data/lib/schemacop/schema.rb +1 -1
  47. data/lib/schemacop/validator/hash_validator.rb +15 -2
  48. data/lib/schemacop/validator/object_validator.rb +7 -1
  49. data/lib/schemacop/validator/symbol_validator.rb +5 -0
  50. data/schemacop.gemspec +9 -9
  51. data/test/collector_test.rb +45 -0
  52. data/test/custom_check_test.rb +7 -0
  53. data/test/short_forms_test.rb +15 -0
  54. data/test/types_test.rb +1 -0
  55. data/test/validator_object_test.rb +18 -0
  56. data/test/validator_symbol_test.rb +16 -0
  57. metadata +23 -18
@@ -6,7 +6,7 @@
6
6
  <title>
7
7
  Top Level Namespace
8
8
 
9
- &mdash; Documentation by YARD 0.9.9
9
+ &mdash; Documentation by YARD 0.9.20
10
10
 
11
11
  </title>
12
12
 
@@ -102,9 +102,9 @@
102
102
  </div>
103
103
 
104
104
  <div id="footer">
105
- Generated on Mon May 15 17:46:05 2017 by
105
+ Generated on Thu Sep 26 13:19:46 2019 by
106
106
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
107
- 0.9.9 (ruby-2.3.1).
107
+ 0.9.20 (ruby-2.6.2).
108
108
  </div>
109
109
 
110
110
  </div>
@@ -3,6 +3,7 @@ end
3
3
 
4
4
  require 'set'
5
5
  require 'active_support/core_ext/class/attribute'
6
+ require 'active_support/hash_with_indifferent_access'
6
7
 
7
8
  require 'schemacop/scoped_env'
8
9
  require 'schemacop/exceptions'
@@ -21,6 +22,7 @@ require 'schemacop/validator/hash_validator'
21
22
  require 'schemacop/validator/number_validator'
22
23
  require 'schemacop/validator/integer_validator'
23
24
  require 'schemacop/validator/float_validator'
25
+ require 'schemacop/validator/symbol_validator'
24
26
  require 'schemacop/validator/string_validator'
25
27
  require 'schemacop/validator/nil_validator'
26
28
  require 'schemacop/validator/object_validator' # Matches any object, must be last validator
@@ -1,21 +1,31 @@
1
1
  module Schemacop
2
2
  class Collector
3
3
  attr_reader :current_path
4
+ attr_reader :exceptions
4
5
 
5
6
  def initialize
6
7
  @exceptions = []
7
8
  @current_path = []
9
+ @ignore_next_segment = false
8
10
  end
9
11
 
10
12
  def valid?
11
13
  @exceptions.empty?
12
14
  end
13
15
 
16
+ # Construct the current path
14
17
  def path(segment)
15
- @current_path << segment
18
+ ignore_this_segment = false
19
+ if @ignore_next_segment
20
+ ignore_this_segment = true
21
+ @ignore_next_segment = false
22
+ end
23
+
24
+ @current_path << segment unless ignore_this_segment
25
+
16
26
  yield
17
27
  ensure
18
- @current_path.pop
28
+ @current_path.pop unless ignore_this_segment
19
29
  end
20
30
 
21
31
  def exception_message
@@ -30,5 +40,14 @@ module Schemacop
30
40
  message: error_msg
31
41
  }
32
42
  end
43
+
44
+ # Does not include the path segment next time {Schemacop::Collector.path} is
45
+ # called.
46
+ #
47
+ # @return [Schemacop::Collector]
48
+ def ignore_next_segment
49
+ @ignore_next_segment = true
50
+ return self
51
+ end
33
52
  end
34
53
  end
@@ -119,8 +119,12 @@ module Schemacop
119
119
  protected
120
120
 
121
121
  def validate_custom_check(data, collector)
122
- if option?(:check) && !option(:check).call(data)
123
- collector.error 'Custom :check failed.'
122
+ if option?(:check) && (check_result = option(:check).call(data)) != true
123
+ if check_result.is_a?(String)
124
+ collector.error "Custom :check failed: #{check_result}."
125
+ else
126
+ collector.error 'Custom :check failed.'
127
+ end
124
128
  end
125
129
  end
126
130
  end
@@ -23,7 +23,7 @@ module Schemacop
23
23
  field(*args, required: true, allow_nil: false, &block)
24
24
  end
25
25
 
26
- alias req req!
26
+ alias_method :req, :req!
27
27
 
28
28
  def opt?(*args, &block)
29
29
  field(*args, required: false, allow_nil: true, &block)
@@ -33,16 +33,13 @@ module Schemacop
33
33
  field(*args, required: false, allow_nil: false, &block)
34
34
  end
35
35
 
36
- alias opt opt?
36
+ alias_method :opt, :opt?
37
37
 
38
38
  protected
39
39
 
40
40
  def field(*args, required:, allow_nil:, &block)
41
- # name = args.shift
42
- # options = args.last.is_a?(Hash) ? args.pop : {}
43
41
  name = args.shift
44
42
 
45
- # rubocop: disable Style/IfInsideElse
46
43
  if @fields[name]
47
44
  @fields[name].type(*args, &block)
48
45
  else
@@ -54,7 +51,6 @@ module Schemacop
54
51
  @fields[name] = FieldNode.new(name, required, &block)
55
52
  end
56
53
  end
57
- # rubocop: enable Style/IfInsideElse
58
54
 
59
55
  @fields[name].type(:nil) if allow_nil
60
56
  end
@@ -38,7 +38,7 @@ module Schemacop
38
38
  # throughout the validation.
39
39
  def validate(data)
40
40
  collector = Collector.new
41
- @root.fields[:root].validate({ root: data }, collector)
41
+ @root.fields[:root].validate({ root: data }, collector.ignore_next_segment)
42
42
  return collector
43
43
  end
44
44
 
@@ -5,8 +5,21 @@ module Schemacop
5
5
  def validate(data, collector)
6
6
  super
7
7
 
8
- allowed_fields = @fields.keys
9
- obsolete_keys = data.keys - allowed_fields
8
+ if data.is_a? ActiveSupport::HashWithIndifferentAccess
9
+ allowed_fields = @fields.keys.map { |k| k.is_a?(String) ? k.to_sym : k }
10
+ data_keys = data.keys.map { |k| k.is_a?(String) ? k.to_sym : k }
11
+
12
+ # If the same key is specified in the schema as string and symbol, we
13
+ # definitely expect a Ruby hash and not one with indifferent access
14
+ if @fields.keys.length != Set.new(allowed_fields).length
15
+ fail Exceptions::ValidationError, 'Hash expected, but got ActiveSupport::HashWithIndifferentAccess.'
16
+ end
17
+ else
18
+ allowed_fields = @fields.keys
19
+ data_keys = data.keys
20
+ end
21
+
22
+ obsolete_keys = data_keys - allowed_fields
10
23
 
11
24
  collector.error "Obsolete keys: #{obsolete_keys.inspect}." if obsolete_keys.any?
12
25
 
@@ -3,13 +3,19 @@ module Schemacop
3
3
  register symbols: :object, klasses: Object
4
4
 
5
5
  option :classes
6
+ option :strict
6
7
 
7
8
  def type_label
8
9
  "#{super} (#{classes.join(', ')})"
9
10
  end
10
11
 
11
12
  def type_matches?(data)
12
- super && (classes.empty? || classes.include?(data.class)) && !data.nil?
13
+ if option(:strict).is_a?(FalseClass)
14
+ sub_or_class = classes.map { |klass| data.class <= klass }.include?(true)
15
+ super && (classes.empty? || sub_or_class) && !data.nil?
16
+ else
17
+ super && (classes.empty? || classes.include?(data.class)) && !data.nil?
18
+ end
13
19
  end
14
20
 
15
21
  private
@@ -0,0 +1,5 @@
1
+ module Schemacop
2
+ class SymbolValidator < Node
3
+ register symbols: :symbol, klasses: Symbol
4
+ end
5
+ end
@@ -1,20 +1,20 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: schemacop 2.0.0 ruby lib
2
+ # stub: schemacop 2.3.2 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "schemacop".freeze
6
- s.version = "2.0.0"
6
+ s.version = "2.3.2"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
10
10
  s.authors = ["Sitrox".freeze]
11
- s.date = "2017-05-15"
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/Collector.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/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/collector.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, "schemacop.gemspec".freeze, "test/custom_check_test.rb".freeze, "test/custom_if_test.rb".freeze, "test/nil_dis_allow_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]
11
+ s.date = "2019-09-26"
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/Collector.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/collector.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/collector_test.rb".freeze, "test/custom_check_test.rb".freeze, "test/custom_if_test.rb".freeze, "test/nil_dis_allow_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]
13
13
  s.homepage = "https://github.com/sitrox/schemacop".freeze
14
14
  s.licenses = ["MIT".freeze]
15
- s.rubygems_version = "2.6.6".freeze
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/custom_check_test.rb".freeze, "test/custom_if_test.rb".freeze, "test/nil_dis_allow_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]
17
+ s.test_files = ["test/collector_test.rb".freeze, "test/custom_check_test.rb".freeze, "test/custom_if_test.rb".freeze, "test/nil_dis_allow_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]
18
18
 
19
19
  if s.respond_to? :specification_version then
20
20
  s.specification_version = 4
@@ -24,31 +24,31 @@ Gem::Specification.new do |s|
24
24
  s.add_development_dependency(%q<rake>.freeze, [">= 0"])
25
25
  s.add_development_dependency(%q<ci_reporter>.freeze, ["~> 2.0"])
26
26
  s.add_development_dependency(%q<ci_reporter_minitest>.freeze, [">= 0"])
27
- s.add_development_dependency(%q<activesupport>.freeze, [">= 0"])
28
27
  s.add_development_dependency(%q<haml>.freeze, [">= 0"])
29
28
  s.add_development_dependency(%q<yard>.freeze, [">= 0"])
30
29
  s.add_development_dependency(%q<rubocop>.freeze, ["= 0.35.1"])
31
30
  s.add_development_dependency(%q<redcarpet>.freeze, [">= 0"])
31
+ s.add_runtime_dependency(%q<activesupport>.freeze, [">= 4.0"])
32
32
  else
33
33
  s.add_dependency(%q<bundler>.freeze, ["~> 1.3"])
34
34
  s.add_dependency(%q<rake>.freeze, [">= 0"])
35
35
  s.add_dependency(%q<ci_reporter>.freeze, ["~> 2.0"])
36
36
  s.add_dependency(%q<ci_reporter_minitest>.freeze, [">= 0"])
37
- s.add_dependency(%q<activesupport>.freeze, [">= 0"])
38
37
  s.add_dependency(%q<haml>.freeze, [">= 0"])
39
38
  s.add_dependency(%q<yard>.freeze, [">= 0"])
40
39
  s.add_dependency(%q<rubocop>.freeze, ["= 0.35.1"])
41
40
  s.add_dependency(%q<redcarpet>.freeze, [">= 0"])
41
+ s.add_dependency(%q<activesupport>.freeze, [">= 4.0"])
42
42
  end
43
43
  else
44
44
  s.add_dependency(%q<bundler>.freeze, ["~> 1.3"])
45
45
  s.add_dependency(%q<rake>.freeze, [">= 0"])
46
46
  s.add_dependency(%q<ci_reporter>.freeze, ["~> 2.0"])
47
47
  s.add_dependency(%q<ci_reporter_minitest>.freeze, [">= 0"])
48
- s.add_dependency(%q<activesupport>.freeze, [">= 0"])
49
48
  s.add_dependency(%q<haml>.freeze, [">= 0"])
50
49
  s.add_dependency(%q<yard>.freeze, [">= 0"])
51
50
  s.add_dependency(%q<rubocop>.freeze, ["= 0.35.1"])
52
51
  s.add_dependency(%q<redcarpet>.freeze, [">= 0"])
52
+ s.add_dependency(%q<activesupport>.freeze, [">= 4.0"])
53
53
  end
54
54
  end
@@ -0,0 +1,45 @@
1
+ require 'test_helper'
2
+
3
+ module Schemacop
4
+ class CollectorTest < Minitest::Test
5
+ def test_no_root_node
6
+ s = Schema.new do
7
+ req :a, :string
8
+ end
9
+
10
+ col = s.validate(a: 0)
11
+ assert col.exceptions.first[:path].first !~ %r{^/root}, 'Root node is present in the path.'
12
+ end
13
+
14
+ def test_correct_path
15
+ s = Schema.new do
16
+ req :long_symbol, :string
17
+ req 'long_string', :string
18
+ req 123, :string
19
+ end
20
+
21
+ col = s.validate('long_string' => 0, long_symbol: 0, 123 => 0)
22
+
23
+ symbol = col.exceptions[0]
24
+ string = col.exceptions[1]
25
+ number = col.exceptions[2]
26
+
27
+ assert symbol[:path].first =~ %r{^/long_symbol}
28
+ assert string[:path].first =~ %r{^/long_string}
29
+ assert number[:path].first =~ %r{^/123}
30
+ end
31
+
32
+ def test_nested_paths
33
+ s = Schema.new do
34
+ req :one do
35
+ req :two, :string
36
+ end
37
+ req :three, :string
38
+ end
39
+
40
+ col = s.validate(one: { two: 0 }, three: 0)
41
+ assert_equal 2, col.exceptions[0][:path].length
42
+ assert_equal 1, col.exceptions[1][:path].length
43
+ end
44
+ end
45
+ end
@@ -12,6 +12,13 @@ module Schemacop
12
12
  assert_verr { s.validate!(2.1) }
13
13
  end
14
14
 
15
+ def test_custom_error_message
16
+ s = Schema.new :integer, check: proc { |i| i.even? ? true : 'Custom error' }
17
+ assert_nil s.validate!(2)
18
+ exception = assert_verr { s.validate!(3) }
19
+ assert_match(/Custom :check failed: Custom error\./, exception.message)
20
+ end
21
+
15
22
  def test_integer_check_with_lambda
16
23
  s = Schema.new do
17
24
  type :integer, check: ->(i) { i.even? }
@@ -2,6 +2,9 @@ require 'test_helper'
2
2
 
3
3
  module Schemacop
4
4
  class ShortFormsTest < Minitest::Test
5
+ class User; end
6
+ class Group; end
7
+
5
8
  def test_constructor_defaults_to_hash
6
9
  s = Schema.new do
7
10
  req! :r do
@@ -142,6 +145,7 @@ module Schemacop
142
145
  end
143
146
  req :name, :integer, min: 5, max: 7
144
147
  req :id, [:integer, :string]
148
+ req :callback, :symbol
145
149
  req :attrs do
146
150
  req :color do
147
151
  type :integer
@@ -161,6 +165,7 @@ module Schemacop
161
165
  foo: { bar: nil },
162
166
  attrs: { color: 5 },
163
167
  id: 'hallo',
168
+ callback: :funky_function,
164
169
  colors: [5, 'sdf'],
165
170
  cars: [
166
171
  {
@@ -312,5 +317,15 @@ module Schemacop
312
317
  assert_verr { s.validate!('123') }
313
318
  assert_verr { s.validate!(string: '1234') }
314
319
  end
320
+
321
+ def test_inline_objects
322
+ s = Schema.new do
323
+ req :user, User
324
+ req :group, Group
325
+ end
326
+
327
+ assert_nil s.validate!(user: User.new, group: Group.new)
328
+ assert_verr { s.validate!(user: Group.new, group: User.new) }
329
+ end
315
330
  end
316
331
  end
@@ -9,6 +9,7 @@ module Schemacop
9
9
  hash: {},
10
10
  integer: -5,
11
11
  number: -3.2,
12
+ symbol: :thing,
12
13
  object: self,
13
14
  string: 'miau' }.freeze
14
15
  end
@@ -83,5 +83,23 @@ module Schemacop
83
83
  assert_verr { s.validate!(fld: nil) }
84
84
  assert_verr { s.validate!({}) }
85
85
  end
86
+
87
+ def test_strict_option
88
+ s = Schema.new do
89
+ req :o_strict do
90
+ type :object, classes: User, strict: true
91
+ end
92
+ opt :o_ns do
93
+ type :object, classes: User, strict: false
94
+ end
95
+ end
96
+
97
+ assert_nil s.validate!(o_strict: User.new, o_ns: User.new)
98
+ assert_nil s.validate!(o_strict: User.new, o_ns: SubUser.new)
99
+ assert_nil s.validate!(o_strict: User.new)
100
+ assert_verr { s.validate!(o_strict: SubUser.new) }
101
+ assert_verr { s.validate!(o_strict: User.new, o_ns: AdminUser.new) }
102
+ assert_verr { s.validate!(o_strict: SubUser.new, o_ns: User.new) }
103
+ end
86
104
  end
87
105
  end
@@ -0,0 +1,16 @@
1
+ require 'test_helper'
2
+
3
+ module Schemacop
4
+ class ValidatorSymbolTest < Minitest::Test
5
+ def test_basic
6
+ s = Schema.new do
7
+ type :symbol
8
+ end
9
+
10
+ assert_nil s.validate!(:good)
11
+ assert_nil s.validate!('-+/'.to_sym)
12
+ assert_verr { s.validate!('bad') }
13
+ assert_verr { s.validate!(456) }
14
+ end
15
+ end
16
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: schemacop
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sitrox
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-15 00:00:00.000000000 Z
11
+ date: 2019-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,20 +66,6 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: activesupport
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: haml
85
71
  requirement: !ruby/object:Gem::Requirement
@@ -136,6 +122,20 @@ dependencies:
136
122
  - - ">="
137
123
  - !ruby/object:Gem::Version
138
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: activesupport
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '4.0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '4.0'
139
139
  description:
140
140
  email:
141
141
  executables: []
@@ -176,6 +176,7 @@ files:
176
176
  - doc/Schemacop/RootNode.html
177
177
  - doc/Schemacop/Schema.html
178
178
  - doc/Schemacop/StringValidator.html
179
+ - doc/Schemacop/SymbolValidator.html
179
180
  - doc/ScopedEnv.html
180
181
  - doc/_index.html
181
182
  - doc/class_list.html
@@ -214,7 +215,9 @@ files:
214
215
  - lib/schemacop/validator/number_validator.rb
215
216
  - lib/schemacop/validator/object_validator.rb
216
217
  - lib/schemacop/validator/string_validator.rb
218
+ - lib/schemacop/validator/symbol_validator.rb
217
219
  - schemacop.gemspec
220
+ - test/collector_test.rb
218
221
  - test/custom_check_test.rb
219
222
  - test/custom_if_test.rb
220
223
  - test/nil_dis_allow_test.rb
@@ -230,6 +233,7 @@ files:
230
233
  - test/validator_number_test.rb
231
234
  - test/validator_object_test.rb
232
235
  - test/validator_string_test.rb
236
+ - test/validator_symbol_test.rb
233
237
  homepage: https://github.com/sitrox/schemacop
234
238
  licenses:
235
239
  - MIT
@@ -249,13 +253,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
249
253
  - !ruby/object:Gem::Version
250
254
  version: '0'
251
255
  requirements: []
252
- rubyforge_project:
253
- rubygems_version: 2.6.8
256
+ rubygems_version: 3.0.3
254
257
  signing_key:
255
258
  specification_version: 4
256
259
  summary: Schemacop validates ruby structures consisting of nested hashes and arrays
257
260
  against simple schema definitions.
258
261
  test_files:
262
+ - test/collector_test.rb
259
263
  - test/custom_check_test.rb
260
264
  - test/custom_if_test.rb
261
265
  - test/nil_dis_allow_test.rb
@@ -271,3 +275,4 @@ test_files:
271
275
  - test/validator_number_test.rb
272
276
  - test/validator_object_test.rb
273
277
  - test/validator_string_test.rb
278
+ - test/validator_symbol_test.rb