From 2ed834e290152ae81b1f48b6b1d2f4b64637b6c6 Mon Sep 17 00:00:00 2001 From: Stainless Bot Date: Wed, 12 Mar 2025 21:06:06 +0000 Subject: [PATCH] fix: enums should only coerce matching symbols into strings --- lib/openai/base_model.rb | 29 +++++++++++++++++++++++++---- test/openai/base_model_test.rb | 16 +++++++++++++++- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/lib/openai/base_model.rb b/lib/openai/base_model.rb index 8f58a6ab..798e49ca 100644 --- a/lib/openai/base_model.rb +++ b/lib/openai/base_model.rb @@ -55,11 +55,11 @@ def type_info(spec) type_info(spec.slice(:const, :enum, :union).first&.last) in Proc spec - in OpenAI::Converter | Class + in OpenAI::Converter | Class | Symbol -> { spec } in true | false -> { OpenAI::BooleanModel } - in NilClass | true | false | Symbol | Integer | Float + in NilClass | Integer | Float -> { spec.class } end end @@ -82,6 +82,13 @@ def coerce(target, value) case target in OpenAI::Converter target.coerce(value) + in Symbol + case value + in Symbol | String if (val = value.to_sym) == target + val + else + value + end in Class case target in -> { _1 <= NilClass } @@ -140,6 +147,13 @@ def try_strict_coerce(target, value) case target in OpenAI::Converter target.try_strict_coerce(value) + in Symbol + case value + in Symbol | String if (val = value.to_sym) == target + [true, val, 1] + else + [false, false, 0] + end in Class case [target, value] in [-> { _1 <= NilClass }, _] @@ -367,7 +381,14 @@ class << self # # @return [Symbol, Object] # - def coerce(value) = (value.is_a?(String) ? value.to_sym : value) + def coerce(value) + case value + in Symbol | String if values.include?(val = value.to_sym) + val + else + value + end + end # @!parse # # @private @@ -388,7 +409,7 @@ def try_strict_coerce(value) return [true, value, 1] if values.include?(value) case value - in String if values.include?(val = value.to_sym) + in Symbol | String if values.include?(val = value.to_sym) [true, val, 1] else case [value, values.first] diff --git a/test/openai/base_model_test.rb b/test/openai/base_model_test.rb index 0444fb0e..f6e598d0 100644 --- a/test/openai/base_model_test.rb +++ b/test/openai/base_model_test.rb @@ -22,7 +22,7 @@ def test_basic_coerce end assert_pattern do - OpenAI::Converter.coerce(A2, %w[a b c]) => [:a, :b, :c] + OpenAI::Converter.coerce(A2, %w[a b c]) => [:a, :b, "c"] end end @@ -338,4 +338,18 @@ def test_basic_eql refute_equal(U1, U2) assert_equal(U1, U3) end + + class U4 < OpenAI::Union + variant :a, const: :a + variant :b, const: :b + end + + def test_basic_const_union + assert_pattern do + U4.coerce(nil) => nil + U4.coerce("") => "" + U4.coerce(:a) => :a + U4.coerce("a") => :a + end + end end