Skip to content

Commit

Permalink
Ref in paths / responses / parameters: flatten $ref in Paths (covers …
Browse files Browse the repository at this point in the history
…skip schemas) (#111)

* fix(expander): support SkipSchema case for  in Paths section

* added some quick patches to keep things running on windows: a more elaborate
  approach is still needed to fully support file $ref on windows

Signed-off-by: Frederic BIDON <[email protected]>

* fixed some missing nested schema  rebasing when SkipSchema is enabled

Signed-off-by: Frederic BIDON <[email protected]>

* more fixes

Signed-off-by: Frederic BIDON <[email protected]>

* added test and fixture on self-referencing  pointers

Signed-off-by: Frederic BIDON <[email protected]>

* fixup ci: useless install step

Signed-off-by: Frederic BIDON <[email protected]>

* cleanup code

Signed-off-by: Frederic BIDON <[email protected]>

* fixup linting

Signed-off-by: Frederic BIDON <[email protected]>
  • Loading branch information
fredbi authored Nov 26, 2020
1 parent 81c4553 commit d0486ac
Show file tree
Hide file tree
Showing 29 changed files with 991 additions and 22 deletions.
1 change: 1 addition & 0 deletions .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,4 @@ linters:
- nestif
- godot
- gofumpt
- paralleltest
2 changes: 0 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,3 @@ notifications:
secure: QUWvCkBBK09GF7YtEvHHVt70JOkdlNBG0nIKu/5qc4/nW5HP8I2w0SEf/XR2je0eED1Qe3L/AfMCWwrEj+IUZc3l4v+ju8X8R3Lomhme0Eb0jd1MTMCuPcBT47YCj0M7RON7vXtbFfm1hFJ/jLe5+9FXz0hpXsR24PJc5ZIi/ogNwkaPqG4BmndzecpSh0vc2FJPZUD9LT0I09REY/vXR0oQAalLkW0asGD5taHZTUZq/kBpsNxaAFrLM23i4mUcf33M5fjLpvx5LRICrX/57XpBrDh2TooBU6Qj3CgoY0uPRYUmSNxbVx1czNzl2JtEpb5yjoxfVPQeg0BvQM00G8LJINISR+ohrjhkZmAqchDupAX+yFrxTtORa78CtnIL6z/aTNlgwwVD8kvL/1pFA/JWYmKDmz93mV/+6wubGzNSQCstzjkFA4/iZEKewKUoRIAi/fxyscP6L/rCpmY/4llZZvrnyTqVbt6URWpopUpH4rwYqreXAtJxJsfBJIeSmUIiDIOMGkCTvyTEW3fWGmGoqWtSHLoaWDyAIGb7azb+KvfpWtEcoPFWfSWU+LGee0A/YsUhBl7ADB9A0CJEuR8q4BPpKpfLwPKSiKSAXL7zDkyjExyhtgqbSl2jS+rKIHOZNL8JkCcTP2MKMVd563C5rC5FMKqu3S9m2b6380E=
script:
- gotestsum -f short-verbose -- -race -coverprofile=coverage.txt -covermode=atomic ./...
- go get -u github.com/go-openapi/analysis@master
#- gotestsum -f short-verbose -- -timeout=30m github.com/go-openapi/analysis/...
38 changes: 29 additions & 9 deletions expander.go
Original file line number Diff line number Diff line change
Expand Up @@ -616,41 +616,61 @@ func expandParameterOrResponse(input interface{}, resolver *schemaLoader, basePa
if err != nil {
return err
}

if ref == nil {
return nil
}

parentRefs := []string{}
if err := resolver.deref(input, parentRefs, basePath); resolver.shouldStopOnError(err) {
if err = resolver.deref(input, parentRefs, basePath); resolver.shouldStopOnError(err) {
return err
}

ref, sch, _ := getRefAndSchema(input)
if ref.String() != "" {
transitiveResolver, err := resolver.transitiveResolver(basePath, *ref)
if transitiveResolver.shouldStopOnError(err) {
return err
transitiveResolver, ert := resolver.transitiveResolver(basePath, *ref)
if transitiveResolver.shouldStopOnError(ert) {
return ert
}
basePath = resolver.updateBasePath(transitiveResolver, basePath)
resolver = transitiveResolver
}

if sch != nil && sch.Ref.String() != "" {
// schema expanded to a $ref in another root
var ern error
sch.Ref, ern = NewRef(normalizePaths(sch.Ref.String(), ref.RemoteURI()))
if sch == nil {
// nothing to be expanded
if ref != nil {
*ref = Ref{}
}
return nil
}

if sch.Ref.String() != "" {
rebasedRef, ern := NewRef(normalizePaths(sch.Ref.String(), basePath))
if ern != nil {
return ern
}

if !resolver.options.SkipSchemas {
// schema expanded to a $ref in another root
sch.Ref = rebasedRef
} else {
// skip schema expansion but rebase $ref to schema
sch.Ref = *denormalizeFileRef(&rebasedRef, basePath, resolver.context.basePath)
}
}

if ref != nil {
*ref = Ref{}
}

if !resolver.options.SkipSchemas && sch != nil {
// expand schema
if !resolver.options.SkipSchemas {
s, err := expandSchema(*sch, parentRefs, resolver, basePath)
if resolver.shouldStopOnError(err) {
return err
}
*sch = *s
}

return nil
}
6 changes: 3 additions & 3 deletions expander_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,19 +76,19 @@ func TestNormalizePaths(t *testing.T) {
// file basePath, absolute refPath, no fragment
refPath: `C:\another\base\path.json`,
base: `C:\base\path.json`,
expOutput: `C:\another\base\path.json`,
expOutput: `c:\another\base\path.json`,
},
{
// file basePath, absolute refPath
refPath: `C:\another\base\path.json#/definitions/Pet`,
base: `C:\base\path.json`,
expOutput: `C:\another\base\path.json#/definitions/Pet`,
expOutput: `c:\another\base\path.json#/definitions/Pet`,
},
{
// file basePath, relative refPath
refPath: `another\base\path.json#/definitions/Pet`,
base: `C:\base\path.json`,
expOutput: `C:\base\another\base\path.json#/definitions/Pet`,
expOutput: `c:\base\another\base\path.json#/definitions/Pet`,
},
}...)
return testCases
Expand Down
50 changes: 50 additions & 0 deletions fixtures/flatten/external/definitions.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
definitions:
named:
type: string
tag:
type: object
properties:
id:
type: integer
format: int64
value:
type: string
audit:
$ref: "#/definitions/record"
record:
type: object
properties:
createdAt:
type: string
format: date-time

nestedThing:
type: object
properties:
record:
type: array
items:
- type: string
format: date-time
- type: object
properties:
createdAt:
type: string
format: date-time
- allOf:
- type: string
format: date
- type: object
additionalProperties:
type: object
properties:
id:
type: integer
format: int64
value:
type: string
properties:
value:
type: string
name:
$ref: "definitions2.yml#/coordinate"
9 changes: 9 additions & 0 deletions fixtures/flatten/external/definitions2.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
coordinate:
type: object
properties:
id:
type: integer
format: int64
createdAt:
type: string
format: date-time
13 changes: 13 additions & 0 deletions fixtures/flatten/external/errors.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
error:
type: object
required:
- id
- message
properties:
id:
type: integer
format: int64
readOnly: true
message:
type: string
readOnly: true
35 changes: 35 additions & 0 deletions fixtures/flatten/external/nestedParams.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
bodyParam:
name: body
in: body
schema:
type: object
properties:
record:
type: array
items:
- type: string
format: date-time
- type: object
properties:
createdAt:
type: string
format: date-time
- allOf:
- type: string
format: date
- type: object
properties:
id:
type: integer
format: int64
value:
type: string
name:
type: object
properties:
id:
type: integer
format: int64
createdAt:
type: string
format: date-time
32 changes: 32 additions & 0 deletions fixtures/flatten/external/nestedResponses.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
genericResponse:
type: object
properties:
record:
type: array
items:
- type: string
format: date-time
- type: object
properties:
createdAt:
type: string
format: date-time
- allOf:
- type: string
format: date
- type: object
properties:
id:
type: integer
format: int64
value:
type: string
name:
type: object
properties:
id:
type: integer
format: int64
createdAt:
type: string
format: date-time
12 changes: 12 additions & 0 deletions fixtures/flatten/external/parameters.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
parameters:
idParam:
name: id
in: path
type: integer
format: int32
limitParam:
name: limit
in: query
type: integer
format: int32
required: false
9 changes: 9 additions & 0 deletions fixtures/flatten/external/pathItem.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
get:
operationId: modelOp
summary: many model variations
description: Used to see if a codegen can render all the possible parameter variations for a header param
tags:
- testcgen
responses:
default:
description: Generic Out
4 changes: 4 additions & 0 deletions fixtures/flatten/external/responses.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
responses:
notFound:
schema:
$ref: "errors.yml#/error"
85 changes: 85 additions & 0 deletions fixtures/flatten/flatten.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
---
swagger: "2.0"
info:
version: "0.1.0"
title: reference analysis

parameters:
someParam:
name: some
in: query
type: string
responses:
notFound:
description: "Not Found"
schema:
$ref: "external/errors.yml#/error"

paths:
"/some/where/{id}":
parameters:
- $ref: "external/parameters.yml#/parameters/idParam"

get:
parameters:
- $ref: "external/parameters.yml#/parameters/limitParam"
- $ref: "#/parameters/someParam"
- name: other
in: query
type: string
- $ref: "external/nestedParams.yml#/bodyParam"

responses:
default:
$ref: "external/nestedResponses.yml#/genericResponse"
404:
$ref: "#/responses/notFound"
200:
description: "RecordHolder"
schema:
type: object
properties:
record:
$ref: "external/definitions.yml#/definitions/nestedThing"
"/other/place":
$ref: "external/pathItem.yml"

definitions:
namedAgain:
$ref: "external/definitions.yml#/definitions/named"

datedTag:
allOf:
- type: string
format: date
- $ref: "external/definitions.yml#/definitions/tag"

records:
type: array
items:
- $ref: "external/definitions.yml#/definitions/record"

datedRecords:
type: array
items:
- type: string
format: date-time
- $ref: "external/definitions.yml#/definitions/record"

otherRecords:
type: array
items:
$ref: "external/definitions.yml#/definitions/record"

tags:
type: object
additionalProperties:
$ref: "external/definitions.yml#/definitions/tag"

namedThing:
type: object
properties:
name:
$ref: "external/definitions.yml#/definitions/named"
namedAgain:
$ref: "#/definitions/namedAgain"
29 changes: 29 additions & 0 deletions fixtures/more_circulars/pointers/fixture-pointers-loop.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
---
swagger: '2.0'
info:
version: '0.1.0'
title: JSON pointers

paths:
/some/where:
get:
responses:
default:
schema:
$ref: '#/definitions/whiteStone/properties/p1'
definitions:
whiteStone:
type: object
properties:
p1:
$ref: '#/definitions/blackStone/properties/p2'
blackStone:
type: object
properties:
p2:
$ref: '#/definitions/redStone/properties/p3'
redStone:
type: object
properties:
p3:
$ref: '#/definitions/whiteStone/properties/p1'
Loading

0 comments on commit d0486ac

Please sign in to comment.