robotframework-openapitools 0.4.0__py3-none-any.whl → 1.0.0b1__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 (60) hide show
  1. OpenApiDriver/__init__.py +44 -41
  2. OpenApiDriver/openapi_executors.py +40 -39
  3. OpenApiDriver/openapi_reader.py +115 -116
  4. OpenApiDriver/openapidriver.libspec +71 -61
  5. OpenApiDriver/openapidriver.py +25 -19
  6. OpenApiLibCore/__init__.py +13 -11
  7. OpenApiLibCore/annotations.py +3 -0
  8. OpenApiLibCore/data_generation/__init__.py +12 -0
  9. OpenApiLibCore/data_generation/body_data_generation.py +269 -0
  10. OpenApiLibCore/data_generation/data_generation_core.py +240 -0
  11. OpenApiLibCore/data_invalidation.py +281 -0
  12. OpenApiLibCore/dto_base.py +29 -35
  13. OpenApiLibCore/dto_utils.py +97 -85
  14. OpenApiLibCore/oas_cache.py +14 -13
  15. OpenApiLibCore/openapi_libcore.libspec +350 -193
  16. OpenApiLibCore/openapi_libcore.py +392 -1698
  17. OpenApiLibCore/parameter_utils.py +89 -0
  18. OpenApiLibCore/path_functions.py +215 -0
  19. OpenApiLibCore/path_invalidation.py +44 -0
  20. OpenApiLibCore/protocols.py +30 -0
  21. OpenApiLibCore/request_data.py +275 -0
  22. OpenApiLibCore/resource_relations.py +54 -0
  23. OpenApiLibCore/validation.py +497 -0
  24. OpenApiLibCore/value_utils.py +528 -481
  25. openapi_libgen/__init__.py +46 -0
  26. openapi_libgen/command_line.py +87 -0
  27. openapi_libgen/parsing_utils.py +26 -0
  28. openapi_libgen/spec_parser.py +212 -0
  29. openapi_libgen/templates/__init__.jinja +3 -0
  30. openapi_libgen/templates/library.jinja +30 -0
  31. robotframework_openapitools-1.0.0b1.dist-info/METADATA +237 -0
  32. robotframework_openapitools-1.0.0b1.dist-info/RECORD +37 -0
  33. {robotframework_openapitools-0.4.0.dist-info → robotframework_openapitools-1.0.0b1.dist-info}/WHEEL +1 -1
  34. robotframework_openapitools-1.0.0b1.dist-info/entry_points.txt +3 -0
  35. roboswag/__init__.py +0 -9
  36. roboswag/__main__.py +0 -3
  37. roboswag/auth.py +0 -44
  38. roboswag/cli.py +0 -80
  39. roboswag/core.py +0 -85
  40. roboswag/generate/__init__.py +0 -1
  41. roboswag/generate/generate.py +0 -121
  42. roboswag/generate/models/__init__.py +0 -0
  43. roboswag/generate/models/api.py +0 -219
  44. roboswag/generate/models/definition.py +0 -28
  45. roboswag/generate/models/endpoint.py +0 -68
  46. roboswag/generate/models/parameter.py +0 -25
  47. roboswag/generate/models/response.py +0 -8
  48. roboswag/generate/models/tag.py +0 -16
  49. roboswag/generate/models/utils.py +0 -60
  50. roboswag/generate/templates/api_init.jinja +0 -15
  51. roboswag/generate/templates/models.jinja +0 -7
  52. roboswag/generate/templates/paths.jinja +0 -68
  53. roboswag/logger.py +0 -33
  54. roboswag/validate/__init__.py +0 -6
  55. roboswag/validate/core.py +0 -3
  56. roboswag/validate/schema.py +0 -21
  57. roboswag/validate/text_response.py +0 -14
  58. robotframework_openapitools-0.4.0.dist-info/METADATA +0 -42
  59. robotframework_openapitools-0.4.0.dist-info/RECORD +0 -41
  60. {robotframework_openapitools-0.4.0.dist-info → robotframework_openapitools-1.0.0b1.dist-info}/LICENSE +0 -0
@@ -1,68 +0,0 @@
1
- from itertools import chain
2
- from typing import Dict, List
3
-
4
- from roboswag.generate.models.parameter import Parameter
5
- from roboswag.generate.models.response import Response
6
-
7
-
8
- class Endpoint:
9
- def __init__(
10
- self,
11
- method_name: str,
12
- http_method,
13
- url,
14
- summary: str,
15
- description: str,
16
- path_params: List[Parameter],
17
- headers: List[Parameter],
18
- query: List[Parameter],
19
- body: Parameter,
20
- responses: Dict[str, Response],
21
- exp_status: str = "200",
22
- ):
23
- self.method_name: str = method_name
24
- self.http_method = http_method
25
- self.url = self.prepare_path(url, path_params)
26
- self.summary: str = summary
27
- self.description: str = description
28
- self.path_params: List[Parameter] = path_params
29
- self.headers: List[Parameter] = headers
30
- self.query: List[Parameter] = query
31
- self.body: Parameter = body
32
- self.responses: Dict[str, Response] = responses
33
- self.exp_status = exp_status
34
- self.method_signature: str = self.get_python_method_signature()
35
-
36
- @staticmethod
37
- def prepare_path(url, path_params):
38
- for param in path_params:
39
- url = url.replace(f"{{{param.name}}}", f"{{{param.python_name}}}")
40
- return url
41
-
42
- def get_python_method_signature(self) -> str:
43
- max_line_length: int = 120
44
- args = [
45
- str(param)
46
- for param in chain(self.path_params, self.headers, self.query)
47
- if param
48
- ]
49
- if self.body:
50
- args.append(f"{self.body}")
51
- args.append(f"exp_status={self.exp_status}")
52
- args.append(f"validate_schema=True")
53
- line = f" def {self.method_name}(self"
54
- prefix = len(line) - 4
55
- last_index = len(args) - 1
56
- method_sig = ""
57
- for index, arg in enumerate(args):
58
- if not arg:
59
- continue
60
- if len(line) + len(arg) + 2 > max_line_length - (
61
- 2 if last_index == index else 0
62
- ):
63
- method_sig += line
64
- line = ",\n" + prefix * " " + arg
65
- else:
66
- line += f", {arg}"
67
- method_sig += line
68
- return method_sig
@@ -1,25 +0,0 @@
1
- from roboswag.generate.models.utils import pythonify_name
2
-
3
-
4
- class Parameter:
5
- def __init__(
6
- self,
7
- name: str,
8
- default=None,
9
- param_type=None,
10
- description=None,
11
- required=None,
12
- schema=None,
13
- ) -> None:
14
- self.name: str = name
15
- self.python_name: str = pythonify_name(name)
16
- self.default = default
17
- self.param_type = param_type
18
- self.description = description
19
- self.required = required
20
- self.schema = schema
21
-
22
- def __str__(self):
23
- if self.default is None:
24
- return self.python_name
25
- return f"{self.python_name}={self.default}"
@@ -1,8 +0,0 @@
1
- class Response:
2
- def __init__(self, description: str, headers=None, schema=None):
3
- self.description = description
4
- self.headers = headers
5
- self.schema = schema
6
-
7
- def __repr__(self):
8
- return f"schema: {self.schema}"
@@ -1,16 +0,0 @@
1
- from typing import List
2
-
3
- from roboswag.generate.models.endpoint import Endpoint
4
- from roboswag.generate.models.utils import pythonify_name
5
-
6
-
7
- class Tag:
8
- def __init__(self, name: str, description: str = "") -> None:
9
- # tag is grouped paths/endpoints
10
- self.name: str = pythonify_name(name, join_mark="", join_fn="title")
11
- self.description: str = description
12
- self.endpoints: List[Endpoint] = []
13
-
14
- @staticmethod
15
- def normalize_tag_name(tag_name: str) -> str:
16
- return tag_name.strip(" -_").title() + "API"
@@ -1,60 +0,0 @@
1
- import datetime
2
- import re
3
- import uuid
4
- from typing import Dict
5
-
6
- RESERVED_WORDS = {"global", "cls", "self"}
7
-
8
- types_mapping = {
9
- "string": {
10
- "": str,
11
- "byte": str,
12
- "password": str,
13
- "date": datetime.date,
14
- "date-time": datetime.datetime,
15
- "binary": bytes,
16
- "uuid": uuid.UUID,
17
- },
18
- "integer": {
19
- "": int,
20
- "int32": int,
21
- "int64": int,
22
- },
23
- "number": {
24
- "float": float,
25
- "double": float,
26
- },
27
- "boolean": bool,
28
- "file": "file",
29
- "array": list(),
30
- "object": object,
31
- }
32
-
33
-
34
- def get_python_type(param_type, param_format=None):
35
- if not param_type:
36
- return str
37
- if not types_mapping[param_type]:
38
- return str
39
- if not isinstance(types_mapping[param_type], Dict):
40
- return types_mapping[param_type]
41
- if param_format:
42
- return types_mapping[param_type][param_format]
43
- return str
44
-
45
-
46
- def pythonify_name(name: str, join_mark: str = "_", join_fn: str = "lower") -> str:
47
- names = re.split("([A-Z][a-z]+)", name)
48
- if join_fn == "lower":
49
- name = join_mark.join(name.lower() for name in names if name.strip())
50
- elif join_fn == "title":
51
- name = join_mark.join(name.title() for name in names if name.strip())
52
- name = name.replace("-", "")
53
- return name
54
-
55
-
56
- def replace_reserved_name(name: str) -> str:
57
- """If the name is in reserved words, append it with _"""
58
- if name in RESERVED_WORDS:
59
- return f"_{name}"
60
- return name
@@ -1,15 +0,0 @@
1
- """
2
- **OpenAPI version:** {{ swagger_version }}
3
- **Title:** {{ infos["title"] }}
4
- **API Version:** {{ infos["version"] }}
5
- {% if infos.get("description") %}**Description:** {{ infos["description"] }}{% endif %}
6
- {% if infos.get("termsOfService") %}**Terms of Service:** {{ infos["termsOfService"] }}{% endif %}
7
- {% if infos.get("contact") %}**Contact:**
8
- {%- for key, value in infos["contact"].items() %}
9
- **{{ key }}:** {{ value }}
10
- {%- endfor %}{% endif %}
11
- {% if infos.get("license") %}**License:**
12
- {%- for key, value in infos["license"].items() %}
13
- **{{ key }}:** {{ value }}
14
- {%- endfor %}{% endif %}
15
- """
@@ -1,7 +0,0 @@
1
- class {{ class_name }}:
2
- def __init__(self{% if properties %}{% for property in properties %}, {{ property.name }}: {{ property.type.__name__ }}{% endfor %}{% endif %}):
3
- {% for property in properties %}self.{{ property.name }} = {{ property.name }}
4
- {% endfor %}
5
- {% if not properties %}
6
- pass
7
- {% endif %}
@@ -1,68 +0,0 @@
1
- import logging
2
- import json
3
-
4
- from roboswag import APIModel
5
- {% if authentication %}from roboswag.auth import {{ authentication }}{% endif %}
6
-
7
-
8
- class {{ class_name }}(APIModel):
9
- {% if description %} """**Description:** {{ description }}"""
10
- {% endif %}
11
- def __init__(self, url):
12
- super().__init__(base_url=url{% if authentication %}, authentication={{ authentication }}{% endif %})
13
- {% for endpoint in endpoints %}
14
- {{ endpoint.method_signature }}{% if endpoint.body %}, validate_payload=True, overwrite_body=None{% endif %}{% if endpoint.headers %}, overwrite_headers=None{% endif %}{% if endpoint.query %}, overwrite_query=None{% endif %}, **kwargs):
15
- {% if (endpoint.summary or endpoint.description) %} """{% if endpoint.summary %}
16
- **Summary:** {{ endpoint.summary }}{% endif %}{% if endpoint.description %}
17
-
18
- **Description:** {{ endpoint.description }}{% endif %}
19
- """{% endif %}
20
- {%- if endpoint.headers %}
21
- headers = {
22
- {%- for param in endpoint.headers %}
23
- "{{ param.name }}": {{ param.python_name }}{{ "," if not loop.last else "" }}
24
- {%- endfor %}
25
- }
26
- if overwrite_headers:
27
- headers = overwrite_headers
28
- {% endif %}
29
- {%- if endpoint.query %}
30
- _query = {
31
- {%- for param in endpoint.query %}
32
- "{{ param.name }}": {{ param.python_name }}{{ "," if not loop.last else "" }}
33
- {%- endfor %}
34
- }
35
- if overwrite_query:
36
- _query = overwrite_query
37
- {% endif %}
38
- {%- if endpoint.body %}
39
- if validate_payload:
40
- {%- if endpoint.body.schema %}
41
- schema = {{ endpoint.body.schema }}
42
- self.validate.schema(json.loads({{ endpoint.body.python_name }}), schema)
43
- {%- endif %}
44
-
45
- _body = overwrite_body if overwrite_body else {{ endpoint.body.python_name }}
46
- {%- endif %}
47
- response = self.{{ endpoint.http_method }}({{ "f" if "{" in endpoint.url else "" }}"{{ endpoint.url }}"{% if endpoint.headers %}, headers=headers{% endif %}{% if endpoint.query %}, query=_query{% endif %}{% if endpoint.body %}, body=_body{% endif %}, status=exp_status, **kwargs)
48
-
49
- if validate_schema:{% for status_code, resp in endpoint.responses.items() %}
50
- {%- if resp.schema %}
51
- {% if not loop.first %}el{% endif %}if response.status_code == {{ status_code }}:
52
- schema = {{ resp.schema }}
53
- self.validate.schema(response.json(), schema)
54
- {%- elif status_code != "default" %}
55
- {% if not loop.first %}el{% endif %}if response.status_code == {{ status_code }}:
56
- # TODO self.validate.response_as_text(response, "FILL EXPECTED MESSAGE")
57
- pass
58
- {%- else %}
59
- {% if not loop.first %}el{% endif %}if response.status_code == "default":
60
- # TODO self.validate.response_as_text(response, "FILL EXPECTED MESSAGE")
61
- pass
62
- {%- endif %}{% endfor %}
63
- else:
64
- logging.error(f"Received status code ({response.status_code}) is not expected by the API specification")
65
- assert False
66
-
67
- return response
68
- {% endfor %}
roboswag/logger.py DELETED
@@ -1,33 +0,0 @@
1
- from pprint import pformat
2
-
3
- from robot.api import logger
4
-
5
-
6
- class Logger:
7
- @staticmethod
8
- def info(message):
9
- logger.info(message)
10
-
11
- @staticmethod
12
- def debug(message):
13
- logger.debug(message)
14
-
15
- @staticmethod
16
- def log_request(response):
17
- # TODO we can add flag for removing auth details (such as passwords, tokens) if needed
18
- if response.history: # TODO print redirects
19
- original_request = response.history[0].request
20
- redirected = "(redirected)"
21
- else:
22
- original_request = response.request
23
- redirected = ""
24
- logger.info(
25
- f"{original_request.method.upper()} {original_request.url} {redirected}\n"
26
- f"headers: {pformat(original_request.headers)}"
27
- ) # TODO make pretty print work
28
-
29
- @staticmethod
30
- def log_response(response):
31
- logger.info(
32
- f"{response.request.method.upper()} response: {response.status_code} {response.text}"
33
- )
@@ -1,6 +0,0 @@
1
- from roboswag.validate.schema import ValidateSchema
2
- from roboswag.validate.text_response import ValidateTextResponse
3
-
4
-
5
- class Validate(ValidateSchema, ValidateTextResponse):
6
- pass
roboswag/validate/core.py DELETED
@@ -1,3 +0,0 @@
1
- class ValidateBase:
2
- def __init__(self, logger):
3
- self.logger = logger
@@ -1,21 +0,0 @@
1
- import json
2
- from pathlib import Path
3
- from typing import Dict, Union
4
-
5
- import jsonschema
6
-
7
- from roboswag.validate.core import ValidateBase
8
-
9
-
10
- class ValidateSchema(ValidateBase):
11
- def schema(self, to_validate, schema: Union[str, Path, Dict]):
12
- self.logger.info("Validating schema...")
13
- if isinstance(schema, (str, Path)):
14
- with open(schema) as fp:
15
- schema = json.load(fp)
16
- self.logger.debug(f"Schema:\n{json.dumps(schema, indent=4)}")
17
- try:
18
- jsonschema.validate(instance=to_validate, schema=schema)
19
- except jsonschema.exceptions.ValidationError as err:
20
- raise err
21
- self.logger.info("Schema is valid.")
@@ -1,14 +0,0 @@
1
- from roboswag.validate.core import ValidateBase
2
-
3
-
4
- class ValidateTextResponse(ValidateBase):
5
- def response_as_text(self, response, exp_response):
6
- self.logger.info("Validating response...")
7
- assertion_err_msg = (
8
- "Received response description:\n"
9
- f" '{response.text}'\n"
10
- "does not equal expected:\n"
11
- f" '{exp_response}'"
12
- )
13
- assert response.text == exp_response, assertion_err_msg
14
- self.logger.info("Response is valid.")
@@ -1,42 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: robotframework-openapitools
3
- Version: 0.4.0
4
- Summary: A set of Robot Framework libraries to test APIs for which the OAS is available.
5
- Home-page: https://github.com/MarketSquare/robotframework-openapitools
6
- License: Apache-2.0
7
- Author: Bartlomiej Hirsz
8
- Author-email: bartek.hirsz@gmail.com
9
- Maintainer: Robin Mackaij
10
- Maintainer-email: r.a.mackaij@gmail.com
11
- Requires-Python: >=3.8,<4.0
12
- Classifier: Framework :: Robot Framework
13
- Classifier: License :: OSI Approved :: Apache Software License
14
- Classifier: Operating System :: OS Independent
15
- Classifier: Programming Language :: Python :: 3
16
- Classifier: Programming Language :: Python :: 3.8
17
- Classifier: Programming Language :: Python :: 3.9
18
- Classifier: Programming Language :: Python :: 3.10
19
- Classifier: Programming Language :: Python :: 3.11
20
- Classifier: Programming Language :: Python :: 3.12
21
- Classifier: Programming Language :: Python :: 3.13
22
- Classifier: Topic :: Software Development :: Testing
23
- Classifier: Topic :: Software Development :: Testing :: Acceptance
24
- Requires-Dist: Faker (>=23.1.0)
25
- Requires-Dist: Jinja2 (>=3.1.2)
26
- Requires-Dist: black (>=24.1.0)
27
- Requires-Dist: openapi-core (>=0.19.0)
28
- Requires-Dist: prance[cli] (>=23)
29
- Requires-Dist: requests (>=2.31.0)
30
- Requires-Dist: rich_click (>=1.7.0)
31
- Requires-Dist: robotframework (>=6.0.0,!=7.0.0)
32
- Requires-Dist: robotframework-datadriver (>=1.10.0)
33
- Requires-Dist: rstr (>=3.2.0)
34
- Description-Content-Type: text/markdown
35
-
36
- # OpenApiTools for Robot Framework
37
-
38
- OpenApiTools is a set of libraries centered around the OpenAPI Specification:
39
-
40
- - [OpenApiDriver](./driver.md)
41
- - [OpenApiLibCore](./libcore.md)
42
-
@@ -1,41 +0,0 @@
1
- OpenApiDriver/__init__.py,sha256=34h5RkB8nBNRKPId4r_B_xzcgXJYD3m2QYwIaPfpv80,1331
2
- OpenApiDriver/openapi_executors.py,sha256=L_oixhT1Ux6ZOTz0-iQEBos_Qz1kkRc3W_YjI-A-VuM,12434
3
- OpenApiDriver/openapi_reader.py,sha256=4kSM-hFd54ws-jq88inbienkaoC5sSDwfRuxLrHP7aA,4652
4
- OpenApiDriver/openapidriver.libspec,sha256=5Wleyi6EM42z4_Wzg38L5YGUPNRBjGw-XU0ZaYut4ow,27181
5
- OpenApiDriver/openapidriver.py,sha256=HD2t32pU0RokKbf2VopjxlArIVoh_-fLcwiJmfQ2MJM,15209
6
- OpenApiDriver/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- OpenApiLibCore/__init__.py,sha256=CGZRj3Vh4TZ76LOLWJOrBFr27QYWVXsO1imLqH-aP9E,1604
8
- OpenApiLibCore/dto_base.py,sha256=GE_vXY0bJsDfOyQFahRy9jVgFR6BbWDmyrAegl1NQS4,12299
9
- OpenApiLibCore/dto_utils.py,sha256=maYX9QqPaJtiEo8vIFQLsT2FOT-LUGVnNcVaca4zCDk,2903
10
- OpenApiLibCore/oas_cache.py,sha256=Qg_Is5pAJZjZu5VmwEEarQs8teKrh3Y2psCcpDLU5Y4,379
11
- OpenApiLibCore/openapi_libcore.libspec,sha256=o3_sXNjA3QSr-sPH6Ai5mGPg0MFToLJ5GnTWqZWajfc,47001
12
- OpenApiLibCore/openapi_libcore.py,sha256=zRk8QMc22wFLqpLQQOac1aZgoF_IDQdZdRkrBtfqCF0,93211
13
- OpenApiLibCore/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- OpenApiLibCore/value_utils.py,sha256=wO5ssYTuk4YWWMJb0kl5n20X2r0NG55FXvgLqQd8qvw,18145
15
- roboswag/__init__.py,sha256=-8ql4wuY_ftOZRdCxSmBCMW3WpDk7Ir__st9xcb9qCI,223
16
- roboswag/__main__.py,sha256=sZyVODLDUj4yuWwQEdB8lSOuNsmTfmt4XqbYUgwcIOg,35
17
- roboswag/auth.py,sha256=Nh4p0OsRH6dvpPSPmFfLVsTcNXqDemzmtqHymRbCWNc,1323
18
- roboswag/cli.py,sha256=mmdRPmu1J0w9gmHcd0ezSi7HAWLi_U18wELVztmIucs,2216
19
- roboswag/core.py,sha256=TFv6XTno-c9SqzVuFjgUbpgn7xAQvuSsr3-hk3GxegY,2870
20
- roboswag/generate/__init__.py,sha256=ibIs0SR9XqajHy9fPQJdCAQrTr1JXym3T0PZB_hXR_M,59
21
- roboswag/generate/generate.py,sha256=a2okQD56z3Ql7d_LF9GfO_mM-jtgwUFYmjiXWmweTew,4706
22
- roboswag/generate/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
- roboswag/generate/models/api.py,sha256=wuBGnmP85DDUjlGDUrmZRxAxE8tlG5PAAit57qtupzU,8528
24
- roboswag/generate/models/definition.py,sha256=PX4sPU000ceezlgF7s3UqIHzp5gqzurQbSMdkvHQM0o,841
25
- roboswag/generate/models/endpoint.py,sha256=GnHtZV-2kB-28QNrJNvCUSoOy2tmT6qUlmeIG50ZhGg,2304
26
- roboswag/generate/models/parameter.py,sha256=CWUuAgT8opjcuJ_ew6q-nYe5nWDZ8g4pe8H55bXQhf0,682
27
- roboswag/generate/models/response.py,sha256=KTcQez15japXnSMsrYGdfRF9jz5igQf_ZFwpG4CejX8,257
28
- roboswag/generate/models/tag.py,sha256=uV3YSujM-f7HVbHyWMZ46PV65SOzrYCiXsRhk7PwcGY,561
29
- roboswag/generate/models/utils.py,sha256=NPDl9_urjctkL0nzYEb1lOMcbX64VqliszPPGhzklwY,1550
30
- roboswag/generate/templates/api_init.jinja,sha256=NyvQ9I1lhzv3f1nsxaJx2l8iifwsG_HpK44POtNiJjI,621
31
- roboswag/generate/templates/models.jinja,sha256=upTukanAN__KcaNLNphn0M2miMcJx91r1cqU9F9qiz8,357
32
- roboswag/generate/templates/paths.jinja,sha256=jfqahBD0hSqDwaVfVZn-nFvsiGV-rZNE_p1qBTLbxx4,3191
33
- roboswag/logger.py,sha256=SdxkYw8UITgy0zyGVyUSFh4PVXrDHf8ElZ052iDzF8U,1025
34
- roboswag/validate/__init__.py,sha256=stpgQmvZvqlqPBjZ3Vxhd3wbX_Nb85jyIbj44_EhK_w,188
35
- roboswag/validate/core.py,sha256=CfUEhkXPFAzIppRSiGyh62j4BYW4vkjIXWEzRcJFD6o,84
36
- roboswag/validate/schema.py,sha256=jyD44GcYU_JQLw5hb1wK-DwxOsbJ-FstoNHwIVVMqoo,711
37
- roboswag/validate/text_response.py,sha256=P7WEC6ot1OG3YDEXRtmOwIFwki8jgq8fMb-L77X4vIo,527
38
- robotframework_openapitools-0.4.0.dist-info/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
39
- robotframework_openapitools-0.4.0.dist-info/METADATA,sha256=gebYOaq4qzFePksuD1iKi6kdc7nYGv9nFuwwWc7IAwc,1621
40
- robotframework_openapitools-0.4.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
41
- robotframework_openapitools-0.4.0.dist-info/RECORD,,