rbdantic 0.1.1 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1f31756908c3f101b3467b76d592b01e79e6270ca65e6af2c7aafbfd0ec29362
4
- data.tar.gz: 4cc1e248332c2cfd58ff2e83d968d00c0bb1d73fd938fb927782eb898bb542b6
3
+ metadata.gz: c5bc7743bd48fc0b326f385d47a196efac8731d0a614be08d5a7b0c4164c6c7c
4
+ data.tar.gz: f70a6506f8acc1c989f9e6ff557e87a606b212450b7a797abb42fd0178994ab8
5
5
  SHA512:
6
- metadata.gz: 9e506a1022c3b43ac0ee4de6521e361648e32d10087ea99acdd292514fe5f0baced64ac88c10e3dccef6c1a6371f91cdefd9309ec299287fd3218b951904da5e
7
- data.tar.gz: 80614dccf3af5d2c19d90d373782bfcae399f228a9c5d036e4bfeaeab28776a418f67fe46c505ee9d189261deaea702407fa8042755e4be83c20b93061d527f4
6
+ metadata.gz: 5eb15d4b7adc30fea19a1605cc001cada89af20d0f020b8053e9a5763143391096627c5b5de9653de4e306b1dc1c23a14b7c3cae34adf4061d5c5d7c0aaffaab
7
+ data.tar.gz: c1603559a66b8917a2310613f939081f37f89295c5093a1199639dc8e0beb78f2c29550af26d36ec958f70eb24d5cc96db81f8fff59a7bea36d87e0a85a231aa
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.1.2] - 2026-04-07
4
+
5
+ - Add Date type validator with coercion support (ISO8601 string, Time, DateTime, days since epoch)
6
+ - Add DateTime type validator with coercion support (ISO8601 string, Time, Date, Unix timestamp)
7
+ - Extend Time validator to coerce from DateTime and Date
8
+ - Update JSON Schema generation for Date and DateTime types
9
+
3
10
  ## [0.1.1] - 2026-04-06
4
11
 
5
12
  - Add `to_h` alias method for `model_dump`
data/README.md CHANGED
@@ -614,6 +614,9 @@ config.enabled # => true
614
614
  | `Rbdantic::Boolean` | `"true"`, `"yes"`, `"on"`, `"1"`, `1`, `"false"`, `"no"`, `"off"`, `"0"`, `0` |
615
615
  | `Array` | String with `split`, any value with `to_a` |
616
616
  | `Hash` | Array of pairs, any value with `to_h` |
617
+ | `Time` | ISO8601 String, `Date`, `DateTime`, Unix timestamp (Integer/Float) |
618
+ | `Date` | ISO8601 String, `Time`, `DateTime`, days since epoch (Integer/Float) |
619
+ | `DateTime` | ISO8601 String, `Time`, `Date`, Unix timestamp (Integer/Float) |
617
620
 
618
621
  ## Validation Errors
619
622
 
@@ -649,17 +652,10 @@ end
649
652
  | `[Type]` | Array with per-item validation |
650
653
  | `Hash` | Key-value hash type |
651
654
  | `Time` | Ruby Time type |
655
+ | `Date` | Ruby Date type |
656
+ | `DateTime` | Ruby DateTime type |
652
657
  | `Rbdantic::BaseModel` subclass | Nested model validation |
653
658
 
654
- **Note:** Use `Rbdantic::Boolean` for public boolean fields.
655
-
656
- ```ruby
657
- class Config < Rbdantic::BaseModel
658
- field :enabled, Rbdantic::Boolean
659
- field :active, Rbdantic::Boolean, optional: true
660
- end
661
- ```
662
-
663
659
  ## Format Validation
664
660
 
665
661
  Built-in format validators for common patterns:
data/README_CN.md CHANGED
@@ -614,6 +614,9 @@ config.enabled # => true
614
614
  | `Rbdantic::Boolean` | `"true"`, `"yes"`, `"on"`, `"1"`, `1`, `"false"`, `"no"`, `"off"`, `"0"`, `0` |
615
615
  | `Array` | 可用 `split` 分割的字符串,任何有 `to_a` 方法的值 |
616
616
  | `Hash` | 键值对数组,任何有 `to_h` 方法的值 |
617
+ | `Time` | ISO8601 字符串, `Date`, `DateTime`, Unix 时间戳 (Integer/Float) |
618
+ | `Date` | ISO8601 字符串, `Time`, `DateTime`, 纪元天数 (Integer/Float) |
619
+ | `DateTime` | ISO8601 字符串, `Time`, `Date`, Unix 时间戳 (Integer/Float) |
617
620
 
618
621
  ## 验证错误
619
622
 
@@ -649,17 +652,10 @@ end
649
652
  | `[Type]` | 带元素校验的数组 |
650
653
  | `Hash` | 键值哈希类型 |
651
654
  | `Time` | Ruby Time 类型 |
655
+ | `Date` | Ruby Date 类型 |
656
+ | `DateTime` | Ruby DateTime 类型 |
652
657
  | `Rbdantic::BaseModel` 子类 | 嵌套模型验证 |
653
658
 
654
- **注意:** 对外布尔字段统一使用 `Rbdantic::Boolean`。
655
-
656
- ```ruby
657
- class Config < Rbdantic::BaseModel
658
- field :enabled, Rbdantic::Boolean
659
- field :active, Rbdantic::Boolean, optional: true
660
- end
661
- ```
662
-
663
659
  ## 格式验证
664
660
 
665
661
  内置常用格式的验证器:
@@ -35,6 +35,10 @@ module Rbdantic
35
35
  { "type" => "number" }
36
36
  elsif type == ::Time
37
37
  { "type" => "string", "format" => "date-time" }
38
+ elsif type == ::Date
39
+ { "type" => "string", "format" => "date" }
40
+ elsif type == ::DateTime
41
+ { "type" => "string", "format" => "date-time" }
38
42
  elsif type == ::Rbdantic::Boolean
39
43
  { "type" => "boolean" }
40
44
  elsif type == ::Array
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "date"
4
+ require_relative "base"
5
+
6
+ module Rbdantic
7
+ module Validators
8
+ module Types
9
+ class Date < Base
10
+ def matches_type?(value)
11
+ value.is_a?(::Date) && !value.is_a?(::DateTime)
12
+ end
13
+
14
+ def expected_type_name
15
+ "Date"
16
+ end
17
+
18
+ def coerce(value)
19
+ case value
20
+ when ::Date
21
+ # DateTime is a subclass of Date, so this handles both
22
+ # But we need to convert DateTime to Date (drop time info)
23
+ if value.is_a?(::DateTime)
24
+ value.to_date
25
+ else
26
+ value
27
+ end
28
+ when ::Time
29
+ value.to_date
30
+ when ::String
31
+ ::Date.iso8601(value)
32
+ when ::Integer, ::Float
33
+ # Treat as days since Unix epoch (1970-01-01)
34
+ # Integer: whole days (e.g., 0 => 1970-01-01, 1 => 1970-01-02)
35
+ # Float: truncated to whole days (e.g., 1.5 => 1970-01-02)
36
+ ::Date.new(1970, 1, 1) + value
37
+ end
38
+ rescue ArgumentError
39
+ nil
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "date"
4
+ require_relative "base"
5
+
6
+ module Rbdantic
7
+ module Validators
8
+ module Types
9
+ class DateTime < Base
10
+ def matches_type?(value)
11
+ value.is_a?(::DateTime)
12
+ end
13
+
14
+ def expected_type_name
15
+ "DateTime"
16
+ end
17
+
18
+ def coerce(value)
19
+ case value
20
+ when ::DateTime
21
+ value
22
+ when ::Time
23
+ value.to_datetime
24
+ when ::Date
25
+ value.to_datetime
26
+ when ::String
27
+ ::DateTime.iso8601(value)
28
+ when ::Integer, ::Float
29
+ # Unix timestamp in seconds since 1970-01-01 00:00:00 UTC
30
+ # Integer: whole seconds (e.g., 86400 => 1970-01-02 00:00:00)
31
+ # Float: preserves fractional seconds (e.g., 86400.5 => 1970-01-02 00:00:00.5)
32
+ ::DateTime.new(1970, 1, 1) + (value / 86_400.0)
33
+ end
34
+ rescue ArgumentError
35
+ nil
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -19,6 +19,10 @@ module Rbdantic
19
19
  case value
20
20
  when ::Time
21
21
  value
22
+ when ::DateTime
23
+ value.to_time
24
+ when ::Date
25
+ value.to_time
22
26
  when ::String
23
27
  ::Time.iso8601(value)
24
28
  when ::Integer, ::Float
@@ -10,6 +10,8 @@ require_relative "types/array"
10
10
  require_relative "types/hash"
11
11
  require_relative "types/symbol"
12
12
  require_relative "types/time"
13
+ require_relative "types/date"
14
+ require_relative "types/datetime"
13
15
  require_relative "types/model"
14
16
 
15
17
  module Rbdantic
@@ -26,7 +28,9 @@ module Rbdantic
26
28
  ::Array => Validators::Types::Array,
27
29
  ::Hash => Validators::Types::Hash,
28
30
  ::Symbol => Validators::Types::Symbol,
29
- ::Time => Validators::Types::Time
31
+ ::Time => Validators::Types::Time,
32
+ ::Date => Validators::Types::Date,
33
+ ::DateTime => Validators::Types::DateTime
30
34
  }.freeze
31
35
 
32
36
  def self.validator_class_for(type)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Rbdantic
4
- VERSION = "0.1.1"
4
+ VERSION = "0.1.2"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbdantic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - cp5670681
@@ -45,6 +45,8 @@ files:
45
45
  - lib/rbdantic/validators/types/array.rb
46
46
  - lib/rbdantic/validators/types/base.rb
47
47
  - lib/rbdantic/validators/types/boolean.rb
48
+ - lib/rbdantic/validators/types/date.rb
49
+ - lib/rbdantic/validators/types/datetime.rb
48
50
  - lib/rbdantic/validators/types/float.rb
49
51
  - lib/rbdantic/validators/types/hash.rb
50
52
  - lib/rbdantic/validators/types/integer.rb