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
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "0.17.0"
".": "0.17.1"
}
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
# Changelog

## 0.17.1 (2025-08-09)

Full Changelog: [v0.17.0...v0.17.1](https://github.com/openai/openai-ruby/compare/v0.17.0...v0.17.1)

### Chores

* collect metadata from type DSL ([d63cb9e](https://github.com/openai/openai-ruby/commit/d63cb9eb8efc60d43bd17c96bb6dc1e3b4254b26))
* **internal:** update comment in script ([a08be47](https://github.com/openai/openai-ruby/commit/a08be4787dfc910a7c9cc06bc72f9c40b40250a4))

## 0.17.0 (2025-08-08)

Full Changelog: [v0.16.0...v0.17.0](https://github.com/openai/openai-ruby/compare/v0.16.0...v0.17.0)
Expand Down
2 changes: 1 addition & 1 deletion Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ GIT
PATH
remote: .
specs:
openai (0.17.0)
openai (0.17.1)
connection_pool

GEM
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ To use this gem, install via Bundler by adding the following to your application
<!-- x-release-please-start-version -->

```ruby
gem "openai", "~> 0.17.0"
gem "openai", "~> 0.17.1"
```

<!-- x-release-please-end -->
Expand Down
1 change: 1 addition & 0 deletions lib/openai/internal/type/array_of.rb
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ def to_sorbet_type
# @option spec [Boolean] :"nil?"
def initialize(type_info, spec = {})
@item_type_fn = OpenAI::Internal::Type::Converter.type_info(type_info || spec)
@meta = OpenAI::Internal::Type::Converter.meta_info(type_info, spec)
@nilable = spec.fetch(:nil?, false)
end

Expand Down
4 changes: 3 additions & 1 deletion lib/openai/internal/type/base_model.rb
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ def fields
#
# @option spec [Boolean] :"nil?"
private def add_field(name_sym, required:, type_info:, spec:)
meta = OpenAI::Internal::Type::Converter.meta_info(type_info, spec)
type_fn, info =
case type_info
in Proc | OpenAI::Internal::Type::Converter | Class
Expand All @@ -74,7 +75,8 @@ def fields
required: required,
nilable: nilable,
const: const,
type_fn: type_fn
type_fn: type_fn,
meta: meta
}

define_method(setter) do |value|
Expand Down
27 changes: 27 additions & 0 deletions lib/openai/internal/type/converter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,33 @@ def type_info(spec)
end
end

# @api private
#
# @param type_info [Hash{Symbol=>Object}, Proc, OpenAI::Internal::Type::Converter, Class] .
#
# @option type_info [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
#
# @option type_info [Proc] :enum
#
# @option type_info [Proc] :union
#
# @option type_info [Boolean] :"nil?"
#
# @param spec [Hash{Symbol=>Object}, Proc, OpenAI::Internal::Type::Converter, Class] .
#
# @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
#
# @option spec [Proc] :enum
#
# @option spec [Proc] :union
#
# @option spec [Boolean] :"nil?"
#
# @return [Hash{Symbol=>Object}]
def meta_info(type_info, spec)
[spec, type_info].grep(Hash).first.to_h.except(:const, :enum, :union, :nil?)
end

# @api private
#
# @param translate_names [Boolean]
Expand Down
1 change: 1 addition & 0 deletions lib/openai/internal/type/hash_of.rb
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,7 @@ def to_sorbet_type
# @option spec [Boolean] :"nil?"
def initialize(type_info, spec = {})
@item_type_fn = OpenAI::Internal::Type::Converter.type_info(type_info || spec)
@meta = OpenAI::Internal::Type::Converter.meta_info(type_info, spec)
@nilable = spec.fetch(:nil?, false)
end

Expand Down
16 changes: 9 additions & 7 deletions lib/openai/internal/type/union.rb
Original file line number Diff line number Diff line change
Expand Up @@ -33,20 +33,20 @@ module Union
#
# All of the specified variant info for this union.
#
# @return [Array<Array(Symbol, Proc)>]
# @return [Array<Array(Symbol, Proc, Hash{Symbol=>Object})>]
private def known_variants = (@known_variants ||= [])

# @api private
#
# @return [Array<Array(Symbol, Object)>]
# @return [Array<Array(Symbol, Object, Hash{Symbol=>Object})>]
protected def derefed_variants
known_variants.map { |key, variant_fn| [key, variant_fn.call] }
known_variants.map { |key, variant_fn, meta| [key, variant_fn.call, meta] }
end

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

# @api private
#
Expand All @@ -72,12 +72,13 @@ def variants = derefed_variants.map(&:last)
#
# @option spec [Boolean] :"nil?"
private def variant(key, spec = nil)
meta = OpenAI::Internal::Type::Converter.meta_info(nil, spec)
variant_info =
case key
in Symbol
[key, OpenAI::Internal::Type::Converter.type_info(spec)]
[key, OpenAI::Internal::Type::Converter.type_info(spec), meta]
in Proc | OpenAI::Internal::Type::Converter | Class | Hash
[nil, OpenAI::Internal::Type::Converter.type_info(key)]
[nil, OpenAI::Internal::Type::Converter.type_info(key), meta]
end

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

key = key.to_sym if key.is_a?(String)
known_variants.find { |k,| k == key }&.last&.call
_, found = known_variants.find { |k,| k == key }
found&.call
else
nil
end
Expand Down
2 changes: 1 addition & 1 deletion lib/openai/version.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# frozen_string_literal: true

module OpenAI
VERSION = "0.17.0"
VERSION = "0.17.1"
end
46 changes: 46 additions & 0 deletions rbi/openai/internal/type/converter.rbi
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,52 @@ module OpenAI
def self.type_info(spec)
end

# @api private
sig do
params(
type_info:
T.any(
{
const:
T.nilable(
T.any(NilClass, T::Boolean, Integer, Float, Symbol)
),
enum:
T.nilable(
T.proc.returns(OpenAI::Internal::Type::Converter::Input)
),
union:
T.nilable(
T.proc.returns(OpenAI::Internal::Type::Converter::Input)
)
},
T.proc.returns(OpenAI::Internal::Type::Converter::Input),
OpenAI::Internal::Type::Converter::Input
),
spec:
T.any(
{
const:
T.nilable(
T.any(NilClass, T::Boolean, Integer, Float, Symbol)
),
enum:
T.nilable(
T.proc.returns(OpenAI::Internal::Type::Converter::Input)
),
union:
T.nilable(
T.proc.returns(OpenAI::Internal::Type::Converter::Input)
)
},
T.proc.returns(OpenAI::Internal::Type::Converter::Input),
OpenAI::Internal::Type::Converter::Input
)
).returns(OpenAI::Internal::AnyHash)
end
def self.meta_info(type_info, spec)
end

# @api private
sig do
params(translate_names: T::Boolean).returns(
Expand Down
9 changes: 7 additions & 2 deletions rbi/openai/internal/type/union.rbi
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ module OpenAI
T::Array[
[
T.nilable(Symbol),
T.proc.returns(OpenAI::Internal::Type::Converter::Input)
T.proc.returns(OpenAI::Internal::Type::Converter::Input),
OpenAI::Internal::AnyHash
]
]
)
Expand All @@ -25,7 +26,11 @@ module OpenAI
end

# @api private
sig { returns(T::Array[[T.nilable(Symbol), T.anything]]) }
sig do
returns(
T::Array[[T.nilable(Symbol), T.anything, OpenAI::Internal::AnyHash]]
)
end
protected def derefed_variants
end

Expand Down
2 changes: 1 addition & 1 deletion scripts/test
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ elif ! prism_is_running ; then
echo -e "To run the server, pass in the path or url of your OpenAPI"
echo -e "spec to the prism command:"
echo
echo -e " \$ ${YELLOW}npm exec --package=@stoplight/prism-cli@~5.3.2 -- prism mock path/to/your.openapi.yml${NC}"
echo -e " \$ ${YELLOW}npm exec --package=@stainless-api/prism-cli@5.15.0 -- prism mock path/to/your.openapi.yml${NC}"
echo

exit 1
Expand Down
17 changes: 17 additions & 0 deletions sig/openai/internal/type/converter.rbs
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,23 @@ module OpenAI
| OpenAI::Internal::Type::Converter::input spec
) -> (^-> top)

def self.meta_info: (
{
const: (nil | bool | Integer | Float | Symbol)?,
enum: ^-> OpenAI::Internal::Type::Converter::input?,
union: ^-> OpenAI::Internal::Type::Converter::input?
}
| ^-> OpenAI::Internal::Type::Converter::input
| OpenAI::Internal::Type::Converter::input type_info,
{
const: (nil | bool | Integer | Float | Symbol)?,
enum: ^-> OpenAI::Internal::Type::Converter::input?,
union: ^-> OpenAI::Internal::Type::Converter::input?
}
| ^-> OpenAI::Internal::Type::Converter::input
| OpenAI::Internal::Type::Converter::input spec
) -> ::Hash[Symbol, top]

def self.new_coerce_state: (
?translate_names: bool
) -> OpenAI::Internal::Type::Converter::coerce_state
Expand Down
4 changes: 2 additions & 2 deletions sig/openai/internal/type/union.rbs
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ module OpenAI
include OpenAI::Internal::Type::Converter
include OpenAI::Internal::Util::SorbetRuntimeSupport

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

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

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

Expand Down
32 changes: 32 additions & 0 deletions test/openai/internal/type/base_model_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -686,3 +686,35 @@ def test_equality
end
end
end

class OpenAI::Test::MetaInfoTest < Minitest::Test
A1 = OpenAI::Internal::Type::ArrayOf[Integer, nil?: true, doc: "dog"]
H1 = OpenAI::Internal::Type::HashOf[-> { String }, nil?: true, doc: "dawg"]

class M1 < OpenAI::Internal::Type::BaseModel
required :a, Integer, doc: "dog"
optional :b, -> { String }, nil?: true, doc: "dawg"
end

module U1
extend OpenAI::Internal::Type::Union

variant -> { Integer }, const: 2, doc: "dog"
variant -> { String }, doc: "dawg"
end

def test_meta_retrieval
m1 = A1.instance_variable_get(:@meta)
m2 = H1.instance_variable_get(:@meta)
assert_equal({doc: "dog"}, m1)
assert_equal({doc: "dawg"}, m2)

ma, mb = M1.fields.fetch_values(:a, :b)
assert_equal({doc: "dog"}, ma.fetch(:meta))
assert_equal({doc: "dawg"}, mb.fetch(:meta))

ua, ub = U1.send(:known_variants).map(&:last)
assert_equal({doc: "dog"}, ua)
assert_equal({doc: "dawg"}, ub)
end
end