Skip to content

Commit 8ec225b

Browse files
v0.1.3 💧
1 parent d8100d7 commit 8ec225b

File tree

8 files changed

+441
-54
lines changed

8 files changed

+441
-54
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [0.1.3] - 2021-06-17 :droplet:
9+
10+
- Corrects a bug forcing `camelCase` on examples objects handled as dataclasses
11+
- Adds base64 ValueFormat to the v3 enum
812
## [0.1.2] - 2021-05-03 :notes:
913

1014
- Adds a changelog

openapidocs/common.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import copy
22
import json
3-
from dataclasses import fields, is_dataclass
3+
from dataclasses import fields, is_dataclass, asdict
44
from enum import Enum
55
from typing import Any, List, Tuple
66

@@ -13,7 +13,11 @@ class Format(Enum):
1313
JSON = "JSON"
1414

1515

16-
class OpenAPIRoot:
16+
class OpenAPIElement:
17+
"""Base class for all OpenAPI Elements"""
18+
19+
20+
class OpenAPIRoot(OpenAPIElement):
1721
"""Base class for a root OpenAPI Documentation"""
1822

1923

@@ -51,12 +55,14 @@ def normalize_dict_factory(items: List[Tuple[Any, Any]]) -> Any:
5155
def _asdict_inner(obj, dict_factory):
5256
if hasattr(obj, "to_obj"):
5357
return obj.to_obj()
54-
if is_dataclass(obj):
58+
if isinstance(obj, OpenAPIElement):
5559
result = []
5660
for f in fields(obj):
5761
value = _asdict_inner(getattr(obj, f.name), dict_factory)
5862
result.append((f.name, value))
5963
return dict_factory(result)
64+
if is_dataclass(obj):
65+
return asdict(obj)
6066
elif isinstance(obj, (list, tuple)):
6167
return type(obj)(_asdict_inner(v, dict_factory) for v in obj)
6268
elif isinstance(obj, dict):
@@ -71,7 +77,9 @@ def _asdict_inner(obj, dict_factory):
7177
def normalize_dict(obj):
7278
if hasattr(obj, "to_obj"):
7379
return obj.to_obj()
74-
return _asdict_inner(obj, dict_factory=normalize_dict_factory)
80+
if isinstance(obj, OpenAPIElement):
81+
return _asdict_inner(obj, dict_factory=normalize_dict_factory)
82+
return asdict(obj)
7583

7684

7785
class Serializer:

openapidocs/v2.py

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from dataclasses import dataclass
99
from openapidocs.common import OpenAPIRoot
1010
from typing import Any, List, Optional, Dict, Type, Union
11+
from .common import OpenAPIElement
1112

1213

1314
def get_ref(ref_type: Union[str, Type]) -> str:
@@ -90,26 +91,26 @@ class OAuthFlowType(Enum):
9091

9192

9293
@dataclass
93-
class Contact:
94+
class Contact(OpenAPIElement):
9495
name: Optional[str] = None
9596
url: Optional[str] = None
9697
email: Optional[str] = None
9798

9899

99100
@dataclass
100-
class ExternalDocs:
101+
class ExternalDocs(OpenAPIElement):
101102
url: str
102103
description: Optional[str] = None
103104

104105

105106
@dataclass
106-
class License:
107+
class License(OpenAPIElement):
107108
name: str
108109
url: Optional[str] = None
109110

110111

111112
@dataclass
112-
class Info:
113+
class Info(OpenAPIElement):
113114
title: str
114115
version: str
115116
description: Optional[str] = None
@@ -119,7 +120,7 @@ class Info:
119120

120121

121122
@dataclass
122-
class XML:
123+
class XML(OpenAPIElement):
123124
name: Optional[str] = None
124125
namespace: Optional[str] = None
125126
prefix: Optional[str] = None
@@ -128,13 +129,13 @@ class XML:
128129

129130

130131
@dataclass
131-
class Discriminator:
132+
class Discriminator(OpenAPIElement):
132133
property_name: str
133134
mapping: Optional[Dict[str, str]] = None
134135

135136

136137
@dataclass
137-
class Schema:
138+
class Schema(OpenAPIElement):
138139
type: Union[None, str, ValueType] = None
139140
format: Union[None, str, ValueFormat] = None
140141
required: Optional[List[str]] = None
@@ -162,7 +163,7 @@ class Schema:
162163

163164

164165
@dataclass
165-
class Header:
166+
class Header(OpenAPIElement):
166167
type: HeaderType
167168
description: Optional[str] = None
168169
format: Optional[str] = None
@@ -184,23 +185,23 @@ class Header:
184185

185186

186187
@dataclass
187-
class Example:
188+
class Example(OpenAPIElement):
188189
summary: Optional[str] = None
189190
description: Optional[str] = None
190191
value: Any = None
191192
external_value: Optional[str] = None
192193

193194

194195
@dataclass
195-
class Reference:
196+
class Reference(OpenAPIElement):
196197
ref: str
197198

198199
def to_obj(self) -> Dict[str, str]:
199200
return {"$ref": self.ref}
200201

201202

202203
@dataclass
203-
class Encoding:
204+
class Encoding(OpenAPIElement):
204205
content_type: Optional[str] = None
205206
headers: Optional[Dict[str, Union[Header, Reference]]] = None
206207
style: Optional[str] = None
@@ -209,15 +210,15 @@ class Encoding:
209210

210211

211212
@dataclass
212-
class Response:
213+
class Response(OpenAPIElement):
213214
description: str
214215
headers: Optional[Dict[str, Union[Header, Reference]]] = None
215216
schema: Optional[Schema] = None
216217
examples: Optional[Dict[str, Any]] = None
217218

218219

219220
@dataclass
220-
class Items:
221+
class Items(OpenAPIElement):
221222
type: ValueItemType
222223
format: Optional[ValueFormat] = None
223224
items: Optional["Items"] = None
@@ -238,7 +239,7 @@ class Items:
238239

239240

240241
@dataclass
241-
class Parameter:
242+
class Parameter(OpenAPIElement):
242243
name: str
243244
in_: ParameterLocation
244245
type: Optional[ValueType] = None
@@ -267,7 +268,7 @@ class Parameter:
267268

268269

269270
@dataclass
270-
class SecurityRequirement:
271+
class SecurityRequirement(OpenAPIElement):
271272
name: str
272273
value: List[str]
273274

@@ -276,7 +277,7 @@ def to_obj(self):
276277

277278

278279
@dataclass
279-
class Operation:
280+
class Operation(OpenAPIElement):
280281
responses: Dict[str, Response]
281282
tags: Optional[List[str]] = None
282283
operation_id: Optional[str] = None
@@ -292,7 +293,7 @@ class Operation:
292293

293294

294295
@dataclass
295-
class PathItem:
296+
class PathItem(OpenAPIElement):
296297
ref: Optional[str] = None
297298
get: Optional[Operation] = None
298299
put: Optional[Operation] = None
@@ -304,7 +305,7 @@ class PathItem:
304305
parameters: Optional[List[Union[Parameter, Reference]]] = None
305306

306307

307-
class SecurityScheme(ABC):
308+
class SecurityScheme(OpenAPIElement, ABC):
308309
"""Abstract security scheme"""
309310

310311

@@ -333,7 +334,7 @@ class OAuth2Security(SecurityScheme):
333334

334335

335336
@dataclass
336-
class Tag:
337+
class Tag(OpenAPIElement):
337338
name: str
338339
description: Optional[str] = None
339340
external_docs: Optional[ExternalDocs] = None

0 commit comments

Comments
 (0)