Skip to content

Commit f8ea16b

Browse files
chore: collect metadata from type DSL
1 parent 2fe1d5f commit f8ea16b

File tree

10 files changed

+145
-12
lines changed

10 files changed

+145
-12
lines changed

lib/openai/internal/type/array_of.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ def to_sorbet_type
148148
# @option spec [Boolean] :"nil?"
149149
def initialize(type_info, spec = {})
150150
@item_type_fn = OpenAI::Internal::Type::Converter.type_info(type_info || spec)
151+
@meta = OpenAI::Internal::Type::Converter.meta_info(type_info, spec)
151152
@nilable = spec.fetch(:nil?, false)
152153
end
153154

lib/openai/internal/type/base_model.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ def fields
5252
#
5353
# @option spec [Boolean] :"nil?"
5454
private def add_field(name_sym, required:, type_info:, spec:)
55+
meta = OpenAI::Internal::Type::Converter.meta_info(type_info, spec)
5556
type_fn, info =
5657
case type_info
5758
in Proc | OpenAI::Internal::Type::Converter | Class
@@ -74,7 +75,8 @@ def fields
7475
required: required,
7576
nilable: nilable,
7677
const: const,
77-
type_fn: type_fn
78+
type_fn: type_fn,
79+
meta: meta
7880
}
7981

8082
define_method(setter) do |value|

lib/openai/internal/type/converter.rb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,33 @@ def type_info(spec)
9898
end
9999
end
100100

101+
# @api private
102+
#
103+
# @param type_info [Hash{Symbol=>Object}, Proc, OpenAI::Internal::Type::Converter, Class] .
104+
#
105+
# @option type_info [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
106+
#
107+
# @option type_info [Proc] :enum
108+
#
109+
# @option type_info [Proc] :union
110+
#
111+
# @option type_info [Boolean] :"nil?"
112+
#
113+
# @param spec [Hash{Symbol=>Object}, Proc, OpenAI::Internal::Type::Converter, Class] .
114+
#
115+
# @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
116+
#
117+
# @option spec [Proc] :enum
118+
#
119+
# @option spec [Proc] :union
120+
#
121+
# @option spec [Boolean] :"nil?"
122+
#
123+
# @return [Hash{Symbol=>Object}]
124+
def meta_info(type_info, spec)
125+
[spec, type_info].grep(Hash).first.to_h.except(:const, :enum, :union, :nil?)
126+
end
127+
101128
# @api private
102129
#
103130
# @param translate_names [Boolean]

lib/openai/internal/type/hash_of.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ def to_sorbet_type
168168
# @option spec [Boolean] :"nil?"
169169
def initialize(type_info, spec = {})
170170
@item_type_fn = OpenAI::Internal::Type::Converter.type_info(type_info || spec)
171+
@meta = OpenAI::Internal::Type::Converter.meta_info(type_info, spec)
171172
@nilable = spec.fetch(:nil?, false)
172173
end
173174

lib/openai/internal/type/union.rb

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,20 +33,20 @@ module Union
3333
#
3434
# All of the specified variant info for this union.
3535
#
36-
# @return [Array<Array(Symbol, Proc)>]
36+
# @return [Array<Array(Symbol, Proc, Hash{Symbol=>Object})>]
3737
private def known_variants = (@known_variants ||= [])
3838

3939
# @api private
4040
#
41-
# @return [Array<Array(Symbol, Object)>]
41+
# @return [Array<Array(Symbol, Object, Hash{Symbol=>Object})>]
4242
protected def derefed_variants
43-
known_variants.map { |key, variant_fn| [key, variant_fn.call] }
43+
known_variants.map { |key, variant_fn, meta| [key, variant_fn.call, meta] }
4444
end
4545

4646
# All of the specified variants for this union.
4747
#
4848
# @return [Array<Object>]
49-
def variants = derefed_variants.map(&:last)
49+
def variants = derefed_variants.map { _2 }
5050

5151
# @api private
5252
#
@@ -72,12 +72,13 @@ def variants = derefed_variants.map(&:last)
7272
#
7373
# @option spec [Boolean] :"nil?"
7474
private def variant(key, spec = nil)
75+
meta = OpenAI::Internal::Type::Converter.meta_info(nil, spec)
7576
variant_info =
7677
case key
7778
in Symbol
78-
[key, OpenAI::Internal::Type::Converter.type_info(spec)]
79+
[key, OpenAI::Internal::Type::Converter.type_info(spec), meta]
7980
in Proc | OpenAI::Internal::Type::Converter | Class | Hash
80-
[nil, OpenAI::Internal::Type::Converter.type_info(key)]
81+
[nil, OpenAI::Internal::Type::Converter.type_info(key), meta]
8182
end
8283

8384
known_variants << variant_info
@@ -100,7 +101,8 @@ def variants = derefed_variants.map(&:last)
100101
return nil if key == OpenAI::Internal::OMIT
101102

102103
key = key.to_sym if key.is_a?(String)
103-
known_variants.find { |k,| k == key }&.last&.call
104+
_, found = known_variants.find { |k,| k == key }
105+
found&.call
104106
else
105107
nil
106108
end

rbi/openai/internal/type/converter.rbi

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,52 @@ module OpenAI
8686
def self.type_info(spec)
8787
end
8888

89+
# @api private
90+
sig do
91+
params(
92+
type_info:
93+
T.any(
94+
{
95+
const:
96+
T.nilable(
97+
T.any(NilClass, T::Boolean, Integer, Float, Symbol)
98+
),
99+
enum:
100+
T.nilable(
101+
T.proc.returns(OpenAI::Internal::Type::Converter::Input)
102+
),
103+
union:
104+
T.nilable(
105+
T.proc.returns(OpenAI::Internal::Type::Converter::Input)
106+
)
107+
},
108+
T.proc.returns(OpenAI::Internal::Type::Converter::Input),
109+
OpenAI::Internal::Type::Converter::Input
110+
),
111+
spec:
112+
T.any(
113+
{
114+
const:
115+
T.nilable(
116+
T.any(NilClass, T::Boolean, Integer, Float, Symbol)
117+
),
118+
enum:
119+
T.nilable(
120+
T.proc.returns(OpenAI::Internal::Type::Converter::Input)
121+
),
122+
union:
123+
T.nilable(
124+
T.proc.returns(OpenAI::Internal::Type::Converter::Input)
125+
)
126+
},
127+
T.proc.returns(OpenAI::Internal::Type::Converter::Input),
128+
OpenAI::Internal::Type::Converter::Input
129+
)
130+
).returns(OpenAI::Internal::AnyHash)
131+
end
132+
def self.meta_info(type_info, spec)
133+
end
134+
89135
# @api private
90136
sig do
91137
params(translate_names: T::Boolean).returns(

rbi/openai/internal/type/union.rbi

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ module OpenAI
1616
T::Array[
1717
[
1818
T.nilable(Symbol),
19-
T.proc.returns(OpenAI::Internal::Type::Converter::Input)
19+
T.proc.returns(OpenAI::Internal::Type::Converter::Input),
20+
OpenAI::Internal::AnyHash
2021
]
2122
]
2223
)
@@ -25,7 +26,11 @@ module OpenAI
2526
end
2627

2728
# @api private
28-
sig { returns(T::Array[[T.nilable(Symbol), T.anything]]) }
29+
sig do
30+
returns(
31+
T::Array[[T.nilable(Symbol), T.anything, OpenAI::Internal::AnyHash]]
32+
)
33+
end
2934
protected def derefed_variants
3035
end
3136

sig/openai/internal/type/converter.rbs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,23 @@ module OpenAI
3939
| OpenAI::Internal::Type::Converter::input spec
4040
) -> (^-> top)
4141

42+
def self.meta_info: (
43+
{
44+
const: (nil | bool | Integer | Float | Symbol)?,
45+
enum: ^-> OpenAI::Internal::Type::Converter::input?,
46+
union: ^-> OpenAI::Internal::Type::Converter::input?
47+
}
48+
| ^-> OpenAI::Internal::Type::Converter::input
49+
| OpenAI::Internal::Type::Converter::input type_info,
50+
{
51+
const: (nil | bool | Integer | Float | Symbol)?,
52+
enum: ^-> OpenAI::Internal::Type::Converter::input?,
53+
union: ^-> OpenAI::Internal::Type::Converter::input?
54+
}
55+
| ^-> OpenAI::Internal::Type::Converter::input
56+
| OpenAI::Internal::Type::Converter::input spec
57+
) -> ::Hash[Symbol, top]
58+
4259
def self.new_coerce_state: (
4360
?translate_names: bool
4461
) -> OpenAI::Internal::Type::Converter::coerce_state

sig/openai/internal/type/union.rbs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ module OpenAI
55
include OpenAI::Internal::Type::Converter
66
include OpenAI::Internal::Util::SorbetRuntimeSupport
77

8-
private def self.known_variants: -> ::Array[[Symbol?, (^-> OpenAI::Internal::Type::Converter::input)]]
8+
private def self.known_variants: -> ::Array[[Symbol?, (^-> OpenAI::Internal::Type::Converter::input), ::Hash[Symbol, top]]]
99

10-
def self.derefed_variants: -> ::Array[[Symbol?, top]]
10+
def self.derefed_variants: -> ::Array[[Symbol?, top, ::Hash[Symbol, top]]]
1111

1212
def self.variants: -> ::Array[top]
1313

test/openai/internal/type/base_model_test.rb

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -686,3 +686,35 @@ def test_equality
686686
end
687687
end
688688
end
689+
690+
class OpenAI::Test::MetaInfoTest < Minitest::Test
691+
A1 = OpenAI::Internal::Type::ArrayOf[Integer, nil?: true, doc: "dog"]
692+
H1 = OpenAI::Internal::Type::HashOf[-> { String }, nil?: true, doc: "dawg"]
693+
694+
class M1 < OpenAI::Internal::Type::BaseModel
695+
required :a, Integer, doc: "dog"
696+
optional :b, -> { String }, nil?: true, doc: "dawg"
697+
end
698+
699+
module U1
700+
extend OpenAI::Internal::Type::Union
701+
702+
variant -> { Integer }, const: 2, doc: "dog"
703+
variant -> { String }, doc: "dawg"
704+
end
705+
706+
def test_meta_retrieval
707+
m1 = A1.instance_variable_get(:@meta)
708+
m2 = H1.instance_variable_get(:@meta)
709+
assert_equal({doc: "dog"}, m1)
710+
assert_equal({doc: "dawg"}, m2)
711+
712+
ma, mb = M1.fields.fetch_values(:a, :b)
713+
assert_equal({doc: "dog"}, ma.fetch(:meta))
714+
assert_equal({doc: "dawg"}, mb.fetch(:meta))
715+
716+
ua, ub = U1.send(:known_variants).map(&:last)
717+
assert_equal({doc: "dog"}, ua)
718+
assert_equal({doc: "dawg"}, ub)
719+
end
720+
end

0 commit comments

Comments
 (0)