Module: DSPy::Mixins::TypeCoercion
- Extended by:
- T::Sig
- Included in:
- Predict, Tools::Base, Tools::Toolset::ToolProxy
- Defined in:
- lib/dspy/mixins/type_coercion.rb
Overview
Shared module for type coercion logic across DSPy modules
Class Method Summary collapse
- .deserialize_enum(enum_class, value) ⇒ Object
- .enum_type?(type) ⇒ Boolean
- .extract_enum_class(prop_type) ⇒ Object
Class Method Details
.deserialize_enum(enum_class, value) ⇒ Object
19 20 21 22 23 24 25 26 27 28 29 30 31 |
# File 'lib/dspy/mixins/type_coercion.rb', line 19 def self.deserialize_enum(enum_class, value) return value if value.is_a?(enum_class) str = value.to_s result = enum_class.try_deserialize(str) return result if result @ci_enum_cache ||= {} ci_map = (@ci_enum_cache[enum_class] ||= enum_class.values.each_with_object({}) { |v, h| h[v.serialize.downcase.freeze] = v }.freeze) ci_map[str.downcase] end |
.enum_type?(type) ⇒ Boolean
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/dspy/mixins/type_coercion.rb', line 35 def self.enum_type?(type) return false unless type case type when Class !!(type < T::Enum) when T::Types::Simple type.raw_type.is_a?(Class) && !!(type.raw_type < T::Enum) when T::Types::Union non_nil = type.types.reject { |t| t.is_a?(T::Types::Simple) && t.raw_type == NilClass } non_nil.size == 1 && enum_type?(non_nil.first) else false end rescue StandardError false end |
.extract_enum_class(prop_type) ⇒ Object
55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/dspy/mixins/type_coercion.rb', line 55 def self.extract_enum_class(prop_type) case prop_type when Class return prop_type if prop_type < T::Enum when T::Types::Simple return prop_type.raw_type if prop_type.raw_type.is_a?(Class) && prop_type.raw_type < T::Enum when T::Types::Union non_nil = prop_type.types.reject { |t| t.is_a?(T::Types::Simple) && t.raw_type == NilClass } return extract_enum_class(non_nil.first) if non_nil.size == 1 end raise ArgumentError, "Not an enum type: #{prop_type.inspect}" end |