From 4f689cb1cf0dcf474f959b4da4146edbd0cd6ab2 Mon Sep 17 00:00:00 2001 From: quobix Date: Fri, 12 Jun 2026 12:40:08 -0400 Subject: [PATCH 1/4] perf: lazy SpecInfo JSON, SkipMetadataCollection, and hot-path allocation cuts Build SpecInfo's JSON representation lazily via new GetSpecJSON/GetSpecJSONBytes/GetSpecJSONError accessors (deprecating direct field access), with parse-time structural validation (duplicate key detection, JSON syntax checks) preserved without the full eager conversion. Add DocumentConfiguration.SkipMetadataCollection to skip collecting diagnostic index metadata (descriptions, summaries, enums, security requirement refs, inline schema Paths), cutting allocations and retained memory on large documents; propagated through v2/v3 document creation. Reduce hot-path overhead: build oneOf/anyOf/allOf/prefixItems schema proxies inline instead of goroutine-per-item, make SchemaProxy's lock a value mutex, scan extensions directly instead of via FindExtensionNodes, and avoid strings.ToLower allocation for already-lowercase keys in BuildModel. Includes golden/parity tests for component ID generation, inline ref collection, lazy JSON behavior, duplicate key detection, and metadata skipping. --- datamodel/document_config.go | 25 +- datamodel/high/base/schema.go | 80 ++---- datamodel/high/base/schema_proxy.go | 18 +- datamodel/high/base/schema_proxy_test.go | 10 +- datamodel/low/extraction_functions.go | 16 +- datamodel/low/model_builder.go | 16 +- datamodel/low/v2/swagger.go | 1 + datamodel/low/v2/swagger_test.go | 18 ++ datamodel/low/v3/create_document.go | 1 + datamodel/low/v3/create_document_test.go | 33 ++- datamodel/spec_info.go | 202 +++++++++++++-- datamodel/spec_info_duplicate_keys_test.go | 106 ++++++++ datamodel/spec_info_lazy_json_test.go | 134 ++++++++++ datamodel/spec_info_test.go | 10 +- datamodel/translate.go | 59 ++++- datamodel/translate_test.go | 91 +++++++ index/extract_refs_inline.go | 70 ++++-- index/extract_refs_lookup.go | 13 +- index/extract_refs_metadata.go | 46 ++-- index/index_model.go | 63 ++++- index/index_model_test.go | 15 +- index/inline_collector_parity_test.go | 90 +++++++ index/map_index_nodes.go | 96 ++++++-- index/map_index_nodes_test.go | 98 +++++++- index/search_index.go | 48 ++-- index/search_rolodex.go | 68 +++--- index/skip_metadata_collection_test.go | 83 +++++++ index/spec_index_build.go | 1 - index/testdata/inline_collector_parity.txt | 12 + index/utility_methods.go | 11 +- utils/component_id_golden_test.go | 181 ++++++++++++++ utils/testdata/component_id_golden.txt.gz | Bin 0 -> 287401 bytes utils/utils.go | 270 ++++++++------------- utils/utils_test.go | 17 -- 34 files changed, 1541 insertions(+), 461 deletions(-) create mode 100644 datamodel/spec_info_duplicate_keys_test.go create mode 100644 datamodel/spec_info_lazy_json_test.go create mode 100644 index/inline_collector_parity_test.go create mode 100644 index/skip_metadata_collection_test.go create mode 100644 index/testdata/inline_collector_parity.txt create mode 100644 utils/component_id_golden_test.go create mode 100644 utils/testdata/component_id_golden.txt.gz diff --git a/datamodel/document_config.go b/datamodel/document_config.go index 9c2df0c64..3a431005a 100644 --- a/datamodel/document_config.go +++ b/datamodel/document_config.go @@ -101,11 +101,16 @@ type DocumentConfiguration struct { // passed in and used. Only enable this when parsing non openapi documents. BypassDocumentCheck bool - // SkipJSONConversion skips the YAML-to-JSON conversion during spec parsing. - // SpecJSON and SpecJSONBytes on SpecInfo will be nil when enabled. - // This also skips structural validation that parseJSON performs (e.g., duplicate key detection). + // SkipJSONConversion disables the JSON representation of the document entirely: + // SpecInfo.GetSpecJSON and GetSpecJSONBytes return nil when enabled (and the + // deprecated SpecJSON/SpecJSONBytes fields stay nil). This also skips the eager + // structural validation performed at parse time (e.g., duplicate key detection). // Safe when document-level schema validation rules are not running and no custom // functions depend on the JSON representation. + // + // Note: the JSON representation is built lazily on first accessor call, so leaving + // this disabled no longer costs anything at parse time. Enable it only to also + // skip the eager structural validation, or to guarantee accessors return nil. SkipJSONConversion bool // IgnorePolymorphicCircularReferences will skip over checking for circular references in polymorphic schemas. @@ -139,6 +144,20 @@ type DocumentConfiguration struct { // defaults to false (which means extensions will be included) ExcludeExtensionRefs bool + // SkipMetadataCollection disables the collection of diagnostic metadata during indexing: + // descriptions, summaries, enums, objects-with-properties, security requirement + // references, and the JSONPath `Path` values on inline schema references. Skipping + // them significantly reduces allocations and retained memory when parsing large + // documents. Reference extraction, resolution and model building are unaffected. + // + // -- UNSAFE FOR DIAGNOSTIC, RULE, OR PATH CONSUMERS -- + // When enabled, the index methods GetAllDescriptions, GetAllSummaries, GetAllEnums, + // GetAllObjectsWithProperties, GetSecurityRequirementReferences and the related + // counts are intentionally empty/zero, and inline schema Reference.Path values are + // empty strings. vacuum and any other tool that consumes index metadata or Path + // values must NOT enable this. Defaults to false (everything is collected). + SkipMetadataCollection bool + // BundleInlineRefs controls whether local component references are inlined during bundling. // When false (default): Local refs like #/components/schemas/Pet are preserved // When true: Local refs are also inlined (may break discriminator mappings) diff --git a/datamodel/high/base/schema.go b/datamodel/high/base/schema.go index f65771057..6a7208088 100644 --- a/datamodel/high/base/schema.go +++ b/datamodel/high/base/schema.go @@ -367,50 +367,21 @@ func NewSchema(schema *base.Schema) *Schema { } s.Enum = enum - // async work. - // any polymorphic properties need to be handled in their own threads - // any properties each need to be processed in their own thread. - // we go as fast as we can. - polyCompletedChan := make(chan struct{}) - errChan := make(chan error) - - type buildResult struct { - idx int - s *SchemaProxy - } - - // for every item, build schema async - buildSchema := func(sch lowmodel.ValueReference[*base.SchemaProxy], idx int, bChan chan buildResult) { - n := &lowmodel.NodeReference[*base.SchemaProxy]{ - ValueNode: sch.ValueNode, - Value: sch.Value, - } - n.SetReference(sch.GetReference(), sch.GetReferenceNode()) - - p := NewSchemaProxy(n) - - bChan <- buildResult{idx: idx, s: p} - } - - // schema async - buildOutSchemas := func(schemas []lowmodel.ValueReference[*base.SchemaProxy], items *[]*SchemaProxy, - doneChan chan struct{}, e chan error, - ) { - bChan := make(chan buildResult) - totalSchemas := len(schemas) + // each item is a single SchemaProxy struct construction: spinning up goroutines + // and channels per item costs far more than the work itself, so build inline. + buildOutSchemas := func(schemas []lowmodel.ValueReference[*base.SchemaProxy]) []*SchemaProxy { + items := make([]*SchemaProxy, len(schemas)) for i := range schemas { - go buildSchema(schemas[i], i, bChan) - } - j := 0 - for j < totalSchemas { - r := <-bChan - j++ - (*items)[r.idx] = r.s + n := &lowmodel.NodeReference[*base.SchemaProxy]{ + ValueNode: schemas[i].ValueNode, + Value: schemas[i].Value, + } + n.SetReference(schemas[i].GetReference(), schemas[i].GetReferenceNode()) + items[i] = NewSchemaProxy(n) } - doneChan <- struct{}{} + return items } - // props async buildProps := func(k lowmodel.KeyReference[string], v lowmodel.ValueReference[*base.SchemaProxy], props *orderedmap.Map[string, *SchemaProxy], sw int, ) { @@ -470,21 +441,14 @@ func NewSchema(schema *base.Schema) *Schema { var items *DynamicValue[*SchemaProxy, bool] var prefixItems []*SchemaProxy - children := 0 if !schema.AllOf.IsEmpty() { - children++ - allOf = make([]*SchemaProxy, len(schema.AllOf.Value)) - go buildOutSchemas(schema.AllOf.Value, &allOf, polyCompletedChan, errChan) + allOf = buildOutSchemas(schema.AllOf.Value) } if !schema.AnyOf.IsEmpty() { - children++ - anyOf = make([]*SchemaProxy, len(schema.AnyOf.Value)) - go buildOutSchemas(schema.AnyOf.Value, &anyOf, polyCompletedChan, errChan) + anyOf = buildOutSchemas(schema.AnyOf.Value) } if !schema.OneOf.IsEmpty() { - children++ - oneOf = make([]*SchemaProxy, len(schema.OneOf.Value)) - go buildOutSchemas(schema.OneOf.Value, &oneOf, polyCompletedChan, errChan) + oneOf = buildOutSchemas(schema.OneOf.Value) } if !schema.Not.IsEmpty() { not = NewSchemaProxy(&schema.Not) @@ -504,21 +468,7 @@ func NewSchema(schema *base.Schema) *Schema { } } if !schema.PrefixItems.IsEmpty() { - children++ - prefixItems = make([]*SchemaProxy, len(schema.PrefixItems.Value)) - go buildOutSchemas(schema.PrefixItems.Value, &prefixItems, polyCompletedChan, errChan) - } - - completeChildren := 0 - if children > 0 { - allDone: - for { - <-polyCompletedChan - completeChildren++ - if children == completeChildren { - break allDone - } - } + prefixItems = buildOutSchemas(schema.PrefixItems.Value) } s.OneOf = oneOf s.AnyOf = anyOf diff --git a/datamodel/high/base/schema_proxy.go b/datamodel/high/base/schema_proxy.go index adc9afb5a..53ecc1f5c 100644 --- a/datamodel/high/base/schema_proxy.go +++ b/datamodel/high/base/schema_proxy.go @@ -175,12 +175,12 @@ type SchemaProxy struct { buildError error rendered *Schema refStr string - lock *sync.Mutex + lock sync.Mutex } // NewSchemaProxy creates a new high-level SchemaProxy from a low-level one. func NewSchemaProxy(schema *low.NodeReference[*base.SchemaProxy]) *SchemaProxy { - return &SchemaProxy{schema: schema, lock: &sync.Mutex{}} + return &SchemaProxy{schema: schema} } // copySchemaWithParentProxy creates a shallow copy of a schema and sets the ParentProxy @@ -193,13 +193,13 @@ func (sp *SchemaProxy) copySchemaWithParentProxy(schema *Schema) *Schema { // CreateSchemaProxy will create a new high-level SchemaProxy from a high-level Schema, this acts the same // as if the SchemaProxy is pre-rendered. func CreateSchemaProxy(schema *Schema) *SchemaProxy { - return &SchemaProxy{rendered: schema, lock: &sync.Mutex{}} + return &SchemaProxy{rendered: schema} } // CreateSchemaProxyRef will create a new high-level SchemaProxy from a reference string, this is used only when // building out new models from scratch that require a reference rather than a schema implementation. func CreateSchemaProxyRef(ref string) *SchemaProxy { - return &SchemaProxy{refStr: ref, lock: &sync.Mutex{}} + return &SchemaProxy{refStr: ref} } // CreateSchemaProxyRefWithSchema creates a SchemaProxy that carries both a $ref and sibling schema @@ -208,7 +208,7 @@ func CreateSchemaProxyRef(ref string) *SchemaProxy { // // If schema is nil, the result behaves identically to CreateSchemaProxyRef. func CreateSchemaProxyRefWithSchema(ref string, schema *Schema) *SchemaProxy { - return &SchemaProxy{refStr: ref, rendered: schema, lock: &sync.Mutex{}} + return &SchemaProxy{refStr: ref, rendered: schema} } // GetValueNode returns the value node of the SchemaProxy. @@ -228,7 +228,7 @@ func (sp *SchemaProxy) GetValueNode() *yaml.Node { // instead for proxies created using NewSchemaProxy or CreateSchema* methods. // https://github.com/pb33f/libopenapi/issues/403 func (sp *SchemaProxy) Schema() *Schema { - if sp == nil || sp.lock == nil { + if sp == nil { return nil } @@ -376,9 +376,6 @@ func (sp *SchemaProxy) BuildSchema() (*Schema, error) { return nil, nil } schema := sp.Schema() - if sp.lock == nil { - return schema, sp.buildError - } sp.lock.Lock() er := sp.buildError sp.lock.Unlock() @@ -390,9 +387,6 @@ func (sp *SchemaProxy) GetBuildError() error { if sp == nil { return nil } - if sp.lock == nil { - return sp.buildError - } sp.lock.Lock() err := sp.buildError sp.lock.Unlock() diff --git a/datamodel/high/base/schema_proxy_test.go b/datamodel/high/base/schema_proxy_test.go index 5a0a06fc4..41bc32188 100644 --- a/datamodel/high/base/schema_proxy_test.go +++ b/datamodel/high/base/schema_proxy_test.go @@ -72,9 +72,7 @@ func TestCreateSchemaProxy_Fail(t *testing.T) { } func TestSchemaProxy_Schema_NoLowLevel(t *testing.T) { - proxy := &SchemaProxy{ - lock: &sync.Mutex{}, - } + proxy := &SchemaProxy{} assert.Nil(t, proxy.Schema()) } @@ -868,7 +866,6 @@ func TestMarshalYAMLInline_CircularReferenceDetection_WithReference(t *testing.T ref := "#/components/schemas/CircularTest" proxy := &SchemaProxy{ refStr: ref, - lock: &sync.Mutex{}, } // Pre-load the render key to simulate being mid-render (cycle detected) @@ -959,7 +956,6 @@ func TestGetInlineRenderKey_ReferenceWithoutIndex(t *testing.T) { proxy := &SchemaProxy{ schema: &lowRef, - lock: &sync.Mutex{}, } renderKey := proxy.getInlineRenderKey() @@ -974,7 +970,6 @@ func TestGetInlineRenderKey_NilSchemaReturnsRefStr(t *testing.T) { proxy := &SchemaProxy{ refStr: "#/components/schemas/EarlyReturn", - lock: &sync.Mutex{}, } renderKey := proxy.getInlineRenderKey() @@ -994,7 +989,6 @@ func TestGetInlineRenderKey_NilSchemaValueReturnsRefStr(t *testing.T) { proxy := &SchemaProxy{ refStr: "#/components/schemas/AnotherEarlyReturn", schema: &lowRef, - lock: &sync.Mutex{}, } renderKey := proxy.getInlineRenderKey() @@ -1076,7 +1070,6 @@ func TestMarshalYAMLInlineWithContext_PreserveReference_ViaLowLevel(t *testing.T proxy := &SchemaProxy{ schema: &lowRef, - lock: &sync.Mutex{}, } // create context and mark the ref as preserved @@ -1137,7 +1130,6 @@ func TestMarshalYAMLInline_BundlingMode_ViaLowLevelRef(t *testing.T) { proxy := &SchemaProxy{ schema: &lowRef, - lock: &sync.Mutex{}, } // Enable bundling mode diff --git a/datamodel/low/extraction_functions.go b/datamodel/low/extraction_functions.go index f8f86d030..222aeec47 100644 --- a/datamodel/low/extraction_functions.go +++ b/datamodel/low/extraction_functions.go @@ -1100,13 +1100,17 @@ func ExtractExtensions(root *yaml.Node) *orderedmap.Map[KeyReference[string], Va if root == nil { return nil } - extensions := utils.FindExtensionNodes(root.Content) extensionMap := orderedmap.New[KeyReference[string], ValueReference[*yaml.Node]]() - for _, ext := range extensions { - extensionMap.Set(KeyReference[string]{ - Value: ext.Key.Value, - KeyNode: ext.Key, - }, ValueReference[*yaml.Node]{Value: ext.Value, ValueNode: ext.Value}) + content := root.Content + for i := 0; i+1 < len(content); i += 2 { + key := content[i] + if strings.HasPrefix(key.Value, "x-") { + value := utils.NodeAlias(content[i+1]) + extensionMap.Set(KeyReference[string]{ + Value: key.Value, + KeyNode: key, + }, ValueReference[*yaml.Node]{Value: value, ValueNode: value}) + } } return extensionMap } diff --git a/datamodel/low/model_builder.go b/datamodel/low/model_builder.go index 4cebe9057..7b721b8f7 100644 --- a/datamodel/low/model_builder.go +++ b/datamodel/low/model_builder.go @@ -9,6 +9,7 @@ import ( "strconv" "strings" "sync" + "unicode/utf8" "github.com/pb33f/libopenapi/orderedmap" "github.com/pb33f/libopenapi/utils" @@ -48,6 +49,19 @@ func buildModelFields(modelType reflect.Type) []buildModelField { return actual.([]buildModelField) } +// lowerIfNeeded returns the input unchanged when it contains no uppercase ASCII and no +// multibyte runes (the overwhelmingly common case for OpenAPI keys), avoiding the +// per-key allocation of strings.ToLower on the BuildModel hot path. +func lowerIfNeeded(s string) string { + for i := 0; i < len(s); i++ { + c := s[i] + if c >= utf8.RuneSelf || ('A' <= c && c <= 'Z') { + return strings.ToLower(s) + } + } + return s +} + // BuildModel accepts a yaml.Node pointer and a model, which can be any struct. Using reflection, the model is // analyzed and the names of all the properties are extracted from the model and subsequently looked up from within // the yaml.Node.Content value. @@ -70,7 +84,7 @@ func BuildModel(node *yaml.Node, model interface{}) error { content := node.Content keyMap := make(map[string]int, len(content)/2) for j := 0; j < len(content)-1; j += 2 { - k := strings.ToLower(utils.NodeAlias(content[j]).Value) + k := lowerIfNeeded(utils.NodeAlias(content[j]).Value) if _, exists := keyMap[k]; !exists { keyMap[k] = j } diff --git a/datamodel/low/v2/swagger.go b/datamodel/low/v2/swagger.go index 0d5f668e5..7e5211b0a 100644 --- a/datamodel/low/v2/swagger.go +++ b/datamodel/low/v2/swagger.go @@ -152,6 +152,7 @@ func createDocument(info *datamodel.SpecInfo, config *datamodel.DocumentConfigur idxConfig.BasePath = config.BasePath idxConfig.Logger = config.Logger idxConfig.ExcludeExtensionRefs = config.ExcludeExtensionRefs + idxConfig.SkipMetadataCollection = config.SkipMetadataCollection rolodex := index.NewRolodex(idxConfig) rolodex.SetRootNode(info.RootNode) doc.Rolodex = rolodex diff --git a/datamodel/low/v2/swagger_test.go b/datamodel/low/v2/swagger_test.go index 1ef93ed17..03e09f84a 100644 --- a/datamodel/low/v2/swagger_test.go +++ b/datamodel/low/v2/swagger_test.go @@ -69,6 +69,24 @@ func TestCreateDocument(t *testing.T) { assert.Equal(t, 1, orderedmap.Len(doc.GetExtensions())) } +func TestCreateDocument_SkipMetadataCollection_Propagates(t *testing.T) { + data, _ := os.ReadFile("../../../test_specs/petstorev2-complete.yaml") + + info, _ := datamodel.ExtractSpecInfo(data) + cfg := datamodel.NewDocumentConfiguration() + cfg.SkipMetadataCollection = true + skipDoc, err := CreateDocumentFromConfig(info, cfg) + assert.NoError(t, err) + assert.True(t, skipDoc.Index.GetConfig().SkipMetadataCollection) + assert.Empty(t, skipDoc.Index.GetAllDescriptions()) + + info, _ = datamodel.ExtractSpecInfo(data) + fullDoc, err := CreateDocumentFromConfig(info, datamodel.NewDocumentConfiguration()) + assert.NoError(t, err) + assert.False(t, fullDoc.Index.GetConfig().SkipMetadataCollection) + assert.NotEmpty(t, fullDoc.Index.GetAllDescriptions()) +} + func TestCreateDocument_Info(t *testing.T) { initTest() assert.Equal(t, "Swagger Petstore", doc.Info.Value.Title.Value) diff --git a/datamodel/low/v3/create_document.go b/datamodel/low/v3/create_document.go index 7ae8f838e..74a2a5440 100644 --- a/datamodel/low/v3/create_document.go +++ b/datamodel/low/v3/create_document.go @@ -151,6 +151,7 @@ func createDocument(info *datamodel.SpecInfo, config *datamodel.DocumentConfigur idxConfig.SpecInfo = info idxConfig.UseSchemaQuickHash = config.UseSchemaQuickHash idxConfig.ExcludeExtensionRefs = config.ExcludeExtensionRefs + idxConfig.SkipMetadataCollection = config.SkipMetadataCollection idxConfig.IgnoreArrayCircularReferences = config.IgnoreArrayCircularReferences idxConfig.IgnorePolymorphicCircularReferences = config.IgnorePolymorphicCircularReferences idxConfig.AllowUnknownExtensionContentDetection = config.AllowUnknownExtensionContentDetection diff --git a/datamodel/low/v3/create_document_test.go b/datamodel/low/v3/create_document_test.go index 9eec996d4..0c9b34239 100644 --- a/datamodel/low/v3/create_document_test.go +++ b/datamodel/low/v3/create_document_test.go @@ -386,9 +386,11 @@ func BenchmarkCreateDocument_Stripe(b *testing.B) { info, _ := datamodel.ExtractSpecInfo(data) for i := 0; i < b.N; i++ { - _, err := CreateDocumentFromConfig(info, &datamodel.DocumentConfiguration{}) - if err != nil { - panic("this should not error") + // stripe.yaml contains circular references, so an error is expected + // with the default configuration; only a nil document is a failure. + doc, _ := CreateDocumentFromConfig(info, &datamodel.DocumentConfiguration{}) + if doc == nil { + panic("document should not be nil") } } } @@ -424,6 +426,31 @@ func TestCreateDocument(t *testing.T) { assert.Equal(t, 1, orderedmap.Len(doc.GetExtensions())) } +func TestCreateDocument_SkipMetadataCollection_Propagates(t *testing.T) { + spec := []byte(`openapi: 3.1.0 +info: + title: skip metadata + description: a description that would normally be collected + version: 1.0.0 +paths: {}`) + + info, err := datamodel.ExtractSpecInfo(spec) + assert.NoError(t, err) + + skipDoc, err := CreateDocumentFromConfig(info, &datamodel.DocumentConfiguration{ + SkipMetadataCollection: true, + }) + assert.NoError(t, err) + assert.True(t, skipDoc.Index.GetConfig().SkipMetadataCollection) + assert.Empty(t, skipDoc.Index.GetAllDescriptions()) + + info, _ = datamodel.ExtractSpecInfo(spec) + fullDoc, err := CreateDocumentFromConfig(info, &datamodel.DocumentConfiguration{}) + assert.NoError(t, err) + assert.False(t, fullDoc.Index.GetConfig().SkipMetadataCollection) + assert.NotEmpty(t, fullDoc.Index.GetAllDescriptions()) +} + func TestCreateDocument_DeprecatedWrapper(t *testing.T) { spec := []byte(`openapi: 3.1.0 info: diff --git a/datamodel/spec_info.go b/datamodel/spec_info.go index 8a2e7e0b4..bfb51f3a9 100644 --- a/datamodel/spec_info.go +++ b/datamodel/spec_info.go @@ -9,6 +9,7 @@ import ( "errors" "fmt" "strings" + "sync" "time" "unicode/utf16" "unicode/utf8" @@ -31,18 +32,99 @@ type SpecInfo struct { VersionNumeric float32 `json:"versionNumeric"` SpecFormat string `json:"format"` SpecFileType string `json:"fileType"` - SpecBytes *[]byte `json:"bytes"` // the original byte array - RootNode *yaml.Node `json:"-"` // reference to the root node of the spec. - SpecJSONBytes *[]byte `json:"-"` // original bytes converted to JSON - SpecJSON *map[string]interface{} `json:"-"` // standard JSON map of original bytes - Error error `json:"-"` // something go wrong? - APISchema string `json:"-"` // API Schema for supplied spec type (2 or 3) - Generated time.Time `json:"-"` - OriginalIndentation int `json:"-"` // the original whitespace - Self string `json:"-"` // the $self field for OpenAPI 3.2+ documents (base URI) + SpecBytes *[]byte `json:"bytes"` // the original byte array + RootNode *yaml.Node `json:"-"` // reference to the root node of the spec. + + // SpecJSONBytes is the original document converted to JSON. It is populated lazily. + // + // Deprecated: read via GetSpecJSONBytes(), which builds the JSON representation on + // first use. This field is nil until GetSpecJSON or GetSpecJSONBytes is called. + // Concurrent readers must use the accessors: a direct field read racing the first + // accessor call is a data race. + SpecJSONBytes *[]byte `json:"-"` + + // SpecJSON is the original document as a standard JSON map. It is populated lazily. + // + // Deprecated: read via GetSpecJSON(), which builds the JSON representation on + // first use. This field is nil until GetSpecJSON or GetSpecJSONBytes is called. + // Concurrent readers must use the accessors: a direct field read racing the first + // accessor call is a data race. + SpecJSON *map[string]interface{} `json:"-"` + + Error error `json:"-"` // something go wrong? + APISchema string `json:"-"` // API Schema for supplied spec type (2 or 3) + Generated time.Time `json:"-"` + OriginalIndentation int `json:"-"` // the original whitespace + Self string `json:"-"` // the $self field for OpenAPI 3.2+ documents (base URI) + + jsonOnce sync.Once // guards the lazy JSON build + jsonErr error // error from the lazy JSON build, if any + skipJSONBuild bool // set by SkipJSONConversion: accessors return nil, preserving the flag's contract +} + +// GetSpecJSON returns the document as a standard JSON map, building it on first call. +// Returns nil if the document cannot be converted, or if the SpecInfo has been +// released (the node tree and original bytes are required to build the JSON view). +func (s *SpecInfo) GetSpecJSON() *map[string]interface{} { + s.jsonOnce.Do(s.buildJSON) + return s.SpecJSON +} + +// GetSpecJSONBytes returns the document converted to JSON bytes, building the +// representation on first call. Returns nil if the document cannot be converted, or +// if the SpecInfo has been released. +func (s *SpecInfo) GetSpecJSONBytes() *[]byte { + s.jsonOnce.Do(s.buildJSON) + return s.SpecJSONBytes +} + +// GetSpecJSONError returns the error from building the JSON view, building it first +// if needed. It distinguishes a failed conversion (non-nil error) from a released +// SpecInfo (nil error, nil JSON: there is nothing left to build, so nothing failed). +func (s *SpecInfo) GetSpecJSONError() error { + s.jsonOnce.Do(s.buildJSON) + return s.jsonErr +} + +// buildJSON populates SpecJSON and SpecJSONBytes from the parsed node tree (YAML) or +// the original bytes (JSON). This is the same conversion the library used to perform +// eagerly on every parse; it now runs only when the JSON view is requested. +func (s *SpecInfo) buildJSON() { + if s.skipJSONBuild { + return + } + var jsonSpec map[string]interface{} + if s.SpecFileType == YAMLFileType { + if s.RootNode == nil { + return + } + if err := s.RootNode.Decode(&jsonSpec); err != nil { + s.jsonErr = fmt.Errorf("failed to decode YAML to JSON: %w", err) + return + } + // Marshal to JSON - if this fails due to unsupported types (e.g. map[interface{}]interface{}), + // we tolerate it as it doesn't indicate spec invalidity, just YAML/JSON incompatibility + b, err := json.Marshal(&jsonSpec) + if err == nil { + s.SpecJSONBytes = &b + } + s.SpecJSON = &jsonSpec + return + } + if s.SpecBytes == nil { + return + } + if err := json.Unmarshal(*s.SpecBytes, &jsonSpec); err != nil { + s.jsonErr = fmt.Errorf("failed to unmarshal JSON: %w", err) + return + } + s.SpecJSONBytes = s.SpecBytes + s.SpecJSON = &jsonSpec } // Release nils fields that pin the YAML node tree and large byte arrays in memory. +// After release, GetSpecJSON and GetSpecJSONBytes return nil: the inputs needed to +// build the JSON view are gone and will not be resurrected. func (s *SpecInfo) Release() { if s == nil { return @@ -81,7 +163,7 @@ func ExtractSpecInfoWithDocumentCheck(spec []byte, bypass bool) (*SpecInfo, erro func extractSpecInfoInternal(spec []byte, bypass bool, skipJSON bool) (*SpecInfo, error) { var parsedSpec yaml.Node - specInfo := &SpecInfo{} + specInfo := &SpecInfo{skipJSONBuild: skipJSON} // set original bytes specInfo.SpecBytes = &spec @@ -132,28 +214,38 @@ func extractSpecInfoInternal(spec []byte, bypass bool, skipJSON bool) (*SpecInfo _, openAPI2 := utils.FindKeyNode(utils.OpenApi2, parsedSpec.Content) _, asyncAPI := utils.FindKeyNode(utils.AsyncApi, parsedSpec.Content) + // validate document structure without building the JSON view: the root must be a + // mapping, YAML mappings must not contain duplicate keys (matching the yaml + // decoder's checks), and JSON input must be syntactically valid. The full JSON + // conversion is built lazily by GetSpecJSON/GetSpecJSONBytes. parseJSON := func(bytes []byte, spec *SpecInfo, parsedNode *yaml.Node) error { - var jsonSpec map[string]interface{} if spec.SpecFileType == YAMLFileType { - // Decode YAML to map - this is critical to catch structural errors like duplicate keys - if err := parsedNode.Decode(&jsonSpec); err != nil { - return fmt.Errorf("failed to decode YAML to JSON: %w", err) + root := parsedNode + if root.Kind == yaml.DocumentNode && len(root.Content) > 0 { + root = root.Content[0] } - // Marshal to JSON - if this fails due to unsupported types (e.g. map[interface{}]interface{}), - // we tolerate it as it doesn't indicate spec invalidity, just YAML/JSON incompatibility - b, err := json.Marshal(&jsonSpec) - if err == nil { - spec.SpecJSONBytes = &b + if root.Kind != yaml.MappingNode && root.Tag != "!!null" { + // the document cannot construct into a map: run the decoder purely to + // surface its exact construct error (garbage input is the rare path). + var jsonSpec map[string]interface{} + if err := parsedNode.Decode(&jsonSpec); err != nil { + return fmt.Errorf("failed to decode YAML to JSON: %w", err) + } } - spec.SpecJSON = &jsonSpec - } else { - if err := json.Unmarshal(bytes, &jsonSpec); err != nil { - return fmt.Errorf("failed to unmarshal JSON: %w", err) + if err := checkDuplicateMappingKeys(parsedNode); err != nil { + return fmt.Errorf("failed to decode YAML to JSON: %w", err) } - spec.SpecJSONBytes = &bytes - spec.SpecJSON = &jsonSpec + return nil } - return nil + if json.Valid(bytes) { + return nil + } + // invalid JSON is the rare path: run the decoder purely to surface the same + // detailed error message the eager conversion produced. json.Valid and + // json.Unmarshal share the same scanner, so the decode always errors here. + var jsonSpec map[string]interface{} + err := json.Unmarshal(bytes, &jsonSpec) + return fmt.Errorf("failed to unmarshal JSON: %w", err) } // if !bypass { @@ -316,6 +408,64 @@ func ExtractSpecInfo(spec []byte) (*SpecInfo, error) { return ExtractSpecInfoWithDocumentCheck(spec, false) } +// checkDuplicateMappingKeys walks a parsed node tree and reports duplicate mapping +// keys using the exact equality semantics of the go.yaml.in/yaml/v4 decoder: two keys +// in the same mapping collide when their node Kind and raw Value match (no tag or +// alias resolution). Error text matches the decoder's construct errors byte for byte, +// and children of an offending mapping are not descended into, mirroring the decoder +// halting construction of that mapping. +// +// Known divergence: an anchored mapping with duplicate keys that is aliased +// elsewhere is reported ONCE here, while the decoder re-reports it on every +// construction visit (anchor + each alias). The decoder's repeat count is an +// artifact of construction order, not extra information, so the walker does +// not replicate it. TestCheckDuplicateMappingKeys_MatchesDecoder pins parity +// for everything else (and TestCheckDuplicateMappingKeys_AliasedAnchorDivergence +// pins this exception); revisit both when go.yaml.in/yaml/v4 leaves rc. +func checkDuplicateMappingKeys(node *yaml.Node) error { + var errs []string + walkDuplicateMappingKeys(node, &errs) + if len(errs) == 0 { + return nil + } + var b strings.Builder + b.WriteString("yaml: construct errors:") + for _, e := range errs { + b.WriteString("\n ") + b.WriteString(e) + } + return errors.New(b.String()) +} + +func walkDuplicateMappingKeys(node *yaml.Node, errs *[]string) { + switch node.Kind { + case yaml.DocumentNode, yaml.SequenceNode: + for _, child := range node.Content { + walkDuplicateMappingKeys(child, errs) + } + case yaml.MappingNode: + l := len(node.Content) + found := false + for i := 0; i < l; i += 2 { + ni := node.Content[i] + for j := i + 2; j < l; j += 2 { + nj := node.Content[j] + if ni.Kind == nj.Kind && ni.Value == nj.Value { + *errs = append(*errs, + fmt.Sprintf("line %d: mapping key %#v already defined at line %d", nj.Line, nj.Value, ni.Line)) + found = true + } + } + } + if found { + return + } + for _, child := range node.Content { + walkDuplicateMappingKeys(child, errs) + } + } +} + // extract version number from specification func parseVersionTypeData(d interface{}) (string, int, error) { r := []rune(strings.TrimSpace(fmt.Sprintf("%v", d))) diff --git a/datamodel/spec_info_duplicate_keys_test.go b/datamodel/spec_info_duplicate_keys_test.go new file mode 100644 index 000000000..12535b2e3 --- /dev/null +++ b/datamodel/spec_info_duplicate_keys_test.go @@ -0,0 +1,106 @@ +// Copyright 2026 Princess B33f Heavy Industries / Dave Shanley +// SPDX-License-Identifier: MIT + +package datamodel + +import ( + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.yaml.in/yaml/v4" +) + +// TestCheckDuplicateMappingKeys_MatchesDecoder is a differential test: every case is +// run through both checkDuplicateMappingKeys and the yaml v4 decoder (the previous +// source of duplicate-key errors). The walker must agree with the decoder on whether +// an error occurs AND on the exact construct error text. +func TestCheckDuplicateMappingKeys_MatchesDecoder(t *testing.T) { + cases := []struct { + name string + yml string + }{ + {"no duplicates", "a: 1\nb: 2\nc:\n d: 3\n e: 4\n"}, + {"simple duplicate", "a: 1\nb: 2\na: 3\n"}, + {"nested duplicate", "root:\n x: 1\n y: 2\n x: 3\n"}, + {"duplicate inside sequence", "items:\n - k: 1\n k: 2\n - ok: 1\n"}, + {"multiple duplicates", "a: 1\na: 2\nb: 3\nb: 4\n"}, + {"triple duplicate", "a: 1\na: 2\na: 3\n"}, + {"alias keys", "anchored: &k value\nmap:\n *k : 1\n *k : 2\n"}, + {"alias key vs literal", "anchored: &k value\nmap:\n *k : 1\n value: 2\n"}, + {"merge keys", "base: &base\n a: 1\nuses:\n <<: *base\n a: 2\n"}, + {"duplicate merge keys", "b1: &b1\n a: 1\nb2: &b2\n b: 2\nuses:\n <<: *b1\n <<: *b2\n"}, + {"tagged int vs plain", "m:\n !!str 1: a\n 1: b\n"}, + {"quoted vs plain same value", "m:\n \"true\": a\n true: b\n"}, + {"flow map key", "m:\n {a: 1}: x\n {a: 1}: y\n"}, + {"duplicate under duplicate", "a:\n inner: 1\n inner: 2\na:\n other: 1\n"}, + {"numeric keys", "m:\n 9: a\n 9: b\n"}, + {"empty mapping", "{}\n"}, + {"deeply nested clean", "a:\n b:\n c:\n - d: 1\n e: 2\n"}, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + var node yaml.Node + require.NoError(t, yaml.Unmarshal([]byte(tc.yml), &node), "corpus cases must parse") + + // the decoder's view (previous behavior). + var decoded map[string]interface{} + decodeErr := node.Decode(&decoded) + + // the walker's view (new behavior). + walkErr := checkDuplicateMappingKeys(&node) + + if decodeErr != nil { + require.Error(t, walkErr, "decoder errored but walker did not: %s", decodeErr) + assert.Equal(t, decodeErr.Error(), walkErr.Error(), "error text must match decoder byte for byte") + } else { + assert.NoError(t, walkErr, "walker errored but decoder did not") + } + }) + } +} + +// TestCheckDuplicateMappingKeys_AliasedAnchorDivergence pins the one KNOWN, +// INTENTIONAL divergence from the decoder: an anchored mapping with duplicate +// keys that is aliased elsewhere is reported once per definition by the +// walker, but once per construction visit (anchor + each alias) by the +// decoder. The duplicate itself is identical; only the repeat count differs. +// If this test starts failing on the walker side, the decoder's construction +// semantics changed - re-verify the whole corpus above. +func TestCheckDuplicateMappingKeys_AliasedAnchorDivergence(t *testing.T) { + yml := "a: &x {k: 1, k: 2}\nb: *x\nc: *x\n" + var node yaml.Node + require.NoError(t, yaml.Unmarshal([]byte(yml), &node)) + + var decoded map[string]interface{} + decodeErr := node.Decode(&decoded) + walkErr := checkDuplicateMappingKeys(&node) + + require.Error(t, decodeErr) + require.Error(t, walkErr) + + dupLine := `line 1: mapping key "k" already defined at line 1` + // decoder: one report per construction visit (anchor + two aliases). + assert.Equal(t, 3, strings.Count(decodeErr.Error(), dupLine), "decoder reports per visit") + // walker: one report per definition. + assert.Equal(t, 1, strings.Count(walkErr.Error(), dupLine), "walker reports once") +} + +// TestCheckDuplicateMappingKeys_OffendingMappingNotDescended pins the decoder-matching +// behavior that children of a mapping with duplicate keys are not walked: the decoder +// stops constructing that mapping, so nested duplicates below it never surface. +func TestCheckDuplicateMappingKeys_OffendingMappingNotDescended(t *testing.T) { + yml := "a: 1\na:\n x: 1\n x: 2\n" + var node yaml.Node + require.NoError(t, yaml.Unmarshal([]byte(yml), &node)) + + var decoded map[string]interface{} + decodeErr := node.Decode(&decoded) + walkErr := checkDuplicateMappingKeys(&node) + + require.Error(t, decodeErr) + require.Error(t, walkErr) + assert.Equal(t, decodeErr.Error(), walkErr.Error()) +} diff --git a/datamodel/spec_info_lazy_json_test.go b/datamodel/spec_info_lazy_json_test.go new file mode 100644 index 000000000..9973a9522 --- /dev/null +++ b/datamodel/spec_info_lazy_json_test.go @@ -0,0 +1,134 @@ +// Copyright 2026 Princess B33f Heavy Industries / Dave Shanley +// SPDX-License-Identifier: MIT + +package datamodel + +import ( + "sync" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +const lazyJSONYAML = `openapi: 3.0.1 +info: + title: lazy + version: 1.0.0 +paths: {}` + +const lazyJSONJSON = `{"openapi":"3.0.1","info":{"title":"lazy","version":"1.0.0"},"paths":{}}` + +func TestSpecInfo_LazyJSON_YAMLInput(t *testing.T) { + r, err := ExtractSpecInfo([]byte(lazyJSONYAML)) + require.NoError(t, err) + + // nothing is built eagerly. + assert.Nil(t, r.SpecJSON) + assert.Nil(t, r.SpecJSONBytes) + + j := r.GetSpecJSON() + require.NotNil(t, j) + assert.Equal(t, "3.0.1", (*j)["openapi"]) + assert.NoError(t, r.GetSpecJSONError()) + + b := r.GetSpecJSONBytes() + require.NotNil(t, b) + assert.Greater(t, len(*b), 0) + + // accessors populate the public fields for mixed readers. + assert.Equal(t, j, r.SpecJSON) + assert.Equal(t, b, r.SpecJSONBytes) +} + +func TestSpecInfo_LazyJSON_JSONInput(t *testing.T) { + r, err := ExtractSpecInfo([]byte(lazyJSONJSON)) + require.NoError(t, err) + + assert.Nil(t, r.SpecJSON) + + j := r.GetSpecJSON() + require.NotNil(t, j) + assert.Equal(t, "3.0.1", (*j)["openapi"]) + + // JSON input: the bytes are the original document, not a copy. + b := r.GetSpecJSONBytes() + require.NotNil(t, b) + assert.Equal(t, r.SpecBytes, b) +} + +func TestSpecInfo_LazyJSON_Concurrent(t *testing.T) { + r, err := ExtractSpecInfo([]byte(lazyJSONYAML)) + require.NoError(t, err) + + var wg sync.WaitGroup + for i := 0; i < 16; i++ { + wg.Add(1) + go func() { + defer wg.Done() + assert.NotNil(t, r.GetSpecJSON()) + assert.NotNil(t, r.GetSpecJSONBytes()) + }() + } + wg.Wait() +} + +func TestSpecInfo_LazyJSON_SkipJSONConversion(t *testing.T) { + r, err := ExtractSpecInfoWithConfig([]byte(lazyJSONYAML), &DocumentConfiguration{ + SkipJSONConversion: true, + }) + require.NoError(t, err) + // the flag's contract holds for accessors too: no JSON representation, ever. + // consumers (e.g. vacuum turbo mode) rely on nil as the "conversion disabled" signal. + assert.Nil(t, r.SpecJSON) + assert.Nil(t, r.GetSpecJSON()) + assert.Nil(t, r.GetSpecJSONBytes()) + assert.NoError(t, r.GetSpecJSONError()) +} + +func TestSpecInfo_LazyJSON_AfterRelease(t *testing.T) { + r, err := ExtractSpecInfo([]byte(lazyJSONYAML)) + require.NoError(t, err) + + r.Release() + + // released: inputs are gone, accessors return nil without panicking and + // nothing is resurrected. no error either - nothing was built, nothing failed. + assert.Nil(t, r.GetSpecJSON()) + assert.Nil(t, r.GetSpecJSONBytes()) + assert.NoError(t, r.GetSpecJSONError()) + assert.Nil(t, r.SpecJSON) + assert.Nil(t, r.SpecJSONBytes) + + // same nil-safety for JSON input, which builds from the original bytes. + rj, err := ExtractSpecInfo([]byte(lazyJSONJSON)) + require.NoError(t, err) + rj.Release() + assert.Nil(t, rj.GetSpecJSON()) + assert.Nil(t, rj.GetSpecJSONBytes()) +} + +func TestSpecInfo_LazyJSON_YAMLDecodeError(t *testing.T) { + // a tagged scalar that cannot decode to its tag passes extraction (only duplicate + // keys are validated eagerly) but fails the lazy build. + spec := "openapi: 3.0.1\ninfo:\n title: lazy\n version: !!int notanint\npaths: {}" + r, err := ExtractSpecInfo([]byte(spec)) + require.NoError(t, err) + + assert.Nil(t, r.GetSpecJSON()) + assert.Nil(t, r.GetSpecJSONBytes()) + assert.ErrorContains(t, r.GetSpecJSONError(), "failed to decode YAML to JSON") +} + +func TestSpecInfo_LazyJSON_JSONUnmarshalError(t *testing.T) { + // bypass lets structurally invalid JSON through extraction; the lazy build + // surfaces the decode failure instead. + bad := `{"openapi": }` + r, err := ExtractSpecInfoWithDocumentCheck([]byte(bad), true) + require.NoError(t, err) + r.SpecFileType = JSONFileType + + // GetSpecJSONError builds on first call, so it works standalone too. + assert.ErrorContains(t, r.GetSpecJSONError(), "failed to unmarshal JSON") + assert.Nil(t, r.GetSpecJSON()) +} diff --git a/datamodel/spec_info_test.go b/datamodel/spec_info_test.go index a2ba2d367..56ec42a57 100644 --- a/datamodel/spec_info_test.go +++ b/datamodel/spec_info_test.go @@ -203,7 +203,7 @@ info: func TestExtractSpecInfo_ValidJSON(t *testing.T) { r, e := ExtractSpecInfo([]byte(goodJSON)) - assert.Greater(t, len(*r.SpecJSONBytes), 0) + assert.Greater(t, len(*r.GetSpecJSONBytes()), 0) assert.Error(t, e) } @@ -219,7 +219,7 @@ func TestExtractSpecInfo_Nothing(t *testing.T) { func TestExtractSpecInfo_ValidYAML(t *testing.T) { r, e := ExtractSpecInfo([]byte(goodYAML)) - assert.Greater(t, len(*r.SpecJSONBytes), 0) + assert.Greater(t, len(*r.GetSpecJSONBytes()), 0) assert.Error(t, e) } @@ -254,7 +254,7 @@ func TestExtractSpecInfo_OpenAPI3(t *testing.T) { assert.Nil(t, e) assert.Equal(t, utils.OpenApi3, r.SpecType) assert.Equal(t, "3.0.1", r.Version) - assert.Greater(t, len(*r.SpecJSONBytes), 0) + assert.Greater(t, len(*r.GetSpecJSONBytes()), 0) assert.Contains(t, r.APISchema, "https://spec.openapis.org/oas/3.0/schema/2021-09-28") } @@ -349,7 +349,7 @@ func TestExtractSpecInfo_OpenAPI2(t *testing.T) { assert.Nil(t, e) assert.Equal(t, OpenApi2, r.SpecType) assert.Equal(t, "2.0.1", r.Version) - assert.Greater(t, len(*r.SpecJSONBytes), 0) + assert.Greater(t, len(*r.GetSpecJSONBytes()), 0) assert.Contains(t, r.APISchema, "http://swagger.io/v2/schema.json#") } @@ -365,7 +365,7 @@ func TestExtractSpecInfo_AsyncAPI(t *testing.T) { assert.Nil(t, e) assert.Equal(t, AsyncApi, r.SpecType) assert.Equal(t, "2.0.0", r.Version) - assert.Greater(t, len(*r.SpecJSONBytes), 0) + assert.Greater(t, len(*r.GetSpecJSONBytes()), 0) } func TestExtractSpecInfo_AsyncAPI_OddVersion(t *testing.T) { diff --git a/datamodel/translate.go b/datamodel/translate.go index a5245c0cb..7e8ce6446 100644 --- a/datamodel/translate.go +++ b/datamodel/translate.go @@ -38,6 +38,11 @@ type pipelineResult[OUT any] struct { err error } +// parallelTranslateThreshold is the collection size below which TranslateSliceParallel +// and TranslateMapParallel run sequentially: worker pool setup (goroutines, channels, +// pending map) costs more than translating a handful of items inline. +const parallelTranslateThreshold = 16 + // TranslateSliceParallel iterates a slice in parallel and calls translate() // asynchronously. // translate() may return `datamodel.Continue` to continue iteration. @@ -48,6 +53,33 @@ func TranslateSliceParallel[IN any, OUT any](in []IN, translate TranslateSliceFu return nil } + // small collections run inline: same observable semantics, none of the + // worker pool overhead. + if len(in) <= parallelTranslateThreshold { + for i := range in { + out, err := translate(i, in[i]) + if err == Continue { + continue + } + if err != nil { + if err == io.EOF { + return nil + } + return err + } + if result == nil { + continue + } + if err = result(out); err != nil { + if err == io.EOF { + return nil + } + return err + } + } + return nil + } + ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -149,14 +181,33 @@ func TranslateMapParallel[K comparable, V any, RV any](m *orderedmap.Map[K, V], return nil } - // Snapshot pairs for indexed access. + // small maps run inline: same observable semantics, none of the worker + // pool or pair snapshot overhead. + if m.Len() <= parallelTranslateThreshold { + for pair := orderedmap.First(m); pair != nil; pair = pair.Next() { + rv, err := translate(pair) + if err != nil { + if err == io.EOF { + return nil + } + return err + } + if err = result(rv); err != nil { + if err == io.EOF { + return nil + } + return err + } + } + return nil + } + + // Snapshot pairs for indexed access. The map is larger than the sequential + // threshold, so pairs is never empty here. pairs := make([]orderedmap.Pair[K, V], 0, m.Len()) for pair := orderedmap.First(m); pair != nil; pair = pair.Next() { pairs = append(pairs, pair) } - if len(pairs) == 0 { - return nil - } ctx, cancel := context.WithCancel(context.Background()) defer cancel() diff --git a/datamodel/translate_test.go b/datamodel/translate_test.go index 00aa91478..0ee4321d0 100644 --- a/datamodel/translate_test.go +++ b/datamodel/translate_test.go @@ -176,6 +176,97 @@ func TestTranslateSliceParallel(t *testing.T) { } } +// TestTranslateSliceParallel_SequentialNilResult covers the inline fast path when no +// result callback is provided (collections at or below the parallel threshold). +func TestTranslateSliceParallel_SequentialNilResult(t *testing.T) { + sl := []int{1, 2, 3} + var translateCounter int64 + translateFunc := func(_, value int) (string, error) { + atomic.AddInt64(&translateCounter, 1) + return "foobar", nil + } + err := datamodel.TranslateSliceParallel[int, string](sl, translateFunc, nil) + require.NoError(t, err) + assert.Equal(t, int64(3), translateCounter) +} + +// TestTranslateMapParallel_Sequential covers every branch of the inline fast path +// taken for maps at or below the parallel threshold. +func TestTranslateMapParallel_Sequential(t *testing.T) { + buildMap := func(n int) *orderedmap.Map[string, int] { + m := orderedmap.New[string, int]() + for i := 0; i < n; i++ { + m.Set(fmt.Sprintf("key%d", i), i) + } + return m + } + + t.Run("Happy path preserves order", func(t *testing.T) { + m := buildMap(5) + var results []string + err := datamodel.TranslateMapParallel[string, int, string](m, + func(pair orderedmap.Pair[string, int]) (string, error) { + return fmt.Sprintf("foobar %d", pair.Value()), nil + }, + func(value string) error { + results = append(results, value) + return nil + }) + require.NoError(t, err) + assert.Equal(t, []string{"foobar 0", "foobar 1", "foobar 2", "foobar 3", "foobar 4"}, results) + }) + + t.Run("Error in translate", func(t *testing.T) { + m := buildMap(3) + err := datamodel.TranslateMapParallel[string, int, string](m, + func(orderedmap.Pair[string, int]) (string, error) { + return "", errors.New("Foobar") + }, + func(string) error { return nil }) + require.ErrorContains(t, err, "Foobar") + }) + + t.Run("EOF in translate", func(t *testing.T) { + m := buildMap(3) + var resultCounter int + err := datamodel.TranslateMapParallel[string, int, string](m, + func(orderedmap.Pair[string, int]) (string, error) { + return "", io.EOF + }, + func(string) error { + resultCounter++ + return nil + }) + require.NoError(t, err) + assert.Zero(t, resultCounter) + }) + + t.Run("Error in result", func(t *testing.T) { + m := buildMap(3) + err := datamodel.TranslateMapParallel[string, int, string](m, + func(pair orderedmap.Pair[string, int]) (string, error) { + return "foobar", nil + }, + func(string) error { return errors.New("Foobar") }) + require.ErrorContains(t, err, "Foobar") + }) + + t.Run("EOF in result", func(t *testing.T) { + m := buildMap(3) + var resultCounter int + err := datamodel.TranslateMapParallel[string, int, string](m, + func(pair orderedmap.Pair[string, int]) (string, error) { + return "foobar", nil + }, + func(string) error { + resultCounter++ + return io.EOF + }) + require.NoError(t, err) + assert.Equal(t, 1, resultCounter) + }) +} + func TestTranslateMapParallel(t *testing.T) { const mapSize = 1000 diff --git a/index/extract_refs_inline.go b/index/extract_refs_inline.go index 3f80fe033..643c83739 100644 --- a/index/extract_refs_inline.go +++ b/index/extract_refs_inline.go @@ -11,6 +11,39 @@ import ( "go.yaml.in/yaml/v4" ) +// buildDefinitionPath assembles absPath + "#/" + seenPath + extra segments joined by +// '/' in a single allocation. The "#/..." definition is a zero-copy suffix slice of +// the result, so callers derive both strings from one build. +func buildDefinitionPath(absPath string, seenPath []string, extra ...string) string { + size := len(absPath) + 2 + for _, s := range seenPath { + size += len(s) + 1 + } + for _, s := range extra { + size += len(s) + 1 + } + var b strings.Builder + b.Grow(size) + b.WriteString(absPath) + b.WriteString("#/") + first := true + for _, s := range seenPath { + if !first { + b.WriteByte('/') + } + b.WriteString(s) + first = false + } + for _, s := range extra { + if !first { + b.WriteByte('/') + } + b.WriteString(s) + first = false + } + return b.String() +} + func (index *SpecIndex) collectInlineSchemaDefinition(parent, node *yaml.Node, seenPath []string, keyIndex int) { if keyIndex+1 >= len(node.Content) { return @@ -21,11 +54,11 @@ func (index *SpecIndex) collectInlineSchemaDefinition(parent, node *yaml.Node, s var jsonPath, definitionPath, fullDefinitionPath string if len(seenPath) > 0 || keyNode.Value != "" { - loc := append(seenPath, keyNode.Value) - locPath := strings.Join(loc, "/") - definitionPath = "#/" + locPath - fullDefinitionPath = index.specAbsolutePath + "#/" + locPath - _, jsonPath = utils.ConvertComponentIdIntoFriendlyPathSearch(definitionPath) + fullDefinitionPath = buildDefinitionPath(index.specAbsolutePath, seenPath, keyNode.Value) + definitionPath = fullDefinitionPath[len(index.specAbsolutePath):] + if !index.skipMetadataCollection() { + _, jsonPath = utils.ConvertComponentIdIntoFriendlyPathSearch(definitionPath) + } } ref := &Reference{ @@ -68,6 +101,7 @@ func (index *SpecIndex) collectMapSchemaDefinitions(parent, node *yaml.Node, see } label := "" + prefix := "" for h, prop := range propertiesNode.Content { if h%2 == 0 { label = prop.Value @@ -76,11 +110,14 @@ func (index *SpecIndex) collectMapSchemaDefinitions(parent, node *yaml.Node, see var jsonPath, definitionPath, fullDefinitionPath string if len(seenPath) > 0 || keyNode.Value != "" && label != "" { - loc := append(seenPath, keyNode.Value, label) - locPath := strings.Join(loc, "/") - definitionPath = "#/" + locPath - fullDefinitionPath = index.specAbsolutePath + "#/" + locPath - _, jsonPath = utils.ConvertComponentIdIntoFriendlyPathSearch(definitionPath) + if prefix == "" { + prefix = buildDefinitionPath(index.specAbsolutePath, seenPath, keyNode.Value) + } + fullDefinitionPath = prefix + "/" + label + definitionPath = fullDefinitionPath[len(index.specAbsolutePath):] + if !index.skipMetadataCollection() { + _, jsonPath = utils.ConvertComponentIdIntoFriendlyPathSearch(definitionPath) + } } ref := &Reference{ @@ -111,17 +148,20 @@ func (index *SpecIndex) collectArraySchemaDefinitions(parent, node *yaml.Node, s keyNode := node.Content[keyIndex] arrayNode := node.Content[keyIndex+1] + prefix := "" for h, element := range arrayNode.Content { var jsonPath, definitionPath, fullDefinitionPath string if len(seenPath) > 0 { - loc := append(seenPath, keyNode.Value, strconv.Itoa(h)) - locPath := strings.Join(loc, "/") - definitionPath = "#/" + locPath - fullDefinitionPath = index.specAbsolutePath + "#/" + locPath - _, jsonPath = utils.ConvertComponentIdIntoFriendlyPathSearch(definitionPath) + if prefix == "" { + prefix = buildDefinitionPath(index.specAbsolutePath, seenPath, keyNode.Value) + } + fullDefinitionPath = prefix + "/" + strconv.Itoa(h) + definitionPath = fullDefinitionPath[len(index.specAbsolutePath):] } else { definitionPath = "#/" + keyNode.Value fullDefinitionPath = index.specAbsolutePath + "#/" + keyNode.Value + } + if !index.skipMetadataCollection() { _, jsonPath = utils.ConvertComponentIdIntoFriendlyPathSearch(definitionPath) } diff --git a/index/extract_refs_lookup.go b/index/extract_refs_lookup.go index 4062daca8..288ef7682 100644 --- a/index/extract_refs_lookup.go +++ b/index/extract_refs_lookup.go @@ -197,8 +197,9 @@ func (index *SpecIndex) ExtractComponentsFromRefs(ctx context.Context, refs []*R } func (index *SpecIndex) locateRef(ctx context.Context, ref *Reference) *Reference { - uri := strings.Split(ref.FullDefinition, "#/") - isExternalRef := len(uri) == 2 && len(uri[0]) > 0 + // match strings.Split len==2 semantics: exactly one "#/" with a non-empty file part. + refFile, refFragment, refCut := strings.Cut(ref.FullDefinition, "#/") + isExternalRef := refCut && refFile != "" && !strings.Contains(refFragment, "#/") if isExternalRef { index.refLock.Lock() } @@ -221,11 +222,11 @@ func (index *SpecIndex) locateRef(ctx context.Context, ref *Reference) *Referenc } if located.Node != nil { + index.awaitNodeMap() index.nodeMapLock.RLock() - if located.Node.Line > 1 && len(index.nodeMap[located.Node.Line-1]) > 0 { - for _, v := range index.nodeMap[located.Node.Line-1] { - located.KeyNode = v - break + if prevLine := located.Node.Line - 1; prevLine > 0 && prevLine < len(index.nodeLines) { + if entries := index.nodeLines[prevLine]; len(entries) > 0 { + located.KeyNode = entries[0].node } } index.nodeMapLock.RUnlock() diff --git a/index/extract_refs_metadata.go b/index/extract_refs_metadata.go index ce9b82f78..085237792 100644 --- a/index/extract_refs_metadata.go +++ b/index/extract_refs_metadata.go @@ -16,6 +16,13 @@ type metadataPathAction struct { stop bool } +// skipMetadataCollection reports whether diagnostic metadata collection is disabled. +// Only collection is skipped: the path actions extractNodeMetadata returns drive +// seenPath handling for every downstream ref, so that logic always runs. +func (index *SpecIndex) skipMetadataCollection() bool { + return index.config != nil && index.config.SkipMetadataCollection +} + func (index *SpecIndex) extractNodeMetadata(node, parent *yaml.Node, seenPath []string, keyIndex int) metadataPathAction { keyNode := node.Content[keyIndex] if keyNode == nil || keyNode.Value == "" || keyNode.Value == "$ref" || keyNode.Value == "$id" { @@ -31,8 +38,7 @@ func (index *SpecIndex) extractNodeMetadata(node, parent *yaml.Node, seenPath [] var jsonPathComputed bool computeJSONPath := func() string { if !jsonPathComputed { - loc := append(seenPath, segment) - definitionPath := "#/" + strings.Join(loc, "/") + definitionPath := buildDefinitionPath("", seenPath, segment) _, jsonPath = utils.ConvertComponentIdIntoFriendlyPathSearch(definitionPath) jsonPathComputed = true } @@ -47,7 +53,7 @@ func (index *SpecIndex) extractNodeMetadata(node, parent *yaml.Node, seenPath [] if isMetadataPropertyNamePath(seenPath) { return metadataPathAction{appendSegment: true, stop: true} } - if !metadataPathContainsExamples(seenPath) { + if !metadataPathContainsExamples(seenPath) && !index.skipMetadataCollection() { refNode := metadataValueNode(node, keyIndex) ref := &DescriptionReference{ ParentNode: parent, @@ -69,25 +75,33 @@ func (index *SpecIndex) extractNodeMetadata(node, parent *yaml.Node, seenPath [] if metadataPathContainsExamples(seenPath) { return metadataPathAction{stop: true} } - refNode := metadataValueNode(node, keyIndex) - index.allSummaries = append(index.allSummaries, &DescriptionReference{ - ParentNode: parent, - Content: refNode.Value, - Path: computeJSONPath(), - Node: refNode, - KeyNode: keyNode, - IsSummary: true, - }) - index.summaryCount++ + if !index.skipMetadataCollection() { + refNode := metadataValueNode(node, keyIndex) + index.allSummaries = append(index.allSummaries, &DescriptionReference{ + ParentNode: parent, + Content: refNode.Value, + Path: computeJSONPath(), + Node: refNode, + KeyNode: keyNode, + IsSummary: true, + }) + index.summaryCount++ + } case "security": - index.collectSecurityRequirementMetadata(node, keyIndex, computeJSONPath()) + if !index.skipMetadataCollection() { + index.collectSecurityRequirementMetadata(node, keyIndex, computeJSONPath()) + } case "enum": if len(seenPath) > 0 && seenPath[len(seenPath)-1] == "properties" { return metadataPathAction{appendSegment: true, stop: true} } - index.collectEnumMetadata(node, parent, keyIndex, computeJSONPath()) + if !index.skipMetadataCollection() { + index.collectEnumMetadata(node, parent, keyIndex, computeJSONPath()) + } case "properties": - index.collectObjectWithPropertiesMetadata(node, parent, keyNode, computeJSONPath()) + if !index.skipMetadataCollection() { + index.collectObjectWithPropertiesMetadata(node, parent, keyNode, computeJSONPath()) + } } return metadataPathAction{appendSegment: true} diff --git a/index/index_model.go b/index/index_model.go index 32eb02905..8cc44af76 100644 --- a/index/index_model.go +++ b/index/index_model.go @@ -227,6 +227,20 @@ type SpecIndexConfig struct { // PropertyMergeStrategy defines how to handle conflicts when merging properties. PropertyMergeStrategy datamodel.PropertyMergeStrategy + // SkipMetadataCollection disables the collection of diagnostic metadata during indexing: + // descriptions, summaries, enums, objects-with-properties, security requirement + // references, and the JSONPath `Path` values on inline schema references. Skipping + // them significantly reduces allocations and retained memory when parsing large + // documents. Reference extraction and resolution are unaffected. + // + // -- UNSAFE FOR DIAGNOSTIC, RULE, OR PATH CONSUMERS -- + // When enabled, GetAllDescriptions, GetAllSummaries, GetAllEnums, + // GetAllObjectsWithProperties, GetSecurityRequirementReferences and the related + // counts are intentionally empty/zero, and inline schema Reference.Path values are + // empty strings. vacuum and any other tool that consumes index metadata or Path + // values must NOT enable this. Defaults to false (everything is collected). + SkipMetadataCollection bool + // private fields uri []string id string @@ -279,6 +293,7 @@ func (s *SpecIndexConfig) ToDocumentConfiguration() *datamodel.DocumentConfigura ResolveNestedRefsWithDocumentContext: s.ResolveNestedRefsWithDocumentContext, PropertyMergeStrategy: strategy, SkipExternalRefResolution: s.SkipExternalRefResolution, + SkipMetadataCollection: s.SkipMetadataCollection, Logger: s.Logger, } } @@ -416,7 +431,8 @@ type SpecIndex struct { built bool uri []string logger *slog.Logger - nodeMap map[int]map[int]*yaml.Node + nodeLines [][]nodeLineEntry + legacyNodeMap map[int]map[int]*yaml.Node // materialized on demand by GetNodeMap only nodeMapCompleted chan struct{} pendingResolve []refMap highModelCache Cache @@ -444,8 +460,40 @@ func (index *SpecIndex) GetConfig() *SpecIndexConfig { } // GetNodeMap returns the line-to-column-to-node map built during indexing. +// The map is materialized from the internal line index on first call and cached. +// +// Deprecated: use GetNode for single lookups; this method exists for API +// compatibility and allocates a full legacy map on first use. func (index *SpecIndex) GetNodeMap() map[int]map[int]*yaml.Node { - return index.nodeMap + index.awaitNodeMap() + index.nodeMapLock.RLock() + legacy := index.legacyNodeMap + lines := index.nodeLines + index.nodeMapLock.RUnlock() + if legacy != nil || lines == nil { + return legacy + } + legacy = make(map[int]map[int]*yaml.Node) + for line, entries := range lines { + if len(entries) == 0 { + continue + } + cols := make(map[int]*yaml.Node, len(entries)) + for _, e := range entries { + cols[int(e.column)] = e.node + } + legacy[line] = cols + } + index.nodeMapLock.Lock() + // another caller may have built and cached the map while this one was + // building; keep the first instance so callers share one map. + if cached := index.legacyNodeMap; cached != nil { + index.nodeMapLock.Unlock() + return cached + } + index.legacyNodeMap = legacy + index.nodeMapLock.Unlock() + return legacy } // GetCache returns the reference lookup cache used during resolution. @@ -543,7 +591,12 @@ func (index *SpecIndex) releaseComponentIndexes() { } func (index *SpecIndex) releaseDerivedState() { - index.nodeMap = nil + // node-map state is read concurrently via awaitNodeMap/GetNode; nil it + // under the same lock those readers use. + index.nodeMapLock.Lock() + index.nodeLines = nil + index.legacyNodeMap = nil + index.nodeMapLock.Unlock() index.allDescriptions = nil index.allSummaries = nil index.allEnums = nil @@ -603,7 +656,9 @@ func (index *SpecIndex) resetRuntimeState() { index.built = false index.componentIndexChan = nil index.polyComponentIndexChan = nil - index.nodeMapCompleted = nil + // nodeMapCompleted is deliberately NOT nilled: it is closed (retaining + // nothing) and awaitNodeMap reads the field without a lock on the GetNode + // hot path - writing nil here would race every reader for zero benefit. } // SetAbsolutePath sets the absolute path to the spec file for the index. Will be absolute, either as a http link or a file. diff --git a/index/index_model_test.go b/index/index_model_test.go index 2dafd301e..26d8c8b2f 100644 --- a/index/index_model_test.go +++ b/index/index_model_test.go @@ -90,6 +90,7 @@ func TestSpecIndexConfig_ToDocumentConfiguration_AllFields(t *testing.T) { AllowUnknownExtensionContentDetection: true, TransformSiblingRefs: true, ResolveNestedRefsWithDocumentContext: true, + SkipMetadataCollection: true, } result := config.ToDocumentConfiguration() @@ -107,6 +108,7 @@ func TestSpecIndexConfig_ToDocumentConfiguration_AllFields(t *testing.T) { assert.True(t, result.AllowUnknownExtensionContentDetection) assert.True(t, result.TransformSiblingRefs) assert.True(t, result.ResolveNestedRefsWithDocumentContext) + assert.True(t, result.SkipMetadataCollection) assert.False(t, result.MergeReferencedProperties) // default disabled for index configs } @@ -144,7 +146,8 @@ func TestSpecIndex_Release(t *testing.T) { rawSequencedRefs: []*Reference{{}}, allMappedRefs: map[string]*Reference{"mapped": {}}, allMappedRefsSequenced: []*ReferenceMapped{{}}, - nodeMap: map[int]map[int]*yaml.Node{1: {1: &yaml.Node{}}}, + nodeLines: [][]nodeLineEntry{nil, {{column: 1, node: &yaml.Node{}}}}, + legacyNodeMap: map[int]map[int]*yaml.Node{1: {1: &yaml.Node{}}}, allDescriptions: []*DescriptionReference{{}}, allEnums: []*EnumReference{{}}, circularReferences: []*CircularReferenceResult{{}}, @@ -181,8 +184,9 @@ func TestSpecIndex_Release(t *testing.T) { assert.Nil(t, idx.allMappedRefs) assert.Nil(t, idx.allMappedRefsSequenced) - // node map - assert.Nil(t, idx.nodeMap) + // node line index and legacy map + assert.Nil(t, idx.nodeLines) + assert.Nil(t, idx.legacyNodeMap) // descriptions, enums assert.Nil(t, idx.allDescriptions) @@ -209,7 +213,10 @@ func TestSpecIndex_Release(t *testing.T) { assert.False(t, idx.allowCircularReferences) assert.Nil(t, idx.componentIndexChan) assert.Nil(t, idx.polyComponentIndexChan) - assert.Nil(t, idx.nodeMapCompleted) + // nodeMapCompleted survives release on purpose: it is a closed channel + // (retains nothing) and awaitNodeMap reads it without a lock, so nilling + // it would race concurrent GetNode callers. + assert.NotNil(t, idx.nodeMapCompleted) // resolver released and niled assert.Nil(t, idx.resolver) diff --git a/index/inline_collector_parity_test.go b/index/inline_collector_parity_test.go new file mode 100644 index 000000000..dc8844345 --- /dev/null +++ b/index/inline_collector_parity_test.go @@ -0,0 +1,90 @@ +// Copyright 2026 Princess B33f Heavy Industries / Dave Shanley +// SPDX-License-Identifier: MIT + +package index + +import ( + "crypto/sha256" + "encoding/hex" + "fmt" + "os" + "path/filepath" + "sort" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.yaml.in/yaml/v4" +) + +// inlineCollectorParityPath pins the exact (Definition, FullDefinition, Path) tuples +// produced by the inline schema collectors for real documents. The converter golden +// corpus (utils/testdata) protects the path converter; this fixture protects the +// string assembly inside the collectors themselves. Regenerate with: +// +// GOLDEN_REGENERATE=true go test ./index -run TestInlineCollectorParity +const inlineCollectorParityPath = "testdata/inline_collector_parity.txt" + +// parityAbsolutePath is a fixed absolute path so fixtures are machine independent. +const parityAbsolutePath = "/parity/test/root.yaml" + +var parityScanSpecs = []string{ + "../test_specs/stripe.yaml", + "../test_specs/burgershop.openapi.yaml", + "../test_specs/mixedref-burgershop.openapi.yaml", + "../test_specs/k8s.json", +} + +func collectInlineParityRows(t *testing.T) []string { + var rows []string + for _, spec := range parityScanSpecs { + data, err := os.ReadFile(spec) + require.NoError(t, err) + + var rootNode yaml.Node + require.NoError(t, yaml.Unmarshal(data, &rootNode)) + + cfg := CreateOpenAPIIndexConfig() + cfg.AllowRemoteLookup = false + cfg.AllowFileLookup = false + cfg.SpecAbsolutePath = parityAbsolutePath + idx := NewSpecIndexWithConfig(&rootNode, cfg) + + collections := []struct { + name string + refs []*Reference + }{ + {"inline", idx.GetAllInlineSchemas()}, + {"refs", idx.GetAllReferenceSchemas()}, + {"objects", idx.GetAllInlineSchemaObjects()}, + } + for _, c := range collections { + tuples := make([]string, 0, len(c.refs)) + for _, ref := range c.refs { + tuples = append(tuples, ref.Definition+"\x1f"+ref.FullDefinition+"\x1f"+ref.Path) + } + sort.Strings(tuples) + h := sha256.Sum256([]byte(strings.Join(tuples, "\n"))) + rows = append(rows, fmt.Sprintf("%s\t%s\t%d\t%s", + filepath.Base(spec), c.name, len(tuples), hex.EncodeToString(h[:]))) + } + } + return rows +} + +func TestInlineCollectorParity(t *testing.T) { + rows := collectInlineParityRows(t) + + if os.Getenv("GOLDEN_REGENERATE") == "true" { + require.NoError(t, os.MkdirAll("testdata", 0o755)) + require.NoError(t, os.WriteFile(inlineCollectorParityPath, + []byte(strings.Join(rows, "\n")+"\n"), 0o644)) + t.Logf("inline collector parity fixture regenerated: %d rows", len(rows)) + } + + expected, err := os.ReadFile(inlineCollectorParityPath) + require.NoError(t, err, "parity fixture missing - regenerate with GOLDEN_REGENERATE=true") + assert.Equal(t, strings.TrimRight(string(expected), "\n"), strings.Join(rows, "\n"), + "inline collector output changed - Definition/FullDefinition/Path must stay byte-identical") +} diff --git a/index/map_index_nodes.go b/index/map_index_nodes.go index 4f8ecde50..84cb1f101 100644 --- a/index/map_index_nodes.go +++ b/index/map_index_nodes.go @@ -41,44 +41,96 @@ type NodeOrigin struct { Index *SpecIndex `json:"-" yaml:"-"` } +// nodeLineEntry is a single (column, node) pair on one line of the spec. Lines hold very +// few nodes, so a small slice scanned linearly is far cheaper than a per-line map. +type nodeLineEntry struct { + column int32 + node *yaml.Node +} + // GetNode returns a node from the spec based on a line and column. The second return var bool is true -// if the node was found, false if not. +// if the node was found, false if not. Blocks until the node line index has been fully built. func (index *SpecIndex) GetNode(line int, column int) (*yaml.Node, bool) { + index.awaitNodeMap() index.nodeMapLock.RLock() defer index.nodeMapLock.RUnlock() - if index.nodeMap[line] == nil { - return nil, false - } - node := index.nodeMap[line][column] + node := lookupNodeLines(index.nodeLines, line, column) return node, node != nil } -// MapNodes maps all nodes in the document to a map of line/column to node. -// Writes directly to index.nodeMap with lock protection (concurrent reads -// may happen from ExtractRefs running in parallel). +// awaitNodeMap blocks until MapNodes has published the node line index. It is a no-op +// once the index has been built or released (the completion channel is close-only). +func (index *SpecIndex) awaitNodeMap() { + if ch := index.nodeMapCompleted; ch != nil { + <-ch + } +} + +// lookupNodeLines returns the node stored at line/column, or nil if absent. +func lookupNodeLines(lines [][]nodeLineEntry, line, column int) *yaml.Node { + if line < 0 || line >= len(lines) { + return nil + } + for _, e := range lines[line] { + if int(e.column) == column { + return e.node + } + } + return nil +} + +// MapNodes maps all nodes in the document by line and column. The index is built into a +// local structure without locking, published under a single lock, and completion is +// signalled by closing nodeMapCompleted (close-only: supports any number of waiters). func (index *SpecIndex) MapNodes(rootNode *yaml.Node) { - mapNodesRecursive(rootNode, index, true) - index.nodeMapCompleted <- struct{}{} + sizeHint := 0 + if index.config != nil && index.config.SpecInfo != nil { + sizeHint = index.config.SpecInfo.NumLines + } + // lines are 1-based; +1 so line NumLines is directly addressable. + lines := make([][]nodeLineEntry, sizeHint+1) + lines = mapNodesRecursive(rootNode, lines) + index.nodeMapLock.Lock() + index.nodeLines = lines + index.nodeMapLock.Unlock() close(index.nodeMapCompleted) } -func mapNodesRecursive(node *yaml.Node, index *SpecIndex, root bool) { +func mapNodesRecursive(node *yaml.Node, lines [][]nodeLineEntry) [][]nodeLineEntry { if node.Kind == yaml.DocumentNode { node = node.Content[0] } for _, child := range node.Content { - index.nodeMapLock.Lock() - if index.nodeMap[child.Line] == nil { - index.nodeMap[child.Line] = make(map[int]*yaml.Node) + lines = addNodeLineEntry(lines, child) + lines = mapNodesRecursive(child, lines) + } + return addNodeLineEntry(lines, node) +} + +// addNodeLineEntry records node at its line/column, preserving the previous map +// semantics: a later write to the same line/column replaces the earlier one +// (parents are written after their children, so parents win collisions). +func addNodeLineEntry(lines [][]nodeLineEntry, node *yaml.Node) [][]nodeLineEntry { + line := node.Line + if line < 0 { + return lines + } + if line >= len(lines) { + grown := len(lines) * 2 + if grown <= line { + grown = line + 1 } - index.nodeMap[child.Line][child.Column] = child - index.nodeMapLock.Unlock() - mapNodesRecursive(child, index, false) + expanded := make([][]nodeLineEntry, grown) + copy(expanded, lines) + lines = expanded } - index.nodeMapLock.Lock() - if index.nodeMap[node.Line] == nil { - index.nodeMap[node.Line] = make(map[int]*yaml.Node) + entries := lines[line] + for i := range entries { + if int(entries[i].column) == node.Column { + entries[i].node = node + return lines + } } - index.nodeMap[node.Line][node.Column] = node - index.nodeMapLock.Unlock() + lines[line] = append(entries, nodeLineEntry{column: int32(node.Column), node: node}) + return lines } diff --git a/index/map_index_nodes_test.go b/index/map_index_nodes_test.go index 1e9693d45..79e812ce8 100644 --- a/index/map_index_nodes_test.go +++ b/index/map_index_nodes_test.go @@ -42,25 +42,27 @@ func TestSpecIndex_MapNodes(t *testing.T) { // check missing line var ok bool - mappedKeyNode, ok = index.GetNode(999, 999) + mappedKeyNode, ok = index.GetNode(999999, 999) assert.False(t, ok) assert.Nil(t, mappedKeyNode) + // check missing column on an existing line mappedKeyNode, ok = index.GetNode(12, 999) assert.False(t, ok) assert.Nil(t, mappedKeyNode) - index.nodeMap[15] = nil - mappedKeyNode, ok = index.GetNode(15, 999) + // check negative line + mappedKeyNode, ok = index.GetNode(-1, 1) assert.False(t, ok) assert.Nil(t, mappedKeyNode) } func TestSpecIndex_GetNode_MissDoesNotLeakReadLock(t *testing.T) { index := NewSpecIndexWithConfig(&yaml.Node{}, CreateOpenAPIIndexConfig()) - index.nodeMap = map[int]map[int]*yaml.Node{ - 1: {1: {Value: "ok"}}, - 2: nil, + index.nodeLines = [][]nodeLineEntry{ + nil, + {{column: 1, node: &yaml.Node{Value: "ok"}}}, + nil, } node, ok := index.GetNode(2, 1) @@ -70,7 +72,7 @@ func TestSpecIndex_GetNode_MissDoesNotLeakReadLock(t *testing.T) { locked := make(chan struct{}) go func() { index.nodeMapLock.Lock() - index.nodeMap[3] = map[int]*yaml.Node{} + index.nodeLines = append(index.nodeLines, nil) index.nodeMapLock.Unlock() close(locked) }() @@ -82,6 +84,88 @@ func TestSpecIndex_GetNode_MissDoesNotLeakReadLock(t *testing.T) { } } +func TestSpecIndex_MapNodes_LineZeroAndGrowth(t *testing.T) { + // a zero-value node reports line 0; nodes can also report lines beyond any + // preallocated hint. both must be stored and retrievable without panics. + lines := make([][]nodeLineEntry, 1) + zeroNode := &yaml.Node{} + lines = addNodeLineEntry(lines, zeroNode) + assert.Same(t, zeroNode, lookupNodeLines(lines, 0, 0)) + + farNode := &yaml.Node{Line: 500, Column: 3} + lines = addNodeLineEntry(lines, farNode) + assert.GreaterOrEqual(t, len(lines), 501) + assert.Same(t, farNode, lookupNodeLines(lines, 500, 3)) + + // a negative line is ignored, not stored. + negNode := &yaml.Node{Line: -1, Column: 1} + lines = addNodeLineEntry(lines, negNode) + assert.Nil(t, lookupNodeLines(lines, -1, 1)) + + // growth that doubles instead of exact-fit: line just past the end. + nearNode := &yaml.Node{Line: 501, Column: 9} + lines = addNodeLineEntry(lines, nearNode) + assert.Same(t, nearNode, lookupNodeLines(lines, 501, 9)) +} + +func TestSpecIndex_MapNodes_OverwriteSemantics(t *testing.T) { + // a later write to the same line/column replaces the earlier one — parents are + // written after children in mapNodesRecursive, so parents win collisions. + first := &yaml.Node{Line: 4, Column: 2, Value: "child"} + second := &yaml.Node{Line: 4, Column: 2, Value: "parent"} + + var lines [][]nodeLineEntry + lines = addNodeLineEntry(lines, first) + lines = addNodeLineEntry(lines, second) + + assert.Same(t, second, lookupNodeLines(lines, 4, 2)) + assert.Len(t, lines[4], 1) +} + +func TestSpecIndex_GetNodeMap_LegacyMaterialization(t *testing.T) { + petstore, _ := os.ReadFile("../test_specs/petstorev3.json") + var rootNode yaml.Node + _ = yaml.Unmarshal(petstore, &rootNode) + + index := NewSpecIndexWithConfig(&rootNode, CreateOpenAPIIndexConfig()) + + // the legacy map must never be materialized by internal build paths. + assert.Nil(t, index.legacyNodeMap) + + legacy := index.GetNodeMap() + assert.NotNil(t, legacy) + + // every entry in the legacy map must match the line index exactly. + total := 0 + for line, cols := range legacy { + for col, n := range cols { + total++ + found, ok := index.GetNode(line, col) + assert.True(t, ok) + assert.Same(t, n, found) + } + } + assert.Positive(t, total) + + // second call returns the cached map. + assert.Equal(t, reflect.ValueOf(legacy).Pointer(), reflect.ValueOf(index.GetNodeMap()).Pointer()) +} + +func TestSpecIndex_GetNodeMap_AfterRelease(t *testing.T) { + petstore, _ := os.ReadFile("../test_specs/petstorev3.json") + var rootNode yaml.Node + _ = yaml.Unmarshal(petstore, &rootNode) + + index := NewSpecIndexWithConfig(&rootNode, CreateOpenAPIIndexConfig()) + index.Release() + + // after release: no legacy map, no lookups, no blocking. + assert.Nil(t, index.GetNodeMap()) + node, ok := index.GetNode(1, 1) + assert.False(t, ok) + assert.Nil(t, node) +} + func BenchmarkSpecIndex_MapNodes(b *testing.B) { petstore, _ := os.ReadFile("../test_specs/petstorev3.json") var rootNode yaml.Node diff --git a/index/search_index.go b/index/search_index.go index 9e0c92d17..e03171163 100644 --- a/index/search_index.go +++ b/index/search_index.go @@ -171,47 +171,49 @@ func (index *SpecIndex) SearchIndexForReferenceByReferenceWithContext(ctx contex absPath = index.config.BasePath } var roloLookup string - uri := strings.Split(ref, "#/") - if len(uri) == 2 { - if uri[0] != "" { - if strings.HasPrefix(uri[0], "http") { + uriFile, uriFragment, uriCut := strings.Cut(ref, "#/") + // match strings.Split(ref, "#/") len==2 semantics: exactly one separator. + singleFragment := uriCut && !strings.Contains(uriFragment, "#/") + if singleFragment { + if uriFile != "" { + if strings.HasPrefix(uriFile, "http") { roloLookup = searchRef.FullDefinition } else { - if filepath.IsAbs(uri[0]) { - roloLookup = uri[0] + if filepath.IsAbs(uriFile) { + roloLookup = uriFile } else { if filepath.Ext(absPath) != "" { absPath = filepath.Dir(absPath) } - roloLookup = index.resolveRelativeFilePath(absPath, uri[0]) + roloLookup = index.resolveRelativeFilePath(absPath, uriFile) } } } else { - if filepath.Ext(uri[1]) != "" { + if filepath.Ext(uriFragment) != "" { roloLookup = absPath } else { roloLookup = "" } - ref = fmt.Sprintf("#/%s", uri[1]) - refAlt = fmt.Sprintf("%s#/%s", absPath, uri[1]) + ref = fmt.Sprintf("#/%s", uriFragment) + refAlt = fmt.Sprintf("%s#/%s", absPath, uriFragment) } } else { - if filepath.IsAbs(uri[0]) { - roloLookup = uri[0] + if filepath.IsAbs(uriFile) { + roloLookup = uriFile } else { - if strings.HasPrefix(uri[0], "http") { + if strings.HasPrefix(uriFile, "http") { roloLookup = ref } else { if filepath.Ext(absPath) != "" { absPath = filepath.Dir(absPath) } - roloLookup = index.resolveRelativeFilePath(absPath, uri[0]) + roloLookup = index.resolveRelativeFilePath(absPath, uriFile) } } - ref = uri[0] + ref = uriFile } if strings.Contains(ref, "%") { // decode the url. @@ -258,9 +260,7 @@ func (index *SpecIndex) SearchIndexForReferenceByReferenceWithContext(ctx contex // component-tree walking inside the remote file. if roloLookup != "" { - if strings.Contains(roloLookup, "#") { - roloLookup = strings.Split(roloLookup, "#")[0] - } + roloLookup, _, _ = strings.Cut(roloLookup, "#") b := filepath.Base(roloLookup) sfn := index.GetSpecFileName() @@ -270,8 +270,8 @@ func (index *SpecIndex) SearchIndexForReferenceByReferenceWithContext(ctx contex if b == sfn && roloLookup == abp { // if the reference is the same as the spec file name, we should look through the index for the component var r *Reference - if len(uri) == 2 { - r = index.FindComponentInRoot(ctx, fmt.Sprintf("#/%s", uri[1])) + if singleFragment { + r = index.FindComponentInRoot(ctx, fmt.Sprintf("#/%s", uriFragment)) } return r, index, ctx } @@ -352,12 +352,12 @@ func (index *SpecIndex) SearchIndexForReferenceByReferenceWithContext(ctx contex node, _ := rFile.GetContentAsYAMLNode() if node != nil { var found *Reference - exp := strings.Split(ref, "#/") + expFile, expFragment, expCut := strings.Cut(ref, "#/") compId := ref - if len(exp) == 2 { - compId = fmt.Sprintf("#/%s", exp[1]) - found = FindComponent(ctx, node, compId, exp[0], idx) + if expCut && !strings.Contains(expFragment, "#/") { + compId = fmt.Sprintf("#/%s", expFragment) + found = FindComponent(ctx, node, compId, expFile, idx) } if found == nil { found = idx.FindComponent(ctx, ref) diff --git a/index/search_rolodex.go b/index/search_rolodex.go index 6eb3f4bb4..d61c6c50f 100644 --- a/index/search_rolodex.go +++ b/index/search_rolodex.go @@ -97,51 +97,49 @@ func (r *Rolodex) FindNodeOrigin(node *yaml.Node) *NodeOrigin { // is returned, otherwise nil is returned. func (index *SpecIndex) FindNodeOrigin(node *yaml.Node) *NodeOrigin { if node != nil { + index.awaitNodeMap() index.nodeMapLock.RLock() - if index.nodeMap[node.Line] != nil { - if index.nodeMap[node.Line][node.Column] != nil { - foundNode := index.nodeMap[node.Line][node.Column] - match := false + if foundNode := lookupNodeLines(index.nodeLines, node.Line, node.Column); foundNode != nil { + match := false - if foundNode == node { - match = true + if foundNode == node { + match = true + } + + // if the found node is a map. iterate through the content until we locate the node at that position + if !match && (utils.IsNodeMap(foundNode) || + utils.IsNodeArray(foundNode)) && (utils.IsNodeMap(node) || utils.IsNodeArray(node)) { + if len(node.Content) == len(foundNode.Content) { + // hash node and found node + match = checkHash(node, foundNode) } + } else { + if !match { + // hash node and found node + match = checkHash(node, foundNode) - // if the found node is a map. iterate through the content until we locate the node at that position - if !match && (utils.IsNodeMap(foundNode) || - utils.IsNodeArray(foundNode)) && (utils.IsNodeMap(node) || utils.IsNodeArray(node)) { - if len(node.Content) == len(foundNode.Content) { - // hash node and found node - match = checkHash(node, foundNode) - } - } else { if !match { - // hash node and found node - match = checkHash(node, foundNode) - - if !match { - // check if the found node is a map and if the first item in the map - // has the same line and column, as well as the same value - if utils.IsNodeMap(foundNode) && len(foundNode.Content) > 0 { - if foundNode.Content[0].Line == node.Line && - foundNode.Content[0].Column == node.Column && - foundNode.Content[0].Value == node.Value { - match = true - } + // check if the found node is a map and if the first item in the map + // has the same line and column, as well as the same value + if utils.IsNodeMap(foundNode) && len(foundNode.Content) > 0 { + if foundNode.Content[0].Line == node.Line && + foundNode.Content[0].Column == node.Column && + foundNode.Content[0].Value == node.Value { + match = true } } } } + } - if match { - index.nodeMapLock.RUnlock() - return &NodeOrigin{ - Node: foundNode, - Line: node.Line, - Column: node.Column, - AbsoluteLocation: index.specAbsolutePath, - Index: index, - } + if match { + index.nodeMapLock.RUnlock() + return &NodeOrigin{ + Node: foundNode, + Line: node.Line, + Column: node.Column, + AbsoluteLocation: index.specAbsolutePath, + Index: index, } } } diff --git a/index/skip_metadata_collection_test.go b/index/skip_metadata_collection_test.go new file mode 100644 index 000000000..e6f0b761d --- /dev/null +++ b/index/skip_metadata_collection_test.go @@ -0,0 +1,83 @@ +// Copyright 2026 Princess B33f Heavy Industries / Dave Shanley +// SPDX-License-Identifier: MIT + +package index + +import ( + "os" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.yaml.in/yaml/v4" +) + +func buildSkipMetadataIndex(t *testing.T, skip bool) *SpecIndex { + data, err := os.ReadFile("../test_specs/burgershop.openapi.yaml") + require.NoError(t, err) + var rootNode yaml.Node + require.NoError(t, yaml.Unmarshal(data, &rootNode)) + + cfg := CreateOpenAPIIndexConfig() + cfg.AllowRemoteLookup = false + cfg.AllowFileLookup = false + cfg.SkipMetadataCollection = skip + return NewSpecIndexWithConfig(&rootNode, cfg) +} + +// TestSkipMetadataCollection_RefExtractionParity proves the flag only affects +// diagnostic metadata: reference extraction must be identical with it on or off. +func TestSkipMetadataCollection_RefExtractionParity(t *testing.T) { + full := buildSkipMetadataIndex(t, false) + skip := buildSkipMetadataIndex(t, true) + + fullRefs := full.GetRawReferencesSequenced() + skipRefs := skip.GetRawReferencesSequenced() + require.Equal(t, len(fullRefs), len(skipRefs)) + for i := range fullRefs { + assert.Equal(t, fullRefs[i].Definition, skipRefs[i].Definition) + assert.Equal(t, fullRefs[i].FullDefinition, skipRefs[i].FullDefinition) + } + + // inline schema collections are still gathered (the resolver searches them by + // FullDefinition), only their JSONPath Path values are skipped. + fullInline := full.GetAllInlineSchemas() + skipInline := skip.GetAllInlineSchemas() + require.Equal(t, len(fullInline), len(skipInline)) + require.NotEmpty(t, fullInline) + for i := range fullInline { + assert.Equal(t, fullInline[i].Definition, skipInline[i].Definition) + assert.Equal(t, fullInline[i].FullDefinition, skipInline[i].FullDefinition) + assert.NotEmpty(t, fullInline[i].Path) + assert.Empty(t, skipInline[i].Path) + } + + fullRefSchemas := full.GetAllReferenceSchemas() + skipRefSchemas := skip.GetAllReferenceSchemas() + require.Equal(t, len(fullRefSchemas), len(skipRefSchemas)) + + mapped := full.GetMappedReferences() + mappedSkip := skip.GetMappedReferences() + assert.Equal(t, len(mapped), len(mappedSkip)) +} + +// TestSkipMetadataCollection_MetadataEmpty proves all diagnostic collections are +// intentionally empty when the flag is enabled, and populated when it is not. +func TestSkipMetadataCollection_MetadataEmpty(t *testing.T) { + full := buildSkipMetadataIndex(t, false) + skip := buildSkipMetadataIndex(t, true) + + assert.NotEmpty(t, full.GetAllDescriptions()) + assert.NotEmpty(t, full.GetAllSummaries()) + assert.NotEmpty(t, full.GetAllEnums()) + assert.NotEmpty(t, full.GetAllObjectsWithProperties()) + assert.NotEmpty(t, full.GetSecurityRequirementReferences()) + assert.Positive(t, full.descriptionCount) + + assert.Empty(t, skip.GetAllDescriptions()) + assert.Empty(t, skip.GetAllSummaries()) + assert.Empty(t, skip.GetAllEnums()) + assert.Empty(t, skip.GetAllObjectsWithProperties()) + assert.Empty(t, skip.GetSecurityRequirementReferences()) + assert.Zero(t, skip.descriptionCount) +} diff --git a/index/spec_index_build.go b/index/spec_index_build.go index 9df192ecd..544696d41 100644 --- a/index/spec_index_build.go +++ b/index/spec_index_build.go @@ -62,7 +62,6 @@ func createNewIndex(ctx context.Context, rootNode *yaml.Node, index *SpecIndex, return index } index.nodeMapCompleted = make(chan struct{}) - index.nodeMap = make(map[int]map[int]*yaml.Node) go index.MapNodes(rootNode) index.cache = new(sync.Map) diff --git a/index/testdata/inline_collector_parity.txt b/index/testdata/inline_collector_parity.txt new file mode 100644 index 000000000..25f919c71 --- /dev/null +++ b/index/testdata/inline_collector_parity.txt @@ -0,0 +1,12 @@ +stripe.yaml inline 15928 01204e05677a268ba71235a4157edcd4654b0a4be8f3eb3600547dbb0d75461e +stripe.yaml refs 2712 47652e79cef0fad8791d17c2c2fafe45462545d7a7cd9d0a539e14528b1cb7c9 +stripe.yaml objects 3857 4a21396e646e17a5a2cbca7614f28f40f8862f7c9722daeaab2036d35116c333 +burgershop.openapi.yaml inline 26 fd272026c992ecf45db265ba77226fbdb82913a5ccf3c2234e0f73a8b66496a0 +burgershop.openapi.yaml refs 24 f2cc7dc5c24330e66d8effd08c1aa6ebd69d10e77b883db6032c230b4e35801f +burgershop.openapi.yaml objects 5 cf82c2ab6a949c333ed0817e3579db7aba6b9c622a6934e64812f3a8d60852ad +mixedref-burgershop.openapi.yaml inline 6 e8c3af4d3b89d49c0b32305123e89455310fe43accfaaf28c7c32ffc99423bf0 +mixedref-burgershop.openapi.yaml refs 15 657348a49dce28aee9bcacb027d4328bab286254f4725d987825d14e4b51ef79 +mixedref-burgershop.openapi.yaml objects 2 6b25726d63946c707c2cb45151dc969770bc5f7ada3ac613ddb4647a4b33f15f +k8s.json inline 1934 f0aa6b35287accea6aeb00bd15ce4251e79648c2063172f5b893a45ac35185db +k8s.json refs 2533 c251e8a4ab708495abf5e473da7c1f6acdd4d1423d465d356d0849874eae6d3b +k8s.json objects 441 a79b0751a208f832200dd66d960bed3844849bd91660705f158f768c3b06c0da diff --git a/index/utility_methods.go b/index/utility_methods.go index 1e8fc191f..d201dcac5 100644 --- a/index/utility_methods.go +++ b/index/utility_methods.go @@ -555,16 +555,7 @@ func findIndex(index *SpecIndex, i *yaml.Node) *SpecIndex { } allIndexes := rolodex.GetIndexes() for _, searchIndex := range allIndexes { - nodeMap := searchIndex.GetNodeMap() - line, ok := nodeMap[i.Line] - if !ok { - continue - } - node, ok := line[i.Column] - if !ok { - continue - } - if node == i { + if node, ok := searchIndex.GetNode(i.Line, i.Column); ok && node == i { return searchIndex } } diff --git a/utils/component_id_golden_test.go b/utils/component_id_golden_test.go new file mode 100644 index 000000000..4d8c827f7 --- /dev/null +++ b/utils/component_id_golden_test.go @@ -0,0 +1,181 @@ +// Copyright 2026 Princess B33f Heavy Industries / Dave Shanley +// SPDX-License-Identifier: MIT + +package utils_test + +import ( + "bufio" + "compress/gzip" + "fmt" + "os" + "path/filepath" + "sort" + "strings" + "testing" + + "github.com/pb33f/libopenapi/index" + "github.com/pb33f/libopenapi/utils" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.yaml.in/yaml/v4" +) + +// goldenCorpusPath is the byte-for-byte contract for ConvertComponentIdIntoFriendlyPathSearch. +// The file is gzipped; each line is: inputnamepath. It is generated from real +// reference and schema definitions collected by indexing every spec in test_specs/, plus +// hand-picked edge cases, all run through the converter. Regenerate with: +// +// GOLDEN_REGENERATE=true go test ./utils -run TestComponentIdGoldenCorpus +const goldenCorpusPath = "testdata/component_id_golden.txt.gz" + +// goldenCorpusPerSpecCap bounds the number of unique inputs taken per spec so the +// fixture stays reviewable. Inputs are sorted before capping, so the selection is +// deterministic; the cap is recorded per spec during generation, never silent. +const goldenCorpusPerSpecCap = 4000 + +// goldenEdgeCaseInputs are converter inputs that exercise documented quirks regardless +// of whether any spec in test_specs happens to contain them. +var goldenEdgeCaseInputs = []string{ + "", + "#/", + "#/components/schemas/Burger", + "#/components/schemas/Burger/properties/fries", + "#/paths/~1burgers~1{burgerId}/get", + "#/paths/~1burgers/post/responses/200", + "#/components/schemas/List/items/0", + "#/components/schemas/List/items/100", + "#/components/schemas/403_permission_denied", + "#/components/schemas/some%20space", + "#/components/schemas/async_search.submit#wait_for_completion_timeout", + "#/definitions/Pet", + "document.yaml#/components/schemas/Thing", + "/absolute/path/file.yaml#/components/schemas/Thing", + "not-a-pointer", + "#/a/b/c/d/e/f/g/h", +} + +func collectGoldenCorpusInputs(t *testing.T) []string { + specDir := "../test_specs" + entries, err := os.ReadDir(specDir) + require.NoError(t, err) + + seen := make(map[string]struct{}) + for _, in := range goldenEdgeCaseInputs { + seen[in] = struct{}{} + } + + for _, entry := range entries { + if entry.IsDir() { + continue + } + ext := filepath.Ext(entry.Name()) + if ext != ".yaml" && ext != ".json" { + continue + } + data, rErr := os.ReadFile(filepath.Join(specDir, entry.Name())) + require.NoError(t, rErr) + + var rootNode yaml.Node + if yaml.Unmarshal(data, &rootNode) != nil { + continue // some fixtures are intentionally unparsable + } + if len(rootNode.Content) == 0 { + continue + } + + cfg := index.CreateOpenAPIIndexConfig() + cfg.AllowRemoteLookup = false + cfg.AllowFileLookup = false + idx := index.NewSpecIndexWithConfig(&rootNode, cfg) + + specInputs := make(map[string]struct{}) + for _, ref := range idx.GetRawReferencesSequenced() { + specInputs[ref.Definition] = struct{}{} + } + for _, ref := range idx.GetAllSequencedReferences() { + specInputs[ref.Definition] = struct{}{} + } + for _, ref := range idx.GetAllInlineSchemas() { + specInputs[ref.Definition] = struct{}{} + } + for _, ref := range idx.GetAllReferenceSchemas() { + specInputs[ref.Definition] = struct{}{} + } + for def := range idx.GetMappedReferences() { + specInputs[def] = struct{}{} + } + + ordered := make([]string, 0, len(specInputs)) + for in := range specInputs { + if strings.ContainsAny(in, "\t\n") { + continue // the fixture format is tab separated lines + } + ordered = append(ordered, in) + } + sort.Strings(ordered) + if len(ordered) > goldenCorpusPerSpecCap { + // stride-sample across the sorted range so the selection spans the + // whole spec rather than the alphabetically-first slice. + t.Logf("golden corpus: sampling %s from %d down to %d inputs", entry.Name(), len(ordered), goldenCorpusPerSpecCap) + sampled := make([]string, 0, goldenCorpusPerSpecCap) + stride := float64(len(ordered)) / float64(goldenCorpusPerSpecCap) + for i := 0; i < goldenCorpusPerSpecCap; i++ { + sampled = append(sampled, ordered[int(float64(i)*stride)]) + } + ordered = sampled + } + for _, in := range ordered { + seen[in] = struct{}{} + } + } + + all := make([]string, 0, len(seen)) + for in := range seen { + all = append(all, in) + } + sort.Strings(all) + return all +} + +func TestComponentIdGoldenCorpus(t *testing.T) { + if os.Getenv("GOLDEN_REGENERATE") == "true" { + inputs := collectGoldenCorpusInputs(t) + require.NoError(t, os.MkdirAll("testdata", 0o755)) + out, cErr := os.Create(goldenCorpusPath) + require.NoError(t, cErr) + gz := gzip.NewWriter(out) + for _, in := range inputs { + name, path := utils.ConvertComponentIdIntoFriendlyPathSearch(in) + _, _ = gz.Write([]byte(in)) + _, _ = gz.Write([]byte{'\t'}) + _, _ = gz.Write([]byte(name)) + _, _ = gz.Write([]byte{'\t'}) + _, _ = gz.Write([]byte(path)) + _, _ = gz.Write([]byte{'\n'}) + } + require.NoError(t, gz.Close()) + require.NoError(t, out.Close()) + t.Logf("golden corpus regenerated: %d inputs", len(inputs)) + } + + f, err := os.Open(goldenCorpusPath) + require.NoError(t, err, "golden corpus fixture missing - regenerate with GOLDEN_REGENERATE=true") + defer f.Close() + gzr, err := gzip.NewReader(f) + require.NoError(t, err) + defer gzr.Close() + + scanner := bufio.NewScanner(gzr) + scanner.Buffer(make([]byte, 1024*1024), 1024*1024) + lines := 0 + for scanner.Scan() { + lines++ + parts := strings.SplitN(scanner.Text(), "\t", 3) + require.Len(t, parts, 3, fmt.Sprintf("malformed golden corpus line %d", lines)) + name, path := utils.ConvertComponentIdIntoFriendlyPathSearch(parts[0]) + assert.Equal(t, parts[1], name, "name mismatch for input %q (line %d)", parts[0], lines) + assert.Equal(t, parts[2], path, "path mismatch for input %q (line %d)", parts[0], lines) + } + require.NoError(t, scanner.Err()) + assert.Greater(t, lines, 1000, "golden corpus suspiciously small") +} diff --git a/utils/testdata/component_id_golden.txt.gz b/utils/testdata/component_id_golden.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..45a45de4f191f0c831594039b3a37292b61cacee GIT binary patch literal 287401 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%0D+%h?{2&XX9*!J!obqe&8 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∾8M-{JRQ8b&SOOWHpjAO$s z35OH|N0{tbJzrZ#nn}MhA+q|w0z%l0pi7?F7EVy{1gXI1yrHQAw-JIxX z91l+3)JU$fV9ZIGi1E&(2F@fo_QB>-gM)8;K3^zs15}u(=`b%6MGDBT#t!8>s`CxD5M4@u?gJaY331UuA6L(e{9YOkBeb!{yyx18d&_HGilM!YtCU^4v9znxfp6hdS#9z|BzbV8^$E_kANJvx)j zcRFyLV9MzitwDWzVi(Z7EenzrQ_Ko~R;3_yo^k&YRZTMdC2G5YT7#`ycv(Z{IO2;s zca(an=8$$yXT&@qqNNco6R4J7HXHC^CIcc_{~psS+|H#8yCJYf;^jBl&M_>56JBx5 zON*!)I{ep)@a}YDYP2l;oK-{9%NX^54zG^f~@UXVBUip;~I)r>#83 za>~FN>)|Cf@AZ{Kq7fcudQN=^;i{_eSPyi;0F)PV&80J;xgcCSq5VnxN*-gW z3I4u@(3}T>t}U@l!&GwqVV@Jqa&TY%QqW)ZRBnB8iu*J&;0skFb;|Zff zup~JuO67KC>d-50l4|T#(B2#~k}ANam~a!(#>V=Z9nmS(waz;(O!^*YGv=0IC)}HW z9`$YX>)qyfV~(FM`2YfAA}!_*W5BL7@k<%cHNdRbu1N>m?)!&hmOME#nK<)Qu=Ir~ zrIU+(BL#PoyI{4lh|LL0%e;*G@LCSTq9Lk66+H?!>(n%sB-m2Dh*7%#`{|UGz=_|b zjnCL~MILFXd^%;MQPtq{qA(7BY)7@gOtQw|Srf!J>K~~s?vL_>2XP~ND|_#k{Z6yg z$<7z$Ua(1NpvJRzhxzf{fm5DE{ z^89Cru_vuEU+B-ySJ;crTKn&ZK!v4ga0d%x@)g{NGp(;#CBDe(JbH`?T$=_MVe4=* zhEX)y$F?9S8aR2yo-DRyjvs>1JKB}LsripO&wu??7YvaS3y5);J5e{n$Ts&M*Li;4 zgt40?ZE!NzOnB`y4(REdDjbgd;e;SbAH-1Ymq&v|r{9o;D~ISKc`TeEj}-Wg0^h}C zm~(lLhXb!ksoDa5|B_%2p ztG|@~*&!XLa!>1b)iMm|k^uAB2Ka}_QJExbv7TP!Oz$)sqI)BmR+Nb}g<^RP2;$H5 zw6JoFFLA6y9aF*65I2>n1yr>*{K8tDZ09bhLHjW}v~fM-mRf+RnHp=Fu2+GFB1ZU0 zi=iiABlxTIVQ}Vo&mE#t4ndMl{l*%H*9b+gslZ-PL4dzl)5{NT6S z2mAzR$M^Y((`~A62+)nGYl+i&(-%`<(;6y?xGXrJ51L`6`q&EM$>gmR8#H#ICcEq& z&yc7gX4!H*9B;ch#rzx&L;4*A=sms3{h>}y>s>P!t2dxp9r=`gJ7J_U=@QgoGsdsu zs!ZZaDf}P|HO^9tXUAUG56U=Yl>X+KphMy6Mi6#NG(u|8)AQlu8)HgpuF@SJ42m|w z?!`&XgPNQ*aBe^#>B{_9T%m_wxW5GOnna}Ju_?rX=o>9r?;fr=BTrq?3pV-wv-hGI z26HNxTAsd8w>0YN3}6cF8ob!|(B5ZzAXy+}n;RqjkWFc5{!w_`UGnm#+(|Zh9B4ta zia(LG=ytaoxhwc&oK+UHY1;3iDoU6si}KRoqu}-cFsf9I_y)q!A*6KhQ{W%JZrqgf z$q?f@f!4}ZM4K*NUDSXjTd+e7G)110C^_7=>TYS&UzRzlrFyxQo+~oO_x^=YFJoRI zjfPEUyz&_On1D|);AmLu}qZ7t_dDT=*tFwD_eV zV2GK&bP-flB=+0R*3Q> zg4_B(SGW&dR-D)g>h_QWRpt3;TF-K)hnE_lhp_%;I6(`dU_>97nCL<5N!W3K2=i#s zfVq*+LJ{_&adBs%X9f-oI+ju^1nQ|(a1tj@=FIfBLQ<#{{^&z&Nj?FmSNqrGmtu?= zIPup7>}ZH*8k~)XL!Sf*A$R0`N(Rgr&;ea)V;p$b;lQ+CO|iID`RB93{3T$Ix~l4J7# z)lO``@P_~tHACFyymJ?t1Zwx$gQ&(_8e7GK{2fuQDn~-Bye~-tNufF{ zx=jeY3SFqLNoHL);Z?P?A(e1F=94--Pa#R)oD!f(q1hlwrFR>Zc_f58U9>^es@Ek- zx#N!ALkw&Mb_s+#(^E<(vrkyb+)?t>A_tzbe&)7ml+ZpyYeakx{z{>PBuyx;@Jn$4 zqa_+#pk(tg#F<+wKH(aV1<;x-+7BL+)iQi-B|IXMsm32!nglfuMyjyWzr|pr&$5l* z2PHpD7e2XZ;6+(t2Wu5Eu1q#rGj>c^n{p~8!wOo^21N&F-D45xFY0Ev5=Nh&N7IBN z$4f9tDBixqKV7K^sPK7-psnTYbA;5C*+QK=?u87|Zh}NzxFj`YYP%USjCX^ibMT7G z>x~FiA6Y$D4_1uTj<52g4-O~^ge~!w5fSqaX9}*EJqUuHle1yecp-jIUid~Kh30?< zyqZxI#vmbaLvb;0m;8rEeVh^vKW3&Zh%nGRD~S!Z8LEhf3DMr%-ls>M7^6=9VH5Jz z75h;0H9Rt#2}?RPN))xYr`J$5bR3sDBwazYcSM5;&PMb8r@T5@Wq~%<5)F77G-SxU z{C6NSLKalc&&JP)E;GmyyX~;yI*de|r-r#z}3gxs24Z&jd z2nxe8{KkzrZR?dI-rQ7gnfC}hUK_K)ArV^+e&Lvq4xz;Tdnh-4f0a)3!8ib?xfi5H zX}Bi|=q6`{kBlJ+1ntO+U&EuYYMYYTC7yQ6+sNB_t~LOSS2^wP$;u9c z4_Br|+&nOb!x^}{r7M?P>(Q?GVNx}=aDL%hOS{)s6_NhuActtc91BTOy|6;wxB4LC zi4~>Pj4wu~l+J!UqR>oEZl;iqe+;3}j89gf$mzQ{RR{JmUjTE5u<>NtA0G2yx0V}i z#-lYGo-nE6YI2V9+3=DPLE%Yhb*^2HQeeO0RK3y_zJdhpShMAgQKyd|-(!WcRnni9 z@GlZtI4E7V!l`Q_y2nxX##@7GNp^X=Kdw(bV&LlN8k99k0A;3-LNkD8=L!ePiw(?; z2+Rw<_u>xt@!&)5h}nt!1`RqTbt8zjGjR+osWxW?anbyzNzll}Ikw_9pXN4rJT&4~ zR0EbBCyCP= zV+l~n3rHv@Jhqf1`xM(&RAhSxZeEPLD{dG~-6;;c=R(;2|1=v)3U>subiGooAk;XghS zjK*{}4x&VDn;nIGqh7y}ZjU?H-rDR*{wS{Kgl4Vn)X{u5a;Yl{ZQINqMLa9EhWEiB zv9j^y3Mth<7Iz^XfsOkU%JVt@7p5Kcia(A8=dBA30~b+o*uJ6F_KyhKWOD#=2EL=w zFR}MJb!K`+X{^iyeA3g=NgH0YF$s8-mE)2Yg8Pvp)~%{!qJX6Db+%IX2m>wh@&`!w zv9+Lb>txkmf1|D0cF}^fcT&?sv-6f$eHLB|rFRc~XSa2&NGpUf_z4<00KwhvC_irB z>HVGbq^~*%Zo$$5s{1Ob2ASKa(zc&mWL)p&5BcQbo#^R}r)lN%BE8qDVv04~?-S*F z`#>Au*^%)E3LcuW4W@BGc?IN$8v_o6HAbf;nF5?LS4}eyrF(5TgO(}CBZ|}NEkl#B zRc}Uo2KhumHHb$Ak4Tv`K_?v7TS_j>91?n~`R@n0vT+l^GKr$JFrJ@JFD3pjf)tI! zE1H7tzq?-5USLF?7_xSLgpHua^H<)SwAI!{Cs)iwx(idia7{gZZ_~_#iG|GUA7rDS zvbLp>2%^-L+#2``9Vm^pma*q?PJ&;hK1IcAFBz0iD;ZT>>uOj3rgl2EMviw>G#d3* zOsJgfvwSxjnAtHo)GAuEOvg=+cmo|5uARMU_sdha=;RixRK5=}ojl2om9A;#znNi_ z2FXfB`qYe#(hRhKfYj7*{WGlllgpN&;2M(Dr^=A9k1UVDGm1@T8!D1)qjs{?r+Psj zl$8aU`9+RSIDQf%?m$wvZaG-;3S|%!-|hik7RK(-BQ{Ck>AFNef~?HDue)0!X~qwj zNmW^}X^-Y!z zoz*4VY)@0~wOl}%{+?iE-( zTx;orvb3S{w7Gn|1Y^V#v5KC(lhRbBE9wHM*zO86gX0JaaKb|fl%aYH0JZ0l{R!YZOd`+V% z0GWUgW+#XFEHUHp)BmMJkSuxE4(@a{)r`tL9ii!;nv)G@ouW_5E{c;C7+1YN-qoM? z9qn(u-v=b)=S*>Noh>3XdfyLEj~74haZ!aSuUGd^m>H$Dd}eQHmm4O!W3&-^SNE5U zYlNLhYps(}-Bt8b8t5LXJ)P+iopaEguh)6CFAcuD zQXdDMl{dXVfL(4$RBgp)C4RECp7wR#qoYxP48+?MOqv=6YOqnilggvv7{|g_nmMy z#N)Kahe-qCTx{QiExRHnuFu>>dAtA7eyM`AFva!;Go*mml(|jq_)&S%L*) zqMLnSxk7qXGDO<`o<3w|yLRA(JsN5I!Y=Ts0BWm(hrtyV*Di3cufE3-7zdnNKGf>! z=u*3K+3+I7Qp(5&yUe7X%^yiNKX8Uo{Bjs|B^X6$+Hr^q2xn(d6)=_=YZc%qh*fG( z-ICX81aFJjR-xSm%D+;(Y8Y)wrwy_VKCs2_u5W58X+N&95R`CcO!S%wHNe0OGW^%} zF+qg%V`9iBU+K^X*}3fa3|!nlktDAi^e{ZBf6c#J7N_cEfMFyWSjI`c+y`k>7n_<3 zj_j7!BN*7tIjJhVsFDlcV5Qw!+J(mNW8bXkp=`c!qSL5KQ62_xl@s1nz_oNRr1VbT zr}792rd@uhL0T5SDhA@LjuhacCQV?Rs-aD7pqg=nwbHsk7>DhD;}HS_Zu2Lwpm3-$#nP-Np<+p!_Is7(> z?=pkMnFkudR~KMdooGWKP@5+|$jx-2mx0UsZli43m<+~+%Gi5c{_%ZkeLk*akMU;w zz|jPMK&cw2|9gsre)`WV9L9N#^;r5sd@#RzIU;D!gnpl*_!1m13|pg1l7}HAD<-GK z{09eJ=nW;cqh0~9l|^&B)LAQ?G%^fz^8>aG^cs_Wefj?1+X5b}qd8C@pGD!)1 zV4{O|re%N{zp$cxO2iHJK_9rKXIR3n#d+jTP@+cRYLySF4|yt_^TRc1l@X%FVe~C=vfel zKNTQM`J51n1&E;V<*U=O&#(LghH(V&%OwXE`%u^J=frhS+_JB2?>Tt4fK{=$J-(m@ z0SgDbNGoo6C{M2+e1OVZ-HW=Is4gVt-AGOA*&MF5dN@fDZR#QZ6<-Csm@O^{-9E)f z9?xQe4!>>?W^;HvPUEBN_542ow?Ih0*&RN~H6h6mToa5Rv8X@@q05T{cyftxCE`?U zs;;6qwMKUj7k~X{Urb*=u1o1->x*o(k@9Fn;Wk)y4+N}av+}Kh-^Ks!hxGgjYn9LJEKkM^) zLMUK*s~fFv9hR70Z>*cS`Anc~p}3Xhi~+P_Uc+c2{ok#o{@wJD4>H|FmHS*mJ+EHy z#VD7n#xo%HT>F{m_^t?9*b*y6M())5(Th43b>)9oZS~V-CN#IsM0MJ#Q$f15deIfB zFU8^NR9|{o)~~N_Cl%}~$JUv5rRgi%SD1DhyGosFUSHa>RKg!$3i%oa zFenxCMc$_SUVQHh_Ukr>Kfd>)^B(`Dxb%$w(kuQeapf8Rl?#5(wweY$W1EZw9XuM$ zMg%$*%+C#1&{?*HLO1{hrj9Owk*SlbU|{O#JQ$f8oJuy|7R#l-nk{#^0(VLm8MC=E z4Js}_Mg$FZVmuU}9xOYiY4nhG#&?r>ICW8*17p)_l>wJot#e>9FfJl+Q)8xuGP*k% z!0slQ_%b~W4upO;CWhuDHxonK zk&}s`xya4L)HXCT@!{3xL_9b&JPDjHBU55F-Ip1nJ@<`+5+X9 zi8c>rB1J#m^;dlClF4@T>8>l7?lTEHc^3w8u0bpaIyQZSpoi4Emk~x^EP(@y<3yrv zKiY4Xe??`9oV9wAbrF^2#YvL8nK^>8?Wc@Ewz9Xf4Ig6>SjWw0{hWlrmd{QOVf0P< zZ5Dn3k6%f^Q((h0enA{RM?DITKY+vQ(} zsJQJXxE!LQ-_J3g{4m@iIp{-FT%5AHnB;V^%!uN@c}UT=-S)s6zDGA%89s_IMh!kn zcmRdCyMRE-L3oJ#;nTOvzw(DqgSzsEPZM{bu%15EV zF!oU>0w~12Py|vAqEJ+I*_~`ZsOurm({Go5H6O#RB&)w&{*`3)a3eb&zFq#69S@$H z?Nwb~oUmOqm@X#BE|RRiIN`d;j)#jADvvg{k<#4lZX*Rk?Qq!h)X&`9rFh0jEeH1X z0TV9x>*FGfJPd;%%sdQZ9gI8-0~^dd4C5D!Jbn;A1mN+5D-W(}Vuc2i$7i7c9>!oL z1Rcfj!x8V;{0{_sWsGov{)d6RGDbK{|AW9@86(^(BV&WRJ)I(1eY=dMEV^+}+!=5a zVHYP^m?PobVbNk$DCF>H6cZiWfD0dsKfY@-!M+`~%G%0^tIlSo1YW`IgCKO#wr9?s zOC;BlY#pF8QdpxAbCYOeE&cIbi|)IBni@?TYRu52Ivb4{8eJP|j9R+{(%i}v0guXC ziJN&>j5!i!B#b$}(!c|8nx#7|)lN&%{Bc2?8JX#zCo*Vc0dfV8v48ecMXg-CH_Yg# zPhuKod?!m{8fHA4r{D93PjC7eKz~GK`A@O9v7K(_yO+$NouBr|9w3zB!ub%3`g%~= zOKW+PZ)c^w6Rxwcxem@lvQM)5zAh)Ko7_7?1)k8Iof;Q9JYxl(mG<&H{ZJ_C8}6K= z{(5X@rofr@&Q^8jq_;S#<;Ub8C%QY`Iz#=9;Lc2kGyR>d?#@bYa+e&URIPfaH_uUr zCwS+l$)y_4S%>GOK$#s66YX_h&ro$Ourt!zW12_x4_6b_jd#vadjqyJQecwRKU}?2 zt#5Mg43&67cW!E&tMGi)cV?I@mBr z=4G&Qf!NDHC5;MdkdlKKYJifL>ugND%|whB+vs5K^9DHQp`BsDFKrF5&P!_~ zZx>2oVLT|JUS-#aQ=QtL1oDA6)2XE}NMfj2*FjBnEVEtndjETuAG2Dh-a)U zNvM|PK`38*(rGgA!KNv5{o9ya`e1Sr?}JArqjLAuy@%IBdWoQ%{_scTnS?9^2&DinV{#Pf;? z3Jtsu3BO8$lc(}MdlAjw7OWR>q3mT#Rdkb&MgMUQ3hAJ1uao<_6sN26(ae1fTI=Rb zIeDIn_TO2kB+n6b5U(~q6tx&W&qXI6icL#U9Mw{^|IR@n4Unz1@i94c8fh=iMJo-M zO*PZay%odfS?Hz1at3N?>Yd5u87XJuI!I>6gJ}PqgH9SCTWX`9M=XZVbI?hTWlOa* z?b&l_({9|LZD;w4?*EynV{_Z+W{r!})!8WK-Nyc;pVTad&ofcX8K~t$QNKT?shC`z ziE?^4Tk5AVm2)wdjZGyx9tQiET%L(y&cIZL>BZyx=d;kw0A@?gRCOt;GimEr+cxsM zDf^=TI1_~gj;pwg>ufXye%$GnKDslCVi@C5Vfh>BnPc`i-b0~;AN64%NErL!i`gEEiQmHOtN(KVs}r8??b=uR3xGRtMCO zQ{39Cf?T3Y0TtvFX!5F{Qa*kdqAAnsGgH_E+Lt$f)+ z56c-JCqP?jsY(t-Do54KzMg}oR7fFp1@zd=S^&D~L-JL|o?LV*+nayZB4@z|k7l1R zc&Q(z0KHTWSp2Apfyf3`D{v9yTjRv91^fah4($NF8z*g`Yb%mMa%=+C$YIz7$_j_i z#z2UX3q9>L9Cmks0R`^FGDqgcB`*+r@yj$SDDTWc4CSJExsvv>@}vXGURM6KgWk(3 zu(n+GvI?g)lD9jzy{!1u25c3uYsB0%I31Xu$cAcO)!!}`RC@Mpx9_gU;(nKX%rN;aJ3sE?Y1aNW6m3toCWKEHlX3X@hiu+yqeph{kNeilr~xS z3rRb%ltu8e&}6znF_>}$2`rSF*5Ns-Fo`(u*UvXpW7!q)@oz6~(8D0(!F)UvAopR-ZRh-NF@ z)beZHJ^i}DvYApE92X;u?X|JJBEsk(q-(V(aGXB@VG;AyiK2eJ}K<{!()=$O{kn=HQ0v#PFqoBbj~-v)1F=+DqsIC?a37NQi> z=A=zBYI!K?msfeW{LHgGPxJC^$~0ceo~4Z>(ftp_Q$1O&5f|>AF1Y`m)KBl4i%Ims z_``M@(x9O#&7a%TE5M`2qtf$HB50nDrC5+ua3`x`W_4rPF#NW$y7Z`Al-Mm>b{KU3 z`s&Ml23 zyVvyRudZ3shQ}I*i>$I^dR`tx`)>p4iaTv2yZcRkZ3Hbl94cceLQY{PW*6)jd*brF zjb7hIb@cJ2Xm0lNWFM0KP3FDhrsUmEitTdt-HqdAjhHjdP2F{hG(-XZstyQyk5vda z`Ptb%k!b&Is0zhDHeg(;6rb90jc57Sj%#4cw{|@F5)LKt_?S4Vy$|f@G}0aVwMDgp zW6Wd-c-s80J8XrbG7nyzV2N{ACPX!Os7g3A!%>lNYKEs8;nIv3-*HA&$av`7CKbu# z$h%Fd69RiK!yu}_ml*`EU^H3?U(Jw|z+TyKsKiH=!=@#ciicfGOw|vomOT2JGpLHX zv$w<6Kf_7rL2DhAXebXmry9<$;`#D9Q!;x_7s{g$n&0GA2+>=P$L?=Y`olLn7j(n= zfQ_10B-Y%X;C$LsY--`~2j|m(ddTxsMp#c&;+efRMbp>50F0d!)G7aqrRI0)Jz?^JAH-Kl%=mp69S)BlnN{BvyS0y|y zAb9X=vq9JG1{t> zn9t_&5&KAqm72`h^zw`4^1%vY$RmewdH6h znLKaJb!Nk!tlFX1TW2=@$*!GE9M8E{T3ZY*w;I}HfSJZQgyB%s;@>`k)>qq&%2TN` z*H&jWJkO~chPvvk#_73rvxUPszlth59v(tR!@E2K*G?+YP`-9fHJqEp^W}3QWcHl? zqpHgWbWlt0@(gV0D$!7uKBpSa((!!xES=1rWa+0x4vQzXj>5rb)b=nnpAiBbYFX@#lBl_2SVNd)5ra zLkG~47q6XUX_CpUU3Q0JbAL@&#?*u!@;nvozs*&nm`(%fJWOY*t?YOZ&EI+HDmyxD zCmu#sRb7ha@4Qr1)#Zk&^4(y<>dSX)$%DGi$A?)?eK;eh2G!@5Ud}Vy z;Lr(wc!EzuUSbnfktW`^2-Rz*&3daa1d=y@MMltqm%58VF&woOms*%AC;HDbiApB&|qWga?np(J^AI{0HW=`n`(f&J2-8IP0RdrQe{vg_a zXQ{ddSpd~}?(y5z1td1nE9bA(f&IV{WMt4M?FOC-(JdEmKAqF z=|m42IOX%lcU=yC_-qn>QK@bcgh4C8Q!Iv}5`PgH7A>&_X4rJZ8J=NL5nGgoO+}os z8aEXM3E4R6DM;XkPfgz9H>_&&7{&3UO2%N0KSi>Jbo}U%F|y-NkF4<>s~$syc>uZ! z5bU9-!duLTs2Y!vA1-w<27ow~#To|U(iLMgh*MXrF`=2RHVF;Qm9tfVh@gw9*+k{O z679e3HKQ0#gXtU$XRa*vrSpL``p0)Vtmmd_#_%Pt5?OEs|vFNtxoYa3K$nBsWKE=ZZAuw!p6 zvnYVLjg&zvp3Ae2wC_SqBS|jVER@N`yQ%x{`g;G}p{QRzJbaQn?<)aTvJO$~*;r4l z;C(OnL(!GK4-cP&?%qZkQcOjIYctEy>2MG{)#3EsIq7hM>nwCQ)zi7@%%86OR!~-r zc&@BwcD8|s-o`m^^^VWx^@a+Yu`7TUE1RL|8?r%qAi8`*n?0WIT7%>!s}~KD=H3>% zS#6EnWc4=Ivep!N)AYm_jgju|*=SIKb*4H*#`C0G?QIZx+{gx>WN6)2; zL=d~cjgu~RF`FL^Ouzqml;z8P+v{uPi^Yx2HTB1L#bjyPAK%RpZl+6&*Jjs|qyL^P zAdaOhjINPoIsb7Y=c37O%_)*s?$7BZkB_pHS^ZOz%JVqJiR8!RDQSGUoFkVG{P{zEJ#o6gDmfHE zonV)tcQ-hUY#Mmg@@xI=vPh!@Rq9XUl_nBR1{bY-B6e?{YsSH!$3oK~bb6`eD1F^7 zZ`NStTqH-dQVY{tS%F0;>7^!IP}0cDcS+hREXhZh5|{L#0}p{ouexH4OfqW|<)y>M zCOgrC5_AnI=D8@-47IIH*105bdTfr-fgqP_^uy9&28K`0@EH_#HC%U73f{Lf3W8g< zntNb7*HaH?^(OM+$^cyhoF#%yADrdmZB)z9rJ~6*a9Nnr3|9hFqT%cw%a+sHiQGAD z+{-#Us{%Z%uydsv&eDA?Wb(Z+yi&0jaM?2yZYxee~8k1Sw741VlU^spJWs_jk^E+YFJhK>Tm5W z`&(Yh|L&i!_fo^D&*YEq7P+jy(5f!;Y@fa~N{c^a^1~x*d0dKTEP7__OoeO>Jx_V! zp#Uy9tc0M2q?V~X$hv&_cDXxNb$)nttYrBr+BcM%;^Go;AB9~kWc5V@9BH@WVzVPV zXfAtV<}@{|-ouFDGZat7%=*m3yipB%+SqeI{WuLgPxR)$2!ycxZH#_9Yd=>rKNtIM ztGl-2Gj4Fg-qbN=!r0)k@!%?}RwhgZmXQv)3FLtsxFK}P+N=3_G&|4c=G)AInpaS> zx*b}*Kg&#(oiyjRwLy?`!`cZD_^@dNJm{&>c*H9QKU49VxBJ7xT{(oA3fFv^@-a*D z>}^!b#^JI$Jw-C3$0H)X$Xh@2z4+b}=+|uqe|+yn-#z+Eap@QRr2~4Vs>T4Gr=B4L z2Ujv&G@vyMJ2O-P;h={oI1D`9iV`DFTM_%196UPZLAnpej7JW%JsNnRosn7CEQ^JO zs}*rO>m>t56XIPxmm%XeR+Zeft?Hg?n0&il$1w$On>Juu@?M7uR` zT|h@DU;GoDX6HbZtNPWFVXAqFu;G<14+(I6%goEW+hM7qINcGewrCE@k8ZY834<$R zR|&wyeUZ^;Z}XGp!WkPJCfrQ!*^HdWMRULhyJ!?n${TKQ0l;@v! zdG?s>kKKdSMJ!WUOHKl-`F;1#*Ikam2r|DO8@rJ24%~m`AO`B}^3e+T%Jh!Y=R2E{ zy9!P2${V?Fmw#o^LH>JiDnU&1qRaE-SVGw7oM|X)U62iAwrhNS8t^*b0G3=t_3kOO zA-9=^wd0Owcr)&(hPL7*+sm!kUIt(b+@gn*C}0C0c8(jo&-sQPq__DTrAcgWs&l@$O8J=x8tmy*e50{t1R4sa=q7hKHBEOVXek^w~mXAr6-~tr}q{a+fThRy#Ov+xP z;QKAOjSeCRIE)Bl;d_1sZovZ%61IAsg~VDN?oI;TV|L|&>?6||`Lr_ph#fC4TW_D2 z*INIcz{|H+=4?H{7`gXk@thp{uB@!M{T{l1N@3+Pjz%B^9y=p)31oFH{b@!<9xcwL z&x~jE?Xs$)`dGO}_K?Iby4)N?dTjIp7~`B_0IOUf>B&AfcCi`%yg2K<^QWci%zBqpe1h~rI!x_9+l zpwd-oLd&gNo)^DB>%$COqe>v4PLU)yOgD!ON9y30abWG8btKsJemMjzAsS@IjE(?d zkaHI}N~FgLzYlN0Ta%fPJNIN^p)YI|kaPT1%1P_1yhZHJ7Gx7dT+@b{-9u5%#GzI@}!=H;Hgf}>d zAU#$e1n|;<>N@28Pkl`-R>M~DLS(frSsc?a$4ueJ% z8de<1LzALLqd7@HgJ^8NDxy;%Yrp(kuQcaAR0s2v$HgQIgD%~AQWP2pg=3g_ekVxN zabgm{v>f9!2of$q8$1Q4S_#VnUMuksvBq~;h^z*CFhuaNA6GuuKoAEjuZ5owBqDM1 z?$xjXBoZsvZXKSKQ|FF>Q=oU{+S6lZ#_rJZK`9zDr>-o46ud)A<`e2YIduxHtR{T` z-bza88ZcK%OVE79Ux%Bqywm$!5ZugF$^^9gEOR(&$Jym1*t8OAfz4JVnH$0u*tGWV zNw}wG??f-YTDxWrK3)Q0N;rmzFMs2$C9C1U+JMzj;BB`W8Tfq;NZYjr3Gkf(g#l6xL^lQDU`eybo}@uFD+)f!%xU2(emidPy?(~GGPpl z*~!Tw&0h{Og z*cq|_Cw78P(tY(wC#vz*DK)e3VnIHKT!38IjLK^lTf>F7f2!lb+(9*R@N8QAO;!*S zVp|o+gxE^eF=1?;YDsW5Obz&bzX#^d>XOB`%W4;;(qA)aY+pCocx^MyDS7r=BO~wL zOC=QKEroDpBQ2kP;KazUH<*$M^M<^2Q*D&E{hXPS4{zrsHmBj_D>%18DujRV7oKw> z#&3iE0(5J{{JK6bAvz14K;{?1`yrP_@R6b!UMbtd{`^cSnF#mNsh)!8b=E3!X7@aW z%^AW|L9>SN7La|ZnmdHI3Y->gu>q$AStimwh47}T@fE^bVd2Gse1`CVT-c1tX9!Qn zg|#cJ<-ywtHgoW7TI|hQ7!z8X0?LG~IpHIOrzgSKa5drg{T{qE>imZAmSlW|@Kz{! z_FJApcveC|-ckrx<{^Z)#>lTX@Dswb@Co;ReEKFB zo|X-3BT>(Uw|Th2!nc93_kw|3XblZ87rsV@kC>i;24jQP$iVx%@Yme)8`sm&@fFxx zBjwwNc?#{>DTR4cLEM^$=-w(P&wjyAe9y)x;5+i_^L&N)45WO-__VA%1^HHK`FDPP z!h8Tyo^8-upl_X;X9wsb)Mq6Ws9c5dfj**rZnQw=#}O7|iGK}eDDmxm+MkldxYcQo zk-ocB2aRDfsR0pvd2tVkVKs4&$yi`KYzWzbH6O#ZXhhYlxDhG~<$POI5T9$U|lOIYPb?7P=&I;BoaOIl~)2rco0~A#s>nEAj z$&Pq_qE3wSsR(*3sB;;#cn}9Qm?72qXPGsXv;5*Z#AyOI73ns(=>n5OjXI=Wbm}tJ zga*4dxOA+a@-q1sy?D%}U`%m|1Y0;3XmDji56I}Q(|i}D)$!qz+||);C#wowfOG^5 zzT23qa~b2M>(a+&W(@9gdnFAh(B4Qpm-#mEAk#;G=4+D9WTxxj8T^M0Ki#pwDIiVD zi2~Jx%3~_MS(Tdk^gCXCj$eP{v+nj=Kl^o) zJT5Y?c2SySdvr5)5P)mFs@be$4sjALwiHB zr#Se2u7{`KQaAm>SBS|r`Nk_L_uk+pT$y?dD9#-HhN}lzN7UeJCxjM(9e{+5Yxc-P z1~iEk-zm=jNz!6HLC5j;_RP!~-T8`&k24E{O^Fx{qWD;zo|2Yhw1DIQBx{&bm)|e^;QN?2|@Va?h=3Sz#SZYVBn4oJ&^uS(e18a8$Q^cXCc7B=#SEYVm-9h`$5 zY*IZScTdo&!Do27C+RUpJ!7#=@K&L@RRs5nBZ7Oy5W&6jX-roh&FE^A(DPOJ&@+lC z!>bD(i$xJ7#$quvNwHWw$>6V(8jIzj>Re6pP<5-Bd8j(a;&`aKh2St$S;Mc+q&dT{ z-0c0oa?bE8iGBDgiL(+xGlpJi+({7!3T;BDfy{WTvQ3OFu<{OS zy`I- z>(xdRgB5yP1e3OpG9%fu^jmzrRZs6Mcr-U`Aa{%D!@*|`2lp^x-Adr_bjZkb_(*Nw zAZ_^gY~axBW|M(8nFqXO40@~Z^JXoXjhZjpL|nHBwr)7RccYoT8%CBl3My|FUEL(G zx>-zhlW^+hlXthAx4U&1dBX_u8AMFC4VG>jC*3SWy7{EsE$8EI9va>CnKCkCXJ)U7^FHok-vw)$TO6mI1ycbV-N55~*~Cj}1&ZvB1S4$y|Kd z6gtYt%81j<&=XhjjNJO6NHz}rO)3-r#^x3U?`J7@&hIBor}xpa&h}p}$%3>-=^}%AS_Bx8RnqxR%FwkgrgX zwqcEWYFg&Dq9T;{d7LAlwpFj+| z1dOVr+}g5G!`GdWlue2FWt`nL*Co=IIbhd0tW|%Qerw)B}*Df&dTgU=Wk!=%@!q6VlW~|y6=a|v|VZO zc^{@ZST_!zBWKTzqvy!UBg+_o@!%SnxO`Mf|CDIi zoM^@ThKB$P365R&9SL&BY3Ij}wiMmu8|=~Hr(#bd5p|nAXGz?O=BID}*!+~0@B|9Q zL!h}7N*p%H94ajE)DA72`F~{RA}h|d_^+#IT5xzt15{rC(49n3z{_pIg0n6_nGiM{ z%u^z);WO6)C|*TEV#m&-A+cfQk&xJlu+Wg$h_YCaKqOCq=~!n`5c8t0ChMpeh8NA$ zXF`g3ZnO-XAqWAYXm~!HgPd*t1&S5GtHls9^=+|S-1H%clS|2nvBd$RbO=V>BdWT5 zjdMri!(l4V*+8+P=%7iiSvqK)n?#vf>JCxlsGyVHy89=*P^R|$8M#-nxfUR z0R=%v8uvQD!iZnLt$1nF<;T*&)wa?F54drurJ`x1D~3S(l7J*tWtlQ` zT!$dH8cojJ!KR|-vg$xiHwVET*N1`NhVO$XXuE3@$J1^xW8ClaP0WnV>^$PH>H`tDzD3g^t zxSU)@?VcCSO3JYT594YZIiTQ76+?LC@RaH62kajs#zd%JY&{e@cKTiV`!2@|XM==0 z2j7uzkMMfo^Dn~T1x~t7oq2bDybl-NwfFAHarfY}`>-!AE(^CKkmmB zckhMc9a9Ij30TeM;pm_yk$yLy%gyC&dvLTFeQfb6iq`(P6Y1;FHQ`0s)@#%<2+IX( z9hl*B8c4&ZM8NdTZ$J#RDbQCrF(Yk>kVwBr#6^vOoJ~6#=58j61bcOW7K_QK z>`a$bR5qqaODeXGqy-~87m|nUizCgoLK-wlhd+(3-KL9q0|% z5e@fvM-%O1QZ)>sYBzQ&F;ER%N=6b`v01wwvm43jLGn9~%zmQ<0id03K>%WzJ98AB z_=qmuLsy=mOQ+D4Kj_M3a^Wpu93`eE2U`>*Wdt<49eI6j96o+u&zYO&#KXI<pi+F317kf0TzTUepB0lg2Il~O+sPA z+=f%Ib@HH0?A$y&AI9!&?dTy`F^^arbMq!2n3HEu2jJ$R**K{mn4?F^iFlZ{b@ecu zU@j7Z5x_|z-?Wi&v2+W$~PyuXTTF8BcU!qdXpyev2T-w6IN(VPe=K zNblBf(<68DcgeY}KF~@p2Sthz21=22kYNoQY)Q)*MgZ`2*nYXg43?}ZB3;(3@gXo1 z){f^H*5Hc?Umla)h%t-pZpWEPZJ20k9{j_I#kH&y6Yv5#`H)|jT zLZ2b90%1=dXn~XWS^K^QbNegbTu9(#Y-bJOfCTV60CI$QQ1tP&KW6f9=PwKyJnUHv zYc{NA_lgy(u|1M=9m5((x{YLgAx^#;pURPh^@TeL>kD%dmYM*y@=6Yj^}x}3c!#eq zJ4rzF49EkRdlc~VuyiA7wCZUb3+ z92q7Fm&sUr^k|c@Ovt&dK8{!hh$4mW38jd4LH#6SZ8BvIBzQ~4f>CzYkh#MtzLK#F zSu=zu09iV&TQ-kp;wcr&nlpt(=qVM;lry#O;yx7%z|>FOIyL*9giw5@Vgc!U8MfI{ zv8>4ZtbJdDIbU!FnuX)7?iqqNJ`=Ez^xX{itic{930Pm8Bw&5;SB}y?Th?{m zUDkH1y;;$Ux`kq zuqZXNoj@oxvyIRviW&PDO>S@Oa{@cV7*;U9mzWp%7-$=)#PI@n?kGy8PCA;6tF{O5 zyfK_?LyXqk?1G9U6k%aR0)~LVAt6Dxwdih;v`X{{Vglb)8sL`LVCK>q=4oJ&;|Dz3fC~^g z%u9gb2KWOw)TC+yO#E%sv?c|WHBsoUVY;KHm}Cm|{Y!H)1oMpn8Hy?}AmgTH@V1`; z6|^;IO2k36fR-N#>DY`&R&?N_(>@(iYjckksr?D(#@z;~tyCOC8}|ms5bpT^7`hnS zNv(ANHv$XZoEqMy2Q%XyEs5=C2tUB8C6=1$!X*tWcYTe(cR+AsZjX2m!u7Mb*ughX!B*qz!STkddO6*c298FB9F%Ban%XbKBgwE}vI2R$9rJ7Cx zF*`inRHn0#g^sPeanw!tLdTQO>Cn<-^f|U!x~@-Nhr^sJ-*n1IRjBS+GijF|&2G17fEn~=hubM2TJsa;{lkkqc&Bg)a! zH)(PX1B_&FsLNE?r#;`l3{H5SmwUUv1_NNajD`eAeJ$GTB5V_{6|m$dLj5fhkObPT zK$0s7%VjZv2uNHp21qRCT$D$i6KbjdtntM z@~!9z1UdN_W@)iNFayIK0LYN21{^Wz=wa=(gK$HZ0U?l$7yF=Snc6ZaUVy<&*)AZy zzY_CkO7jgJgF($OfM6|Kq)|(2&yt$5I%xJ%>CjPWhp=D?jaOp3mDXe>wpM8k)qQXv zTge2Rxpl;5j567wY$hm^^~p1P@JtyD<|c!s$z^2n*q02ZCAn3}V^DI~l00T4hXu)M zJQCWCeH8Z{ZY~brgPMs`Y1Z-Au~^H{>#BI|Qb1LvY1Y)&s?Eyc>6)HJ3pQdGST$<^ zs*->fE)6aFTCif~sLnvfGm4kFWlcfJRc(Q+a%y5bqc}0KjlrFo*p6jNOl-qi#Sud| z3-%PPJqbRpY}IM)g%EMY&CXUt-OcBg4h{uLfcHbn(aGRy>p4*|1vpkDBu%|8LVk|> zB*bH5V(Fr_0=zvMmX^CF(PXW*PO?yT*^q5FQL+=~ZriroDXEFO9GERORx;4_RLhuw zOj!cX4%9d*C`+#@(?%rMI&0r;w|lNpE}w{v!)$;=sj0_FswcYE6*$Q&9T^Q#qr^o$ zj9|is15=p5p1uzg=GvOVgm|usXWC}@?W48J^0UEADl%Q1U<*0~xCY_O%?3y? zx<#&JvNkxZL*-#b+VNtvhjnPjOVF-YpIt6I)2+wyva@yk+^;vgU21l^%Is``+4b78 z%VlNkx{Sk7#qJtWI;xhzFZV0T{uYzHtRwqdLiVzHOudrorf$6qPPQRF59`I$4mq*s z?KCLqFdoShilmD|)=zQrQ+#b-$~yaN+&#zov>)xGpb@hTOg51_JuY}KZwFeEUz=9c zb(xE&tVpxs3{G>{M5}l{&{ek}Kq`ap+6gDPB z3JN>18xjf|(Hb}fM5ql)#yZMI%Zj*)tRrg(R?I`MT{I2B2j=10(*bz3Xf})kn{B)d z!wC>5L(nmeks+Bl={peDlaLQzTLbu)=6r0HvrRczEMY@{GmXN0mM@dZ%Vq2G8M%zs zEuT%uXbf5}CL3e7TR=uI;Ak}t3|JSIs|%Br+qUC2>JUr3))Y8f6Pr!yz!>GVLV3+k zb~}y7K-0$C*+Q6_pgUhk6GV}!`-4~#jR$5#DUDe(mV`F08AUqd*Nh;UO$?w%HNpTG zIvsLIjcZ$y_7;*6Nfu+=fGdlQZpGN)K*VL!!+1L$eOUs$Fvf�f;c2w_wB9OC6JX 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 m(z7C2VW} literal 0 HcmV?d00001 diff --git a/utils/utils.go b/utils/utils.go index a7eb2ee8b..f903ce9a4 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -521,10 +521,10 @@ func FindKeyNode(key string, nodes []*yaml.Node) (keyNode *yaml.Node, valueNode } return NodeAlias(v), NodeAlias(nodes[i+1]) // next node is what we need. } - for x, j := range mergedNodeContent(v) { + content := mergedNodeContent(v) + for x, j := range content { if key == j.Value { if IsNodeMap(v) { - content := mergedNodeContent(v) if x+1 == len(content) { return NodeAlias(v), NodeAlias(content[x]) } @@ -532,7 +532,7 @@ func FindKeyNode(key string, nodes []*yaml.Node) (keyNode *yaml.Node, valueNode } if IsNodeArray(v) { - return NodeAlias(v), NodeAlias(mergedNodeContent(v)[x]) + return NodeAlias(v), NodeAlias(content[x]) } } } @@ -960,43 +960,6 @@ func isPathChar(s string) bool { return true } -func appendSegment(sb *strings.Builder, segs []string, cleaned []string, i int, wrapInQuotes bool) { - sb.Reset() - if wrapInQuotes { - sb.WriteString("['") - sb.WriteString(segs[i]) - sb.WriteString("']") - } else { - sb.WriteString("[") - sb.WriteString(segs[i]) - sb.WriteString("]") - } - c := sb.String() - sb.Reset() - sb.WriteString(cleaned[len(cleaned)-1]) - sb.WriteString(c) - cleaned[len(cleaned)-1] = sb.String() -} - -// appendSegmentOptimized uses strings.Builder more efficiently to avoid allocations -func appendSegmentOptimized(segs []string, cleaned []string, i int, wrapInQuotes bool) { - var builder strings.Builder - if wrapInQuotes { - builder.Grow(len(cleaned[len(cleaned)-1]) + len(segs[i]) + 4) // existing + [''] + segment - builder.WriteString(cleaned[len(cleaned)-1]) - builder.WriteString("['") - builder.WriteString(segs[i]) - builder.WriteString("']") - } else { - builder.Grow(len(cleaned[len(cleaned)-1]) + len(segs[i]) + 2) // existing + [] + segment - builder.WriteString(cleaned[len(cleaned)-1]) - builder.WriteByte('[') - builder.WriteString(segs[i]) - builder.WriteByte(']') - } - cleaned[len(cleaned)-1] = builder.String() -} - // parseSmallUint returns the unsigned integer value and true if s is a string of // digits representing a non-negative integer. Returns 0, false otherwise. func parseSmallUint(s string) (int, bool) { @@ -1016,15 +979,16 @@ func parseSmallUint(s string) (int, bool) { // ConvertComponentIdIntoFriendlyPathSearch will convert a JSON Path into a friendly path search string. // the friendliness comes from it being suitable for use with any JSON Path parser. // -// This function was re-written in v0.18.0 in order to fix a number of performance issues with the original -// implementation. Allocations were high and this function is used a lot, this new implementation is much -// lighter on string allocations by using a string builder. +// Rewritten as a single pass over the input with one output builder: no segment slice, +// no per-segment builders. Output is byte-identical to the previous implementation and +// is pinned by the golden corpus in testdata/component_id_golden.txt. func ConvertComponentIdIntoFriendlyPathSearch(id string) (string, string) { if id == "" || id == "#/" { return "", "$." } - segs := strings.Split(id, "/") - lastSeg := segs[len(segs)-1] + + // the name is the raw final segment, JSON-Pointer unescaped and URL decoded. + lastSeg := id[strings.LastIndexByte(id, '/')+1:] if strings.Contains(lastSeg, "~1") { lastSeg = strings.ReplaceAll(lastSeg, "~1", "/") } @@ -1033,151 +997,125 @@ func ConvertComponentIdIntoFriendlyPathSearch(id string) (string, string) { } name := lastSeg - // Pre-allocate with estimated capacity - estimatedCap := len(segs) + (len(segs) / 2) - cleaned := make([]string, 0, estimatedCap) + idContainsHash := strings.Contains(id, "#") + lastIndex := strings.Count(id, "/") // absolute index of the final segment - // check for strange spaces, chars and if found, wrap them up, clean them and create a new cleaned path. - for i := range segs { - if segs[i] == "" { + // note: we do NOT replace # with $ here. the leading # from JSON Pointer notation + // (e.g., "#/components/...") is dropped by the leading-segment rule, and any # + // characters within component names (e.g., "async_search.submit#wait_for_completion_timeout") + // should be preserved literally in the JSONPath query. see issue #485. + var b strings.Builder + b.Grow(len(id) + 16) + b.WriteString("$.") + elements := 0 + + // the plural-parent rule reads the previous segment as transformed by its own + // iteration (bracket-wrapped segments end in ']', stripped segments may shrink), + // so track what the previous segment ended up as, not what it started as. + prevNonEmpty := false + prevEndsInS := false + + pos := 0 + for i := 0; pos <= len(id); i++ { + var seg string + if next := strings.IndexByte(id[pos:], '/'); next >= 0 { + seg = id[pos : pos+next] + pos += next + 1 + } else { + seg = id[pos:] + pos = len(id) + 1 + } + + if seg == "" { + prevNonEmpty = false + prevEndsInS = false continue } - if !isPathChar(segs[i]) { + isLast := i == lastIndex - if strings.Contains(segs[i], "~1") { - segs[i] = strings.ReplaceAll(segs[i], "~1", "/") + if !isPathChar(seg) { + t := seg + if strings.Contains(t, "~1") { + t = strings.ReplaceAll(t, "~1", "/") } - if strings.ContainsRune(segs[i], '%') { - segs[i], _ = url.QueryUnescape(segs[i]) + if strings.ContainsRune(t, '%') { + t, _ = url.QueryUnescape(t) } - - // Use string builder for bracket wrapping - var bracketBuilder strings.Builder - bracketBuilder.Grow(len(segs[i]) + 4) - bracketBuilder.WriteString("['") - bracketBuilder.WriteString(segs[i]) - bracketBuilder.WriteString("']") - segs[i] = bracketBuilder.String() - - if len(cleaned) > 0 && i < len(segs)-1 { - // Use string builder for concatenation with last cleaned element - var concatBuilder strings.Builder - concatBuilder.Grow(len(cleaned[len(cleaned)-1]) + len(segs[i])) - concatBuilder.WriteString(cleaned[len(cleaned)-1]) - concatBuilder.WriteString(segs[i]) - cleaned[len(cleaned)-1] = concatBuilder.String() + // the transformed segment is bracket-wrapped: never empty, ends in ']'. + prevNonEmpty = true + prevEndsInS = false + if i == 0 && !isLast { + // a leading non-path segment (like the '#' of a JSON Pointer) is dropped. continue - } else { - if i > 0 && i < len(segs)-1 { - cleaned = append(cleaned, segs[i]) - continue - } - if i == len(segs)-1 { - l := len(cleaned) - if l > 0 { - // Use string builder for concatenation - var endBuilder strings.Builder - endBuilder.Grow(len(cleaned[l-1]) + len(segs[i])) - endBuilder.WriteString(cleaned[l-1]) - endBuilder.WriteString(segs[i]) - cleaned[l-1] = endBuilder.String() - } else { - cleaned = append(cleaned, segs[i]) - } - } } - } else { + if elements == 0 { + elements++ // becomes the first element, no separator needed + } + b.WriteString("['") + b.WriteString(t) + b.WriteString("']") + continue + } - // strip out any backslashes - if strings.Contains(id, "#") && strings.Contains(segs[i], `\`) { - segs[i] = strings.ReplaceAll(segs[i], `\`, "") - cleaned = append(cleaned, segs[i]) - continue + // strip out any backslashes + if idContainsHash && strings.Contains(seg, `\`) { + t := strings.ReplaceAll(seg, `\`, "") + if elements > 0 { + b.WriteByte('.') } + b.WriteString(t) + elements++ + prevNonEmpty = t != "" + prevEndsInS = t != "" && t[len(t)-1] == 's' + continue + } - intVal, isNum := parseSmallUint(segs[i]) - if isNum { + if intVal, isNum := parseSmallUint(seg); isNum { + // an index with no preceding element is dropped. + if elements > 0 { if intVal <= 99 { - if len(cleaned) > 0 { - appendSegmentOptimized(segs, cleaned, i, false) - } + b.WriteByte('[') + b.WriteString(seg) + b.WriteByte(']') } else { - if len(cleaned) > 0 { - appendSegmentOptimized(segs, cleaned, i, true) - } + b.WriteString("['") + b.WriteString(seg) + b.WriteString("']") } - continue } + prevNonEmpty = true + prevEndsInS = false + continue + } - // if we have a plural parent, wrap it in quotes. - if i > 0 && segs[i-1] != "" && segs[i-1][len(segs[i-1])-1] == 's' { - if i == 2 { // ignore first segment. - cleaned = append(cleaned, segs[i]) - continue + // if we have a plural parent, wrap it in quotes. + if i > 0 && prevNonEmpty && prevEndsInS { + prevNonEmpty = true + prevEndsInS = seg[len(seg)-1] == 's' + if i == 2 { // ignore first segment. + if elements > 0 { + b.WriteByte('.') } - - // Use string builder for plural wrapping - var pluralBuilder strings.Builder - pluralBuilder.Grow(len(cleaned[len(cleaned)-1]) + len(segs[i]) + 4) - pluralBuilder.WriteString(cleaned[len(cleaned)-1]) - pluralBuilder.WriteString("['") - pluralBuilder.WriteString(segs[i]) - pluralBuilder.WriteString("']") - cleaned[len(cleaned)-1] = pluralBuilder.String() + b.WriteString(seg) + elements++ continue } - - cleaned = append(cleaned, segs[i]) - } - } - - // use single string builder for final assembly. - // note: we do NOT replace # with $ here. the leading # from JSON Pointer notation - // (e.g., "#/components/...") is already stripped when we split by "/", and any # - // characters within component names (e.g., "async_search.submit#wait_for_completion_timeout") - // should be preserved literally in the JSONPath query. see issue #485. - var finalBuilder strings.Builder - if len(cleaned) > 1 { - // Estimate final size - totalLen := 0 - for _, seg := range cleaned { - totalLen += len(seg) + b.WriteString("['") + b.WriteString(seg) + b.WriteString("']") + continue } - finalBuilder.Grow(totalLen + len(cleaned) + 5) // segments + dots + $ + potential extra . - finalBuilder.WriteByte('$') - for i, segment := range cleaned { - if i > 0 { - finalBuilder.WriteByte('.') - } - finalBuilder.WriteString(segment) - } - } else { - // Handle single segment case - if len(cleaned) == 1 { - finalBuilder.Grow(len(cleaned[0]) + 5) - finalBuilder.WriteString("$.") - finalBuilder.WriteString(cleaned[0]) - } else { - finalBuilder.WriteString("$.") + if elements > 0 { + b.WriteByte('.') } + b.WriteString(seg) + elements++ + prevNonEmpty = true + prevEndsInS = seg[len(seg)-1] == 's' } - replaced := finalBuilder.String() - - // Ensure proper format - if len(replaced) > 0 { - if len(replaced) > 1 && replaced[1] != '.' { - // Insert period after $ - var dotBuilder strings.Builder - dotBuilder.Grow(len(replaced) + 1) - dotBuilder.WriteByte(replaced[0]) // $ - dotBuilder.WriteByte('.') // . - dotBuilder.WriteString(replaced[1:]) - replaced = dotBuilder.String() - } - } - return name, replaced + return name, b.String() } // ConvertComponentIdIntoPath will convert a JSON Path into a component ID diff --git a/utils/utils_test.go b/utils/utils_test.go index 21627e17b..4f42ef245 100644 --- a/utils/utils_test.go +++ b/utils/utils_test.go @@ -1180,23 +1180,6 @@ func TestIsNodeRefValue_False(t *testing.T) { assert.Empty(t, val) } -// Tests for performance optimization coverage -func TestAppendSegment(t *testing.T) { - // Test appendSegment function (currently 0% coverage) - var sb strings.Builder - segs := []string{"test", "segment", "value"} - cleaned := []string{"initial"} - - // Test without quotes - appendSegment(&sb, segs, cleaned, 1, false) - assert.Equal(t, "initial[segment]", cleaned[0]) - - // Test with quotes - cleaned = []string{"another"} - appendSegment(&sb, segs, cleaned, 2, true) - assert.Equal(t, "another['value']", cleaned[0]) -} - func TestConvertComponentIdIntoFriendlyPathSearch_EdgeCases(t *testing.T) { // Test empty cleaned array handling _, path := ConvertComponentIdIntoFriendlyPathSearch("") From 8558ba22c2d057ab0543c1318bdab221881a4fb2 Mon Sep 17 00:00:00 2001 From: quobix Date: Fri, 12 Jun 2026 13:52:16 -0400 Subject: [PATCH 2/4] fix borked windows test --- index/inline_collector_parity_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/index/inline_collector_parity_test.go b/index/inline_collector_parity_test.go index dc8844345..b0a4c58f6 100644 --- a/index/inline_collector_parity_test.go +++ b/index/inline_collector_parity_test.go @@ -85,6 +85,7 @@ func TestInlineCollectorParity(t *testing.T) { expected, err := os.ReadFile(inlineCollectorParityPath) require.NoError(t, err, "parity fixture missing - regenerate with GOLDEN_REGENERATE=true") - assert.Equal(t, strings.TrimRight(string(expected), "\n"), strings.Join(rows, "\n"), + expectedText := strings.ReplaceAll(string(expected), "\r\n", "\n") + assert.Equal(t, strings.TrimRight(expectedText, "\n"), strings.Join(rows, "\n"), "inline collector output changed - Definition/FullDefinition/Path must stay byte-identical") } From 275da16fbf6d64b013a7e7ce80bb3613a7edec7b Mon Sep 17 00:00:00 2001 From: quobix Date: Fri, 12 Jun 2026 15:51:28 -0400 Subject: [PATCH 3/4] fix: hold exclusive lock while building legacy node map Replace the read-lock/build/upgrade dance in SpecIndex.GetNodeMap with a single exclusive lock, removing the double-checked rebuild path so concurrent callers never build the legacy map twice. Also add a nil-receiver test for SchemaProxy.Schema(). --- datamodel/high/base/schema_proxy_test.go | 5 +++++ index/index_model.go | 22 ++++++---------------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/datamodel/high/base/schema_proxy_test.go b/datamodel/high/base/schema_proxy_test.go index 41bc32188..84ec3e6d2 100644 --- a/datamodel/high/base/schema_proxy_test.go +++ b/datamodel/high/base/schema_proxy_test.go @@ -76,6 +76,11 @@ func TestSchemaProxy_Schema_NoLowLevel(t *testing.T) { assert.Nil(t, proxy.Schema()) } +func TestSchemaProxy_Schema_NilProxy(t *testing.T) { + var proxy *SchemaProxy + assert.Nil(t, proxy.Schema()) +} + func TestSchemaProxy_BuildSchema_NoLock(t *testing.T) { buildErr := errors.New("build failed") proxy := &SchemaProxy{ diff --git a/index/index_model.go b/index/index_model.go index 8cc44af76..5e159d31f 100644 --- a/index/index_model.go +++ b/index/index_model.go @@ -466,15 +466,13 @@ func (index *SpecIndex) GetConfig() *SpecIndexConfig { // compatibility and allocates a full legacy map on first use. func (index *SpecIndex) GetNodeMap() map[int]map[int]*yaml.Node { index.awaitNodeMap() - index.nodeMapLock.RLock() - legacy := index.legacyNodeMap - lines := index.nodeLines - index.nodeMapLock.RUnlock() - if legacy != nil || lines == nil { - return legacy + index.nodeMapLock.Lock() + defer index.nodeMapLock.Unlock() + if index.legacyNodeMap != nil || index.nodeLines == nil { + return index.legacyNodeMap } - legacy = make(map[int]map[int]*yaml.Node) - for line, entries := range lines { + legacy := make(map[int]map[int]*yaml.Node) + for line, entries := range index.nodeLines { if len(entries) == 0 { continue } @@ -484,15 +482,7 @@ func (index *SpecIndex) GetNodeMap() map[int]map[int]*yaml.Node { } legacy[line] = cols } - index.nodeMapLock.Lock() - // another caller may have built and cached the map while this one was - // building; keep the first instance so callers share one map. - if cached := index.legacyNodeMap; cached != nil { - index.nodeMapLock.Unlock() - return cached - } index.legacyNodeMap = legacy - index.nodeMapLock.Unlock() return legacy } From 1265c479a00d3cf0857fdff38ff8caabccc5b8d1 Mon Sep 17 00:00:00 2001 From: quobix Date: Fri, 12 Jun 2026 16:27:30 -0400 Subject: [PATCH 4/4] bump coverage on arazzo --- arazzo_test.go | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/arazzo_test.go b/arazzo_test.go index 8b7b1e221..54c97093a 100644 --- a/arazzo_test.go +++ b/arazzo_test.go @@ -4,12 +4,21 @@ package libopenapi import ( + "reflect" + "sync" "testing" + "unsafe" + "github.com/pb33f/libopenapi/datamodel/low" + lowArazzo "github.com/pb33f/libopenapi/datamodel/low/arazzo" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "go.yaml.in/yaml/v4" ) +//go:linkname arazzoLowBuildModelFieldCache github.com/pb33f/libopenapi/datamodel/low.buildModelFieldCache +var arazzoLowBuildModelFieldCache sync.Map + func TestNewArazzoDocument_ValidFull(t *testing.T) { yml := []byte(`arazzo: 1.0.1 info: @@ -177,6 +186,67 @@ func TestNewArazzoDocument_ArrayYAML(t *testing.T) { assert.Contains(t, err.Error(), "expected YAML mapping") } +func TestNewArazzoDocument_BuildModelError(t *testing.T) { + yml := []byte(`arazzo: 1.0.1 +`) + var root yaml.Node + require.NoError(t, yaml.Unmarshal(yml, &root)) + + var seed lowArazzo.Arazzo + require.NoError(t, low.BuildModel(root.Content[0], &seed)) + + arazzoType := reflect.TypeOf(lowArazzo.Arazzo{}) + original, ok := arazzoLowBuildModelFieldCache.Load(arazzoType) + require.True(t, ok) + + origType := reflect.TypeOf(original) + elemType := origType.Elem() + replacement := reflect.MakeSlice(origType, 1, 1) + elem := reflect.New(elemType).Elem() + setArazzoUnexportedField(elem.FieldByName("lookupKey"), "arazzo") + setArazzoUnexportedField(elem.FieldByName("index"), 0) + setArazzoUnexportedField(elem.FieldByName("kind"), reflect.Bool) + replacement.Index(0).Set(elem) + + arazzoLowBuildModelFieldCache.Store(arazzoType, replacement.Interface()) + t.Cleanup(func() { + arazzoLowBuildModelFieldCache.Store(arazzoType, original) + }) + + doc, err := NewArazzoDocument(yml) + assert.Error(t, err) + assert.Nil(t, doc) + assert.Contains(t, err.Error(), "failed to build low-level model") + assert.Contains(t, err.Error(), "unsupported type") +} + +func TestNewArazzoDocument_BuildError(t *testing.T) { + yml := []byte(`arazzo: 1.0.1 +info: + title: Build Error + version: 1.0.0 +sourceDescriptions: + - name: api + url: https://example.com/openapi.yaml +workflows: + - workflowId: wf1 + steps: + - stepId: s1 + operationId: op1 +components: + failureActions: + badRetry: + name: retry + type: retry + retryAfter: nope +`) + doc, err := NewArazzoDocument(yml) + assert.Error(t, err) + assert.Nil(t, doc) + assert.Contains(t, err.Error(), "failed to build arazzo document") + assert.Contains(t, err.Error(), "invalid retryAfter") +} + func TestNewArazzoDocument_MultipleWorkflows(t *testing.T) { yml := []byte(`arazzo: 1.0.1 info: @@ -467,3 +537,7 @@ workflows: assert.Len(t, doc2.Workflows, len(doc1.Workflows)) assert.Equal(t, doc1.Workflows[0].WorkflowId, doc2.Workflows[0].WorkflowId) } + +func setArazzoUnexportedField(field reflect.Value, value any) { + reflect.NewAt(field.Type(), unsafe.Pointer(field.UnsafeAddr())).Elem().Set(reflect.ValueOf(value)) +}