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 +4 -4
- data/CHANGELOG.md +7 -0
- data/README.md +5 -9
- data/README_CN.md +5 -9
- data/lib/rbdantic/json_schema/types.rb +4 -0
- data/lib/rbdantic/validators/types/date.rb +44 -0
- data/lib/rbdantic/validators/types/datetime.rb +40 -0
- data/lib/rbdantic/validators/types/time.rb +4 -0
- data/lib/rbdantic/validators/types.rb +5 -1
- data/lib/rbdantic/version.rb +1 -1
- metadata +3 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c5bc7743bd48fc0b326f385d47a196efac8731d0a614be08d5a7b0c4164c6c7c
|
|
4
|
+
data.tar.gz: f70a6506f8acc1c989f9e6ff557e87a606b212450b7a797abb42fd0178994ab8
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
|
@@ -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)
|
data/lib/rbdantic/version.rb
CHANGED
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.
|
|
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
|