castkit 0.2.0 → 0.3.1

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.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +40 -1
  3. data/README.md +297 -13
  4. data/castkit.gemspec +3 -0
  5. data/lib/castkit/attribute.rb +82 -59
  6. data/lib/castkit/attributes/definition.rb +64 -0
  7. data/lib/castkit/attributes/options.rb +214 -0
  8. data/lib/castkit/castkit.rb +18 -5
  9. data/lib/castkit/cli/generate.rb +112 -0
  10. data/lib/castkit/cli/list.rb +200 -0
  11. data/lib/castkit/cli/main.rb +43 -0
  12. data/lib/castkit/cli.rb +24 -0
  13. data/lib/castkit/configuration.rb +31 -8
  14. data/lib/castkit/contract/{generic.rb → base.rb} +5 -17
  15. data/lib/castkit/contract/result.rb +2 -2
  16. data/lib/castkit/contract/validator.rb +5 -1
  17. data/lib/castkit/contract.rb +5 -5
  18. data/lib/castkit/core/attributes.rb +87 -44
  19. data/lib/castkit/data_object.rb +11 -30
  20. data/lib/castkit/{ext → dsl}/attribute/access.rb +1 -1
  21. data/lib/castkit/{ext → dsl}/attribute/error_handling.rb +1 -1
  22. data/lib/castkit/{ext → dsl}/attribute/options.rb +1 -1
  23. data/lib/castkit/{ext → dsl}/attribute/validation.rb +3 -3
  24. data/lib/castkit/dsl/attribute.rb +47 -0
  25. data/lib/castkit/{ext → dsl}/data_object/contract.rb +2 -2
  26. data/lib/castkit/{ext → dsl}/data_object/deserialization.rb +6 -2
  27. data/lib/castkit/dsl/data_object/plugins.rb +86 -0
  28. data/lib/castkit/{ext → dsl}/data_object/serialization.rb +1 -1
  29. data/lib/castkit/dsl/data_object.rb +61 -0
  30. data/lib/castkit/inflector.rb +1 -1
  31. data/lib/castkit/plugins.rb +82 -0
  32. data/lib/castkit/serializers/base.rb +94 -0
  33. data/lib/castkit/serializers/default_serializer.rb +156 -0
  34. data/lib/castkit/types/{generic.rb → base.rb} +30 -10
  35. data/lib/castkit/types/boolean.rb +14 -10
  36. data/lib/castkit/types/collection.rb +13 -2
  37. data/lib/castkit/types/date.rb +2 -2
  38. data/lib/castkit/types/date_time.rb +2 -2
  39. data/lib/castkit/types/float.rb +5 -5
  40. data/lib/castkit/types/integer.rb +5 -5
  41. data/lib/castkit/types/string.rb +2 -2
  42. data/lib/castkit/types.rb +1 -1
  43. data/lib/castkit/validators/base.rb +59 -0
  44. data/lib/castkit/validators/boolean_validator.rb +39 -0
  45. data/lib/castkit/validators/collection_validator.rb +29 -0
  46. data/lib/castkit/validators/float_validator.rb +31 -0
  47. data/lib/castkit/validators/integer_validator.rb +31 -0
  48. data/lib/castkit/validators/numeric_validator.rb +2 -2
  49. data/lib/castkit/validators/string_validator.rb +3 -4
  50. data/lib/castkit/version.rb +1 -1
  51. data/lib/castkit.rb +1 -4
  52. data/lib/generators/attribute.rb +39 -0
  53. data/lib/generators/base.rb +97 -0
  54. data/lib/generators/contract.rb +68 -0
  55. data/lib/generators/data_object.rb +48 -0
  56. data/lib/generators/plugin.rb +25 -0
  57. data/lib/generators/serializer.rb +28 -0
  58. data/lib/generators/templates/attribute.rb.tt +21 -0
  59. data/lib/generators/templates/attribute_spec.rb.tt +41 -0
  60. data/lib/generators/templates/contract.rb.tt +26 -0
  61. data/lib/generators/templates/contract_spec.rb.tt +76 -0
  62. data/lib/generators/templates/data_object.rb.tt +17 -0
  63. data/lib/generators/templates/data_object_spec.rb.tt +36 -0
  64. data/lib/generators/templates/plugin.rb.tt +37 -0
  65. data/lib/generators/templates/plugin_spec.rb.tt +18 -0
  66. data/lib/generators/templates/serializer.rb.tt +24 -0
  67. data/lib/generators/templates/serializer_spec.rb.tt +14 -0
  68. data/lib/generators/templates/type.rb.tt +57 -0
  69. data/lib/generators/templates/type_spec.rb.tt +42 -0
  70. data/lib/generators/templates/validator.rb.tt +26 -0
  71. data/lib/generators/templates/validator_spec.rb.tt +23 -0
  72. data/lib/generators/type.rb +29 -0
  73. data/lib/generators/validator.rb +41 -0
  74. metadata +92 -16
  75. data/.rspec_status +0 -196
  76. data/lib/castkit/core/registerable.rb +0 -59
  77. data/lib/castkit/default_serializer.rb +0 -154
  78. data/lib/castkit/serializer.rb +0 -92
  79. data/lib/castkit/validators/base_validator.rb +0 -39
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "thor/group"
4
+ require "castkit/inflector"
5
+ require_relative "base"
6
+
7
+ module Castkit
8
+ module Generators
9
+ # Generator for creating a new Castkit validator.
10
+ #
11
+ # Validators are responsible for asserting that a given value conforms to a rule.
12
+ # They are typically used inside a type’s `#validate!` method or within custom contract logic.
13
+ #
14
+ # Example usage:
15
+ # $ castkit generate validator Money
16
+ #
17
+ # Generates:
18
+ # - lib/castkit/validators/money.rb
19
+ # - spec/castkit/validators/money_spec.rb
20
+ #
21
+ # These files scaffold a `Castkit::Validators::Money` class with a `#call` method
22
+ # and a corresponding RSpec test suite.
23
+ #
24
+ # @see Castkit::Generators::Base
25
+ class Validator < Castkit::Generators::Base
26
+ component :validator
27
+
28
+ private
29
+
30
+ # Provides extra context used within ERB templates for this generator.
31
+ #
32
+ # @return [Hash]
33
+ def config
34
+ super.merge(
35
+ default_value: "example",
36
+ sample_context: "field_name"
37
+ )
38
+ end
39
+ end
40
+ end
41
+ end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: castkit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Lucas
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-04-16 00:00:00.000000000 Z
11
+ date: 2025-12-09 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: thor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: rspec
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +52,34 @@ dependencies:
38
52
  - - ">="
39
53
  - !ruby/object:Gem::Version
40
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: simplecov
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov-cobertura
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
41
83
  - !ruby/object:Gem::Dependency
42
84
  name: yard
43
85
  requirement: !ruby/object:Gem::Requirement
@@ -62,7 +104,6 @@ extensions: []
62
104
  extra_rdoc_files: []
63
105
  files:
64
106
  - ".rspec"
65
- - ".rspec_status"
66
107
  - ".rubocop.yml"
67
108
  - CHANGELOG.md
68
109
  - CODE_OF_CONDUCT.md
@@ -72,43 +113,78 @@ files:
72
113
  - castkit.gemspec
73
114
  - lib/castkit.rb
74
115
  - lib/castkit/attribute.rb
116
+ - lib/castkit/attributes/definition.rb
117
+ - lib/castkit/attributes/options.rb
75
118
  - lib/castkit/castkit.rb
119
+ - lib/castkit/cli.rb
120
+ - lib/castkit/cli/generate.rb
121
+ - lib/castkit/cli/list.rb
122
+ - lib/castkit/cli/main.rb
76
123
  - lib/castkit/configuration.rb
77
124
  - lib/castkit/contract.rb
125
+ - lib/castkit/contract/base.rb
78
126
  - lib/castkit/contract/data_object.rb
79
- - lib/castkit/contract/generic.rb
80
127
  - lib/castkit/contract/result.rb
81
128
  - lib/castkit/contract/validator.rb
82
129
  - lib/castkit/core/attribute_types.rb
83
130
  - lib/castkit/core/attributes.rb
84
131
  - lib/castkit/core/config.rb
85
- - lib/castkit/core/registerable.rb
86
132
  - lib/castkit/data_object.rb
87
- - lib/castkit/default_serializer.rb
133
+ - lib/castkit/dsl/attribute.rb
134
+ - lib/castkit/dsl/attribute/access.rb
135
+ - lib/castkit/dsl/attribute/error_handling.rb
136
+ - lib/castkit/dsl/attribute/options.rb
137
+ - lib/castkit/dsl/attribute/validation.rb
138
+ - lib/castkit/dsl/data_object.rb
139
+ - lib/castkit/dsl/data_object/contract.rb
140
+ - lib/castkit/dsl/data_object/deserialization.rb
141
+ - lib/castkit/dsl/data_object/plugins.rb
142
+ - lib/castkit/dsl/data_object/serialization.rb
88
143
  - lib/castkit/error.rb
89
- - lib/castkit/ext/attribute/access.rb
90
- - lib/castkit/ext/attribute/error_handling.rb
91
- - lib/castkit/ext/attribute/options.rb
92
- - lib/castkit/ext/attribute/validation.rb
93
- - lib/castkit/ext/data_object/contract.rb
94
- - lib/castkit/ext/data_object/deserialization.rb
95
- - lib/castkit/ext/data_object/serialization.rb
96
144
  - lib/castkit/inflector.rb
97
- - lib/castkit/serializer.rb
145
+ - lib/castkit/plugins.rb
146
+ - lib/castkit/serializers/base.rb
147
+ - lib/castkit/serializers/default_serializer.rb
98
148
  - lib/castkit/types.rb
149
+ - lib/castkit/types/base.rb
99
150
  - lib/castkit/types/boolean.rb
100
151
  - lib/castkit/types/collection.rb
101
152
  - lib/castkit/types/date.rb
102
153
  - lib/castkit/types/date_time.rb
103
154
  - lib/castkit/types/float.rb
104
- - lib/castkit/types/generic.rb
105
155
  - lib/castkit/types/integer.rb
106
156
  - lib/castkit/types/string.rb
107
157
  - lib/castkit/validator.rb
108
- - lib/castkit/validators/base_validator.rb
158
+ - lib/castkit/validators/base.rb
159
+ - lib/castkit/validators/boolean_validator.rb
160
+ - lib/castkit/validators/collection_validator.rb
161
+ - lib/castkit/validators/float_validator.rb
162
+ - lib/castkit/validators/integer_validator.rb
109
163
  - lib/castkit/validators/numeric_validator.rb
110
164
  - lib/castkit/validators/string_validator.rb
111
165
  - lib/castkit/version.rb
166
+ - lib/generators/attribute.rb
167
+ - lib/generators/base.rb
168
+ - lib/generators/contract.rb
169
+ - lib/generators/data_object.rb
170
+ - lib/generators/plugin.rb
171
+ - lib/generators/serializer.rb
172
+ - lib/generators/templates/attribute.rb.tt
173
+ - lib/generators/templates/attribute_spec.rb.tt
174
+ - lib/generators/templates/contract.rb.tt
175
+ - lib/generators/templates/contract_spec.rb.tt
176
+ - lib/generators/templates/data_object.rb.tt
177
+ - lib/generators/templates/data_object_spec.rb.tt
178
+ - lib/generators/templates/plugin.rb.tt
179
+ - lib/generators/templates/plugin_spec.rb.tt
180
+ - lib/generators/templates/serializer.rb.tt
181
+ - lib/generators/templates/serializer_spec.rb.tt
182
+ - lib/generators/templates/type.rb.tt
183
+ - lib/generators/templates/type_spec.rb.tt
184
+ - lib/generators/templates/validator.rb.tt
185
+ - lib/generators/templates/validator_spec.rb.tt
186
+ - lib/generators/type.rb
187
+ - lib/generators/validator.rb
112
188
  - sig/castkit.rbs
113
189
  homepage: https://github.com/bnlucas/castkit
114
190
  licenses:
data/.rspec_status DELETED
@@ -1,196 +0,0 @@
1
- example_id | status | run_time |
2
- ------------------------------------------------------------- | ------ | --------------- |
3
- ./spec/castkit/attribute_spec.rb[1:1:1] | passed | 0.00049 seconds |
4
- ./spec/castkit/attribute_spec.rb[1:1:2] | passed | 0.00004 seconds |
5
- ./spec/castkit/attribute_spec.rb[1:1:3] | passed | 0.00004 seconds |
6
- ./spec/castkit/attribute_spec.rb[1:1:4] | passed | 0.00004 seconds |
7
- ./spec/castkit/attribute_spec.rb[1:2:1] | passed | 0.00091 seconds |
8
- ./spec/castkit/attribute_spec.rb[1:3:1] | passed | 0.00004 seconds |
9
- ./spec/castkit/attribute_spec.rb[1:3:2] | passed | 0.00004 seconds |
10
- ./spec/castkit/attribute_spec.rb[1:3:3] | passed | 0.00006 seconds |
11
- ./spec/castkit/attribute_spec.rb[1:3:4] | passed | 0.00051 seconds |
12
- ./spec/castkit/contract/validator_spec.rb[1:1:1:1] | passed | 0.00007 seconds |
13
- ./spec/castkit/contract/validator_spec.rb[1:1:2:1] | passed | 0.00047 seconds |
14
- ./spec/castkit/contract/validator_spec.rb[1:1:3:1] | passed | 0.0001 seconds |
15
- ./spec/castkit/contract/validator_spec.rb[1:1:4:1] | passed | 0.00008 seconds |
16
- ./spec/castkit/contract/validator_spec.rb[1:1:5:1] | passed | 0.00007 seconds |
17
- ./spec/castkit/contract_spec.rb[1:1:1] | passed | 0.0004 seconds |
18
- ./spec/castkit/contract_spec.rb[1:1:2] | passed | 0.00108 seconds |
19
- ./spec/castkit/contract_spec.rb[1:1:3] | passed | 0.00008 seconds |
20
- ./spec/castkit/contract_spec.rb[1:1:4] | passed | 0.00005 seconds |
21
- ./spec/castkit/contract_spec.rb[1:1:5] | passed | 0.00006 seconds |
22
- ./spec/castkit/contract_spec.rb[1:1:6] | passed | 0.00005 seconds |
23
- ./spec/castkit/core/attribute_types_spec.rb[1:1:1] | passed | 0.00004 seconds |
24
- ./spec/castkit/core/attribute_types_spec.rb[1:1:2] | passed | 0.00003 seconds |
25
- ./spec/castkit/core/attribute_types_spec.rb[1:1:3] | passed | 0.00003 seconds |
26
- ./spec/castkit/core/attribute_types_spec.rb[1:1:4] | passed | 0.00007 seconds |
27
- ./spec/castkit/core/attribute_types_spec.rb[1:1:5] | passed | 0.00003 seconds |
28
- ./spec/castkit/core/attribute_types_spec.rb[1:1:6] | passed | 0.00003 seconds |
29
- ./spec/castkit/core/attribute_types_spec.rb[1:1:7] | passed | 0.00003 seconds |
30
- ./spec/castkit/core/attribute_types_spec.rb[1:1:8] | passed | 0.00003 seconds |
31
- ./spec/castkit/core/attribute_types_spec.rb[1:1:9] | passed | 0.00003 seconds |
32
- ./spec/castkit/core/attribute_types_spec.rb[1:1:10] | passed | 0.00004 seconds |
33
- ./spec/castkit/core/attribute_types_spec.rb[1:1:11] | passed | 0.00003 seconds |
34
- ./spec/castkit/core/attribute_types_spec.rb[1:1:12] | passed | 0.00003 seconds |
35
- ./spec/castkit/core/attributes_spec.rb[1:1:1] | passed | 0.00005 seconds |
36
- ./spec/castkit/core/attributes_spec.rb[1:1:2] | passed | 0.00005 seconds |
37
- ./spec/castkit/core/attributes_spec.rb[1:1:3] | passed | 0.00005 seconds |
38
- ./spec/castkit/core/attributes_spec.rb[1:2:1] | passed | 0.00007 seconds |
39
- ./spec/castkit/core/attributes_spec.rb[1:3:1] | passed | 0.00005 seconds |
40
- ./spec/castkit/core/attributes_spec.rb[1:4:1] | passed | 0.00056 seconds |
41
- ./spec/castkit/core/attributes_spec.rb[1:5:1] | passed | 0.00007 seconds |
42
- ./spec/castkit/core/attributes_spec.rb[1:6:1] | passed | 0.00051 seconds |
43
- ./spec/castkit/core/attributes_spec.rb[1:7:1] | passed | 0.00006 seconds |
44
- ./spec/castkit/core/config_spec.rb[1:1:1] | passed | 0.00004 seconds |
45
- ./spec/castkit/core/config_spec.rb[1:1:2] | passed | 0.00003 seconds |
46
- ./spec/castkit/core/config_spec.rb[1:2:1] | passed | 0.00003 seconds |
47
- ./spec/castkit/core/config_spec.rb[1:3:1] | passed | 0.00003 seconds |
48
- ./spec/castkit/core/config_spec.rb[1:3:2] | passed | 0.00003 seconds |
49
- ./spec/castkit/core/config_spec.rb[1:4:1] | passed | 0.00004 seconds |
50
- ./spec/castkit/core/config_spec.rb[1:4:2] | passed | 0.00003 seconds |
51
- ./spec/castkit/core/config_spec.rb[1:5:1] | passed | 0.00004 seconds |
52
- ./spec/castkit/core/config_spec.rb[1:5:2] | passed | 0.00003 seconds |
53
- ./spec/castkit/data_object_spec.rb[1:1:1] | passed | 0.00398 seconds |
54
- ./spec/castkit/data_object_spec.rb[1:1:2] | passed | 0.00021 seconds |
55
- ./spec/castkit/data_object_spec.rb[1:2:1] | passed | 0.00017 seconds |
56
- ./spec/castkit/data_object_spec.rb[1:2:2] | passed | 0.0001 seconds |
57
- ./spec/castkit/data_object_spec.rb[1:2:3] | passed | 0.00008 seconds |
58
- ./spec/castkit/data_object_spec.rb[1:3:1] | passed | 0.00007 seconds |
59
- ./spec/castkit/data_object_spec.rb[1:3:2] | passed | 0.00008 seconds |
60
- ./spec/castkit/data_object_spec.rb[1:4:1] | passed | 0.00017 seconds |
61
- ./spec/castkit/data_object_spec.rb[1:5:1] | passed | 0.0001 seconds |
62
- ./spec/castkit/data_object_spec.rb[1:5:2] | passed | 0.00009 seconds |
63
- ./spec/castkit/data_object_spec.rb[1:5:3] | passed | 0.00009 seconds |
64
- ./spec/castkit/data_object_spec.rb[1:5:4] | passed | 0.00009 seconds |
65
- ./spec/castkit/data_object_spec.rb[1:5:5] | passed | 0.00217 seconds |
66
- ./spec/castkit/data_object_spec.rb[1:5:6] | passed | 0.00018 seconds |
67
- ./spec/castkit/data_object_spec.rb[1:5:7] | passed | 0.00012 seconds |
68
- ./spec/castkit/data_object_spec.rb[1:6:1] | passed | 0.0001 seconds |
69
- ./spec/castkit/data_object_spec.rb[1:7:1] | passed | 0.00011 seconds |
70
- ./spec/castkit/data_object_spec.rb[1:8:1] | passed | 0.00013 seconds |
71
- ./spec/castkit/data_object_spec.rb[1:8:2] | passed | 0.00012 seconds |
72
- ./spec/castkit/data_object_spec.rb[1:9:1] | passed | 0.00011 seconds |
73
- ./spec/castkit/default_serializer_spec.rb[1:1:1] | passed | 0.00012 seconds |
74
- ./spec/castkit/default_serializer_spec.rb[1:2:1] | passed | 0.00015 seconds |
75
- ./spec/castkit/default_serializer_spec.rb[1:2:2] | passed | 0.00008 seconds |
76
- ./spec/castkit/default_serializer_spec.rb[1:2:3] | passed | 0.00022 seconds |
77
- ./spec/castkit/default_serializer_spec.rb[1:3:1] | passed | 0.00009 seconds |
78
- ./spec/castkit/default_serializer_spec.rb[1:3:2] | passed | 0.00013 seconds |
79
- ./spec/castkit/default_serializer_spec.rb[1:3:3] | passed | 0.00022 seconds |
80
- ./spec/castkit/default_serializer_spec.rb[1:3:4] | passed | 0.00011 seconds |
81
- ./spec/castkit/default_serializer_spec.rb[1:4:1] | passed | 0.00008 seconds |
82
- ./spec/castkit/default_serializer_spec.rb[1:5:1] | passed | 0.00007 seconds |
83
- ./spec/castkit/default_serializer_spec.rb[1:5:2] | passed | 0.00007 seconds |
84
- ./spec/castkit/default_serializer_spec.rb[1:5:3] | passed | 0.00007 seconds |
85
- ./spec/castkit/ext/attribute/access_spec.rb[1:1:1] | passed | 0.00004 seconds |
86
- ./spec/castkit/ext/attribute/access_spec.rb[1:1:2:1] | passed | 0.00004 seconds |
87
- ./spec/castkit/ext/attribute/access_spec.rb[1:1:3:1] | passed | 0.00004 seconds |
88
- ./spec/castkit/ext/attribute/access_spec.rb[1:1:4:1] | passed | 0.00008 seconds |
89
- ./spec/castkit/ext/attribute/access_spec.rb[1:2:1:1] | passed | 0.00006 seconds |
90
- ./spec/castkit/ext/attribute/access_spec.rb[1:2:2:1] | passed | 0.00018 seconds |
91
- ./spec/castkit/ext/attribute/access_spec.rb[1:2:3:1] | passed | 0.00013 seconds |
92
- ./spec/castkit/ext/attribute/access_spec.rb[1:3:1] | passed | 0.00004 seconds |
93
- ./spec/castkit/ext/attribute/access_spec.rb[1:3:2] | passed | 0.00003 seconds |
94
- ./spec/castkit/ext/attribute/access_spec.rb[1:3:3] | passed | 0.00003 seconds |
95
- ./spec/castkit/ext/attribute/access_spec.rb[1:3:4] | passed | 0.00003 seconds |
96
- ./spec/castkit/ext/attribute/access_spec.rb[1:3:5] | passed | 0.00003 seconds |
97
- ./spec/castkit/ext/attribute/access_spec.rb[1:4:1:1] | passed | 0.00005 seconds |
98
- ./spec/castkit/ext/attribute/access_spec.rb[1:4:2:1] | passed | 0.00004 seconds |
99
- ./spec/castkit/ext/attribute/access_spec.rb[1:4:3:1] | passed | 0.00004 seconds |
100
- ./spec/castkit/ext/attribute/access_spec.rb[1:5:1] | passed | 0.00004 seconds |
101
- ./spec/castkit/ext/attribute/access_spec.rb[1:5:2] | passed | 0.00014 seconds |
102
- ./spec/castkit/ext/attribute/access_spec.rb[1:5:3] | passed | 0.00003 seconds |
103
- ./spec/castkit/ext/attribute/access_spec.rb[1:6:1:1] | passed | 0.00003 seconds |
104
- ./spec/castkit/ext/attribute/access_spec.rb[1:6:2:1] | passed | 0.00003 seconds |
105
- ./spec/castkit/ext/attribute/access_spec.rb[1:6:3:1] | passed | 0.00004 seconds |
106
- ./spec/castkit/ext/attribute/access_spec.rb[1:7:1:1] | passed | 0.00004 seconds |
107
- ./spec/castkit/ext/attribute/access_spec.rb[1:7:2:1] | passed | 0.00003 seconds |
108
- ./spec/castkit/ext/attribute/options_spec.rb[1:1:1:1] | passed | 0.00006 seconds |
109
- ./spec/castkit/ext/attribute/options_spec.rb[1:1:2:1] | passed | 0.00012 seconds |
110
- ./spec/castkit/ext/attribute/options_spec.rb[1:2:1:1] | passed | 0.00004 seconds |
111
- ./spec/castkit/ext/attribute/options_spec.rb[1:2:2:1] | passed | 0.00004 seconds |
112
- ./spec/castkit/ext/attribute/options_spec.rb[1:3:1:1] | passed | 0.00004 seconds |
113
- ./spec/castkit/ext/attribute/options_spec.rb[1:3:2:1] | passed | 0.00004 seconds |
114
- ./spec/castkit/ext/attribute/options_spec.rb[1:3:3:1] | passed | 0.00004 seconds |
115
- ./spec/castkit/ext/attribute/options_spec.rb[1:4:1] | passed | 0.00016 seconds |
116
- ./spec/castkit/ext/attribute/options_spec.rb[1:5:1] | passed | 0.00004 seconds |
117
- ./spec/castkit/ext/attribute/options_spec.rb[1:5:2:1] | passed | 0.00004 seconds |
118
- ./spec/castkit/ext/attribute/options_spec.rb[1:6:1] | passed | 0.00003 seconds |
119
- ./spec/castkit/ext/attribute/options_spec.rb[1:7:1] | passed | 0.00003 seconds |
120
- ./spec/castkit/ext/attribute/options_spec.rb[1:7:2:1] | passed | 0.00004 seconds |
121
- ./spec/castkit/ext/attribute/options_spec.rb[1:8:1] | passed | 0.00004 seconds |
122
- ./spec/castkit/ext/attribute/options_spec.rb[1:8:2:1] | passed | 0.00012 seconds |
123
- ./spec/castkit/ext/attribute/options_spec.rb[1:9:1:1] | passed | 0.00005 seconds |
124
- ./spec/castkit/ext/attribute/options_spec.rb[1:9:2:1] | passed | 0.00004 seconds |
125
- ./spec/castkit/ext/attribute/options_spec.rb[1:9:3:1] | passed | 0.00004 seconds |
126
- ./spec/castkit/ext/attribute/options_spec.rb[1:10:1:1] | passed | 0.00004 seconds |
127
- ./spec/castkit/ext/attribute/options_spec.rb[1:10:2:1] | passed | 0.00004 seconds |
128
- ./spec/castkit/ext/attribute/options_spec.rb[1:11:1:1] | passed | 0.00004 seconds |
129
- ./spec/castkit/ext/attribute/options_spec.rb[1:11:2:1] | passed | 0.00004 seconds |
130
- ./spec/castkit/ext/attribute/options_spec.rb[1:12:1:1] | passed | 0.00004 seconds |
131
- ./spec/castkit/ext/attribute/options_spec.rb[1:12:2:1] | passed | 0.00004 seconds |
132
- ./spec/castkit/ext/attribute/validation_spec.rb[1:1:1:1] | passed | 0.00019 seconds |
133
- ./spec/castkit/ext/attribute/validation_spec.rb[1:1:2:1:1] | passed | 0.0001 seconds |
134
- ./spec/castkit/ext/attribute/validation_spec.rb[1:1:2:2:1] | passed | 0.00016 seconds |
135
- ./spec/castkit/ext/attribute/validation_spec.rb[1:1:3:1] | passed | 0.00008 seconds |
136
- ./spec/castkit/ext/attribute/validation_spec.rb[1:1:4:1:1] | passed | 0.00009 seconds |
137
- ./spec/castkit/ext/attribute/validation_spec.rb[1:1:4:2:1] | passed | 0.00019 seconds |
138
- ./spec/castkit/ext/attribute/validation_spec.rb[1:1:5:1:1] | passed | 0.00009 seconds |
139
- ./spec/castkit/ext/attribute/validation_spec.rb[1:1:5:2:1] | passed | 0.00011 seconds |
140
- ./spec/castkit/ext/data_object/deserialization_spec.rb[1:1:1] | passed | 0.0001 seconds |
141
- ./spec/castkit/ext/data_object/deserialization_spec.rb[1:2:1] | passed | 0.00005 seconds |
142
- ./spec/castkit/ext/data_object/deserialization_spec.rb[1:2:2] | passed | 0.00005 seconds |
143
- ./spec/castkit/ext/data_object/deserialization_spec.rb[1:3:1] | passed | 0.00016 seconds |
144
- ./spec/castkit/ext/data_object/deserialization_spec.rb[1:4:1] | passed | 0.00007 seconds |
145
- ./spec/castkit/ext/data_object/serialization_spec.rb[1:1:1] | passed | 0.00011 seconds |
146
- ./spec/castkit/ext/data_object/serialization_spec.rb[1:1:2] | passed | 0.00004 seconds |
147
- ./spec/castkit/ext/data_object/serialization_spec.rb[1:2:1] | passed | 0.00003 seconds |
148
- ./spec/castkit/ext/data_object/serialization_spec.rb[1:2:2] | passed | 0.00003 seconds |
149
- ./spec/castkit/ext/data_object/serialization_spec.rb[1:3:1] | passed | 0.00004 seconds |
150
- ./spec/castkit/ext/data_object/serialization_spec.rb[1:4:1] | passed | 0.00003 seconds |
151
- ./spec/castkit/ext/data_object/serialization_spec.rb[1:4:2] | passed | 0.00003 seconds |
152
- ./spec/castkit/serializer_spec.rb[1:1:1] | passed | 0.00004 seconds |
153
- ./spec/castkit/serializer_spec.rb[1:2:1] | passed | 0.00019 seconds |
154
- ./spec/castkit/serializer_spec.rb[1:3:1] | passed | 0.00006 seconds |
155
- ./spec/castkit/serializer_spec.rb[1:3:2] | passed | 0.00005 seconds |
156
- ./spec/castkit/serializer_spec.rb[1:4:1] | passed | 0.00004 seconds |
157
- ./spec/castkit/validators/numeric_validator_spec.rb[1:1:1:1] | passed | 0.00004 seconds |
158
- ./spec/castkit/validators/numeric_validator_spec.rb[1:1:2:1] | passed | 0.00012 seconds |
159
- ./spec/castkit/validators/numeric_validator_spec.rb[1:1:3:1] | passed | 0.00004 seconds |
160
- ./spec/castkit/validators/numeric_validator_spec.rb[1:1:4:1] | passed | 0.00003 seconds |
161
- ./spec/castkit/validators/string_validator_spec.rb[1:1:1:1:1] | passed | 0.00004 seconds |
162
- ./spec/castkit/validators/string_validator_spec.rb[1:1:1:1:2] | passed | 0.00004 seconds |
163
- ./spec/castkit/validators/string_validator_spec.rb[1:1:2:1] | passed | 0.00004 seconds |
164
- ./spec/castkit/validators/string_validator_spec.rb[1:1:2:2] | passed | 0.00003 seconds |
165
- ./spec/castkit/validators/string_validator_spec.rb[1:1:3:1] | passed | 0.00005 seconds |
166
- ./spec/castkit/validators/string_validator_spec.rb[1:1:3:2] | passed | 0.00003 seconds |
167
- ./spec/castkit/validators/string_validator_spec.rb[1:1:4:1] | passed | 0.00004 seconds |
168
- ./spec/castkit/validators/validator_spec.rb[1:1:1] | passed | 0.00004 seconds |
169
- ./spec/castkit/validators/validator_spec.rb[1:2:1] | passed | 0.00004 seconds |
170
- ./spec/castkit_spec.rb[1:1] | passed | 0.00003 seconds |
171
- ./spec/castkit_spec.rb[1:2:1:1] | passed | 0.00016 seconds |
172
- ./spec/castkit_spec.rb[1:2:1:2] | passed | 0.00008 seconds |
173
- ./spec/castkit_spec.rb[1:2:1:3] | passed | 0.00011 seconds |
174
- ./spec/castkit_spec.rb[1:2:1:4] | passed | 0.00011 seconds |
175
- ./spec/castkit_spec.rb[1:2:2:1] | passed | 0.00012 seconds |
176
- ./spec/castkit_spec.rb[1:2:2:2] | passed | 0.00016 seconds |
177
- ./spec/castkit_spec.rb[1:2:2:3] | passed | 0.00007 seconds |
178
- ./spec/castkit_spec.rb[1:2:3:1] | passed | 0.00006 seconds |
179
- ./spec/castkit_spec.rb[1:2:3:2] | passed | 0.00006 seconds |
180
- ./spec/castkit_spec.rb[1:2:3:3] | passed | 0.00005 seconds |
181
- ./spec/castkit_spec.rb[1:2:4:1] | passed | 0.00008 seconds |
182
- ./spec/castkit_spec.rb[1:3:1] | passed | 0.00026 seconds |
183
- ./spec/castkit_spec.rb[1:3:2] | passed | 0.00015 seconds |
184
- ./spec/castkit_spec.rb[1:3:3] | passed | 0.00017 seconds |
185
- ./spec/castkit_spec.rb[1:3:4] | passed | 0.00309 seconds |
186
- ./spec/castkit_spec.rb[1:3:5] | passed | 0.00224 seconds |
187
- ./spec/castkit_spec.rb[1:3:6] | passed | 0.00484 seconds |
188
- ./spec/castkit_spec.rb[1:3:7] | passed | 0.00022 seconds |
189
- ./spec/castkit_spec.rb[1:3:8] | passed | 0.00022 seconds |
190
- ./spec/configuration_spec.rb[1:1:1] | passed | 0.00015 seconds |
191
- ./spec/configuration_spec.rb[1:2:1] | passed | 0.00005 seconds |
192
- ./spec/configuration_spec.rb[1:3:1] | passed | 0.00005 seconds |
193
- ./spec/configuration_spec.rb[1:3:2] | passed | 0.00004 seconds |
194
- ./spec/configuration_spec.rb[1:3:3] | passed | 0.00004 seconds |
195
- ./spec/configuration_spec.rb[1:3:4] | passed | 0.00015 seconds |
196
- ./spec/configuration_spec.rb[1:4:1] | passed | 0.00009 seconds |
@@ -1,59 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "../castkit"
4
-
5
- module Castkit
6
- module Core
7
- # Provides methods to register dynamically generated contracts and data objects
8
- # into the appropriate Castkit namespaces (`Castkit::Contracts`, `Castkit::DataObjects`).
9
- #
10
- # This is useful when working with ephemeral classes (e.g., from `Contract.build` or
11
- # `.to_dataobject`) that should be persisted and referenced as constants.
12
- #
13
- # @example Registering a contract class
14
- # contract = Castkit::Contract.build(:user) { string :id }
15
- # contract.extend(Castkit::Core::Registerable)
16
- # contract.register! # => Castkit::Contracts::User
17
- #
18
- # @example Registering a DTO
19
- # dto = contract.to_dataobject
20
- # dto.extend(Castkit::Core::Registerable)
21
- # dto.register!(as: :UserDto) # => Castkit::DataObjects::UserDto
22
- module Registerable
23
- CASTKIT_NAMESPACES = {
24
- contracts: Castkit::Contracts,
25
- dataobjects: Castkit::DataObjects
26
- }.freeze
27
-
28
- # Registers the current class in the specified Castkit namespace.
29
- #
30
- # @param namespace [Symbol] `:contracts` or `:dataobjects`
31
- # @param as [String, Symbol, nil] Optional constant name override (PascalCase).
32
- # If not provided, falls back to the class's name (via `Inflector.pascalize(self.name)`).
33
- #
34
- # @raise [Castkit::Error] if class is anonymous or name already exists in the namespace
35
- # @return [Class] the registered class
36
- def register!(namespace:, as: nil)
37
- name = Castkit::Inflector.pascalize(as || self.name)
38
- raise Castkit::Error, "Unable to register anonymous classes, use as: ClassName" if name.nil?
39
-
40
- ns = Castkit.const_get(namespace.to_s.capitalize, false)
41
- raise Castkit::Error, "#{name} is already registered in #{ns}" if defined_in_namespace?(ns, name)
42
-
43
- ns.const_set(name, self)
44
- self
45
- end
46
-
47
- private
48
-
49
- # Checks whether a constant is already defined in the given namespace.
50
- #
51
- # @param namespace [Module] target module (e.g., `Castkit::Contracts`)
52
- # @param name [String, Symbol]
53
- # @return [Boolean]
54
- def defined_in_namespace?(namespace, name)
55
- namespace.const_defined?(name.to_s.to_sym, false)
56
- end
57
- end
58
- end
59
- end
@@ -1,154 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "serializer"
4
-
5
- module Castkit
6
- # Default serializer for Castkit::DataObject instances.
7
- #
8
- # Serializes attributes into a plain Ruby hash, applying access rules, nil/blank filtering,
9
- # and nested structure handling. The output format supports JSON-compatible structures
10
- # and respects the class-level serialization configuration.
11
- class DefaultSerializer < Castkit::Serializer
12
- # @return [Hash{Symbol => Castkit::Attribute}] the attributes to serialize
13
- attr_reader :attributes
14
-
15
- # @return [Hash{Symbol => Object}] unrecognized attributes captured during deserialization
16
- attr_reader :unknown_attributes
17
-
18
- # @return [Hash] serialization config flags like :root, :ignore_nil, :allow_unknown
19
- attr_reader :options
20
-
21
- # Serializes the object to a hash.
22
- #
23
- # Includes unknown attributes if configured, and wraps in a root key if defined.
24
- #
25
- # @return [Hash] the fully serialized result
26
- def call
27
- result = serialize_attributes
28
- result.merge!(unknown_attributes) if options[:allow_unknown]
29
-
30
- options[:root] ? { options[:root].to_sym => result } : result
31
- end
32
-
33
- private
34
-
35
- # Initializes the serializer.
36
- #
37
- # @param obj [Castkit::DataObject] the object to serialize
38
- # @param visited [Set, nil] tracks circular references
39
- def initialize(obj, visited: nil)
40
- super
41
-
42
- @skip_flag = "__castkit_#{obj.object_id}"
43
- @attributes = obj.class.attributes.freeze
44
- @unknown_attributes = obj.unknown_attributes.freeze
45
- @options = {
46
- root: obj.class.root,
47
- ignore_nil: obj.class.ignore_nil || false,
48
- allow_unknown: obj.class.allow_unknown || false
49
- }
50
- end
51
-
52
- # Serializes all defined attributes.
53
- #
54
- # @return [Hash] serialized attribute key-value pairs
55
- def serialize_attributes
56
- attributes.values.each_with_object({}) do |attribute, hash|
57
- next if attribute.skip_serialization?
58
-
59
- serialized_value = serialize_attribute(attribute)
60
- next if serialized_value == @skip_flag
61
-
62
- assign_attribute_key!(attribute, serialized_value, hash)
63
- end
64
- end
65
-
66
- # Serializes a single attribute.
67
- #
68
- # @param attribute [Castkit::Attribute]
69
- # @return [Object] the serialized value or skip flag
70
- def serialize_attribute(attribute)
71
- value = obj.public_send(attribute.field)
72
- return @skip_flag if skip_nil?(attribute, value)
73
-
74
- serialized_value = process_attribute(attribute, value)
75
- return @skip_flag if skip_blank?(attribute, serialized_value)
76
-
77
- serialized_value
78
- end
79
-
80
- # Delegates serialization based on type.
81
- #
82
- # @param attribute [Castkit::Attribute]
83
- # @param value [Object]
84
- # @return [Object]
85
- def process_attribute(attribute, value)
86
- if attribute.dataobject?
87
- serialize_dataobject(attribute, value)
88
- elsif attribute.dataobject_collection?
89
- Array(value).map { |v| serialize_dataobject(attribute, v) }
90
- else
91
- type = Array(attribute.type).first
92
- Castkit.type_serializer(type).call(value)
93
- end
94
- end
95
-
96
- # Assigns value into nested hash structure based on key path.
97
- #
98
- # @param attribute [Castkit::Attribute]
99
- # @param value [Object]
100
- # @param hash [Hash]
101
- # @return [void]
102
- def assign_attribute_key!(attribute, value, hash)
103
- key_path = attribute.key_path
104
- last = key_path.pop
105
- current = hash
106
-
107
- key_path.each do |key|
108
- current[key] ||= {}
109
- current = current[key]
110
- end
111
-
112
- current[last] = value
113
- end
114
-
115
- # Whether to skip serialization for nil values.
116
- #
117
- # @param attribute [Castkit::Attribute]
118
- # @param value [Object]
119
- # @return [Boolean]
120
- def skip_nil?(attribute, value)
121
- value.nil? && (attribute.ignore_nil? || options[:ignore_nil])
122
- end
123
-
124
- # Whether to skip serialization for blank values.
125
- #
126
- # @param attribute [Castkit::Attribute]
127
- # @param value [Object]
128
- # @return [Boolean]
129
- def skip_blank?(attribute, value)
130
- blank?(value) && (attribute.ignore_blank? || options[:ignore_blank])
131
- end
132
-
133
- # True if value is nil or empty.
134
- #
135
- # @param value [Object]
136
- # @return [Boolean]
137
- def blank?(value)
138
- value.nil? || (value.respond_to?(:empty?) && value.empty?)
139
- end
140
-
141
- # Serializes a DataObject using the proper serializer.
142
- #
143
- # @param attribute [Castkit::Attribute]
144
- # @param value [Castkit::DataObject]
145
- # @return [Object]
146
- def serialize_dataobject(attribute, value)
147
- serializer = attribute.options[:serializer]
148
- serializer ||= value.class.serializer
149
- serializer ||= Castkit::DefaultSerializer
150
-
151
- serializer.call(value, visited: visited)
152
- end
153
- end
154
- end