Skip to content

Commit 267e15a

Browse files
committed
fix: go-swagger flatten errors
- object has no key "XXXXOAIGen": JSON pointer error - object has no key "XXXXOAIGen1": JSON pointer error
1 parent 394d0e5 commit 267e15a

1 file changed

Lines changed: 35 additions & 3 deletions

File tree

flatten.go

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -491,14 +491,25 @@ func stripPointersAndOAIGen(opts *FlattenOpts) error {
491491
// pointer and name resolution again.
492492
func stripOAIGen(opts *FlattenOpts) (bool, error) {
493493
debugLog("stripOAIGen")
494+
// Ensure the spec analysis is fresh, as previous steps (namePointers, etc.) might have modified refs.
495+
opts.Spec.reload()
496+
494497
replacedWithComplex := false
495498

496499
// figure out referers of OAIGen definitions (doing it before the ref start mutating)
497-
for _, r := range opts.flattenContext.newRefs {
500+
// Sort keys to ensure deterministic processing order
501+
sortedKeys := make([]string, 0, len(opts.flattenContext.newRefs))
502+
for k := range opts.flattenContext.newRefs {
503+
sortedKeys = append(sortedKeys, k)
504+
}
505+
sort.Strings(sortedKeys)
506+
507+
for _, k := range sortedKeys {
508+
r := opts.flattenContext.newRefs[k]
498509
updateRefParents(opts.Spec.references.allRefs, r)
499510
}
500511

501-
for k := range opts.flattenContext.newRefs {
512+
for _, k := range sortedKeys {
502513
r := opts.flattenContext.newRefs[k]
503514
debugLog("newRefs[%s]: isOAIGen: %t, resolved: %t, name: %s, path:%s, #parents: %d, parents: %v, ref: %s",
504515
k, r.isOAIGen, r.resolved, r.newName, r.path, len(r.parents), r.parents, r.schema.Ref.String())
@@ -580,14 +591,35 @@ func stripOAIGenForRef(opts *FlattenOpts, k string, r *newRef) (bool, error) {
580591
replacedWithComplex = true
581592
}
582593
}
594+
595+
// update parents of the target ref (pr[0]) if it is also a newRef (OAIGen)
596+
// This ensures that if the target is later deleted/merged, it knows about these new referers.
597+
for _, nr := range opts.flattenContext.newRefs {
598+
if nr.path == pr[0] && nr.isOAIGen && !nr.resolved {
599+
for _, p := range pr[1:] {
600+
if !slices.Contains(nr.parents, p) {
601+
nr.parents = append(nr.parents, p)
602+
}
603+
}
604+
break
605+
}
606+
}
583607
}
584608

585609
// remove OAIGen definition
586610
debugLog("removing definition %s", path.Base(r.path))
587611
delete(opts.Swagger().Definitions, path.Base(r.path))
588612

589613
// propagate changes in ref index for keys which have this one as a parent
590-
for kk, value := range opts.flattenContext.newRefs {
614+
// Sort keys to ensure deterministic update order
615+
propagateKeys := make([]string, 0, len(opts.flattenContext.newRefs))
616+
for k := range opts.flattenContext.newRefs {
617+
propagateKeys = append(propagateKeys, k)
618+
}
619+
sort.Strings(propagateKeys)
620+
621+
for _, kk := range propagateKeys {
622+
value := opts.flattenContext.newRefs[kk]
591623
if kk == k || !value.isOAIGen || value.resolved {
592624
continue
593625
}

0 commit comments

Comments
 (0)