Skip to content

Commit c8dd284

Browse files
committed
Allow extensions in all OpenApi structures
Swagger documentation is outdated (https://swagger.io/docs/specification/openapi-extensions/). Reading OpenApi sepcification (https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md) one can see that almost all objects can be extended with custom extensions.
1 parent 78e8946 commit c8dd284

21 files changed

+171
-62
lines changed

lib/open_api_spex/components.ex

+4-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ defmodule OpenApiSpex.Components do
2525
:headers,
2626
:securitySchemes,
2727
:links,
28-
:callbacks
28+
:callbacks,
29+
:extensions
2930
]
3031

3132
@type schemas_map :: %{String.t() => Schema.t() | Reference.t()}
@@ -47,6 +48,7 @@ defmodule OpenApiSpex.Components do
4748
headers: %{String.t() => Header.t() | Reference.t()} | nil,
4849
securitySchemes: %{String.t() => SecurityScheme.t() | Reference.t()} | nil,
4950
links: %{String.t() => Link.t() | Reference.t()} | nil,
50-
callbacks: %{String.t() => Callback.t() | Reference.t()} | nil
51+
callbacks: %{String.t() => Callback.t() | Reference.t()} | nil,
52+
extensions: %{String.t() => any()} | nil
5153
}
5254
end

lib/open_api_spex/contact.ex

+4-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ defmodule OpenApiSpex.Contact do
66
defstruct [
77
:name,
88
:url,
9-
:email
9+
:email,
10+
extensions: nil
1011
]
1112

1213
@typedoc """
@@ -17,6 +18,7 @@ defmodule OpenApiSpex.Contact do
1718
@type t :: %__MODULE__{
1819
name: String.t() | nil,
1920
url: String.t() | nil,
20-
email: String.t() | nil
21+
email: String.t() | nil,
22+
extensions: %{String.t() => any()} | nil
2123
}
2224
end

lib/open_api_spex/discriminator.ex

+4-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ defmodule OpenApiSpex.Discriminator do
88
@enforce_keys :propertyName
99
defstruct [
1010
:propertyName,
11-
:mapping
11+
:mapping,
12+
:extensions
1213
]
1314

1415
@typedoc """
@@ -21,7 +22,8 @@ defmodule OpenApiSpex.Discriminator do
2122
"""
2223
@type t :: %__MODULE__{
2324
propertyName: String.t(),
24-
mapping: %{String.t() => String.t()} | nil
25+
mapping: %{String.t() => String.t()} | nil,
26+
extensions: %{String.t() => any()} | nil
2527
}
2628

2729
@doc """

lib/open_api_spex/encoding.ex

+4-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ defmodule OpenApiSpex.Encoding do
99
:headers,
1010
:style,
1111
:explode,
12-
:allowReserved
12+
:allowReserved,
13+
:extensions
1314
]
1415

1516
@typedoc """
@@ -22,6 +23,7 @@ defmodule OpenApiSpex.Encoding do
2223
headers: %{String.t() => Header.t() | Reference.t()} | nil,
2324
style: Parameter.style() | nil,
2425
explode: boolean | nil,
25-
allowReserved: boolean | nil
26+
allowReserved: boolean | nil,
27+
extensions: %{String.t() => any()} | nil
2628
}
2729
end

lib/open_api_spex/example.ex

+4-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ defmodule OpenApiSpex.Example do
66
:summary,
77
:description,
88
:value,
9-
:externalValue
9+
:externalValue,
10+
:extensions
1011
]
1112

1213
@typedoc """
@@ -18,6 +19,7 @@ defmodule OpenApiSpex.Example do
1819
summary: String.t() | nil,
1920
description: String.t() | nil,
2021
value: any,
21-
externalValue: String.t() | nil
22+
externalValue: String.t() | nil,
23+
extensions: %{String.t() => any()} | nil
2224
}
2325
end

lib/open_api_spex/extendable.ex

+18-1
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,31 @@ end
99

1010
defimpl OpenApiSpex.Extendable,
1111
for: [
12+
OpenApiSpex.Components,
13+
OpenApiSpex.Contact,
14+
OpenApiSpex.Discriminator,
15+
OpenApiSpex.Encoding,
16+
OpenApiSpex.Example,
17+
OpenApiSpex.ExternalDocumentation,
18+
OpenApiSpex.Header,
1219
OpenApiSpex.Info,
20+
OpenApiSpex.License,
21+
OpenApiSpex.Link,
22+
OpenApiSpex.MediaType,
23+
OpenApiSpex.OAuthFlow,
24+
OpenApiSpex.OAuthFlows,
1325
OpenApiSpex.OpenApi,
1426
OpenApiSpex.Operation,
1527
OpenApiSpex.Parameter,
1628
OpenApiSpex.PathItem,
29+
OpenApiSpex.RequestBody,
1730
OpenApiSpex.Response,
31+
OpenApiSpex.Schema,
1832
OpenApiSpex.SecurityScheme,
19-
OpenApiSpex.Tag
33+
OpenApiSpex.Server,
34+
OpenApiSpex.ServerVariable,
35+
OpenApiSpex.Tag,
36+
OpenApiSpex.Xml
2037
] do
2138
def to_map(struct = %{extensions: e}) do
2239
struct

lib/open_api_spex/external_documentation.ex

+4-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ defmodule OpenApiSpex.ExternalDocumentation do
66
@enforce_keys :url
77
defstruct [
88
:description,
9-
:url
9+
:url,
10+
:extensions
1011
]
1112

1213
@typedoc """
@@ -16,6 +17,7 @@ defmodule OpenApiSpex.ExternalDocumentation do
1617
"""
1718
@type t :: %__MODULE__{
1819
description: String.t() | nil,
19-
url: String.t()
20+
url: String.t(),
21+
extensions: %{String.t() => any()} | nil
2022
}
2123
end

lib/open_api_spex/header.ex

+3-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ defmodule OpenApiSpex.Header do
1414
:schema,
1515
:example,
1616
:examples,
17+
:extensions,
1718
style: :simple
1819
]
1920

@@ -35,6 +36,7 @@ defmodule OpenApiSpex.Header do
3536
explode: boolean | nil,
3637
schema: Schema.t() | Reference.t() | nil,
3738
example: any,
38-
examples: %{String.t() => Example.t() | Reference.t()} | nil
39+
examples: %{String.t() => Example.t() | Reference.t()} | nil,
40+
extensions: %{String.t() => any()} | nil
3941
}
4042
end

lib/open_api_spex/license.ex

+4-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ defmodule OpenApiSpex.License do
66
@enforce_keys :name
77
defstruct [
88
:name,
9-
:url
9+
:url,
10+
:extensions
1011
]
1112

1213
@typedoc """
@@ -16,6 +17,7 @@ defmodule OpenApiSpex.License do
1617
"""
1718
@type t :: %__MODULE__{
1819
name: String.t(),
19-
url: String.t() | nil
20+
url: String.t() | nil,
21+
extensions: %{String.t() => any()} | nil
2022
}
2123
end

lib/open_api_spex/link.ex

+4-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ defmodule OpenApiSpex.Link do
1010
:parameters,
1111
:requestBody,
1212
:description,
13-
:server
13+
:server,
14+
:extensions
1415
]
1516

1617
@typedoc """
@@ -34,6 +35,7 @@ defmodule OpenApiSpex.Link do
3435
parameters: %{String.t() => any} | nil,
3536
requestBody: any,
3637
description: String.t() | nil,
37-
server: Server.t() | nil
38+
server: Server.t() | nil,
39+
extensions: %{String.t() => any()} | nil
3840
}
3941
end

lib/open_api_spex/media_type.ex

+4-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ defmodule OpenApiSpex.MediaType do
88
:schema,
99
:example,
1010
:examples,
11-
:encoding
11+
:encoding,
12+
:extensions
1213
]
1314

1415
@typedoc """
@@ -20,6 +21,7 @@ defmodule OpenApiSpex.MediaType do
2021
schema: Schema.t() | Reference.t() | nil,
2122
example: any,
2223
examples: %{String.t() => Example.t() | Reference.t()} | nil,
23-
encoding: %{String => Encoding.t()} | nil
24+
encoding: %{String => Encoding.t()} | nil,
25+
extensions: %{String.t() => any()} | nil
2426
}
2527
end

lib/open_api_spex/oauth_flow.ex

+4-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ defmodule OpenApiSpex.OAuthFlow do
66
:authorizationUrl,
77
:tokenUrl,
88
:refreshUrl,
9-
:scopes
9+
:scopes,
10+
:extensions
1011
]
1112

1213
@typedoc """
@@ -18,6 +19,7 @@ defmodule OpenApiSpex.OAuthFlow do
1819
authorizationUrl: String.t() | nil,
1920
tokenUrl: String.t() | nil,
2021
refreshUrl: String.t() | nil,
21-
scopes: %{String.t() => String.t()} | nil
22+
scopes: %{String.t() => String.t()} | nil,
23+
extensions: %{String.t() => any()} | nil
2224
}
2325
end

lib/open_api_spex/oauth_flows.ex

+4-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ defmodule OpenApiSpex.OAuthFlows do
88
:implicit,
99
:password,
1010
:clientCredentials,
11-
:authorizationCode
11+
:authorizationCode,
12+
:extensions
1213
]
1314

1415
@typedoc """
@@ -20,6 +21,7 @@ defmodule OpenApiSpex.OAuthFlows do
2021
implicit: OAuthFlow.t() | nil,
2122
password: OAuthFlow.t() | nil,
2223
clientCredentials: OAuthFlow.t() | nil,
23-
authorizationCode: OAuthFlow.t() | nil
24+
authorizationCode: OAuthFlow.t() | nil,
25+
extensions: %{String.t() => any()} | nil
2426
}
2527
end

0 commit comments

Comments
 (0)