Skip to content

Commit a05d2c5

Browse files
chore(internal): improve response envelope unwrap functionality
1 parent cec4b05 commit a05d2c5

File tree

7 files changed

+55
-25
lines changed

7 files changed

+55
-25
lines changed

lib/openai/internal/transport/base_client.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ def initialize(
214214
#
215215
# @option req [Object, nil] :body
216216
#
217-
# @option req [Symbol, nil] :unwrap
217+
# @option req [Symbol, Integer, Array<Symbol, Integer>, Proc, nil] :unwrap
218218
#
219219
# @option req [Class<OpenAI::Internal::Type::BasePage>, nil] :page
220220
#
@@ -415,7 +415,7 @@ def initialize(
415415
#
416416
# @param body [Object, nil]
417417
#
418-
# @param unwrap [Symbol, nil]
418+
# @param unwrap [Symbol, Integer, Array<Symbol, Integer>, Proc, nil]
419419
#
420420
# @param page [Class<OpenAI::Internal::Type::BasePage>, nil]
421421
#

lib/openai/internal/util.rb

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -175,30 +175,31 @@ def deep_merge(*values, sentinel: nil, concat: false)
175175
# @api private
176176
#
177177
# @param data [Hash{Symbol=>Object}, Array<Object>, Object]
178-
# @param pick [Symbol, Integer, Array<Symbol, Integer>, nil]
179-
# @param sentinel [Object, nil]
178+
# @param pick [Symbol, Integer, Array<Symbol, Integer>, Proc, nil]
180179
# @param blk [Proc, nil]
181180
#
182181
# @return [Object, nil]
183-
def dig(data, pick, sentinel = nil, &blk)
184-
case [data, pick, blk]
185-
in [_, nil, nil]
182+
def dig(data, pick, &blk)
183+
case [data, pick]
184+
in [_, nil]
186185
data
187-
in [Hash, Symbol, _] | [Array, Integer, _]
188-
blk.nil? ? data.fetch(pick, sentinel) : data.fetch(pick, &blk)
189-
in [Hash | Array, Array, _]
186+
in [Hash, Symbol] | [Array, Integer]
187+
data.fetch(pick) { blk&.call }
188+
in [Hash | Array, Array]
190189
pick.reduce(data) do |acc, key|
191190
case acc
192191
in Hash if acc.key?(key)
193192
acc.fetch(key)
194193
in Array if key.is_a?(Integer) && key < acc.length
195194
acc[key]
196195
else
197-
return blk.nil? ? sentinel : blk.call
196+
return blk&.call
198197
end
199198
end
200-
in _
201-
blk.nil? ? sentinel : blk.call
199+
in [_, Proc]
200+
pick.call(data)
201+
else
202+
blk&.call
202203
end
203204
end
204205
end

rbi/lib/openai/internal/transport/base_client.rbi

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,14 @@ module OpenAI
2424
)]
2525
),
2626
body: T.nilable(T.anything),
27-
unwrap: T.nilable(Symbol),
27+
unwrap: T.nilable(
28+
T.any(
29+
Symbol,
30+
Integer,
31+
T::Array[T.any(Symbol, Integer)],
32+
T.proc.params(arg0: T.anything).returns(T.anything)
33+
)
34+
),
2835
page: T.nilable(T::Class[OpenAI::Internal::Type::BasePage[OpenAI::Internal::Type::BaseModel]]),
2936
stream: T.nilable(
3037
T::Class[OpenAI::Internal::Type::BaseStream[T.anything,
@@ -173,7 +180,14 @@ module OpenAI
173180
)]
174181
),
175182
body: T.nilable(T.anything),
176-
unwrap: T.nilable(Symbol),
183+
unwrap: T.nilable(
184+
T.any(
185+
Symbol,
186+
Integer,
187+
T::Array[T.any(Symbol, Integer)],
188+
T.proc.params(arg0: T.anything).returns(T.anything)
189+
)
190+
),
177191
page: T.nilable(T::Class[OpenAI::Internal::Type::BasePage[OpenAI::Internal::Type::BaseModel]]),
178192
stream: T.nilable(
179193
T::Class[OpenAI::Internal::Type::BaseStream[T.anything,

rbi/lib/openai/internal/util.rbi

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,19 @@ module OpenAI
6868
sig do
6969
params(
7070
data: T.any(OpenAI::Internal::AnyHash, T::Array[T.anything], T.anything),
71-
pick: T.nilable(T.any(Symbol, Integer, T::Array[T.any(Symbol, Integer)])),
72-
sentinel: T.nilable(T.anything),
71+
pick: T.nilable(
72+
T.any(
73+
Symbol,
74+
Integer,
75+
T::Array[T.any(Symbol, Integer)],
76+
T.proc.params(arg0: T.anything).returns(T.anything)
77+
)
78+
),
7379
blk: T.nilable(T.proc.returns(T.anything))
7480
)
7581
.returns(T.nilable(T.anything))
7682
end
77-
def dig(data, pick, sentinel = nil, &blk); end
83+
def dig(data, pick, &blk); end
7884
end
7985

8086
class << self

sig/openai/internal/transport/base_client.rbs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ module OpenAI
1111
| Integer
1212
| ::Array[(String | Integer)?])?]?,
1313
body: top?,
14-
unwrap: Symbol?,
14+
unwrap: (Symbol
15+
| Integer
16+
| ::Array[(Symbol | Integer)]
17+
| (^(top arg0) -> top))?,
1518
page: Class?,
1619
stream: Class?,
1720
model: OpenAI::Internal::Type::Converter::input?,
@@ -96,7 +99,10 @@ module OpenAI
9699
| Integer
97100
| ::Array[(String | Integer)?])?]?,
98101
?body: top?,
99-
?unwrap: Symbol?,
102+
?unwrap: (Symbol
103+
| Integer
104+
| ::Array[(Symbol | Integer)]
105+
| (^(top arg0) -> top))?,
100106
?page: Class?,
101107
?stream: Class?,
102108
?model: OpenAI::Internal::Type::Converter::input?,

sig/openai/internal/util.rbs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,10 @@ module OpenAI
2929

3030
def self?.dig: (
3131
::Hash[Symbol, top] | ::Array[top] | top data,
32-
(Symbol | Integer | ::Array[(Symbol | Integer)])? pick,
33-
?top? sentinel
32+
(Symbol
33+
| Integer
34+
| ::Array[(Symbol | Integer)]
35+
| (^(top arg0) -> top))? pick
3436
) {
3537
-> top?
3638
} -> top?

test/openai/internal/util_test.rb

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,9 @@ def test_dig
8787
OpenAI::Internal::Util.dig([], 1.0) => nil
8888

8989
OpenAI::Internal::Util.dig(Object, 1) => nil
90-
OpenAI::Internal::Util.dig([], 1.0, 2) => 2
9190
OpenAI::Internal::Util.dig([], 1.0) { 2 } => 2
91+
OpenAI::Internal::Util.dig([], ->(_) { 2 }) => 2
92+
OpenAI::Internal::Util.dig([1], -> { _1 in [1] }) => true
9293
end
9394
end
9495
end
@@ -165,9 +166,9 @@ def test_json_content
165166
"application/vnd.github.v3+json" => true,
166167
"application/vnd.api+json" => true
167168
}
168-
cases.each do |header, _verdict|
169+
cases.each do |header, verdict|
169170
assert_pattern do
170-
OpenAI::Internal::Util::JSON_CONTENT.match?(header) => verdict
171+
OpenAI::Internal::Util::JSON_CONTENT.match?(header) => ^verdict
171172
end
172173
end
173174
end

0 commit comments

Comments
 (0)