@@ -12,12 +12,6 @@ module JsonSchemaConverter
12
12
end
13
13
end . freeze
14
14
# @api private
15
- COUNTER = Object . new . tap do
16
- _1 . define_singleton_method ( :inspect ) do
17
- "#<#{ OpenAI ::Helpers ::StructuredOutput ::JsonSchemaConverter } ::COUNTER>"
18
- end
19
- end . freeze
20
- # @api private
21
15
NO_REF = Object . new . tap do
22
16
_1 . define_singleton_method ( :inspect ) do
23
17
"#<#{ OpenAI ::Helpers ::StructuredOutput ::JsonSchemaConverter } ::NO_REF>"
@@ -81,14 +75,13 @@ def to_nilable(schema)
81
75
def cache_def! ( state , type :, &blk )
82
76
defs , path = state . fetch_values ( :defs , :path )
83
77
if ( stored = defs [ type ] )
84
- stored [ OpenAI ::Helpers ::StructuredOutput ::JsonSchemaConverter ::COUNTER ] += 1
85
- stored . fetch ( OpenAI ::Helpers ::StructuredOutput ::JsonSchemaConverter ::POINTER )
78
+ pointers = stored . fetch ( OpenAI ::Helpers ::StructuredOutput ::JsonSchemaConverter ::POINTER )
79
+ pointers . first . except ( OpenAI ::Helpers ::StructuredOutput ::JsonSchemaConverter ::NO_REF ) . tap { pointers << _1 }
86
80
else
87
81
ref_path = String . new
88
82
ref = { "$ref" : ref_path }
89
83
stored = {
90
- OpenAI ::Helpers ::StructuredOutput ::JsonSchemaConverter ::POINTER => ref ,
91
- OpenAI ::Helpers ::StructuredOutput ::JsonSchemaConverter ::COUNTER => 1
84
+ OpenAI ::Helpers ::StructuredOutput ::JsonSchemaConverter ::POINTER => [ ref ]
92
85
}
93
86
defs . store ( type , stored )
94
87
schema = blk . call
@@ -112,17 +105,21 @@ def to_json_schema(type)
112
105
)
113
106
reused_defs = { }
114
107
defs . each_value do |acc |
115
- ref = acc . fetch ( OpenAI ::Helpers ::StructuredOutput ::JsonSchemaConverter ::POINTER )
116
- if ( no_ref = ref . delete ( OpenAI ::Helpers ::StructuredOutput ::JsonSchemaConverter ::NO_REF ) )
117
- acc [ OpenAI ::Helpers ::StructuredOutput ::JsonSchemaConverter ::COUNTER ] -= 1
108
+ sch = acc . except ( OpenAI ::Helpers ::StructuredOutput ::JsonSchemaConverter ::POINTER )
109
+ pointers = acc . fetch ( OpenAI ::Helpers ::StructuredOutput ::JsonSchemaConverter ::POINTER )
110
+
111
+ no_refs , refs = pointers . partition do
112
+ _1 . delete ( OpenAI ::Helpers ::StructuredOutput ::JsonSchemaConverter ::NO_REF )
118
113
end
119
- cnt = acc . fetch ( OpenAI ::Helpers ::StructuredOutput ::JsonSchemaConverter ::COUNTER )
120
114
121
- sch = acc . except (
122
- OpenAI ::Helpers ::StructuredOutput ::JsonSchemaConverter ::POINTER ,
123
- OpenAI ::Helpers ::StructuredOutput ::JsonSchemaConverter ::COUNTER
124
- )
125
- cnt > 1 && !no_ref ? reused_defs . store ( ref . fetch ( :$ref ) , sch ) : ref . replace ( sch )
115
+ case refs
116
+ in [ _ , ref , *]
117
+ reused_defs . store ( ref . fetch ( :$ref ) , sch )
118
+ in [ ref ]
119
+ ref . replace ( sch )
120
+ else
121
+ end
122
+ no_refs . each { _1 . replace ( sch ) }
126
123
end
127
124
128
125
xformed = reused_defs . transform_keys { _1 . delete_prefix ( "#/$defs/" ) }
0 commit comments