schemacop 3.0.15 → 3.0.16

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2e43238e69ebe95beaac85536a9dadbf3233bd4fa5751c7e019ca6d07aa05860
4
- data.tar.gz: 8bafd412f0572e0c12a7c163cba48b6f6f69900ec903684dc3c9495b4913cf52
3
+ metadata.gz: 3c6c1009f3a4a23a39f58dd1aef99c63136f8d362963d14a7513f08f0d705c0c
4
+ data.tar.gz: 58a4e7ace82f8f5b1a69ac70ec39dc44a0b4766a167920e3f6de497a7ebe3ee9
5
5
  SHA512:
6
- metadata.gz: 9da291f938673bf76f55f4f4fddbf5a3355fe9c72ae30f8be8c9e224b9bea2f1a89dbcb2da8312ddbaca09dcd25da5511e904963400633d9ef193014da9ee0ec
7
- data.tar.gz: 21793a6a7f3fc730a123f7ed8ceacde1e930620b77fef63c7e30c919a9e9ebf3372a8a5208dbdf177880e011322f529d04558bd68d363cbfd85b023a1f2ed265
6
+ metadata.gz: 7086af3afd13d6cabe140cd550a53b9fed5117b496fb01e67ea4fc9a468d0e5e9a8c5f563fe330fae88a3c4a61fd9c98cbe6317ac1cf6478ab159b66afca9391
7
+ data.tar.gz: 438129e855a0da9ba74fd7a03c9de3abf3bd206cca4cfe5c70a5ae5ad21d88a927d3cc25738934a3a51f72c32781d48ea1da47c0f7db427a94945792a892641b
data/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Change log
2
2
 
3
+ ## 3.0.17 (2021-12-06)
4
+
5
+ * `#64545`: Fix an issue where `cast_str` in conjunction with `number` notes
6
+ lead to parsing errors when the given number had a leading zero, e.g. parsing
7
+ the string `08` lead to an error, as the number was interpreted as an octal
8
+ string. Numbers are now always being treated as decimal with base 10.
9
+
10
+ ## 3.0.16 (2021-11-23)
11
+
12
+ * Add setting `Schemacop.v3_default_options` which allows to set default node
13
+ options vor V3 schemas. This is particularly useful for the option `cast_str`
14
+ to allow string casting globally.
15
+
3
16
  ## 3.0.15 (2021-10-11)
4
17
 
5
18
  * Add support for custom string formatters
data/README_V3.md CHANGED
@@ -21,6 +21,7 @@
21
21
  13. [Reference](#reference)
22
22
  5. [Context](#context)
23
23
  6. [External schemas](#external-schemas)
24
+ 7. [Default options](#default-options)
24
25
 
25
26
  ## Validation
26
27
 
@@ -339,6 +340,8 @@ integer can be done.
339
340
  When set to `true`, this node also accepts strings that can be casted to an integer, e.g.
340
341
  the values `'-5'` or `'42'`. Please note that you can only validate numbers which
341
342
  are in the `Integer` format. Blank strings will be treated equally as `nil`.
343
+ Strings will be parsed with base 10, so only decimal numbers are allowed.
344
+ Leading zeroes will be ignored.
342
345
 
343
346
  #### Examples
344
347
 
@@ -420,7 +423,9 @@ With the various available options, validations on the value of the number can b
420
423
  When set to `true`, this node also accepts strings that can be casted to a number, e.g.
421
424
  the values `'0.1'` or `'3.1415'`. Please note that you can only validate numbers which
422
425
  are in the `Integer` or `Float` format, i.e. values like `'1.5r'` or `'(4 + 0i)'` will
423
- not work. Blank strings will be treated equally as `nil`.
426
+ not work. Blank strings will be treated equally as `nil`. Strings will be
427
+ parsed with base 10, so only decimal numbers are allowed. Leading zeroes will
428
+ be ignored.
424
429
 
425
430
  #### Examples
426
431
 
@@ -1449,3 +1454,21 @@ Schemacop::V3::GlobalContext.eager_load!
1449
1454
  As mentioned before, you can also use the external schemas without having to
1450
1455
  eager-load them, but if you use the schemas multiple times, it might be better
1451
1456
  to eager-load them on start of your application / script.
1457
+
1458
+ ## Default options
1459
+
1460
+ Using the setting `Schemacop.v3_default_options`, you can specify a hash
1461
+ containing default options that will be used for every schemacop node (options
1462
+ not supported by a particular node are automatically ignored). Options passed
1463
+ directly to a node still take precedence. The setting can be set in an
1464
+ initializer:
1465
+
1466
+ ```ruby
1467
+ # config/initializers/schemacop.rb
1468
+ Schemacop.v3_default_options = { cast_str: true }.freeze
1469
+
1470
+ # Example schema: As cast_str is enabled in the default options, strings will
1471
+ # automatically be casted where supported.
1472
+ schema = Schemacop::Schema3.new(:integer)
1473
+ schema.validate!('42') # => 42
1474
+ ```
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.0.15
1
+ 3.0.16
@@ -30,6 +30,8 @@ module Schemacop
30
30
 
31
31
  node = klass.new(**options, &block)
32
32
 
33
+ options = Schemacop.v3_default_options.slice(*klass.allowed_options).merge(options)
34
+
33
35
  if options.delete(:cast_str)
34
36
  format = NodeRegistry.name(klass)
35
37
  one_of_options = {
data/lib/schemacop.rb CHANGED
@@ -16,6 +16,9 @@ module Schemacop
16
16
  mattr_accessor :string_formatters
17
17
  self.string_formatters = {}
18
18
 
19
+ mattr_accessor :v3_default_options
20
+ self.v3_default_options = {}
21
+
19
22
  def self.register_string_formatter(name, pattern:, handler:)
20
23
  name = name.to_s.dasherize.to_sym
21
24
 
@@ -72,7 +75,7 @@ module Schemacop
72
75
  register_string_formatter(
73
76
  :integer,
74
77
  pattern: /^-?[0-9]+$/,
75
- handler: ->(value) { Integer(value) }
78
+ handler: ->(value) { Integer(value, 10) }
76
79
  )
77
80
 
78
81
  register_string_formatter(
@@ -84,7 +87,7 @@ module Schemacop
84
87
  register_string_formatter(
85
88
  :'integer-list',
86
89
  pattern: /^(-?[0-9]+)(,-?[0-9]+)*$/,
87
- handler: ->(value) { value.split(',').map(&:to_i) }
90
+ handler: ->(value) { value.split(',').map { |i| Integer(i, 10) } }
88
91
  )
89
92
 
90
93
  def self.with_context(context)
data/schemacop.gemspec CHANGED
@@ -1,14 +1,14 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: schemacop 3.0.15 ruby lib
2
+ # stub: schemacop 3.0.16 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "schemacop".freeze
6
- s.version = "3.0.15"
6
+ s.version = "3.0.16"
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 = "2021-10-11"
11
+ s.date = "2021-12-06"
12
12
  s.files = [".github/workflows/ruby.yml".freeze, ".gitignore".freeze, ".releaser_config".freeze, ".rubocop.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]
@@ -339,6 +339,11 @@ module Schemacop
339
339
  assert_cast('1', 1)
340
340
  assert_cast(1, 1)
341
341
 
342
+ assert_cast('08', 8)
343
+ assert_cast('09', 9)
344
+ assert_cast('050', 50)
345
+ assert_cast('01', 1)
346
+
342
347
  assert_cast(nil, nil)
343
348
  assert_cast('', nil)
344
349
 
@@ -181,6 +181,14 @@ module Schemacop
181
181
 
182
182
  assert_equal(@schema.root.children, [])
183
183
  end
184
+
185
+ def test_default_options
186
+ Schemacop.v3_default_options = { cast_str: true }.freeze
187
+ schema :number
188
+ assert_cast('1', 1)
189
+ ensure
190
+ Schemacop.v3_default_options = {}
191
+ end
184
192
  end
185
193
  end
186
194
  end
@@ -308,6 +308,11 @@ module Schemacop
308
308
  assert_cast('1', 1)
309
309
  assert_cast(1, 1)
310
310
 
311
+ assert_cast('08', 8)
312
+ assert_cast('09', 9)
313
+ assert_cast('050', 50)
314
+ assert_cast('01', 1)
315
+
311
316
  assert_validation(nil)
312
317
  assert_validation('')
313
318
 
@@ -263,6 +263,10 @@ module Schemacop
263
263
  assert_cast '1,-2,3', [1, -2, 3]
264
264
  assert_cast '1', [1]
265
265
  assert_cast '-1', [-1]
266
+ assert_cast '08', [8]
267
+ assert_cast '09', [9]
268
+ assert_cast '050', [50]
269
+ assert_cast '01,032', [1, 32]
266
270
  end
267
271
 
268
272
  def test_format_custom
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: 3.0.15
4
+ version: 3.0.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sitrox
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-11 00:00:00.000000000 Z
11
+ date: 2021-12-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -164,8 +164,8 @@ dependencies:
164
164
  - - '='
165
165
  - !ruby/object:Gem::Version
166
166
  version: 0.21.2
167
- description:
168
- email:
167
+ description:
168
+ email:
169
169
  executables: []
170
170
  extensions: []
171
171
  extra_rdoc_files: []
@@ -277,7 +277,7 @@ homepage: https://github.com/sitrox/schemacop
277
277
  licenses:
278
278
  - MIT
279
279
  metadata: {}
280
- post_install_message:
280
+ post_install_message:
281
281
  rdoc_options: []
282
282
  require_paths:
283
283
  - lib
@@ -292,8 +292,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
292
292
  - !ruby/object:Gem::Version
293
293
  version: '0'
294
294
  requirements: []
295
- rubygems_version: 3.0.3
296
- signing_key:
295
+ rubygems_version: 3.2.22
296
+ signing_key:
297
297
  specification_version: 4
298
298
  summary: Schemacop validates ruby structures consisting of nested hashes and arrays
299
299
  against simple schema definitions.