robotframework-openapitools 1.0.0b2__py3-none-any.whl → 1.0.0b4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- OpenApiDriver/openapi_executors.py +8 -8
- OpenApiDriver/openapi_reader.py +12 -13
- OpenApiDriver/openapidriver.libspec +4 -41
- OpenApiLibCore/__init__.py +0 -2
- OpenApiLibCore/annotations.py +8 -1
- OpenApiLibCore/data_generation/__init__.py +0 -2
- OpenApiLibCore/data_generation/body_data_generation.py +52 -71
- OpenApiLibCore/data_generation/data_generation_core.py +82 -62
- OpenApiLibCore/data_invalidation.py +37 -20
- OpenApiLibCore/dto_base.py +20 -86
- OpenApiLibCore/localized_faker.py +88 -0
- OpenApiLibCore/models.py +715 -0
- OpenApiLibCore/openapi_libcore.libspec +47 -283
- OpenApiLibCore/openapi_libcore.py +20 -46
- OpenApiLibCore/parameter_utils.py +23 -17
- OpenApiLibCore/path_functions.py +5 -4
- OpenApiLibCore/protocols.py +7 -5
- OpenApiLibCore/request_data.py +67 -102
- OpenApiLibCore/resource_relations.py +2 -3
- OpenApiLibCore/validation.py +49 -161
- OpenApiLibCore/value_utils.py +46 -358
- openapi_libgen/__init__.py +0 -46
- openapi_libgen/command_line.py +7 -19
- openapi_libgen/generator.py +84 -0
- openapi_libgen/spec_parser.py +44 -111
- {robotframework_openapitools-1.0.0b2.dist-info → robotframework_openapitools-1.0.0b4.dist-info}/METADATA +98 -1
- robotframework_openapitools-1.0.0b4.dist-info/RECORD +40 -0
- robotframework_openapitools-1.0.0b2.dist-info/RECORD +0 -37
- {robotframework_openapitools-1.0.0b2.dist-info → robotframework_openapitools-1.0.0b4.dist-info}/LICENSE +0 -0
- {robotframework_openapitools-1.0.0b2.dist-info → robotframework_openapitools-1.0.0b4.dist-info}/WHEEL +0 -0
- {robotframework_openapitools-1.0.0b2.dist-info → robotframework_openapitools-1.0.0b4.dist-info}/entry_points.txt +0 -0
openapi_libgen/spec_parser.py
CHANGED
@@ -1,13 +1,18 @@
|
|
1
|
-
from dataclasses import dataclass
|
2
1
|
from os import getenv
|
3
2
|
from string import Template
|
4
|
-
from typing import
|
3
|
+
from typing import Generator
|
5
4
|
|
6
5
|
from robot.utils import is_truthy
|
7
6
|
|
8
7
|
from openapi_libgen.parsing_utils import remove_unsafe_characters_from_string
|
8
|
+
from OpenApiLibCore.models import (
|
9
|
+
ObjectSchema,
|
10
|
+
OpenApiObject,
|
11
|
+
OperationObject,
|
12
|
+
PathItemObject,
|
13
|
+
SchemaObjectTypes,
|
14
|
+
)
|
9
15
|
from OpenApiLibCore.parameter_utils import get_safe_name_for_oas_name
|
10
|
-
from OpenApiLibCore.value_utils import python_type_by_json_type_name
|
11
16
|
|
12
17
|
KEYWORD_TEMPLATE = r"""@keyword
|
13
18
|
{signature}
|
@@ -36,76 +41,29 @@ class BodyTemplate(Template):
|
|
36
41
|
BODY_TEMPLATE = BodyTemplate(BODY_TEMPLATE_)
|
37
42
|
|
38
43
|
|
39
|
-
|
40
|
-
class OperationDetails:
|
44
|
+
class OperationDetails(OperationObject):
|
41
45
|
path: str
|
42
46
|
method: str
|
43
|
-
operation_id: str
|
44
|
-
parameters: list[dict[str, Any]]
|
45
|
-
request_body: dict[str, Any]
|
46
|
-
summary: str
|
47
|
-
description: str
|
48
47
|
|
49
48
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
@dataclass
|
58
|
-
class BodyDetails:
|
59
|
-
schema: dict[str, Any]
|
60
|
-
|
61
|
-
|
62
|
-
def get_path_items(paths: dict[str, Any]) -> Generator[OperationDetails, None, None]:
|
63
|
-
for path, operation_items in paths.items():
|
64
|
-
for method, method_item in operation_items.items():
|
49
|
+
def get_path_items(
|
50
|
+
paths: dict[str, PathItemObject],
|
51
|
+
) -> Generator[OperationDetails, None, None]:
|
52
|
+
for path, path_item_object in paths.items():
|
53
|
+
operations = path_item_object.get_operations()
|
54
|
+
for method, operation_object in operations.items():
|
65
55
|
operation_details = OperationDetails(
|
66
56
|
path=path,
|
67
57
|
method=method,
|
68
|
-
|
69
|
-
parameters=
|
70
|
-
|
71
|
-
summary=
|
72
|
-
description=
|
58
|
+
operationId=operation_object.operationId,
|
59
|
+
parameters=operation_object.parameters,
|
60
|
+
requestBody=operation_object.requestBody,
|
61
|
+
summary=operation_object.summary,
|
62
|
+
description=operation_object.description,
|
73
63
|
)
|
74
64
|
yield operation_details
|
75
65
|
|
76
66
|
|
77
|
-
def get_parameter_details(
|
78
|
-
operation_details: OperationDetails,
|
79
|
-
) -> list[ParameterDetails]:
|
80
|
-
def _get_parameter_details(
|
81
|
-
data: OperationDetails,
|
82
|
-
) -> Generator[ParameterDetails, None, None]:
|
83
|
-
for param_data in data.parameters:
|
84
|
-
name = param_data["name"]
|
85
|
-
type = param_data["in"]
|
86
|
-
if not (schema := param_data.get("schema", {})):
|
87
|
-
content = param_data["content"]
|
88
|
-
for _, media_data in content.items():
|
89
|
-
schema = media_data["schema"]
|
90
|
-
|
91
|
-
yield ParameterDetails(
|
92
|
-
type=type,
|
93
|
-
name=name,
|
94
|
-
schema=schema,
|
95
|
-
)
|
96
|
-
|
97
|
-
return list(_get_parameter_details(data=operation_details))
|
98
|
-
|
99
|
-
|
100
|
-
def get_body_details(operation_details: OperationDetails) -> BodyDetails | None:
|
101
|
-
if not (body_data := operation_details.request_body):
|
102
|
-
return None
|
103
|
-
content = body_data["content"]
|
104
|
-
if not (schema := content.get("application/json")):
|
105
|
-
return None
|
106
|
-
return BodyDetails(schema=schema["schema"])
|
107
|
-
|
108
|
-
|
109
67
|
def get_keyword_signature(operation_details: OperationDetails) -> str:
|
110
68
|
USE_SUMMARY_AS_KEYWORD_NAME = getenv("USE_SUMMARY_AS_KEYWORD_NAME")
|
111
69
|
EXPAND_BODY_ARGUMENTS = getenv("EXPAND_BODY_ARGUMENTS")
|
@@ -114,17 +72,19 @@ def get_keyword_signature(operation_details: OperationDetails) -> str:
|
|
114
72
|
keyword_name = remove_unsafe_characters_from_string(
|
115
73
|
operation_details.summary
|
116
74
|
).lower()
|
117
|
-
|
75
|
+
elif operation_details.operationId:
|
118
76
|
keyword_name = remove_unsafe_characters_from_string(
|
119
|
-
operation_details.
|
77
|
+
operation_details.operationId
|
120
78
|
).lower()
|
79
|
+
else:
|
80
|
+
keyword_name = remove_unsafe_characters_from_string(
|
81
|
+
f"{operation_details.method}_{operation_details.path}"
|
82
|
+
)
|
121
83
|
|
122
|
-
parameters =
|
123
|
-
path_parameters = [p for p in parameters if p.
|
124
|
-
query_parameters = [p for p in parameters if p.
|
125
|
-
header_parameters = [p for p in parameters if p.
|
126
|
-
|
127
|
-
body_details = get_body_details(operation_details=operation_details)
|
84
|
+
parameters = operation_details.parameters or []
|
85
|
+
path_parameters = [p for p in parameters if p.in_ == "path" and p.schema_]
|
86
|
+
query_parameters = [p for p in parameters if p.in_ == "query" and p.schema_]
|
87
|
+
header_parameters = [p for p in parameters if p.in_ == "header" and p.schema_]
|
128
88
|
|
129
89
|
argument_parts: list[str] = []
|
130
90
|
# Keep track of the already used argument names. From the OAS:
|
@@ -133,34 +93,21 @@ def get_keyword_signature(operation_details: OperationDetails) -> str:
|
|
133
93
|
keyword_argument_names: set[str] = set()
|
134
94
|
|
135
95
|
for parameter in path_parameters:
|
136
|
-
|
137
|
-
parameter_python_type = "Any"
|
138
|
-
else:
|
139
|
-
parameter_json_type = parameter.schema["type"]
|
140
|
-
parameter_python_type = python_type_by_json_type_name(
|
141
|
-
parameter_json_type
|
142
|
-
).__name__
|
143
|
-
annotation = f"{parameter_python_type} = UNSET"
|
96
|
+
annotation = f"{parameter.schema_.annotation_string} = UNSET"
|
144
97
|
safe_name = get_safe_name_for_oas_name(parameter.name)
|
145
98
|
keyword_argument_names.add(safe_name)
|
146
99
|
argument = f", {safe_name}: {annotation}"
|
147
100
|
argument_parts.append(argument)
|
148
101
|
arguments = "".join(argument_parts)
|
149
102
|
|
150
|
-
if
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
else:
|
159
|
-
property_json_type = property_data["type"]
|
160
|
-
property_python_type = python_type_by_json_type_name(
|
161
|
-
property_json_type
|
162
|
-
).__name__
|
163
|
-
annotation = f"{property_python_type} = UNSET"
|
103
|
+
if operation_details.requestBody and operation_details.requestBody.schema_:
|
104
|
+
schema = operation_details.requestBody.schema_
|
105
|
+
if isinstance(schema, ObjectSchema) and is_truthy(EXPAND_BODY_ARGUMENTS):
|
106
|
+
body_properties: dict[str, SchemaObjectTypes] = getattr(
|
107
|
+
schema.properties, "root", {}
|
108
|
+
)
|
109
|
+
for property_name, property_schema in body_properties.items():
|
110
|
+
annotation = f"{property_schema.annotation_string} = UNSET"
|
164
111
|
safe_name = get_safe_name_for_oas_name(property_name)
|
165
112
|
if safe_name in keyword_argument_names:
|
166
113
|
safe_name = "body_" + safe_name
|
@@ -168,19 +115,12 @@ def get_keyword_signature(operation_details: OperationDetails) -> str:
|
|
168
115
|
argument = f", {safe_name}: {annotation}"
|
169
116
|
arguments += argument
|
170
117
|
else:
|
171
|
-
annotation = f"{
|
118
|
+
annotation = f"{schema.annotation_string} = UNSET"
|
172
119
|
argument = f", body: {annotation}"
|
173
120
|
arguments += argument
|
174
121
|
|
175
122
|
for parameter in query_parameters:
|
176
|
-
|
177
|
-
parameter_python_type = "Any"
|
178
|
-
else:
|
179
|
-
parameter_json_type = parameter.schema["type"]
|
180
|
-
parameter_python_type = python_type_by_json_type_name(
|
181
|
-
parameter_json_type
|
182
|
-
).__name__
|
183
|
-
annotation = f"{parameter_python_type} = UNSET"
|
123
|
+
annotation = f"{parameter.schema_.annotation_string} = UNSET"
|
184
124
|
safe_name = get_safe_name_for_oas_name(parameter.name)
|
185
125
|
if safe_name in keyword_argument_names:
|
186
126
|
safe_name = "query_" + safe_name
|
@@ -189,14 +129,7 @@ def get_keyword_signature(operation_details: OperationDetails) -> str:
|
|
189
129
|
arguments += argument
|
190
130
|
|
191
131
|
for parameter in header_parameters:
|
192
|
-
|
193
|
-
parameter_python_type = "Any"
|
194
|
-
else:
|
195
|
-
parameter_json_type = parameter.schema["type"]
|
196
|
-
parameter_python_type = python_type_by_json_type_name(
|
197
|
-
parameter_json_type
|
198
|
-
).__name__
|
199
|
-
annotation = f"{parameter_python_type} = UNSET"
|
132
|
+
annotation = f"{parameter.schema_.annotation_string} = UNSET"
|
200
133
|
safe_name = get_safe_name_for_oas_name(parameter.name)
|
201
134
|
if safe_name in keyword_argument_names:
|
202
135
|
safe_name = "header_" + safe_name
|
@@ -214,8 +147,8 @@ def get_keyword_body(data: OperationDetails) -> str:
|
|
214
147
|
return BODY_TEMPLATE.safe_substitute(path_value=data.path, method_value=data.method)
|
215
148
|
|
216
149
|
|
217
|
-
def get_keyword_data(
|
218
|
-
for path_item in get_path_items(
|
150
|
+
def get_keyword_data(openapi_object: OpenApiObject) -> Generator[str, None, None]:
|
151
|
+
for path_item in get_path_items(openapi_object.paths):
|
219
152
|
signature = get_keyword_signature(path_item)
|
220
153
|
body = get_keyword_body(path_item)
|
221
154
|
yield KEYWORD_TEMPLATE.format(signature=signature, body=body)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: robotframework-openapitools
|
3
|
-
Version: 1.0.
|
3
|
+
Version: 1.0.0b4
|
4
4
|
Summary: A set of Robot Framework libraries to test APIs for which the OAS is available.
|
5
5
|
License: Apache License
|
6
6
|
Version 2.0, January 2004
|
@@ -220,6 +220,7 @@ Requires-Dist: Jinja2 (>=3.1.2)
|
|
220
220
|
Requires-Dist: black (>=24.1.0)
|
221
221
|
Requires-Dist: openapi-core (>=0.19.0)
|
222
222
|
Requires-Dist: prance[cli] (>=23)
|
223
|
+
Requires-Dist: pydantic (>=2.11.0)
|
223
224
|
Requires-Dist: requests (>=2.31.0)
|
224
225
|
Requires-Dist: rich_click (>=1.7.0)
|
225
226
|
Requires-Dist: robotframework (>=6.0.0,!=7.0.0)
|
@@ -235,3 +236,99 @@ OpenApiTools is a set of libraries centered around the OpenAPI Specification:
|
|
235
236
|
- [OpenApiDriver](./driver.md)
|
236
237
|
- [OpenApiLibCore](./libcore.md)
|
237
238
|
|
239
|
+
|
240
|
+
## New in OpenApiTools v1.0.0
|
241
|
+
|
242
|
+
Inspired by the work Bartlomiej and Mateusz did on #roboswag, I've created a CLI tool that generates a fully functional Robot Framework (Python) library that builds on OpenApiLibCore for automatic request data generation and request execution.
|
243
|
+
|
244
|
+
### So how does it work?
|
245
|
+
After installing / updating to the v1.0.0 beta (`pip install robotframework-openapitools==1.0.0b3`) , there's a new CLI command available in your (virtual) environment: `generate-library`. You'll have to provide a path to the openapi spec (json or yaml, can be a url or path to the file), provide a path to where to generate the library and (optionally) a name for the library:
|
246
|
+
|
247
|
+
```
|
248
|
+
$ generate-library
|
249
|
+
Please provide a source for the generation:
|
250
|
+
$ http://127.0.0.1:8000/openapi.json
|
251
|
+
Please provide a path to where the library will be generated:
|
252
|
+
$ ./generated
|
253
|
+
Please provide a name for the library [default: FastAPI]:
|
254
|
+
$ My Generated Library
|
255
|
+
generated/MyGeneratedLibrary/__init__.py created
|
256
|
+
generated/MyGeneratedLibrary/my_generated_library.py created
|
257
|
+
```
|
258
|
+
|
259
|
+
> Note: there's currently 2 environment variables that are taken into account by the generator; USE_SUMMARY_AS_KEYWORD_NAME can result in nicer keyword names (but: uniqueness is not guaranteed, so you might need to rename some of the generated keywords manually) and EXPAND_BODY_ARGUMENTS is what a recent poll in #api-testing was about.
|
260
|
+
|
261
|
+
If the location where the library is located is in your Python search path, you'll be able to use it like a regular Robot Framework library (in fact, it's a drop-in replacement for OpenApiLibCore):
|
262
|
+
|
263
|
+
```{robot}
|
264
|
+
*** Settings ***
|
265
|
+
Library MyGeneratedLibrary
|
266
|
+
... source=${ORIGIN}/openapi.json
|
267
|
+
... origin=${ORIGIN}
|
268
|
+
... base_path=${EMPTY}
|
269
|
+
... mappings_path=${ROOT}/tests/user_implemented/custom_user_mappings.py
|
270
|
+
Variables ${ROOT}/tests/variables.py
|
271
|
+
|
272
|
+
|
273
|
+
*** Variables ***
|
274
|
+
${ORIGIN}= http://localhost:8000
|
275
|
+
|
276
|
+
|
277
|
+
*** Test Cases ***
|
278
|
+
Test Generated Keywords: Get Employees
|
279
|
+
${response}= Get Employees
|
280
|
+
Should Be Equal As Integers ${response.status_code} 200
|
281
|
+
|
282
|
+
Test Generated Keywords: Post Employee
|
283
|
+
VAR &{body} name=Robin the Robot
|
284
|
+
${response}= Post Employee body=${body}
|
285
|
+
# ${response}= Post Employee name=Robin the Robot
|
286
|
+
Should Be Equal As Integers ${response.status_code} 201
|
287
|
+
Should Be Equal ${response.json()}[name] Robin the Robot
|
288
|
+
|
289
|
+
Test Generated Keywords: Get Employee
|
290
|
+
${response}= Get Employee
|
291
|
+
Should Be Equal As Integers ${response.status_code} 200
|
292
|
+
|
293
|
+
Test Generated Keywords: Patch Employee
|
294
|
+
${employee_id}= Get Valid Id For Path path=/employees/{employee_id}
|
295
|
+
VAR &{body} date_of_birth=2021-12-31
|
296
|
+
${response}= Patch Employee employee_id=${employee_id} body=${body}
|
297
|
+
# ${response}= Patch Employee employee_id=${employee_id} date_of_birth=2021-12-31
|
298
|
+
Should Be Equal As Integers ${response.status_code} 403
|
299
|
+
|
300
|
+
Test Generated Keywords: Post WageGroup
|
301
|
+
VAR &{body} hourly_rate=99.99
|
302
|
+
${response}= Post Wagegroup body=${body}
|
303
|
+
# ${response}= Post Wagegroup hourly_rate=99.99
|
304
|
+
Should Be Equal As Integers ${response.status_code} 201
|
305
|
+
Should Be Equal As Numbers ${response.json()}[hourly-rate] 99.99
|
306
|
+
|
307
|
+
Test Generated Keywords: Get Energy Label
|
308
|
+
${response}= Get Energy Label
|
309
|
+
... zipcode=1111AA
|
310
|
+
... home_number=10
|
311
|
+
... extension=too long to be acceptable
|
312
|
+
... validate_against_schema=${FALSE}
|
313
|
+
Should Be Equal As Integers ${response.status_code} 422
|
314
|
+
|
315
|
+
VAR @{omit} extension
|
316
|
+
${response}= Get Energy Label
|
317
|
+
... zipcode=1111AA
|
318
|
+
... home_number=10
|
319
|
+
... extension=too long to be acceptable
|
320
|
+
... omit_parameters=${omit}
|
321
|
+
Should Be Equal As Integers ${response.status_code} 200
|
322
|
+
```
|
323
|
+
|
324
|
+
### Contributions and feedback
|
325
|
+
|
326
|
+
So now I need your feedback! Does the library generator work for your openapi spec? Does the library work / do all the generated keywords work? Please let me know of any issues you run into!
|
327
|
+
Things I'd like to address / improve before an official release:
|
328
|
+
- parameters with union types (e.g. int or float) are currently annotated as Any.
|
329
|
+
- support for lists / arrays is limited (i.e. not supported as body)
|
330
|
+
- objects / dicts are currently only typed as dict; I'm looking into TypedDict annotation for better auto-complete / auto-conversion
|
331
|
+
- a documentation rework
|
332
|
+
|
333
|
+
Subscribe to https://app.slack.com/client/T07PJQ9S7/CKK0X68KD for updates
|
334
|
+
|
@@ -0,0 +1,40 @@
|
|
1
|
+
OpenApiDriver/__init__.py,sha256=YjHr-j8g9KwRriNCw_ABvCEbUEp118J70xeJ_t7qcas,1453
|
2
|
+
OpenApiDriver/openapi_executors.py,sha256=4rBaRiVquPkWgTFMSeKbDqWi6ZlYOwcHDkNwotb9TPc,12536
|
3
|
+
OpenApiDriver/openapi_reader.py,sha256=1M3nFRRLgD3Vepiru_jqYgVrnkRznFpR7lzdUKetxYw,4340
|
4
|
+
OpenApiDriver/openapidriver.libspec,sha256=fxh2m7HAO_xK-TyEWlgbm8SeFC-iKcJD4vbHM-uCHvM,26481
|
5
|
+
OpenApiDriver/openapidriver.py,sha256=vypR00YZS3ygGfFxdUedLdCm_f_bWDLMpD1vb49-O0A,15321
|
6
|
+
OpenApiDriver/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
7
|
+
OpenApiLibCore/__init__.py,sha256=CGfgD0W2GcRDc5Q-tDpWk4IDpUmdCSZVPZ18a_KN-co,1733
|
8
|
+
OpenApiLibCore/annotations.py,sha256=YmvWKTbhyxRk2aWFra3v-3p30e96TFJ-CV9f3X90rPs,238
|
9
|
+
OpenApiLibCore/data_generation/__init__.py,sha256=NJViPQGHkczF2gxfS0wE2vE3wCRU9ixDEwHPMZApu6A,206
|
10
|
+
OpenApiLibCore/data_generation/body_data_generation.py,sha256=s7lBsh3Tr9lMKfgDYhY2ROTKVIpVGHDUgNh-65U5i-4,8266
|
11
|
+
OpenApiLibCore/data_generation/data_generation_core.py,sha256=UKtKnD7nnOZhiZOIHTZh5Fg5xMMW3M10ofgmGjiRhtI,9004
|
12
|
+
OpenApiLibCore/data_invalidation.py,sha256=UjNUWXASk7AqqDkGx-3mU7SFb46pjP-A5Q5u1xXksrA,11293
|
13
|
+
OpenApiLibCore/dto_base.py,sha256=CF7a8XPcRjWnHuRap_dV8Pcw3f18vxzEHQ5bhO0-FiE,9108
|
14
|
+
OpenApiLibCore/dto_utils.py,sha256=5dvMYM2Nt9gXq6GGTGJjU5Z75x9p9ky-1V01aLTZgX8,3177
|
15
|
+
OpenApiLibCore/localized_faker.py,sha256=-Z3ry6V7xIkmAlUq70a1L_OspAPZTDFt4RFo3zj4Llo,2205
|
16
|
+
OpenApiLibCore/models.py,sha256=dHpduBUtbLkxJHsVF5kgt-qCku6Lq1TijD-8-U5By2Q,22423
|
17
|
+
OpenApiLibCore/oas_cache.py,sha256=Z2v0mn6JwKchbUKojYVt9sXi8Mc4LoENtN_ekTUtzfI,387
|
18
|
+
OpenApiLibCore/openapi_libcore.libspec,sha256=VX97Z7bPQLdt7uuhskGgUGoZc1klE7m63i5mrWtUPVM,44119
|
19
|
+
OpenApiLibCore/openapi_libcore.py,sha256=xyHVShyEvSmBNMVlyK1N8TOT4QReTfvZ3vF7HrsB-Gw,35432
|
20
|
+
OpenApiLibCore/parameter_utils.py,sha256=SifTQu-VyPw5jvAbzHdPBHX04PeF2Y5HEp-UNBk_9Ho,3530
|
21
|
+
OpenApiLibCore/path_functions.py,sha256=JYsJT76DdQtlGLqMwzYKj_EkSkNkRrVcXN3JfTe0CDg,8097
|
22
|
+
OpenApiLibCore/path_invalidation.py,sha256=2iYjkskMV-7lWu_id_LbVIiumffMWZicqoIKeewqpFA,1539
|
23
|
+
OpenApiLibCore/protocols.py,sha256=lzUJ2meBvqUoJrqBa3mS-63SaPeNelQngkMvW_BgzG4,877
|
24
|
+
OpenApiLibCore/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
25
|
+
OpenApiLibCore/request_data.py,sha256=KK-pPyfZUJGh9uPNUrvYb-DxumPGH9vcqJ_bdKJnmYw,8887
|
26
|
+
OpenApiLibCore/resource_relations.py,sha256=m2MDNIqhyCgnJCJ9nTLG4P_T7RflkCVyUM9V82VxKI0,1733
|
27
|
+
OpenApiLibCore/validation.py,sha256=q5qeAVKKmLkCMCPRt7-SG0IXSCk3F_USy-7kPQ5tjOQ,15235
|
28
|
+
OpenApiLibCore/value_utils.py,sha256=_x7bjrSyozIqzlnoo9KjguM322q-pDob5EOMpDpH7do,7519
|
29
|
+
openapi_libgen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
30
|
+
openapi_libgen/command_line.py,sha256=rWByjZDPYYra6WOsINL2zj5Ny3YSIXiTrhRjSBA4FRE,2380
|
31
|
+
openapi_libgen/generator.py,sha256=kK5SxhTJ4uFBoKegXuYwlE-qMMKEccC4T3_BHYZ3yBg,2727
|
32
|
+
openapi_libgen/parsing_utils.py,sha256=d_N-v619SR6iyolz65IGN12H5wMUA8dzPuG1l7rv5gg,821
|
33
|
+
openapi_libgen/spec_parser.py,sha256=6yZTJOdzXZ-ew__0dpm6XOAmBSfC3e91URI333ujIAg,6322
|
34
|
+
openapi_libgen/templates/__init__.jinja,sha256=92OFwNzeO7lEiUBv04GfjKXA1088V7GbeneASBShbmc,102
|
35
|
+
openapi_libgen/templates/library.jinja,sha256=tIwJuGerOUJmMt928P_38MMfcnSHZqcPDPEJ56R6wT0,952
|
36
|
+
robotframework_openapitools-1.0.0b4.dist-info/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
|
37
|
+
robotframework_openapitools-1.0.0b4.dist-info/METADATA,sha256=Zy0USPxvhvKpVnVSBeR0-bAc3560wWZ2tFAB69Rap7c,19102
|
38
|
+
robotframework_openapitools-1.0.0b4.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
|
39
|
+
robotframework_openapitools-1.0.0b4.dist-info/entry_points.txt,sha256=_yd5PITEJf85hIEsrRkkWxXePf_O9YOOUjON3TYLy0c,69
|
40
|
+
robotframework_openapitools-1.0.0b4.dist-info/RECORD,,
|
@@ -1,37 +0,0 @@
|
|
1
|
-
OpenApiDriver/__init__.py,sha256=YjHr-j8g9KwRriNCw_ABvCEbUEp118J70xeJ_t7qcas,1453
|
2
|
-
OpenApiDriver/openapi_executors.py,sha256=NsHhcP6CM3DsQgxqOcKhpAAOM0zjhMmCsrEygIxJleY,12534
|
3
|
-
OpenApiDriver/openapi_reader.py,sha256=BPD_T8PUjfB-NBajogErI2ATmzlUGFJT8Nx5WpM5N5Y,4478
|
4
|
-
OpenApiDriver/openapidriver.libspec,sha256=ObsSKxKimuui6KcJ6PifLJtfOitHbg7bl_TGW-cPpB8,28220
|
5
|
-
OpenApiDriver/openapidriver.py,sha256=vypR00YZS3ygGfFxdUedLdCm_f_bWDLMpD1vb49-O0A,15321
|
6
|
-
OpenApiDriver/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
7
|
-
OpenApiLibCore/__init__.py,sha256=R6n4FTEz0IGD_LehKkOFSQrlt9Bk4Ugl3OicsZ_h84I,1775
|
8
|
-
OpenApiLibCore/annotations.py,sha256=zfWwItXzECBezyQKoom9BLfrRFlU1u4jOF7NEgEAuQQ,135
|
9
|
-
OpenApiLibCore/data_generation/__init__.py,sha256=KYBoMeFsa4fzb6E-BsQBykCGwt54NvXthXiy9VNwQBc,303
|
10
|
-
OpenApiLibCore/data_generation/body_data_generation.py,sha256=c887DfNMghHFyu3omUDxA0SkaQtMaNiWYNM3YREbbEQ,8903
|
11
|
-
OpenApiLibCore/data_generation/data_generation_core.py,sha256=N6hgyc2WHnPfIRwqdUwmT9XSGM2P-l88K2kblk0VCeA,8413
|
12
|
-
OpenApiLibCore/data_invalidation.py,sha256=HSzbeJnzxrlS2NlPfXnCRXvGzGzXvBwiaJ3WXxrZOSw,10503
|
13
|
-
OpenApiLibCore/dto_base.py,sha256=m41QZyL6ChIcC3DcBCpDFkok5wpCZ6K9gjmADyMGOWc,12132
|
14
|
-
OpenApiLibCore/dto_utils.py,sha256=5dvMYM2Nt9gXq6GGTGJjU5Z75x9p9ky-1V01aLTZgX8,3177
|
15
|
-
OpenApiLibCore/oas_cache.py,sha256=Z2v0mn6JwKchbUKojYVt9sXi8Mc4LoENtN_ekTUtzfI,387
|
16
|
-
OpenApiLibCore/openapi_libcore.libspec,sha256=45xzp_QdGtaH4F_RjDDlL6mEKH12f6NndY0nrZi4yaA,53175
|
17
|
-
OpenApiLibCore/openapi_libcore.py,sha256=30FtvsNHkfWZhz55bJq8bnWiHKvX6dEbGyLhbdNAtqY,36257
|
18
|
-
OpenApiLibCore/parameter_utils.py,sha256=_P2GRc_teIixTgPsRgCxY2Bj6nsZq41GoSOhVgfXE0Y,3251
|
19
|
-
OpenApiLibCore/path_functions.py,sha256=757f655yLg5HzvXxlOIQ76i48gK91Ct7KM-D9OAEA3A,8055
|
20
|
-
OpenApiLibCore/path_invalidation.py,sha256=2iYjkskMV-7lWu_id_LbVIiumffMWZicqoIKeewqpFA,1539
|
21
|
-
OpenApiLibCore/protocols.py,sha256=N9HxH9SqNuzWTyOGQuyEGfyorHZyYkehlBsyPse5jtQ,763
|
22
|
-
OpenApiLibCore/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
23
|
-
OpenApiLibCore/request_data.py,sha256=jm6HnTG4xvQfSeYPMIMzowlSi7cuU3XqDGTQ6FdKnUY,10644
|
24
|
-
OpenApiLibCore/resource_relations.py,sha256=Qp5TBNSArLaDfAqcjC5xiHwlB1h4hgAFIfuJnBg5Yxw,1710
|
25
|
-
OpenApiLibCore/validation.py,sha256=uVPgg3k5X1ww4u4-glqC2szSL1qsvqgnCUoqUMjpnek,20067
|
26
|
-
OpenApiLibCore/value_utils.py,sha256=M4k5m0YW1B20-6KD0f9-5xMERWKG8ncu2-5ahC2_VzU,19208
|
27
|
-
openapi_libgen/__init__.py,sha256=9ZfgPSI8AUAcJ59hBRZE1VImhMVRyt6G_w1nYIPORgQ,1543
|
28
|
-
openapi_libgen/command_line.py,sha256=GppzNAAMomd0Dl5c5HGK8chDQw-kaIztD0hqQ2iUEXE,2783
|
29
|
-
openapi_libgen/parsing_utils.py,sha256=d_N-v619SR6iyolz65IGN12H5wMUA8dzPuG1l7rv5gg,821
|
30
|
-
openapi_libgen/spec_parser.py,sha256=9WCuCCDpMMr9jhA8fgzjBhhoF_DEWFc0lBwFcGBDqs4,8509
|
31
|
-
openapi_libgen/templates/__init__.jinja,sha256=92OFwNzeO7lEiUBv04GfjKXA1088V7GbeneASBShbmc,102
|
32
|
-
openapi_libgen/templates/library.jinja,sha256=tIwJuGerOUJmMt928P_38MMfcnSHZqcPDPEJ56R6wT0,952
|
33
|
-
robotframework_openapitools-1.0.0b2.dist-info/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
|
34
|
-
robotframework_openapitools-1.0.0b2.dist-info/METADATA,sha256=Nu-LfVU0r_z8VCFX5UeM3r9eFScb9eiFmyalTBEiF10,14491
|
35
|
-
robotframework_openapitools-1.0.0b2.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
|
36
|
-
robotframework_openapitools-1.0.0b2.dist-info/entry_points.txt,sha256=_yd5PITEJf85hIEsrRkkWxXePf_O9YOOUjON3TYLy0c,69
|
37
|
-
robotframework_openapitools-1.0.0b2.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|