From eb7cb6065580e6b3b38b7666d92221032bf28cd6 Mon Sep 17 00:00:00 2001 From: Nathan Lucas Date: Mon, 8 Dec 2025 21:57:28 -0500 Subject: [PATCH] CASTKIT-2: Update Castkit::Types::Base.cast! to match documentation --- .rspec_status | 274 ++++++++++++++++---------------- lib/castkit/types/base.rb | 27 +++- spec/castkit/types/base_spec.rb | 40 +++++ 3 files changed, 202 insertions(+), 139 deletions(-) create mode 100644 spec/castkit/types/base_spec.rb diff --git a/.rspec_status b/.rspec_status index aaddb42..a3dd776 100644 --- a/.rspec_status +++ b/.rspec_status @@ -1,200 +1,202 @@ example_id | status | run_time | ------------------------------------------------------------- | ------ | --------------- | -./spec/castkit/attribute_spec.rb[1:1:1] | passed | 0.0005 seconds | -./spec/castkit/attribute_spec.rb[1:1:2] | passed | 0.00006 seconds | +./spec/castkit/attribute_spec.rb[1:1:1] | passed | 0.00063 seconds | +./spec/castkit/attribute_spec.rb[1:1:2] | passed | 0.00005 seconds | ./spec/castkit/attribute_spec.rb[1:1:3] | passed | 0.00004 seconds | -./spec/castkit/attribute_spec.rb[1:1:4] | passed | 0.00003 seconds | -./spec/castkit/attribute_spec.rb[1:2:1] | passed | 0.00129 seconds | -./spec/castkit/attribute_spec.rb[1:3:1] | passed | 0.00004 seconds | -./spec/castkit/attribute_spec.rb[1:3:2] | passed | 0.00004 seconds | +./spec/castkit/attribute_spec.rb[1:1:4] | passed | 0.00004 seconds | +./spec/castkit/attribute_spec.rb[1:2:1] | passed | 0.00138 seconds | +./spec/castkit/attribute_spec.rb[1:3:1] | passed | 0.00005 seconds | +./spec/castkit/attribute_spec.rb[1:3:2] | passed | 0.00005 seconds | ./spec/castkit/attribute_spec.rb[1:3:3] | passed | 0.00003 seconds | -./spec/castkit/attribute_spec.rb[1:3:4] | passed | 0.00071 seconds | -./spec/castkit/contract/validator_spec.rb[1:1:1:1] | passed | 0.00009 seconds | -./spec/castkit/contract/validator_spec.rb[1:1:2:1] | passed | 0.00048 seconds | -./spec/castkit/contract/validator_spec.rb[1:1:3:1] | passed | 0.00008 seconds | -./spec/castkit/contract/validator_spec.rb[1:1:4:1] | passed | 0.00011 seconds | +./spec/castkit/attribute_spec.rb[1:3:4] | passed | 0.00073 seconds | +./spec/castkit/contract/validator_spec.rb[1:1:1:1] | passed | 0.0001 seconds | +./spec/castkit/contract/validator_spec.rb[1:1:2:1] | passed | 0.00055 seconds | +./spec/castkit/contract/validator_spec.rb[1:1:3:1] | passed | 0.00009 seconds | +./spec/castkit/contract/validator_spec.rb[1:1:4:1] | passed | 0.00012 seconds | ./spec/castkit/contract/validator_spec.rb[1:1:5:1] | passed | 0.00009 seconds | -./spec/castkit/contract_spec.rb[1:1:1] | passed | 0.0005 seconds | -./spec/castkit/contract_spec.rb[1:1:2] | passed | 0.00091 seconds | +./spec/castkit/contract_spec.rb[1:1:1] | passed | 0.00048 seconds | +./spec/castkit/contract_spec.rb[1:1:2] | passed | 0.00097 seconds | ./spec/castkit/contract_spec.rb[1:1:3] | passed | 0.00009 seconds | ./spec/castkit/contract_spec.rb[1:1:4] | passed | 0.00007 seconds | -./spec/castkit/contract_spec.rb[1:1:5] | passed | 0.00007 seconds | -./spec/castkit/contract_spec.rb[1:1:6] | passed | 0.00005 seconds | -./spec/castkit/core/attribute_types_spec.rb[1:1:1] | passed | 0.00004 seconds | +./spec/castkit/contract_spec.rb[1:1:5] | passed | 0.00006 seconds | +./spec/castkit/contract_spec.rb[1:1:6] | passed | 0.00006 seconds | +./spec/castkit/core/attribute_types_spec.rb[1:1:1] | passed | 0.00005 seconds | ./spec/castkit/core/attribute_types_spec.rb[1:1:2] | passed | 0.00003 seconds | ./spec/castkit/core/attribute_types_spec.rb[1:1:3] | passed | 0.00004 seconds | -./spec/castkit/core/attribute_types_spec.rb[1:1:4] | passed | 0.00004 seconds | +./spec/castkit/core/attribute_types_spec.rb[1:1:4] | passed | 0.00003 seconds | ./spec/castkit/core/attribute_types_spec.rb[1:1:5] | passed | 0.00003 seconds | ./spec/castkit/core/attribute_types_spec.rb[1:1:6] | passed | 0.00004 seconds | ./spec/castkit/core/attribute_types_spec.rb[1:1:7] | passed | 0.00003 seconds | ./spec/castkit/core/attribute_types_spec.rb[1:1:8] | passed | 0.00003 seconds | -./spec/castkit/core/attribute_types_spec.rb[1:1:9] | passed | 0.00004 seconds | +./spec/castkit/core/attribute_types_spec.rb[1:1:9] | passed | 0.00005 seconds | ./spec/castkit/core/attribute_types_spec.rb[1:1:10] | passed | 0.00004 seconds | ./spec/castkit/core/attribute_types_spec.rb[1:1:11] | passed | 0.00004 seconds | -./spec/castkit/core/attribute_types_spec.rb[1:1:12] | passed | 0.00003 seconds | +./spec/castkit/core/attribute_types_spec.rb[1:1:12] | passed | 0.00005 seconds | ./spec/castkit/core/attributes_spec.rb[1:1:1] | passed | 0.00006 seconds | -./spec/castkit/core/attributes_spec.rb[1:1:2] | passed | 0.00005 seconds | -./spec/castkit/core/attributes_spec.rb[1:1:3] | passed | 0.00006 seconds | +./spec/castkit/core/attributes_spec.rb[1:1:2] | passed | 0.00006 seconds | +./spec/castkit/core/attributes_spec.rb[1:1:3] | passed | 0.00007 seconds | ./spec/castkit/core/attributes_spec.rb[1:2:1] | passed | 0.00004 seconds | -./spec/castkit/core/attributes_spec.rb[1:3:1] | passed | 0.00005 seconds | -./spec/castkit/core/attributes_spec.rb[1:4:1] | passed | 0.00059 seconds | +./spec/castkit/core/attributes_spec.rb[1:3:1] | passed | 0.00007 seconds | +./spec/castkit/core/attributes_spec.rb[1:4:1] | passed | 0.00057 seconds | ./spec/castkit/core/attributes_spec.rb[1:5:1] | passed | 0.00006 seconds | -./spec/castkit/core/attributes_spec.rb[1:6:1] | passed | 0.00049 seconds | -./spec/castkit/core/attributes_spec.rb[1:7:1] | passed | 0.00005 seconds | -./spec/castkit/core/config_spec.rb[1:1:1] | passed | 0.00004 seconds | +./spec/castkit/core/attributes_spec.rb[1:6:1] | passed | 0.00032 seconds | +./spec/castkit/core/attributes_spec.rb[1:7:1] | passed | 0.00006 seconds | +./spec/castkit/core/config_spec.rb[1:1:1] | passed | 0.00005 seconds | ./spec/castkit/core/config_spec.rb[1:1:2] | passed | 0.00003 seconds | ./spec/castkit/core/config_spec.rb[1:2:1] | passed | 0.00003 seconds | ./spec/castkit/core/config_spec.rb[1:3:1] | passed | 0.00003 seconds | ./spec/castkit/core/config_spec.rb[1:3:2] | passed | 0.00003 seconds | ./spec/castkit/core/config_spec.rb[1:4:1] | passed | 0.00003 seconds | ./spec/castkit/core/config_spec.rb[1:4:2] | passed | 0.00003 seconds | -./spec/castkit/core/config_spec.rb[1:5:1] | passed | 0.00004 seconds | -./spec/castkit/core/config_spec.rb[1:5:2] | passed | 0.00003 seconds | -./spec/castkit/data_object_spec.rb[1:1:1] | passed | 0.00414 seconds | +./spec/castkit/core/config_spec.rb[1:5:1] | passed | 0.00005 seconds | +./spec/castkit/core/config_spec.rb[1:5:2] | passed | 0.00004 seconds | +./spec/castkit/data_object_spec.rb[1:1:1] | passed | 0.00553 seconds | ./spec/castkit/data_object_spec.rb[1:1:2] | passed | 0.00029 seconds | -./spec/castkit/data_object_spec.rb[1:2:1] | passed | 0.00016 seconds | +./spec/castkit/data_object_spec.rb[1:2:1] | passed | 0.00017 seconds | ./spec/castkit/data_object_spec.rb[1:2:2] | passed | 0.00013 seconds | ./spec/castkit/data_object_spec.rb[1:2:3] | passed | 0.0001 seconds | -./spec/castkit/data_object_spec.rb[1:3:1] | passed | 0.00008 seconds | -./spec/castkit/data_object_spec.rb[1:3:2] | passed | 0.00009 seconds | +./spec/castkit/data_object_spec.rb[1:3:1] | passed | 0.00009 seconds | +./spec/castkit/data_object_spec.rb[1:3:2] | passed | 0.0001 seconds | ./spec/castkit/data_object_spec.rb[1:4:1] | passed | 0.00017 seconds | -./spec/castkit/data_object_spec.rb[1:5:1] | passed | 0.00011 seconds | -./spec/castkit/data_object_spec.rb[1:5:2] | passed | 0.00011 seconds | -./spec/castkit/data_object_spec.rb[1:5:3] | passed | 0.00011 seconds | +./spec/castkit/data_object_spec.rb[1:5:1] | passed | 0.00013 seconds | +./spec/castkit/data_object_spec.rb[1:5:2] | passed | 0.00023 seconds | +./spec/castkit/data_object_spec.rb[1:5:3] | passed | 0.00018 seconds | ./spec/castkit/data_object_spec.rb[1:5:4] | passed | 0.00012 seconds | -./spec/castkit/data_object_spec.rb[1:5:5] | passed | 0.00092 seconds | -./spec/castkit/data_object_spec.rb[1:5:6] | passed | 0.00018 seconds | -./spec/castkit/data_object_spec.rb[1:5:7] | passed | 0.00014 seconds | -./spec/castkit/data_object_spec.rb[1:6:1] | passed | 0.00012 seconds | -./spec/castkit/data_object_spec.rb[1:7:1] | passed | 0.00012 seconds | -./spec/castkit/data_object_spec.rb[1:8:1] | passed | 0.00014 seconds | -./spec/castkit/data_object_spec.rb[1:8:2] | passed | 0.00013 seconds | -./spec/castkit/data_object_spec.rb[1:9:1] | passed | 0.00012 seconds | +./spec/castkit/data_object_spec.rb[1:5:5] | passed | 0.00081 seconds | +./spec/castkit/data_object_spec.rb[1:5:6] | passed | 0.00026 seconds | +./spec/castkit/data_object_spec.rb[1:5:7] | passed | 0.00018 seconds | +./spec/castkit/data_object_spec.rb[1:6:1] | passed | 0.00015 seconds | +./spec/castkit/data_object_spec.rb[1:7:1] | passed | 0.00018 seconds | +./spec/castkit/data_object_spec.rb[1:8:1] | passed | 0.00017 seconds | +./spec/castkit/data_object_spec.rb[1:8:2] | passed | 0.00014 seconds | +./spec/castkit/data_object_spec.rb[1:9:1] | passed | 0.00013 seconds | ./spec/castkit/default_serializer_spec.rb[1:1:1] | passed | 0.00015 seconds | ./spec/castkit/default_serializer_spec.rb[1:2:1] | passed | 0.00018 seconds | ./spec/castkit/default_serializer_spec.rb[1:2:2] | passed | 0.00011 seconds | ./spec/castkit/default_serializer_spec.rb[1:2:3] | passed | 0.00022 seconds | ./spec/castkit/default_serializer_spec.rb[1:3:1] | passed | 0.00012 seconds | -./spec/castkit/default_serializer_spec.rb[1:3:2] | passed | 0.00019 seconds | -./spec/castkit/default_serializer_spec.rb[1:3:3] | passed | 0.00319 seconds | -./spec/castkit/default_serializer_spec.rb[1:3:4] | passed | 0.00017 seconds | +./spec/castkit/default_serializer_spec.rb[1:3:2] | passed | 0.00018 seconds | +./spec/castkit/default_serializer_spec.rb[1:3:3] | passed | 0.0002 seconds | +./spec/castkit/default_serializer_spec.rb[1:3:4] | passed | 0.00015 seconds | ./spec/castkit/default_serializer_spec.rb[1:4:1] | passed | 0.0001 seconds | ./spec/castkit/default_serializer_spec.rb[1:5:1] | passed | 0.00009 seconds | ./spec/castkit/default_serializer_spec.rb[1:5:2] | passed | 0.00008 seconds | ./spec/castkit/default_serializer_spec.rb[1:5:3] | passed | 0.00008 seconds | -./spec/castkit/definition_spec.rb[1:1:1] | passed | 0.00005 seconds | -./spec/castkit/definition_spec.rb[1:2:1] | passed | 0.00015 seconds | -./spec/castkit/definition_spec.rb[1:3:1] | passed | 0.00008 seconds | +./spec/castkit/definition_spec.rb[1:1:1] | passed | 0.00004 seconds | +./spec/castkit/definition_spec.rb[1:2:1] | passed | 0.00014 seconds | +./spec/castkit/definition_spec.rb[1:3:1] | passed | 0.00007 seconds | ./spec/castkit/definition_spec.rb[1:3:2] | passed | 0.00006 seconds | -./spec/castkit/definition_spec.rb[1:4:1] | passed | 0.0001 seconds | +./spec/castkit/definition_spec.rb[1:4:1] | passed | 0.00005 seconds | ./spec/castkit/ext/attribute/access_spec.rb[1:1:1] | passed | 0.00004 seconds | ./spec/castkit/ext/attribute/access_spec.rb[1:1:2:1] | passed | 0.00004 seconds | -./spec/castkit/ext/attribute/access_spec.rb[1:1:3:1] | passed | 0.00003 seconds | -./spec/castkit/ext/attribute/access_spec.rb[1:1:4:1] | passed | 0.00003 seconds | +./spec/castkit/ext/attribute/access_spec.rb[1:1:3:1] | passed | 0.00004 seconds | +./spec/castkit/ext/attribute/access_spec.rb[1:1:4:1] | passed | 0.00004 seconds | ./spec/castkit/ext/attribute/access_spec.rb[1:2:1:1] | passed | 0.00005 seconds | ./spec/castkit/ext/attribute/access_spec.rb[1:2:2:1] | passed | 0.00004 seconds | -./spec/castkit/ext/attribute/access_spec.rb[1:2:3:1] | passed | 0.00004 seconds | +./spec/castkit/ext/attribute/access_spec.rb[1:2:3:1] | passed | 0.00005 seconds | ./spec/castkit/ext/attribute/access_spec.rb[1:3:1] | passed | 0.00003 seconds | -./spec/castkit/ext/attribute/access_spec.rb[1:3:2] | passed | 0.00003 seconds | +./spec/castkit/ext/attribute/access_spec.rb[1:3:2] | passed | 0.00004 seconds | ./spec/castkit/ext/attribute/access_spec.rb[1:3:3] | passed | 0.00003 seconds | ./spec/castkit/ext/attribute/access_spec.rb[1:3:4] | passed | 0.00003 seconds | -./spec/castkit/ext/attribute/access_spec.rb[1:3:5] | passed | 0.00003 seconds | +./spec/castkit/ext/attribute/access_spec.rb[1:3:5] | passed | 0.00004 seconds | ./spec/castkit/ext/attribute/access_spec.rb[1:4:1:1] | passed | 0.00004 seconds | ./spec/castkit/ext/attribute/access_spec.rb[1:4:2:1] | passed | 0.00004 seconds | -./spec/castkit/ext/attribute/access_spec.rb[1:4:3:1] | passed | 0.00004 seconds | -./spec/castkit/ext/attribute/access_spec.rb[1:5:1] | passed | 0.00003 seconds | -./spec/castkit/ext/attribute/access_spec.rb[1:5:2] | passed | 0.00003 seconds | -./spec/castkit/ext/attribute/access_spec.rb[1:5:3] | passed | 0.00008 seconds | +./spec/castkit/ext/attribute/access_spec.rb[1:4:3:1] | passed | 0.00005 seconds | +./spec/castkit/ext/attribute/access_spec.rb[1:5:1] | passed | 0.00004 seconds | +./spec/castkit/ext/attribute/access_spec.rb[1:5:2] | passed | 0.00004 seconds | +./spec/castkit/ext/attribute/access_spec.rb[1:5:3] | passed | 0.00003 seconds | ./spec/castkit/ext/attribute/access_spec.rb[1:6:1:1] | passed | 0.00004 seconds | -./spec/castkit/ext/attribute/access_spec.rb[1:6:2:1] | passed | 0.00003 seconds | +./spec/castkit/ext/attribute/access_spec.rb[1:6:2:1] | passed | 0.00004 seconds | ./spec/castkit/ext/attribute/access_spec.rb[1:6:3:1] | passed | 0.00003 seconds | -./spec/castkit/ext/attribute/access_spec.rb[1:7:1:1] | passed | 0.00003 seconds | +./spec/castkit/ext/attribute/access_spec.rb[1:7:1:1] | passed | 0.00004 seconds | ./spec/castkit/ext/attribute/access_spec.rb[1:7:2:1] | passed | 0.00004 seconds | -./spec/castkit/ext/attribute/options_spec.rb[1:1:1:1] | passed | 0.00005 seconds | -./spec/castkit/ext/attribute/options_spec.rb[1:1:2:1] | passed | 0.00009 seconds | +./spec/castkit/ext/attribute/options_spec.rb[1:1:1:1] | passed | 0.00006 seconds | +./spec/castkit/ext/attribute/options_spec.rb[1:1:2:1] | passed | 0.00004 seconds | ./spec/castkit/ext/attribute/options_spec.rb[1:2:1:1] | passed | 0.00004 seconds | ./spec/castkit/ext/attribute/options_spec.rb[1:2:2:1] | passed | 0.00004 seconds | -./spec/castkit/ext/attribute/options_spec.rb[1:3:1:1] | passed | 0.00004 seconds | -./spec/castkit/ext/attribute/options_spec.rb[1:3:2:1] | passed | 0.00004 seconds | -./spec/castkit/ext/attribute/options_spec.rb[1:3:3:1] | passed | 0.00004 seconds | -./spec/castkit/ext/attribute/options_spec.rb[1:4:1] | passed | 0.00009 seconds | +./spec/castkit/ext/attribute/options_spec.rb[1:3:1:1] | passed | 0.00005 seconds | +./spec/castkit/ext/attribute/options_spec.rb[1:3:2:1] | passed | 0.00005 seconds | +./spec/castkit/ext/attribute/options_spec.rb[1:3:3:1] | passed | 0.00005 seconds | +./spec/castkit/ext/attribute/options_spec.rb[1:4:1] | passed | 0.00004 seconds | ./spec/castkit/ext/attribute/options_spec.rb[1:5:1] | passed | 0.00004 seconds | -./spec/castkit/ext/attribute/options_spec.rb[1:5:2:1] | passed | 0.00004 seconds | -./spec/castkit/ext/attribute/options_spec.rb[1:6:1] | passed | 0.00004 seconds | +./spec/castkit/ext/attribute/options_spec.rb[1:5:2:1] | passed | 0.00005 seconds | +./spec/castkit/ext/attribute/options_spec.rb[1:6:1] | passed | 0.00005 seconds | ./spec/castkit/ext/attribute/options_spec.rb[1:7:1] | passed | 0.00004 seconds | ./spec/castkit/ext/attribute/options_spec.rb[1:7:2:1] | passed | 0.00004 seconds | -./spec/castkit/ext/attribute/options_spec.rb[1:8:1] | passed | 0.00003 seconds | -./spec/castkit/ext/attribute/options_spec.rb[1:8:2:1] | passed | 0.00008 seconds | -./spec/castkit/ext/attribute/options_spec.rb[1:9:1:1] | passed | 0.00004 seconds | -./spec/castkit/ext/attribute/options_spec.rb[1:9:2:1] | passed | 0.00004 seconds | +./spec/castkit/ext/attribute/options_spec.rb[1:8:1] | passed | 0.00355 seconds | +./spec/castkit/ext/attribute/options_spec.rb[1:8:2:1] | passed | 0.00007 seconds | +./spec/castkit/ext/attribute/options_spec.rb[1:9:1:1] | passed | 0.00006 seconds | +./spec/castkit/ext/attribute/options_spec.rb[1:9:2:1] | passed | 0.00005 seconds | ./spec/castkit/ext/attribute/options_spec.rb[1:9:3:1] | passed | 0.00004 seconds | -./spec/castkit/ext/attribute/options_spec.rb[1:10:1:1] | passed | 0.00004 seconds | -./spec/castkit/ext/attribute/options_spec.rb[1:10:2:1] | passed | 0.00004 seconds | -./spec/castkit/ext/attribute/options_spec.rb[1:11:1:1] | passed | 0.00004 seconds | -./spec/castkit/ext/attribute/options_spec.rb[1:11:2:1] | passed | 0.00004 seconds | -./spec/castkit/ext/attribute/options_spec.rb[1:12:1:1] | passed | 0.00004 seconds | -./spec/castkit/ext/attribute/options_spec.rb[1:12:2:1] | passed | 0.00004 seconds | -./spec/castkit/ext/attribute/validation_spec.rb[1:1:1:1] | passed | 0.00012 seconds | -./spec/castkit/ext/attribute/validation_spec.rb[1:1:2:1:1] | passed | 0.00011 seconds | -./spec/castkit/ext/attribute/validation_spec.rb[1:1:2:2:1] | passed | 0.00016 seconds | -./spec/castkit/ext/attribute/validation_spec.rb[1:1:3:1] | passed | 0.00008 seconds | -./spec/castkit/ext/attribute/validation_spec.rb[1:1:4:1:1] | passed | 0.0001 seconds | -./spec/castkit/ext/attribute/validation_spec.rb[1:1:4:2:1] | passed | 0.0002 seconds | -./spec/castkit/ext/attribute/validation_spec.rb[1:1:5:1:1] | passed | 0.0001 seconds | -./spec/castkit/ext/attribute/validation_spec.rb[1:1:5:2:1] | passed | 0.00012 seconds | -./spec/castkit/ext/data_object/deserialization_spec.rb[1:1:1] | passed | 0.00011 seconds | -./spec/castkit/ext/data_object/deserialization_spec.rb[1:2:1] | passed | 0.00006 seconds | -./spec/castkit/ext/data_object/deserialization_spec.rb[1:2:2] | passed | 0.00006 seconds | -./spec/castkit/ext/data_object/deserialization_spec.rb[1:3:1] | passed | 0.00016 seconds | -./spec/castkit/ext/data_object/deserialization_spec.rb[1:4:1] | passed | 0.00007 seconds | -./spec/castkit/ext/data_object/serialization_spec.rb[1:1:1] | passed | 0.00009 seconds | -./spec/castkit/ext/data_object/serialization_spec.rb[1:1:2] | passed | 0.00003 seconds | -./spec/castkit/ext/data_object/serialization_spec.rb[1:2:1] | passed | 0.00003 seconds | -./spec/castkit/ext/data_object/serialization_spec.rb[1:2:2] | passed | 0.00003 seconds | +./spec/castkit/ext/attribute/options_spec.rb[1:10:1:1] | passed | 0.00005 seconds | +./spec/castkit/ext/attribute/options_spec.rb[1:10:2:1] | passed | 0.00015 seconds | +./spec/castkit/ext/attribute/options_spec.rb[1:11:1:1] | passed | 0.00005 seconds | +./spec/castkit/ext/attribute/options_spec.rb[1:11:2:1] | passed | 0.00005 seconds | +./spec/castkit/ext/attribute/options_spec.rb[1:12:1:1] | passed | 0.00005 seconds | +./spec/castkit/ext/attribute/options_spec.rb[1:12:2:1] | passed | 0.00005 seconds | +./spec/castkit/ext/attribute/validation_spec.rb[1:1:1:1] | passed | 0.00035 seconds | +./spec/castkit/ext/attribute/validation_spec.rb[1:1:2:1:1] | passed | 0.00014 seconds | +./spec/castkit/ext/attribute/validation_spec.rb[1:1:2:2:1] | passed | 0.00024 seconds | +./spec/castkit/ext/attribute/validation_spec.rb[1:1:3:1] | passed | 0.00011 seconds | +./spec/castkit/ext/attribute/validation_spec.rb[1:1:4:1:1] | passed | 0.00022 seconds | +./spec/castkit/ext/attribute/validation_spec.rb[1:1:4:2:1] | passed | 0.00015 seconds | +./spec/castkit/ext/attribute/validation_spec.rb[1:1:5:1:1] | passed | 0.00011 seconds | +./spec/castkit/ext/attribute/validation_spec.rb[1:1:5:2:1] | passed | 0.00057 seconds | +./spec/castkit/ext/data_object/deserialization_spec.rb[1:1:1] | passed | 0.00023 seconds | +./spec/castkit/ext/data_object/deserialization_spec.rb[1:2:1] | passed | 0.00008 seconds | +./spec/castkit/ext/data_object/deserialization_spec.rb[1:2:2] | passed | 0.00008 seconds | +./spec/castkit/ext/data_object/deserialization_spec.rb[1:3:1] | passed | 0.00027 seconds | +./spec/castkit/ext/data_object/deserialization_spec.rb[1:4:1] | passed | 0.00017 seconds | +./spec/castkit/ext/data_object/serialization_spec.rb[1:1:1] | passed | 0.00005 seconds | +./spec/castkit/ext/data_object/serialization_spec.rb[1:1:2] | passed | 0.00004 seconds | +./spec/castkit/ext/data_object/serialization_spec.rb[1:2:1] | passed | 0.00004 seconds | +./spec/castkit/ext/data_object/serialization_spec.rb[1:2:2] | passed | 0.00004 seconds | ./spec/castkit/ext/data_object/serialization_spec.rb[1:3:1] | passed | 0.00004 seconds | -./spec/castkit/ext/data_object/serialization_spec.rb[1:4:1] | passed | 0.00003 seconds | -./spec/castkit/ext/data_object/serialization_spec.rb[1:4:2] | passed | 0.00003 seconds | -./spec/castkit/validators/boolean_validator_spec.rb[1:1:1] | passed | 0.00054 seconds | -./spec/castkit/validators/boolean_validator_spec.rb[1:1:2] | passed | 0.00004 seconds | +./spec/castkit/ext/data_object/serialization_spec.rb[1:4:1] | passed | 0.00004 seconds | +./spec/castkit/ext/data_object/serialization_spec.rb[1:4:2] | passed | 0.00004 seconds | +./spec/castkit/types/base_spec.rb[1:1:1] | passed | 0.0001 seconds | +./spec/castkit/types/base_spec.rb[1:1:2] | passed | 0.00006 seconds | +./spec/castkit/validators/boolean_validator_spec.rb[1:1:1] | passed | 0.00004 seconds | +./spec/castkit/validators/boolean_validator_spec.rb[1:1:2] | passed | 0.00003 seconds | ./spec/castkit/validators/boolean_validator_spec.rb[1:1:3] | passed | 0.00003 seconds | -./spec/castkit/validators/boolean_validator_spec.rb[1:1:4] | passed | 0.00068 seconds | -./spec/castkit/validators/boolean_validator_spec.rb[1:2:1] | passed | 0.00004 seconds | +./spec/castkit/validators/boolean_validator_spec.rb[1:1:4] | passed | 0.00004 seconds | +./spec/castkit/validators/boolean_validator_spec.rb[1:2:1] | passed | 0.00003 seconds | ./spec/castkit/validators/numeric_validator_spec.rb[1:1:1:1] | passed | 0.00005 seconds | -./spec/castkit/validators/numeric_validator_spec.rb[1:1:2:1] | passed | 0.00009 seconds | -./spec/castkit/validators/numeric_validator_spec.rb[1:1:3:1] | passed | 0.00003 seconds | +./spec/castkit/validators/numeric_validator_spec.rb[1:1:2:1] | passed | 0.00004 seconds | +./spec/castkit/validators/numeric_validator_spec.rb[1:1:3:1] | passed | 0.00011 seconds | ./spec/castkit/validators/numeric_validator_spec.rb[1:1:4:1] | passed | 0.00003 seconds | -./spec/castkit/validators/string_validator_spec.rb[1:1:1:1:1] | passed | 0.00003 seconds | -./spec/castkit/validators/string_validator_spec.rb[1:1:2:1] | passed | 0.00004 seconds | -./spec/castkit/validators/string_validator_spec.rb[1:1:2:2] | passed | 0.00003 seconds | -./spec/castkit/validators/string_validator_spec.rb[1:1:3:1] | passed | 0.00004 seconds | -./spec/castkit/validators/string_validator_spec.rb[1:1:3:2] | passed | 0.00003 seconds | +./spec/castkit/validators/string_validator_spec.rb[1:1:1:1:1] | passed | 0.00004 seconds | +./spec/castkit/validators/string_validator_spec.rb[1:1:2:1] | passed | 0.00005 seconds | +./spec/castkit/validators/string_validator_spec.rb[1:1:2:2] | passed | 0.00004 seconds | +./spec/castkit/validators/string_validator_spec.rb[1:1:3:1] | passed | 0.00005 seconds | +./spec/castkit/validators/string_validator_spec.rb[1:1:3:2] | passed | 0.00004 seconds | ./spec/castkit/validators/string_validator_spec.rb[1:1:4:1] | passed | 0.00004 seconds | -./spec/castkit/validators/validator_spec.rb[1:1:1] | passed | 0.00017 seconds | -./spec/castkit/validators/validator_spec.rb[1:2:1] | passed | 0.00007 seconds | +./spec/castkit/validators/validator_spec.rb[1:1:1] | passed | 0.00004 seconds | +./spec/castkit/validators/validator_spec.rb[1:2:1] | passed | 0.00004 seconds | ./spec/castkit_spec.rb[1:1] | passed | 0.00004 seconds | -./spec/castkit_spec.rb[1:2:1:1] | passed | 0.00015 seconds | -./spec/castkit_spec.rb[1:2:1:2] | passed | 0.00009 seconds | +./spec/castkit_spec.rb[1:2:1:1] | passed | 0.00016 seconds | +./spec/castkit_spec.rb[1:2:1:2] | passed | 0.00008 seconds | ./spec/castkit_spec.rb[1:2:1:3] | passed | 0.00012 seconds | -./spec/castkit_spec.rb[1:2:1:4] | passed | 0.00017 seconds | -./spec/castkit_spec.rb[1:2:2:1] | passed | 0.00012 seconds | -./spec/castkit_spec.rb[1:2:2:2] | passed | 0.00009 seconds | -./spec/castkit_spec.rb[1:2:2:3] | passed | 0.00007 seconds | -./spec/castkit_spec.rb[1:2:3:1] | passed | 0.00006 seconds | -./spec/castkit_spec.rb[1:2:3:2] | passed | 0.00006 seconds | -./spec/castkit_spec.rb[1:2:3:3] | passed | 0.00006 seconds | -./spec/castkit_spec.rb[1:2:4:1] | passed | 0.00008 seconds | -./spec/castkit_spec.rb[1:3:1] | passed | 0.00019 seconds | -./spec/castkit_spec.rb[1:3:2] | passed | 0.00018 seconds | -./spec/castkit_spec.rb[1:3:3] | passed | 0.00026 seconds | -./spec/castkit_spec.rb[1:3:4] | passed | 0.00013 seconds | -./spec/castkit_spec.rb[1:3:5] | passed | 0.00012 seconds | -./spec/castkit_spec.rb[1:3:6] | passed | 0.00021 seconds | -./spec/castkit_spec.rb[1:3:7] | passed | 0.00019 seconds | -./spec/castkit_spec.rb[1:3:8] | passed | 0.00021 seconds | -./spec/configuration_spec.rb[1:1:1] | passed | 0.00008 seconds | -./spec/configuration_spec.rb[1:2:1] | passed | 0.00005 seconds | -./spec/configuration_spec.rb[1:3:1] | passed | 0.00005 seconds | -./spec/configuration_spec.rb[1:3:2] | passed | 0.00004 seconds | -./spec/configuration_spec.rb[1:3:3] | passed | 0.00004 seconds | -./spec/configuration_spec.rb[1:3:4] | passed | 0.00006 seconds | -./spec/configuration_spec.rb[1:4:1] | passed | 0.00006 seconds | +./spec/castkit_spec.rb[1:2:1:4] | passed | 0.00012 seconds | +./spec/castkit_spec.rb[1:2:2:1] | passed | 0.0003 seconds | +./spec/castkit_spec.rb[1:2:2:2] | passed | 0.00026 seconds | +./spec/castkit_spec.rb[1:2:2:3] | passed | 0.00015 seconds | +./spec/castkit_spec.rb[1:2:3:1] | passed | 0.0003 seconds | +./spec/castkit_spec.rb[1:2:3:2] | passed | 0.00017 seconds | +./spec/castkit_spec.rb[1:2:3:3] | passed | 0.00008 seconds | +./spec/castkit_spec.rb[1:2:4:1] | passed | 0.00015 seconds | +./spec/castkit_spec.rb[1:3:1] | passed | 0.0003 seconds | +./spec/castkit_spec.rb[1:3:2] | passed | 0.0002 seconds | +./spec/castkit_spec.rb[1:3:3] | passed | 0.00028 seconds | +./spec/castkit_spec.rb[1:3:4] | passed | 0.00014 seconds | +./spec/castkit_spec.rb[1:3:5] | passed | 0.00014 seconds | +./spec/castkit_spec.rb[1:3:6] | passed | 0.00027 seconds | +./spec/castkit_spec.rb[1:3:7] | passed | 0.00029 seconds | +./spec/castkit_spec.rb[1:3:8] | passed | 0.00035 seconds | +./spec/configuration_spec.rb[1:1:1] | passed | 0.00011 seconds | +./spec/configuration_spec.rb[1:2:1] | passed | 0.00006 seconds | +./spec/configuration_spec.rb[1:3:1] | passed | 0.00006 seconds | +./spec/configuration_spec.rb[1:3:2] | passed | 0.00005 seconds | +./spec/configuration_spec.rb[1:3:3] | passed | 0.00005 seconds | +./spec/configuration_spec.rb[1:3:4] | passed | 0.00025 seconds | +./spec/configuration_spec.rb[1:4:1] | passed | 0.0001 seconds | diff --git a/lib/castkit/types/base.rb b/lib/castkit/types/base.rb index 09fb960..da9e712 100644 --- a/lib/castkit/types/base.rb +++ b/lib/castkit/types/base.rb @@ -24,18 +24,19 @@ class << self # @param options [Hash] options passed to `validate!`, e.g., `min`, `max`, `force_type` # @param context [Symbol, String, nil] context label for error messages # @return [Object] the deserialized and validated value - def cast!(value, validator: nil, options: {}, context: {}) + def cast!(value, validator: nil, options: {}, context: {}, **extra_options) + options = options.merge(extra_options) instance = new validator ||= options.delete(:validator) validator ||= default_validator(instance) if options[:force_type] deserialized_value = instance.deserialize(value) - validator.call(deserialized_value, options: options, context: context) + invoke_validator(validator, deserialized_value, options: options, context: context) return deserialized_value end - validator.call(value, options: options, context: context) + invoke_validator(validator, value, options: options, context: context) instance.deserialize(value) end @@ -76,6 +77,26 @@ def default_validator(instance) instance.validate!(value, options: options, context: context) end end + + # Dispatches validation to support callable validators with different arities. + # + # @param validator [#call, Proc] the validator to invoke + # @param value [Object] the value being validated + # @param options [Hash] validation options + # @param context [Symbol, String, nil] context for error messages + # @return [void] + def invoke_validator(validator, value, options:, context:) + return validator.call(value, options: options, context: context) unless validator.is_a?(Proc) + + case validator.arity + when 1 + validator.call(value) + when 2 + validator.call(value, options) + else + validator.call(value, options: options, context: context) + end + end end # Deserializes the value. Override in subclasses to coerce input (e.g., `"123"` → `123`). diff --git a/spec/castkit/types/base_spec.rb b/spec/castkit/types/base_spec.rb new file mode 100644 index 0000000..82283e9 --- /dev/null +++ b/spec/castkit/types/base_spec.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +require "spec_helper" +require "castkit/types/base" + +RSpec.describe Castkit::Types::Base do + let(:type_class) do + Class.new(described_class) do + def deserialize(value) + value + end + end + end + + describe ".cast!" do + it "supports custom validators that accept only the value" do + validator = ->(v) { raise Castkit::AttributeError, "empty" if v.to_s.empty? } + + expect do + type_class.cast!("valid", validator: validator) + end.not_to raise_error + + expect do + type_class.cast!("", validator: validator) + end.to raise_error(Castkit::AttributeError, /empty/) + end + + it "supports custom validators that accept value and options hash" do + validator = ->(v, opts) { raise Castkit::AttributeError, "missing #{opts[:name]}" if v.nil? } + + expect do + type_class.cast!("ok", validator: validator, name: "name") + end.not_to raise_error + + expect do + type_class.cast!(nil, validator: validator, name: "name") + end.to raise_error(Castkit::AttributeError, /missing name/) + end + end +end