datacaster 3.2.7 → 3.3.0

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: cecd5729ff179f70e6a7530603255f009814b7d4ef1d9dbe576a5f2b9e0bc222
4
- data.tar.gz: 4e234450bc92faf277789eb21ccbd03ddb544253250978da41d85dd9d12f8e39
3
+ metadata.gz: 57a921f071865d8d6fae653de1e80edc19e1eaf5d2a37450ccd7b32a24f4386f
4
+ data.tar.gz: 5307a9a2f7619c331efd7620a2e1a2a7a3b11a82bec3e6ad760e8ec75a29ad84
5
5
  SHA512:
6
- metadata.gz: 68e2588ec262fad2419fe3adf0a5d87aacfb28375ae47a277c4c8cb03e172913aec763375f1ffce90d2422269d219c1ff0f504921d5afc2be78c1efc8a3a2062
7
- data.tar.gz: 335ef1ea64bbc63c78b0c6ef44d330967173187d6ac15bdc7b788bee9b38be77ebc63e892d97914f99fa7da1f25a604f10c96038c2f6ad4bb15b6319f5b2db0b
6
+ metadata.gz: 5b7f3713ebd7ce4568ae79d612e0ee2a8277d0c6baeb398e24975ff95c1167d151649565378240445765ac3499ff5db0c65380d5f215556449505e6e9f2b88a1
7
+ data.tar.gz: 5dc58c8d0f853ce3d906e6606af932e7531012666f77a813bf38684463a4606e4bdae3d1f0c63ae1159a1573f30b274b3fffcf9224efa82c34705b73b1671261
@@ -6,7 +6,7 @@ jobs:
6
6
  runs-on: ubuntu-latest
7
7
  strategy:
8
8
  matrix:
9
- ruby-version: ['2.7', '3.0', '3.1']
9
+ ruby-version: ['3.1', '3.2', '3.3']
10
10
  steps:
11
11
  - uses: actions/checkout@v3
12
12
  - name: Set up Ruby
data/README.md CHANGED
@@ -31,6 +31,8 @@ It is currently used in production in several projects (mainly as request parame
31
31
  - [`hash_with_symbolized_keys(error_key = nil)`](#hash_with_symbolized_keyserror_key--nil)
32
32
  - [`integer32(error_key = nil)`](#integer32error_key--nil)
33
33
  - [`non_empty_string(error_key = nil)`](#non_empty_stringerror_key--nil)
34
+ - [`pattern(regexp, error_key = nil)`](#patternregexp-error_key--nil)
35
+ - [`uuid(error_key = nil)`](#uuiderror_key--nil)
34
36
  - [Special types](#special-types)
35
37
  - [`absent(error_key = nil, on: nil)`](#absenterror_key--nil-on-nil)
36
38
  - [`any(error_key = nil)`](#anyerror_key--nil)
@@ -525,9 +527,29 @@ I18n keys:
525
527
 
526
528
  Returns ValidResult if and only if provided value is a string and is not empty. Doesn't transform the value.
527
529
 
530
+ I18n keys:
531
+
528
532
  * not a string – `error_key`, `'.string'`, `'datacaster.errors.string'`
529
533
  * is empty – `error_key`, `'.non_empty_string'`, `'datacaster.errors.non_empty_string'`
530
534
 
535
+ #### `pattern(regexp, error_key = nil)`
536
+
537
+ Returns ValidResult if and only if provided value is a string and satisfies regexp. Doesn't transform the value. Don't forget to provide start/end markers in the regexp if needed, e.g. `/\A\d+\z/` for digits-only string.
538
+
539
+ I18n keys:
540
+
541
+ * not a string – `error_key`, `'.string'`, `'datacaster.errors.string'`
542
+ * doesn't satisfy the regexp – `error_key`, `'.pattern'`, `'datacaster.errors.pattern'`
543
+
544
+ #### `uuid(error_key = nil)`
545
+
546
+ Returns ValidResult if and only if provided value is a string and UUID. Doesn't transform the value.
547
+
548
+ I18n keys:
549
+
550
+ * not a string – `error_key`, `'.string'`, `'datacaster.errors.string'`
551
+ * not UUID – `error_key`, `'.uuid'`, `'datacaster.errors.uuid'`
552
+
531
553
  ### Special types
532
554
 
533
555
  #### `absent(error_key = nil, on: nil)`
@@ -825,7 +847,11 @@ I18n keys:
825
847
 
826
848
  #### `transform_to_value(value)`
827
849
 
828
- Always returns ValidResult. The value is transformed to provided argument (disregarding the original value). See also [`default`](#defaultdefault_value-on-nil).
850
+ Always returns ValidResult. The value is transformed to provided argument (disregarding the original value).
851
+
852
+ Returned value is deeply freezed with [`Ractor::make_shareable`](https://docs.ruby-lang.org/en/master/Ractor.html#method-c-make_shareable) to prevent application bugs due to modification of unintentionally shared value. If that effect is undesired, use [`transform { value }`](#transform--value--) instead.
853
+
854
+ See also [`default`](#defaultdefault_value-on-nil).
829
855
 
830
856
  ### "Web-form" types
831
857
 
@@ -16,6 +16,7 @@ en:
16
16
  integer32: is not a 32-bit integer
17
17
  iso8601: is not a string with ISO-8601 date and time
18
18
  must_be: "is not %{reference}"
19
+ pattern: has invalid format
19
20
  relate: "%{left} should be %{op} %{right}"
20
21
  responds_to: "does not respond to %{reference}"
21
22
  string: is not a string
@@ -25,3 +26,4 @@ en:
25
26
  non_empty_string: should be non-empty string
26
27
  switch: is invalid
27
28
  try: raised an error
29
+ uuid: is not UUID
data/datacaster.gemspec CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
8
8
 
9
9
  spec.summary = %q{Run-time type checker and transformer for Ruby}
10
10
  spec.license = 'MIT'
11
- spec.required_ruby_version = Gem::Requirement.new('>= 2.7.0')
11
+ spec.required_ruby_version = Gem::Requirement.new('>= 3.1')
12
12
 
13
13
  spec.metadata['source_code_uri'] = 'https://github.com/EugZol/datacaster'
14
14
  spec.homepage = 'https://github.com/EugZol/datacaster'
@@ -19,5 +19,9 @@ module Datacaster
19
19
  def present?
20
20
  false
21
21
  end
22
+
23
+ def ==(other)
24
+ other.is_a?(self.class)
25
+ end
22
26
  end
23
27
  end
@@ -276,7 +276,7 @@ module Datacaster
276
276
  end
277
277
 
278
278
  def transform_to_value(value)
279
- transform { value }
279
+ transform { Datacaster::Utils.deep_freeze(value) }
280
280
  end
281
281
 
282
282
  def with(keys, caster)
@@ -319,6 +319,12 @@ module Datacaster
319
319
  check { |x| x.is_a?(Float) }.i18n_key(*error_keys)
320
320
  end
321
321
 
322
+ def pattern(regexp, error_key = nil)
323
+ error_keys = ['.pattern', 'datacaster.errors.pattern']
324
+ error_keys.unshift(error_key) if error_key
325
+ string(error_key) & check { |x| x.match?(regexp) }.i18n_key(*error_keys, reference: regexp.inspect)
326
+ end
327
+
322
328
  # 'hash' would be a bad method name, because it would override built in Object#hash
323
329
  def hash_value(error_key = nil)
324
330
  error_keys = ['.hash_value', 'datacaster.errors.hash_value']
@@ -360,6 +366,12 @@ module Datacaster
360
366
  string(error_key) & check { |x| !x.empty? }.i18n_key(*error_keys)
361
367
  end
362
368
 
369
+ def uuid(error_key = nil)
370
+ error_keys = ['.uuid', 'datacaster.errors.uuid']
371
+ error_keys.unshift(error_key) if error_key
372
+ string(error_key) & pattern(/\A\h{8}-\h{4}-\h{4}-\h{4}-\h{12}\z/).i18n_key(*error_keys)
373
+ end
374
+
363
375
  # Form request types
364
376
 
365
377
  def iso8601(error_key = nil)
@@ -2,6 +2,10 @@ module Datacaster
2
2
  module Utils
3
3
  extend self
4
4
 
5
+ def deep_freeze(value, copy: true)
6
+ Ractor.make_shareable(value, copy:)
7
+ end
8
+
5
9
  def merge_errors(left, right)
6
10
  add_error_to_base = ->(hash, error) {
7
11
  hash[:base] ||= []
@@ -1,3 +1,3 @@
1
1
  module Datacaster
2
- VERSION = "3.2.7"
2
+ VERSION = "3.3.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datacaster
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.7
4
+ version: 3.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eugene Zolotarev
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-04-16 00:00:00.000000000 Z
11
+ date: 2024-07-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -106,7 +106,7 @@ dependencies:
106
106
  - - "<"
107
107
  - !ruby/object:Gem::Version
108
108
  version: '3'
109
- description:
109
+ description:
110
110
  email:
111
111
  - eugzol@gmail.com
112
112
  executables: []
@@ -178,7 +178,7 @@ licenses:
178
178
  - MIT
179
179
  metadata:
180
180
  source_code_uri: https://github.com/EugZol/datacaster
181
- post_install_message:
181
+ post_install_message:
182
182
  rdoc_options: []
183
183
  require_paths:
184
184
  - lib
@@ -186,15 +186,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
186
186
  requirements:
187
187
  - - ">="
188
188
  - !ruby/object:Gem::Version
189
- version: 2.7.0
189
+ version: '3.1'
190
190
  required_rubygems_version: !ruby/object:Gem::Requirement
191
191
  requirements:
192
192
  - - ">="
193
193
  - !ruby/object:Gem::Version
194
194
  version: '0'
195
195
  requirements: []
196
- rubygems_version: 3.1.6
197
- signing_key:
196
+ rubygems_version: 3.5.14
197
+ signing_key:
198
198
  specification_version: 4
199
199
  summary: Run-time type checker and transformer for Ruby
200
200
  test_files: []