Skip to content

Crash if duplicate model names (across files) used in allOf #479

Description

A TSP conversion PR resulted in this error:

"details":"incompatible properties : tags

definitions/ContainerGroup/properties/tags
 at file:///home/runner/work/azure-rest-api-specs/azure-rest-api-specs/specification/containerinstance/resource-manager/Microsoft.ContainerInstance/ContainerInstance/stable/2025-09-01/containerInstance.json#L2245:8

definitions/Resource/properties/tags
  at file:///home/runner/work/azure-rest-api-specs/azure-rest-api-specs/specification/containerinstance/resource-manager/Microsoft.ContainerInstance/ContainerInstance/stable/2025-09-01/containerInstance.json#L4642:8"

Root cause, oad cannot handle two definitions in different files with the same name, if one definition is used in an allOf:

duplicate-names.json

{
  "swagger": "2.0",
  "info": {
    "title": "duplicate-names",
    "version": "1.0"
  },
  "paths": {},
  "definitions": {
    "Bar": {
      "type": "object",
      "properties": {
        "p1": {
          "type": "string"
        }
      },
      "allOf": [
        {
          "$ref": "./common-types.json#/definitions/Foo"
        }
      ]
    },
    "Foo": {
      "type": "object",
      "properties": {
        "p1": {
          "type": "object"
        }
      }
    }
  }
}

common-types.json

{
  "swagger": "2.0",
  "info": {
    "title": "common-types",
    "version": "1.0"
  },
  "paths": {},
  "definitions": {
    "Foo": {
      "type": "object",
      "properties": {
        "p1": {
          "type": "string"
        }
      }
    }
  }
}

test result

    incompatible properties : p1
      definitions/Bar/properties/p1
        at file:///home/mharder/openapi-diff-mh/incompat-prop/src/test/specs/incompatible-properties/duplicate-names.json#L12:8
      definitions/Foo/properties/p1
        at file:///home/mharder/openapi-diff-mh/incompat-prop/src/test/specs/incompatible-properties/duplicate-names.json#L25:8

Reason, it assumes model names are unique across all files:

private getModelName(ref: string) {
const parts = ref.split("/")
if (parts.length === 3 && parts[1] === "definitions") {
return parts[2]
}
return undefined
}

Related: #347

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions