schemacop 2.0.0 → 2.3.2

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