Skip to content

Commit 85682e1

Browse files
committed
fixing nil checks and borked pipeline.
1 parent cda65e2 commit 85682e1

File tree

3 files changed

+51
-14
lines changed

3 files changed

+51
-14
lines changed

datamodel/low/extraction_functions.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -569,7 +569,9 @@ func extractArrayValueReferences[T Buildable[N], N any](
569569
}
570570
}
571571
}
572-
items = make([]ValueReference[T], 0, len(valueNode.Content))
572+
if len(valueNode.Content) > 0 {
573+
items = make([]ValueReference[T], 0, len(valueNode.Content))
574+
}
573575
for _, node := range valueNode.Content {
574576
localReferenceValue := ""
575577
foundCtx := ctx

datamodel/low/v3/create_document.go

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,22 @@ type documentTopLevelNodes struct {
4141
webhooks documentTopLevelNode
4242
}
4343

44+
func selectDocumentNode(root *yaml.Node, preferred documentTopLevelNode, label string, topOnly bool) documentTopLevelNode {
45+
if preferred.value != nil {
46+
return preferred
47+
}
48+
root = utils.NodeAlias(root)
49+
if root == nil {
50+
return documentTopLevelNode{}
51+
}
52+
if topOnly {
53+
_, key, value := utils.FindKeyNodeFullTop(label, root.Content)
54+
return documentTopLevelNode{key: key, value: value}
55+
}
56+
_, key, value := utils.FindKeyNodeFull(label, root.Content)
57+
return documentTopLevelNode{key: key, value: value}
58+
}
59+
4460
func collectDocumentTopLevelNodes(root *yaml.Node) documentTopLevelNodes {
4561
root = utils.NodeAlias(root)
4662
var nodes documentTopLevelNodes
@@ -119,7 +135,8 @@ func CreateDocumentFromConfig(info *datamodel.SpecInfo, config *datamodel.Docume
119135
func createDocument(info *datamodel.SpecInfo, config *datamodel.DocumentConfiguration) (*Document, error) {
120136
rootNode := utils.NodeAlias(info.RootNode.Content[0])
121137
topNodes := collectDocumentTopLevelNodes(rootNode)
122-
labelNode, versionNode := topNodes.version.key, topNodes.version.value
138+
versionNodeRef := selectDocumentNode(rootNode, topNodes.version, OpenAPILabel, false)
139+
labelNode, versionNode := versionNodeRef.key, versionNodeRef.value
123140
var version low.NodeReference[string]
124141
if versionNode == nil {
125142
return nil, errors.New("no openapi version/tag found, cannot create document")
@@ -291,15 +308,17 @@ func createDocument(info *datamodel.SpecInfo, config *datamodel.DocumentConfigur
291308
low.ExtractExtensionNodes(ctx, doc.Extensions, doc.Nodes)
292309

293310
// if set, extract jsonSchemaDialect (3.1)
294-
dialectLabel, dialectNode := topNodes.jsonSchemaDialect.key, topNodes.jsonSchemaDialect.value
311+
dialectRef := selectDocumentNode(rootNode, topNodes.jsonSchemaDialect, JSONSchemaDialectLabel, false)
312+
dialectLabel, dialectNode := dialectRef.key, dialectRef.value
295313
if dialectNode != nil {
296314
doc.JsonSchemaDialect = low.NodeReference[string]{
297315
Value: dialectNode.Value, KeyNode: dialectLabel, ValueNode: dialectNode,
298316
}
299317
}
300318

301319
// if set, extract $self (3.2)
302-
selfLabel, selfNode := topNodes.self.key, topNodes.self.value
320+
selfRef := selectDocumentNode(rootNode, topNodes.self, SelfLabel, false)
321+
selfLabel, selfNode := selfRef.key, selfRef.value
303322
if selfNode != nil {
304323
doc.Self = low.NodeReference[string]{
305324
Value: selfNode.Value, KeyNode: selfLabel, ValueNode: selfNode,
@@ -341,8 +360,9 @@ func createDocument(info *datamodel.SpecInfo, config *datamodel.DocumentConfigur
341360
return &doc, errors.Join(errs...)
342361
}
343362

344-
func extractInfo(ctx context.Context, _ *yaml.Node, nodes documentTopLevelNodes, doc *Document, idx *index.SpecIndex) error {
345-
ln, vn := nodes.info.key, nodes.info.value
363+
func extractInfo(ctx context.Context, root *yaml.Node, nodes documentTopLevelNodes, doc *Document, idx *index.SpecIndex) error {
364+
nodeRef := selectDocumentNode(root, nodes.info, base.InfoLabel, true)
365+
ln, vn := nodeRef.key, nodeRef.value
346366
if vn != nil {
347367
ir := base.Info{}
348368
_ = low.BuildModel(vn, &ir)
@@ -373,8 +393,9 @@ func extractExternalDocs(ctx context.Context, root *yaml.Node, nodes documentTop
373393
return nil
374394
}
375395

376-
func extractComponents(ctx context.Context, _ *yaml.Node, nodes documentTopLevelNodes, doc *Document, idx *index.SpecIndex) error {
377-
ln, vn := nodes.components.key, nodes.components.value
396+
func extractComponents(ctx context.Context, root *yaml.Node, nodes documentTopLevelNodes, doc *Document, idx *index.SpecIndex) error {
397+
nodeRef := selectDocumentNode(root, nodes.components, ComponentsLabel, true)
398+
ln, vn := nodeRef.key, nodeRef.value
378399
if vn != nil {
379400
ir := Components{}
380401
_ = low.BuildModel(vn, &ir)
@@ -388,8 +409,9 @@ func extractComponents(ctx context.Context, _ *yaml.Node, nodes documentTopLevel
388409
return nil
389410
}
390411

391-
func extractServers(ctx context.Context, _ *yaml.Node, nodes documentTopLevelNodes, doc *Document, idx *index.SpecIndex) error {
392-
ln, vn := nodes.servers.key, nodes.servers.value
412+
func extractServers(ctx context.Context, root *yaml.Node, nodes documentTopLevelNodes, doc *Document, idx *index.SpecIndex) error {
413+
nodeRef := selectDocumentNode(root, nodes.servers, ServersLabel, false)
414+
ln, vn := nodeRef.key, nodeRef.value
393415
if vn != nil {
394416
if utils.IsNodeArray(vn) {
395417
var servers []low.ValueReference[*Server]
@@ -414,8 +436,9 @@ func extractServers(ctx context.Context, _ *yaml.Node, nodes documentTopLevelNod
414436
return nil
415437
}
416438

417-
func extractTags(ctx context.Context, _ *yaml.Node, nodes documentTopLevelNodes, doc *Document, idx *index.SpecIndex) error {
418-
ln, vn := nodes.tags.key, nodes.tags.value
439+
func extractTags(ctx context.Context, root *yaml.Node, nodes documentTopLevelNodes, doc *Document, idx *index.SpecIndex) error {
440+
nodeRef := selectDocumentNode(root, nodes.tags, base.TagsLabel, false)
441+
ln, vn := nodeRef.key, nodeRef.value
419442
if vn != nil {
420443
if utils.IsNodeArray(vn) {
421444
var tags []low.ValueReference[*base.Tag]
@@ -442,8 +465,9 @@ func extractTags(ctx context.Context, _ *yaml.Node, nodes documentTopLevelNodes,
442465
return nil
443466
}
444467

445-
func extractPaths(ctx context.Context, _ *yaml.Node, nodes documentTopLevelNodes, doc *Document, idx *index.SpecIndex) error {
446-
ln, vn := nodes.paths.key, nodes.paths.value
468+
func extractPaths(ctx context.Context, root *yaml.Node, nodes documentTopLevelNodes, doc *Document, idx *index.SpecIndex) error {
469+
nodeRef := selectDocumentNode(root, nodes.paths, PathsLabel, false)
470+
ln, vn := nodeRef.key, nodeRef.value
447471
if vn != nil {
448472
ir := Paths{}
449473
err := ir.Build(ctx, ln, vn, idx)

datamodel/low/v3/operation.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,17 @@ func (o *Operation) Build(ctx context.Context, keyNode, root *yaml.Node, idx *in
179179
o.Nodes.Store(sln.Line, sln)
180180
}
181181

182+
// if security is set, but no requirements are defined.
183+
// https://github.com/pb33f/libopenapi/issues/111
184+
if sln != nil && len(svn.Content) == 0 && len(sec) == 0 {
185+
o.Security = low.NodeReference[[]low.ValueReference[*base.SecurityRequirement]]{
186+
Value: []low.ValueReference[*base.SecurityRequirement]{},
187+
KeyNode: sln,
188+
ValueNode: svn,
189+
}
190+
o.Nodes.Store(sln.Line, svn)
191+
}
192+
182193
// extract servers
183194
servers, sl, sn, serErr := low.ExtractArray[*Server](ctx, ServersLabel, root, idx)
184195
if serErr != nil {

0 commit comments

Comments
 (0)