Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 10 additions & 27 deletions lib/openai/internal/type/array_of.rb
Original file line number Diff line number Diff line change
Expand Up @@ -38,19 +38,7 @@ def self.[](...) = new(...)
# @param other [Object]
#
# @return [Boolean]
def ===(other)
type = item_type
other.is_a?(Array) && other.all? do |item|
case item
in ^type
true
in nil
nilable?
else
false
end
end
end
def ===(other) = other.is_a?(Array) && other.all?(item_type)
Comment thread
jbeckwith-oai marked this conversation as resolved.

# @api public
#
Expand Down Expand Up @@ -94,21 +82,16 @@ def coerce(value, state:)

target = item_type
exactness[:yes] += 1
error = state.fetch(:error)
converted = value.map do |item|
case [nilable?, item]
in [true, nil]
exactness[:yes] += 1
nil
else
coerced, item_error =
OpenAI::Internal::Type::Converter.coerce_with_error(target, item, state: state)
error ||= item_error
coerced
value
.map do |item|
case [nilable?, item]
in [true, nil]
exactness[:yes] += 1
nil
else
OpenAI::Internal::Type::Converter.coerce(target, item, state: state)
Comment thread
jbeckwith-oai marked this conversation as resolved.
end
end
end
state[:error] = error
converted
end

# @api private
Expand Down
28 changes: 7 additions & 21 deletions lib/openai/internal/type/base_model.rb
Original file line number Diff line number Diff line change
Expand Up @@ -82,22 +82,12 @@ def fields
define_method(setter) do |value|
target = type_fn.call
state = OpenAI::Internal::Type::Converter.new_coerce_state(translate_names: false)
coerced =
if value.nil? && (nilable || !required)
nil
else
OpenAI::Internal::Type::Converter.coerce(target, value, state: state)
end
error = state.fetch(:error)
@coerced.store(name_sym, error || true)
coerced = OpenAI::Internal::Type::Converter.coerce(target, value, state: state)
Comment thread
jbeckwith-oai marked this conversation as resolved.
error = @coerced.store(name_sym, state.fetch(:error) || true)
stored =
case [target, error]
in [OpenAI::Internal::Type::Converter | Symbol, nil]
if value in ^target
value
else
coerced
end
coerced
else
value
end
Expand Down Expand Up @@ -283,7 +273,7 @@ class << self
def coerce(value, state:)
exactness = state.fetch(:exactness)

if value.is_a?(self)
if value.is_a?(self.class)
Comment thread
jbeckwith-oai marked this conversation as resolved.
exactness[:yes] += 1
return value
end
Expand All @@ -301,7 +291,6 @@ def coerce(value, state:)
viability = instance.instance_variable_get(:@coerced)

# rubocop:disable Metrics/BlockLength
error = state.fetch(:error)
fields.each do |name, field|
mode, required, target = field.fetch_values(:mode, :required, :type)
api_name, nilable, const = field.fetch_values(:api_name, :nilable, :const)
Expand All @@ -319,14 +308,13 @@ def coerce(value, state:)
item = val.fetch(src_name)
keys.delete(src_name)

field_error = nil
state[:error] = nil
converted =
if item.nil? && (nilable || !required)
exactness[nilable ? :yes : :maybe] += 1
nil
else
coerced, field_error =
OpenAI::Internal::Type::Converter.coerce_with_error(target, item, state: state)
coerced = OpenAI::Internal::Type::Converter.coerce(target, item, state: state)
case target
in OpenAI::Internal::Type::Converter | Symbol
coerced
Expand All @@ -335,13 +323,11 @@ def coerce(value, state:)
end
end

error ||= field_error
viability.store(name, field_error || true)
viability.store(name, state.fetch(:error) || true)
data.store(name, converted)
end
# rubocop:enable Metrics/BlockLength

state[:error] = error
keys.each { data.store(_1, val.fetch(_1)) }
instance
end
Expand Down
20 changes: 0 additions & 20 deletions lib/openai/internal/type/converter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -268,26 +268,6 @@ def coerce(target, value, state: OpenAI::Internal::Type::Converter.new_coerce_st
# rubocop:enable Metrics/BlockNesting
end

# @api private
#
# Coerces a value while isolating its error from sibling coercions.
#
# @param target [OpenAI::Internal::Type::Converter, Class]
#
# @param value [Object]
#
# @param state [Hash{Symbol=>Object}]
#
# @return [Array(Object, StandardError, nil)]
def coerce_with_error(target, value, state:)
previous_error = state.fetch(:error)
state[:error] = nil
coerced = coerce(target, value, state: state)
[coerced, state.fetch(:error)]
ensure
state[:error] = previous_error
end

# @api private
#
# @param target [OpenAI::Internal::Type::Converter, Class]
Expand Down
37 changes: 15 additions & 22 deletions lib/openai/internal/type/hash_of.rb
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,6 @@ def ===(other)
case [key, val]
in [Symbol | String, ^type]
true
in [Symbol | String, nil]
nilable?
else
false
end
Expand Down Expand Up @@ -99,26 +97,21 @@ def coerce(value, state:)

target = item_type
exactness[:yes] += 1
error = state.fetch(:error)
converted = value.to_h do |key, val|
k = key.is_a?(String) ? key.to_sym : key
v =
case [nilable?, val]
in [true, nil]
exactness[:yes] += 1
nil
else
coerced, value_error =
OpenAI::Internal::Type::Converter.coerce_with_error(target, val, state: state)
error ||= value_error
coerced
end

exactness[:no] += 1 unless k.is_a?(Symbol)
[k, v]
end
state[:error] = error
converted
value
.to_h do |key, val|
k = key.is_a?(String) ? key.to_sym : key
v =
case [nilable?, val]
in [true, nil]
exactness[:yes] += 1
nil
else
OpenAI::Internal::Type::Converter.coerce(target, val, state: state)
end

exactness[:no] += 1 unless k.is_a?(Symbol)
[k, v]
end
end

# @api private
Expand Down
11 changes: 4 additions & 7 deletions lib/openai/internal/type/union.rb
Original file line number Diff line number Diff line change
Expand Up @@ -159,11 +159,11 @@ def hash = variants.hash
#
# @return [Object]
def coerce(value, state:)
strictness = state.fetch(:strictness)
if (target = resolve_variant(value))
return OpenAI::Internal::Type::Converter.coerce(target, value, state: state)
end

strictness = state.fetch(:strictness)
Comment thread
jbeckwith-oai marked this conversation as resolved.
exactness = state.fetch(:exactness)

alternatives = []
Expand All @@ -172,16 +172,14 @@ def coerce(value, state:)
exact = state[:exactness] = {yes: 0, no: 0, maybe: 0}
state[:branched] += 1

coerced, error =
OpenAI::Internal::Type::Converter.coerce_with_error(target, value, state: state)
coerced = OpenAI::Internal::Type::Converter.coerce(target, value, state: state)
Comment thread
jbeckwith-oai marked this conversation as resolved.
yes, no, maybe = exact.values
if (no + maybe).zero? || (!strictness && yes.positive?)
exact.each { exactness[_1] += _2 }
state[:exactness] = exactness
state[:error] = error
return coerced
elsif maybe.positive?
alternatives << [[-yes, -maybe, no], exact, coerced, error]
alternatives << [[-yes, -maybe, no], exact, coerced]
end
end

Expand All @@ -190,9 +188,8 @@ def coerce(value, state:)
exactness[:no] += 1
state[:error] = ArgumentError.new("no matching variant for #{value.inspect}")
value
in [[_, exact, coerced, error], *]
in [[_, exact, coerced], *]
exact.each { exactness[_1] += _2 }
state[:error] = error
coerced
end
.tap { state[:exactness] = exactness }
Expand Down
Loading