datacaster 4.0.1 → 4.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9709949f8f91c24538332b215d2d08af58a7b1e83869dcde0198512889b1775c
4
- data.tar.gz: 791d875d336e229796f302b448256b6b4ad1a3d6f10e10702af49a3cbb6faf4e
3
+ metadata.gz: 313d4857ebb527af62b00822c82ae25ca81d143fac6d46586704efda3337907d
4
+ data.tar.gz: cafec5e89d47418b72a3b9a9123699d2c4d8c479f8d7720739f4dd59b47e4d72
5
5
  SHA512:
6
- metadata.gz: 7631f63485017a7c431993b80ecb9795c060e02c8742a2cf82400866b578e244caa9d2e783769cf7b3d153336d8242790c68daf652c6d53fdbe94f387230a1bc
7
- data.tar.gz: 551810cf2025496263579b9b3bfd051970a5149a08bf51fd6ac7a4b6ad40fc74b8819fb3e941e7738a8e2e826f75ac5119759864ea740826e95ca3c30d9e316a
6
+ metadata.gz: 7929550a2f1ca7c0b3002ccb32b27336a094737647d0aaaffcdc54001d1084ebfebc8c168b98096e59b7d990cccb1dc8e495cf4a4dcd9fbf0cb1168117f43ba1
7
+ data.tar.gz: 2a7fa2d4528c014fefd3c701c797566ea6eb9bcee08442bbe79f3fa881f9adb473e8424d909b05f0e0a2109ce79265bafb6b700b4873cb89778ab2ff601698c2
data/README.md CHANGED
@@ -26,10 +26,13 @@ It is currently used in production in several projects (mainly as request parame
26
26
  - [`float(error_key = nil)`](#floaterror_key--nil)
27
27
  - [`hash_value(error_key = nil)`](#hash_valueerror_key--nil)
28
28
  - [`integer(error_key = nil)`](#integererror_key--nil)
29
+ - [`numeric(error_key = nil)`](#numericerror_key--nil)
29
30
  - [`string(error_key = nil)`](#stringerror_key--nil)
30
31
  - [Convenience types](#convenience-types)
31
32
  - [`hash_with_symbolized_keys(error_key = nil)`](#hash_with_symbolized_keyserror_key--nil)
32
33
  - [`integer32(error_key = nil)`](#integer32error_key--nil)
34
+ - [`maximum(max, error_key = nil, inclusive: true)`](#maximummax-error_key--nil-inclusive-true)
35
+ - [`minimum(min, error_key = nil, inclusive: true)`](#minimummin-error_key--nil-inclusive-true)
33
36
  - [`non_empty_string(error_key = nil)`](#non_empty_stringerror_key--nil)
34
37
  - [`pattern(regexp, error_key = nil)`](#patternregexp-error_key--nil)
35
38
  - [`uuid(error_key = nil)`](#uuiderror_key--nil)
@@ -500,6 +503,12 @@ Returns ValidResult if and only if provided value is an integer. Doesn't transfo
500
503
 
501
504
  I18n keys: `error_key`, `'.integer'`, `'datacaster.errors.integer'`.
502
505
 
506
+ #### `numeric(error_key = nil)`
507
+
508
+ Returns ValidResult if and only if provided value is a number (Ruby's `Numeric`). Doesn't transform the value.
509
+
510
+ I18n keys: `error_key`, `'.numeric'`, `'datacaster.errors.numeric'`.
511
+
503
512
  #### `string(error_key = nil)`
504
513
 
505
514
  Returns ValidResult if and only if provided value is a string. Doesn't transform the value.
@@ -523,6 +532,26 @@ I18n keys:
523
532
  * not an integer – `error_key`, `'.integer'`, `'datacaster.errors.integer'`
524
533
  * too big – `error_key`, `'.integer32'`, `'datacaster.errors.integer32'`
525
534
 
535
+ #### `maximum(max, error_key = nil, inclusive: true)`
536
+
537
+ Returns ValidResult if and only if provided value is a number and is less than `max`. If `inclusive` set to true, provided value should be less than or equal to `max`. Doesn't transform the value.
538
+
539
+ I18n keys:
540
+
541
+ * not a number – `error_key`, `'.numeric'`, `'datacaster.errors.numeric'`
542
+ * is less (when `inclusive` is `true`) – `error_key`, `'.maximum.lteq'`, `'datacaster.errors.maximum.lteq'`
543
+ * is less (when `inclusive` is `false`) – `error_key`, `'.maximum.lt'`, `'datacaster.errors.maximum.lt'`
544
+
545
+ #### `minimum(min, error_key = nil, inclusive: true)`
546
+
547
+ Returns ValidResult if and only if provided value is a number and is greater than `min`. If `inclusive` set to true, provided value should be greater than or equal to `min`. Doesn't transform the value.
548
+
549
+ I18n keys:
550
+
551
+ * not a number – `error_key`, `'.numeric'`, `'datacaster.errors.numeric'`
552
+ * is greater (when `inclusive` is `true`) – `error_key`, `'.minimum.gteq'`, `'datacaster.errors.minimum.gteq'`
553
+ * is greater (when `inclusive` is `false`) – `error_key`, `'.minimum.gt'`, `'datacaster.errors.minimum.gt'`
554
+
526
555
  #### `non_empty_string(error_key = nil)`
527
556
 
528
557
  Returns ValidResult if and only if provided value is a string and is not empty. Doesn't transform the value.
@@ -1547,6 +1576,18 @@ schema.with_context(five: 15).(nil)
1547
1576
  # => Datacaster::ValidResult(nil)
1548
1577
  ```
1549
1578
 
1579
+ Method `has_key?` could be used to determine whether key is available in the context
1580
+
1581
+ ```ruby
1582
+ schema =
1583
+ Datacaster.schema do
1584
+ check { context.has_key?(:five) }
1585
+ end
1586
+
1587
+ schema.with_context(five: 15).(nil)
1588
+ # => Datacaster::ValidResult(nil)
1589
+ ```
1590
+
1550
1591
  **Note**
1551
1592
 
1552
1593
  `context` can be accesed only in casters' blocks. It can't be used in schema definition itself:
@@ -15,7 +15,14 @@ en:
15
15
  integer: is not an integer
16
16
  integer32: is not a 32-bit integer
17
17
  iso8601: is not a string with ISO-8601 date and time
18
+ maximum:
19
+ lt: '%{value} should be less than %{max}'
20
+ lteq: '%{value} should be less than or equal to %{max}'
21
+ minimum:
22
+ gt: '%{value} should be greater than %{min}'
23
+ gteq: '%{value} should be greater than or equal to %{min}'
18
24
  must_be: "is not %{reference}"
25
+ numeric: is not a number
19
26
  pattern: has invalid format
20
27
  relate: "%{left} should be %{op} %{right}"
21
28
  responds_to: "does not respond to %{reference}"
@@ -296,6 +296,12 @@ module Datacaster
296
296
 
297
297
  # Strict types
298
298
 
299
+ def numeric(error_key = nil)
300
+ error_keys = ['.numeric', 'datacaster.errors.numeric']
301
+ error_keys.unshift(error_key) if error_key
302
+ check { |x| x.is_a?(Numeric) }.i18n_key(*error_keys)
303
+ end
304
+
299
305
  def decimal(digits = 8, error_key = nil)
300
306
  error_keys = ['.decimal', 'datacaster.errors.decimal']
301
307
  error_keys.unshift(error_key) if error_key
@@ -355,6 +361,42 @@ module Datacaster
355
361
  integer(error_key) & check { |x| x.abs <= 2_147_483_647 }.i18n_key(*error_keys)
356
362
  end
357
363
 
364
+ def maximum(max, error_key = nil, inclusive: true)
365
+ subkey = 'lt'
366
+ subkey += 'eq' if inclusive
367
+
368
+ error_keys = [".maximum.#{subkey}", "datacaster.errors.maximum.#{subkey}"]
369
+
370
+ error_keys.unshift(error_key) if error_key
371
+
372
+ caster =
373
+ if inclusive
374
+ check { |x| x <= max }
375
+ else
376
+ check { |x| x < max }
377
+ end
378
+
379
+ numeric(error_key) & caster.i18n_key(*error_keys, max:)
380
+ end
381
+
382
+ def minimum(min, error_key = nil, inclusive: true)
383
+ subkey = 'gt'
384
+ subkey += 'eq' if inclusive
385
+
386
+ error_keys = [".minimum.#{subkey}", "datacaster.errors.minimum.#{subkey}"]
387
+
388
+ error_keys.unshift(error_key) if error_key
389
+
390
+ caster =
391
+ if inclusive
392
+ check { |x| x >= min }
393
+ else
394
+ check { |x| x > min }
395
+ end
396
+
397
+ numeric(error_key) & caster.i18n_key(*error_keys, min:)
398
+ end
399
+
358
400
  def string(error_key = nil)
359
401
  error_keys = ['.string', 'datacaster.errors.string']
360
402
  error_keys.unshift(error_key) if error_key
@@ -4,6 +4,10 @@ module Datacaster
4
4
  module Runtimes
5
5
  class UserContext < Base
6
6
  class ContextStruct
7
+ def self.context_has_key?(context, key)
8
+ context.respond_to?(:key?) && context.key?(key) || context.to_h.key?(key.to_sym)
9
+ end
10
+
7
11
  def initialize(context, node)
8
12
  @context = context
9
13
  @node = node
@@ -14,10 +18,7 @@ module Datacaster
14
18
  return super
15
19
  end
16
20
 
17
- key_present = @context.respond_to?(:key?) && @context.key?(m) ||
18
- @context.to_h.key?(m.to_sym)
19
-
20
- if key_present && args.empty?
21
+ if self.class.context_has_key?(@context, m) && args.empty?
21
22
  return @context[m]
22
23
  end
23
24
 
@@ -31,6 +32,12 @@ module Datacaster
31
32
  raise NoMethodError.new("Key #{m.inspect} is not found in the context")
32
33
  end
33
34
  end
35
+
36
+ def has_key?(key)
37
+ self.class.context_has_key?(@context, key) || @node.class.send_to_parent(@node, :context).has_key?(key)
38
+ rescue NoMethodError
39
+ false
40
+ end
34
41
  end
35
42
 
36
43
  def initialize(parent, user_context)
@@ -1,3 +1,3 @@
1
1
  module Datacaster
2
- VERSION = "4.0.1"
2
+ VERSION = "4.2.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: 4.0.1
4
+ version: 4.2.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-10-08 00:00:00.000000000 Z
11
+ date: 2025-02-03 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
@@ -193,8 +193,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
193
193
  - !ruby/object:Gem::Version
194
194
  version: '0'
195
195
  requirements: []
196
- rubygems_version: 3.5.21
197
- signing_key:
196
+ rubygems_version: 3.5.20
197
+ signing_key:
198
198
  specification_version: 4
199
199
  summary: Run-time type checker and transformer for Ruby
200
200
  test_files: []