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.
Files changed (31) hide show
  1. OpenApiDriver/openapi_executors.py +8 -8
  2. OpenApiDriver/openapi_reader.py +12 -13
  3. OpenApiDriver/openapidriver.libspec +4 -41
  4. OpenApiLibCore/__init__.py +0 -2
  5. OpenApiLibCore/annotations.py +8 -1
  6. OpenApiLibCore/data_generation/__init__.py +0 -2
  7. OpenApiLibCore/data_generation/body_data_generation.py +52 -71
  8. OpenApiLibCore/data_generation/data_generation_core.py +82 -62
  9. OpenApiLibCore/data_invalidation.py +37 -20
  10. OpenApiLibCore/dto_base.py +20 -86
  11. OpenApiLibCore/localized_faker.py +88 -0
  12. OpenApiLibCore/models.py +715 -0
  13. OpenApiLibCore/openapi_libcore.libspec +47 -283
  14. OpenApiLibCore/openapi_libcore.py +20 -46
  15. OpenApiLibCore/parameter_utils.py +23 -17
  16. OpenApiLibCore/path_functions.py +5 -4
  17. OpenApiLibCore/protocols.py +7 -5
  18. OpenApiLibCore/request_data.py +67 -102
  19. OpenApiLibCore/resource_relations.py +2 -3
  20. OpenApiLibCore/validation.py +49 -161
  21. OpenApiLibCore/value_utils.py +46 -358
  22. openapi_libgen/__init__.py +0 -46
  23. openapi_libgen/command_line.py +7 -19
  24. openapi_libgen/generator.py +84 -0
  25. openapi_libgen/spec_parser.py +44 -111
  26. {robotframework_openapitools-1.0.0b2.dist-info → robotframework_openapitools-1.0.0b4.dist-info}/METADATA +98 -1
  27. robotframework_openapitools-1.0.0b4.dist-info/RECORD +40 -0
  28. robotframework_openapitools-1.0.0b2.dist-info/RECORD +0 -37
  29. {robotframework_openapitools-1.0.0b2.dist-info → robotframework_openapitools-1.0.0b4.dist-info}/LICENSE +0 -0
  30. {robotframework_openapitools-1.0.0b2.dist-info → robotframework_openapitools-1.0.0b4.dist-info}/WHEEL +0 -0
  31. {robotframework_openapitools-1.0.0b2.dist-info → robotframework_openapitools-1.0.0b4.dist-info}/entry_points.txt +0 -0
@@ -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 Any, Generator
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
- @dataclass
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
- @dataclass
51
- class ParameterDetails:
52
- type: str
53
- name: str
54
- schema: dict[str, Any]
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
- operation_id=method_item["operationId"],
69
- parameters=method_item.get("parameters", []),
70
- request_body=method_item.get("requestBody", {}),
71
- summary=method_item.get("summary"),
72
- description=method_item.get("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
- else:
75
+ elif operation_details.operationId:
118
76
  keyword_name = remove_unsafe_characters_from_string(
119
- operation_details.operation_id
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 = get_parameter_details(operation_details=operation_details)
123
- path_parameters = [p for p in parameters if p.type == "path"]
124
- query_parameters = [p for p in parameters if p.type == "query"]
125
- header_parameters = [p for p in parameters if p.type == "header"]
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
- if "anyOf" in parameter.schema:
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 body_details:
151
- body_json_type = body_details.schema["type"]
152
- body_python_type = python_type_by_json_type_name(body_json_type).__name__
153
- if body_python_type == "dict" and is_truthy(EXPAND_BODY_ARGUMENTS):
154
- body_properties = body_details.schema["properties"]
155
- for property_name, property_data in body_properties.items():
156
- if "anyOf" in property_data:
157
- property_python_type = "Any"
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"{body_python_type} = UNSET"
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
- if "anyOf" in parameter.schema:
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
- if "anyOf" in parameter.schema:
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(openapi_spec: dict[str, Any]) -> Generator[str, None, None]:
218
- for path_item in get_path_items(openapi_spec["paths"]):
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.0b2
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,,