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

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

Returns:

  • (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

Raises:

  • (ArgumentError)


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