From a08be4787dfc910a7c9cc06bc72f9c40b40250a4 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 8 Aug 2025 21:23:43 +0000 Subject: [PATCH 1/3] chore(internal): update comment in script --- scripts/test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/test b/scripts/test index 8e5d35cd..e0dc1374 100755 --- a/scripts/test +++ b/scripts/test @@ -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 From d63cb9eb8efc60d43bd17c96bb6dc1e3b4254b26 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 9 Aug 2025 08:50:07 +0000 Subject: [PATCH 2/3] chore: collect metadata from type DSL --- lib/openai/internal/type/array_of.rb | 1 + lib/openai/internal/type/base_model.rb | 4 +- lib/openai/internal/type/converter.rb | 27 ++++++++++++ lib/openai/internal/type/hash_of.rb | 1 + lib/openai/internal/type/union.rb | 16 ++++--- rbi/openai/internal/type/converter.rbi | 46 ++++++++++++++++++++ rbi/openai/internal/type/union.rbi | 9 +++- sig/openai/internal/type/converter.rbs | 17 ++++++++ sig/openai/internal/type/union.rbs | 4 +- test/openai/internal/type/base_model_test.rb | 32 ++++++++++++++ 10 files changed, 145 insertions(+), 12 deletions(-) diff --git a/lib/openai/internal/type/array_of.rb b/lib/openai/internal/type/array_of.rb index f939a621..b43a8c49 100644 --- a/lib/openai/internal/type/array_of.rb +++ b/lib/openai/internal/type/array_of.rb @@ -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 diff --git a/lib/openai/internal/type/base_model.rb b/lib/openai/internal/type/base_model.rb index 4f172655..d1e25f0c 100644 --- a/lib/openai/internal/type/base_model.rb +++ b/lib/openai/internal/type/base_model.rb @@ -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 @@ -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| diff --git a/lib/openai/internal/type/converter.rb b/lib/openai/internal/type/converter.rb index 2784b03b..0b31dfcf 100644 --- a/lib/openai/internal/type/converter.rb +++ b/lib/openai/internal/type/converter.rb @@ -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] diff --git a/lib/openai/internal/type/hash_of.rb b/lib/openai/internal/type/hash_of.rb index 1f178fcd..4c4a00d0 100644 --- a/lib/openai/internal/type/hash_of.rb +++ b/lib/openai/internal/type/hash_of.rb @@ -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 diff --git a/lib/openai/internal/type/union.rb b/lib/openai/internal/type/union.rb index dda813a2..0199d301 100644 --- a/lib/openai/internal/type/union.rb +++ b/lib/openai/internal/type/union.rb @@ -33,20 +33,20 @@ module Union # # All of the specified variant info for this union. # - # @return [Array] + # @return [ArrayObject})>] private def known_variants = (@known_variants ||= []) # @api private # - # @return [Array] + # @return [ArrayObject})>] 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] - def variants = derefed_variants.map(&:last) + def variants = derefed_variants.map { _2 } # @api private # @@ -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 @@ -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 diff --git a/rbi/openai/internal/type/converter.rbi b/rbi/openai/internal/type/converter.rbi index 5996a904..4c746081 100644 --- a/rbi/openai/internal/type/converter.rbi +++ b/rbi/openai/internal/type/converter.rbi @@ -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( diff --git a/rbi/openai/internal/type/union.rbi b/rbi/openai/internal/type/union.rbi index fee27fc2..4aa6836b 100644 --- a/rbi/openai/internal/type/union.rbi +++ b/rbi/openai/internal/type/union.rbi @@ -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 ] ] ) @@ -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 diff --git a/sig/openai/internal/type/converter.rbs b/sig/openai/internal/type/converter.rbs index 552a5330..3a4aa4a6 100644 --- a/sig/openai/internal/type/converter.rbs +++ b/sig/openai/internal/type/converter.rbs @@ -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 diff --git a/sig/openai/internal/type/union.rbs b/sig/openai/internal/type/union.rbs index 7a01ff6e..6f209ac7 100644 --- a/sig/openai/internal/type/union.rbs +++ b/sig/openai/internal/type/union.rbs @@ -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] diff --git a/test/openai/internal/type/base_model_test.rb b/test/openai/internal/type/base_model_test.rb index 3ac64c96..c1c893b2 100644 --- a/test/openai/internal/type/base_model_test.rb +++ b/test/openai/internal/type/base_model_test.rb @@ -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 From f6a9899eef71635cf6e0cb7a2411e1d572739341 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 9 Aug 2025 08:50:28 +0000 Subject: [PATCH 3/3] release: 0.17.1 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 9 +++++++++ Gemfile.lock | 2 +- README.md | 2 +- lib/openai/version.rb | 2 +- 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 6db19b95..463488b6 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.17.0" + ".": "0.17.1" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d404b32..a1823fa6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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) diff --git a/Gemfile.lock b/Gemfile.lock index 0448918d..cbdbfc91 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -11,7 +11,7 @@ GIT PATH remote: . specs: - openai (0.17.0) + openai (0.17.1) connection_pool GEM diff --git a/README.md b/README.md index 8db9d78f..bac257a3 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ To use this gem, install via Bundler by adding the following to your application ```ruby -gem "openai", "~> 0.17.0" +gem "openai", "~> 0.17.1" ``` diff --git a/lib/openai/version.rb b/lib/openai/version.rb index 182ed68d..32d93453 100644 --- a/lib/openai/version.rb +++ b/lib/openai/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module OpenAI - VERSION = "0.17.0" + VERSION = "0.17.1" end