robotframework-openapitools 0.1.3__py3-none-any.whl → 0.2.1__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.
@@ -1,12 +1,12 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
- <keywordspec name="OpenApiLibCore" type="LIBRARY" format="HTML" scope="SUITE" generated="2024-04-05T14:47:48+00:00" specversion="5" source="/workspaces/robotframework-openapitools/src/OpenApiLibCore/openapi_libcore.py" lineno="377">
3
- <version>0.1.3</version>
2
+ <keywordspec name="OpenApiLibCore" type="LIBRARY" format="HTML" scope="SUITE" generated="2024-04-18T10:17:56+00:00" specversion="5" source="/workspaces/robotframework-openapitools/src/OpenApiLibCore/openapi_libcore.py" lineno="415">
3
+ <version>0.2.1</version>
4
4
  <doc>&lt;p&gt;Main class providing the keywords and core logic to interact with an OpenAPI server.&lt;/p&gt;
5
5
  &lt;p&gt;Visit the &lt;a href="https://github.com/MarketSquare/robotframework-openapi-libcore"&gt;library page&lt;/a&gt; for an introduction.&lt;/p&gt;</doc>
6
6
  <tags>
7
7
  </tags>
8
8
  <inits>
9
- <init name="__init__" lineno="385">
9
+ <init name="__init__" lineno="423">
10
10
  <arguments repr="source: str, origin: str = , base_path: str = , mappings_path: str | Path = , invalid_property_default_response: int = 422, default_id_property_name: str = id, faker_locale: str | List[str] | None = None, recursion_limit: int = 1, recursion_default: Any = {}, username: str = , password: str = , security_token: str = , auth: AuthBase | None = None, cert: str | Tuple[str, str] | None = None, verify_tls: bool | str | None = True, extra_headers: Dict[str, str] | None = None, cookies: Dict[str, str] | RequestsCookieJar | None = None, proxies: Dict[str, str] | None = None">
11
11
  <arg kind="POSITIONAL_OR_NAMED" required="true" repr="source: str">
12
12
  <name>source</name>
@@ -144,7 +144,7 @@
144
144
  </init>
145
145
  </inits>
146
146
  <keywords>
147
- <kw name="Authorized Request" lineno="1490">
147
+ <kw name="Authorized Request" lineno="1591">
148
148
  <arguments repr="url: str, method: str, params: Dict[str, Any] | None = None, headers: Dict[str, str] | None = None, json_data: Dict[str, Dict[str, ForwardRef('JSON')] | List[ForwardRef('JSON')] | str | int | float | bool | None] | List[Dict[str, ForwardRef('JSON')] | List[ForwardRef('JSON')] | str | int | float | bool | None] | str | int | float | bool | None = None">
149
149
  <arg kind="POSITIONAL_OR_NAMED" required="true" repr="url: str">
150
150
  <name>url</name>
@@ -174,7 +174,7 @@
174
174
  &lt;p&gt;&amp;gt; Note: provided username / password or auth objects take precedence over token based security&lt;/p&gt;</doc>
175
175
  <shortdoc>Perform a request using the security token or authentication set in the library.</shortdoc>
176
176
  </kw>
177
- <kw name="Ensure In Use" lineno="1394">
177
+ <kw name="Ensure In Use" lineno="1495">
178
178
  <arguments repr="url: str, resource_relation: IdReference">
179
179
  <arg kind="POSITIONAL_OR_NAMED" required="true" repr="url: str">
180
180
  <name>url</name>
@@ -188,7 +188,7 @@
188
188
  <doc>&lt;p&gt;Ensure that the (right-most) &lt;span class="name"&gt;id&lt;/span&gt; of the resource referenced by the &lt;span class="name"&gt;url&lt;/span&gt; is used by the resource defined by the &lt;span class="name"&gt;resource_relation&lt;/span&gt;.&lt;/p&gt;</doc>
189
189
  <shortdoc>Ensure that the (right-most) `id` of the resource referenced by the `url` is used by the resource defined by the `resource_relation`.</shortdoc>
190
190
  </kw>
191
- <kw name="Get Ids From Url" lineno="783">
191
+ <kw name="Get Ids From Url" lineno="866">
192
192
  <arguments repr="url: str">
193
193
  <arg kind="POSITIONAL_OR_NAMED" required="true" repr="url: str">
194
194
  <name>url</name>
@@ -198,7 +198,7 @@
198
198
  <doc>&lt;p&gt;Perform a GET request on the &lt;span class="name"&gt;url&lt;/span&gt; and return the list of resource &lt;span class="name"&gt;ids&lt;/span&gt; from the response.&lt;/p&gt;</doc>
199
199
  <shortdoc>Perform a GET request on the `url` and return the list of resource `ids` from the response.</shortdoc>
200
200
  </kw>
201
- <kw name="Get Invalid Json Data" lineno="1171">
201
+ <kw name="Get Invalid Json Data" lineno="1272">
202
202
  <arguments repr="url: str, method: str, status_code: int, request_data: RequestData">
203
203
  <arg kind="POSITIONAL_OR_NAMED" required="true" repr="url: str">
204
204
  <name>url</name>
@@ -221,7 +221,7 @@
221
221
  &lt;p&gt;&amp;gt; Note: applicable UniquePropertyValueConstraint and IdReference Relations are considered before changes to &lt;span class="name"&gt;json_data&lt;/span&gt; are made.&lt;/p&gt;</doc>
222
222
  <shortdoc>Return `json_data` based on the `dto` on the `request_data` that will cause the provided `status_code` for the `method` operation on the `url`.</shortdoc>
223
223
  </kw>
224
- <kw name="Get Invalidated Parameters" lineno="1219">
224
+ <kw name="Get Invalidated Parameters" lineno="1320">
225
225
  <arguments repr="status_code: int, request_data: RequestData">
226
226
  <arg kind="POSITIONAL_OR_NAMED" required="true" repr="status_code: int">
227
227
  <name>status_code</name>
@@ -235,7 +235,7 @@
235
235
  <doc>&lt;p&gt;Returns a version of &lt;span class="name"&gt;params, headers&lt;/span&gt; as present on &lt;span class="name"&gt;request_data&lt;/span&gt; that has been modified to cause the provided &lt;span class="name"&gt;status_code&lt;/span&gt;.&lt;/p&gt;</doc>
236
236
  <shortdoc>Returns a version of `params, headers` as present on `request_data` that has been modified to cause the provided `status_code`.</shortdoc>
237
237
  </kw>
238
- <kw name="Get Invalidated Url" lineno="1137">
238
+ <kw name="Get Invalidated Url" lineno="1238">
239
239
  <arguments repr="valid_url: str">
240
240
  <arg kind="POSITIONAL_OR_NAMED" required="true" repr="valid_url: str">
241
241
  <name>valid_url</name>
@@ -246,7 +246,7 @@
246
246
  &lt;p&gt;Raises ValueError if the valid_url cannot be invalidated.&lt;/p&gt;</doc>
247
247
  <shortdoc>Return an url with all the path parameters in the `valid_url` replaced by a random UUID.</shortdoc>
248
248
  </kw>
249
- <kw name="Get Json Data For Dto Class" lineno="1031">
249
+ <kw name="Get Json Data For Dto Class" lineno="1114">
250
250
  <arguments repr="schema: Dict[str, Any], dto_class: Dto | Type[Dto], operation_id: str = ">
251
251
  <arg kind="POSITIONAL_OR_NAMED" required="true" repr="schema: Dict[str, Any]">
252
252
  <name>schema</name>
@@ -265,7 +265,7 @@
265
265
  <doc>&lt;p&gt;Generate a valid (json-compatible) dict for all the &lt;span class="name"&gt;dto_class&lt;/span&gt; properties.&lt;/p&gt;</doc>
266
266
  <shortdoc>Generate a valid (json-compatible) dict for all the `dto_class` properties.</shortdoc>
267
267
  </kw>
268
- <kw name="Get Json Data With Conflict" lineno="1438">
268
+ <kw name="Get Json Data With Conflict" lineno="1539">
269
269
  <arguments repr="url: str, method: str, dto: Dto, conflict_status_code: int">
270
270
  <arg kind="POSITIONAL_OR_NAMED" required="true" repr="url: str">
271
271
  <name>url</name>
@@ -287,7 +287,7 @@
287
287
  <doc>&lt;p&gt;Return &lt;span class="name"&gt;json_data&lt;/span&gt; based on the &lt;span class="name"&gt;UniquePropertyValueConstraint&lt;/span&gt; that must be returned by the &lt;span class="name"&gt;get_relations&lt;/span&gt; implementation on the &lt;span class="name"&gt;dto&lt;/span&gt; for the given &lt;span class="name"&gt;conflict_status_code&lt;/span&gt;.&lt;/p&gt;</doc>
288
288
  <shortdoc>Return `json_data` based on the `UniquePropertyValueConstraint` that must be returned by the `get_relations` implementation on the `dto` for the given `conflict_status_code`.</shortdoc>
289
289
  </kw>
290
- <kw name="Get Parameterized Endpoint From Url" lineno="1159">
290
+ <kw name="Get Parameterized Endpoint From Url" lineno="1260">
291
291
  <arguments repr="url: str">
292
292
  <arg kind="POSITIONAL_OR_NAMED" required="true" repr="url: str">
293
293
  <name>url</name>
@@ -297,7 +297,7 @@
297
297
  <doc>&lt;p&gt;Return the endpoint as found in the &lt;span class="name"&gt;paths&lt;/span&gt; section based on the given &lt;span class="name"&gt;url&lt;/span&gt;.&lt;/p&gt;</doc>
298
298
  <shortdoc>Return the endpoint as found in the `paths` section based on the given `url`.</shortdoc>
299
299
  </kw>
300
- <kw name="Get Request Data" lineno="823">
300
+ <kw name="Get Request Data" lineno="906">
301
301
  <arguments repr="endpoint: str, method: str">
302
302
  <arg kind="POSITIONAL_OR_NAMED" required="true" repr="endpoint: str">
303
303
  <name>endpoint</name>
@@ -311,7 +311,7 @@
311
311
  <doc>&lt;p&gt;Return an object with valid request data for body, headers and query params.&lt;/p&gt;</doc>
312
312
  <shortdoc>Return an object with valid request data for body, headers and query params.</shortdoc>
313
313
  </kw>
314
- <kw name="Get Valid Id For Endpoint" lineno="687">
314
+ <kw name="Get Valid Id For Endpoint" lineno="770">
315
315
  <arguments repr="endpoint: str, method: str">
316
316
  <arg kind="POSITIONAL_OR_NAMED" required="true" repr="endpoint: str">
317
317
  <name>endpoint</name>
@@ -326,7 +326,7 @@
326
326
  &lt;p&gt;To prevent resource conflicts with other test cases, a new resource is created (POST) if possible.&lt;/p&gt;</doc>
327
327
  <shortdoc>Support keyword that returns the `id` for an existing resource at `endpoint`.</shortdoc>
328
328
  </kw>
329
- <kw name="Get Valid Url" lineno="647">
329
+ <kw name="Get Valid Url" lineno="730">
330
330
  <arguments repr="endpoint: str, method: str">
331
331
  <arg kind="POSITIONAL_OR_NAMED" required="true" repr="endpoint: str">
332
332
  <name>endpoint</name>
@@ -342,7 +342,7 @@
342
342
  &lt;p&gt;&amp;gt; Note: if valid ids cannot be retrieved within the scope of the API, the &lt;span class="name"&gt;PathPropertiesConstraint&lt;/span&gt; Relation can be used. More information can be found &lt;a href="https://marketsquare.github.io/robotframework-openapi-libcore/advanced_use.html"&gt;here&lt;/a&gt;.&lt;/p&gt;</doc>
343
343
  <shortdoc>This keyword returns a valid url for the given `endpoint` and `method`.</shortdoc>
344
344
  </kw>
345
- <kw name="Set Origin" lineno="554">
345
+ <kw name="Set Origin" lineno="592">
346
346
  <arguments repr="origin: str">
347
347
  <arg kind="POSITIONAL_OR_NAMED" required="true" repr="origin: str">
348
348
  <name>origin</name>
@@ -127,8 +127,19 @@ from functools import cached_property
127
127
  from itertools import zip_longest
128
128
  from logging import getLogger
129
129
  from pathlib import Path
130
- from random import choice
131
- from typing import Any, Dict, List, Optional, Set, Tuple, Type, Union
130
+ from random import choice, sample
131
+ from typing import (
132
+ Any,
133
+ Callable,
134
+ Dict,
135
+ Generator,
136
+ List,
137
+ Optional,
138
+ Set,
139
+ Tuple,
140
+ Type,
141
+ Union,
142
+ )
132
143
  from uuid import uuid4
133
144
 
134
145
  from openapi_core import Config, OpenAPI, Spec
@@ -358,6 +369,33 @@ class RequestData:
358
369
  required_properties_dict[key] = value
359
370
  return required_properties_dict
360
371
 
372
+ def get_minimal_body_dict(self) -> Dict[str, Any]:
373
+ required_properties_dict = self.get_required_properties_dict()
374
+
375
+ min_properties = self.dto_schema.get("minProperties", 0)
376
+ number_of_optional_properties_to_add = min_properties - len(
377
+ required_properties_dict
378
+ )
379
+
380
+ if number_of_optional_properties_to_add < 1:
381
+ return required_properties_dict
382
+
383
+ optional_properties_dict = {
384
+ k: v
385
+ for k, v in self.dto.as_dict().items()
386
+ if k not in required_properties_dict
387
+ }
388
+ optional_properties_to_keep = sample(
389
+ sorted(optional_properties_dict), number_of_optional_properties_to_add
390
+ )
391
+ optional_properties_dict = {
392
+ k: v
393
+ for k, v in optional_properties_dict.items()
394
+ if k in optional_properties_to_keep
395
+ }
396
+
397
+ return {**required_properties_dict, **optional_properties_dict}
398
+
361
399
  def get_required_params(self) -> Dict[str, str]:
362
400
  """Get the params dict containing only the required query parameters."""
363
401
  required_parameters = [
@@ -570,7 +608,8 @@ class OpenApiLibCore: # pylint: disable=too-many-instance-attributes
570
608
 
571
609
  @cached_property
572
610
  def validation_spec(self) -> Spec:
573
- return Spec.from_dict(self.openapi_spec)
611
+ _, validation_spec, _ = self._load_specs_and_validator()
612
+ return validation_spec
574
613
 
575
614
  @property
576
615
  def openapi_spec(self) -> Dict[str, Any]:
@@ -580,13 +619,43 @@ class OpenApiLibCore: # pylint: disable=too-many-instance-attributes
580
619
 
581
620
  @cached_property
582
621
  def _openapi_spec(self) -> Dict[str, Any]:
583
- parser = self._load_parser()
622
+ parser, _, _ = self._load_specs_and_validator()
584
623
  return parser.specification
585
624
 
586
- def read_paths(self) -> Dict[str, Any]:
587
- return self.openapi_spec["paths"]
625
+ @cached_property
626
+ def response_validator(
627
+ self,
628
+ ) -> Callable[[RequestsOpenAPIRequest, RequestsOpenAPIResponse], None]:
629
+ _, _, response_validator = self._load_specs_and_validator()
630
+ return response_validator
631
+
632
+ def _get_json_types_from_spec(self, spec: Dict[str, Any]) -> Set[str]:
633
+ json_types: Set[str] = set(self._get_json_types(spec))
634
+ return {json_type for json_type in json_types if json_type is not None}
588
635
 
589
- def _load_parser(self) -> ResolvingParser:
636
+ def _get_json_types(self, item: Any) -> Generator[str, None, None]:
637
+ if isinstance(item, dict):
638
+ content_dict = item.get("content")
639
+ if content_dict is None:
640
+ for value in item.values():
641
+ yield from self._get_json_types(value)
642
+
643
+ else:
644
+ for content_type in content_dict:
645
+ if "json" in content_type:
646
+ yield content_type
647
+
648
+ if isinstance(item, list):
649
+ for list_item in item:
650
+ yield from self._get_json_types(list_item)
651
+
652
+ def _load_specs_and_validator(
653
+ self,
654
+ ) -> Tuple[
655
+ ResolvingParser,
656
+ Spec,
657
+ Callable[[RequestsOpenAPIRequest, RequestsOpenAPIResponse], None],
658
+ ]:
590
659
  try:
591
660
 
592
661
  def recursion_limit_handler(
@@ -599,7 +668,10 @@ class OpenApiLibCore: # pylint: disable=too-many-instance-attributes
599
668
  # will have a global scope due to how the Python import system works. This
600
669
  # ensures that in a Suite of Suites where multiple Suites use the same
601
670
  # `source`, that OAS is only parsed / loaded once.
602
- parser = PARSER_CACHE.get(self._source, None)
671
+ parser, validation_spec, response_validator = PARSER_CACHE.get(
672
+ self._source, (None, None, None)
673
+ )
674
+
603
675
  if parser is None:
604
676
  parser = ResolvingParser(
605
677
  self._source,
@@ -613,9 +685,25 @@ class OpenApiLibCore: # pylint: disable=too-many-instance-attributes
613
685
  "Source was loaded, but no specification was present after parsing."
614
686
  )
615
687
 
616
- PARSER_CACHE[self._source] = parser
688
+ validation_spec = Spec.from_dict(parser.specification)
689
+
690
+ json_types_from_spec: Set[str] = self._get_json_types_from_spec(
691
+ parser.specification
692
+ )
693
+ extra_deserializers = {
694
+ json_type: _json.loads for json_type in json_types_from_spec
695
+ }
696
+ config = Config(extra_media_type_deserializers=extra_deserializers)
697
+ openapi = OpenAPI(spec=validation_spec, config=config)
698
+ response_validator = openapi.validate_response
699
+
700
+ PARSER_CACHE[self._source] = (
701
+ parser,
702
+ validation_spec,
703
+ response_validator,
704
+ )
617
705
 
618
- return parser
706
+ return parser, validation_spec, response_validator
619
707
 
620
708
  except ResolutionError as exception:
621
709
  BuiltIn().fatal_error(
@@ -633,15 +721,10 @@ class OpenApiLibCore: # pylint: disable=too-many-instance-attributes
633
721
  Validate the reponse for a given request against the OpenAPI Spec that is
634
722
  loaded during library initialization.
635
723
  """
636
- if response.content_type == "application/json":
637
- config = None
638
- else:
639
- extra_deserializer = {response.content_type: _json.loads}
640
- config = Config(extra_media_type_deserializers=extra_deserializer)
724
+ self.response_validator(request=request, response=response)
641
725
 
642
- OpenAPI(spec=self.validation_spec, config=config).validate_response(
643
- request, response
644
- )
726
+ def read_paths(self) -> Dict[str, Any]:
727
+ return self.openapi_spec["paths"]
645
728
 
646
729
  @keyword
647
730
  def get_valid_url(self, endpoint: str, method: str) -> str:
@@ -1083,7 +1166,27 @@ class OpenApiLibCore: # pylint: disable=too-many-instance-attributes
1083
1166
 
1084
1167
  json_data: Dict[str, Any] = {}
1085
1168
 
1169
+ property_names = []
1086
1170
  for property_name in schema.get("properties", []):
1171
+ if constrained_values := get_constrained_values(property_name):
1172
+ # do not add properties that are configured to be ignored
1173
+ if IGNORE in constrained_values:
1174
+ continue
1175
+ property_names.append(property_name)
1176
+
1177
+ max_properties = schema.get("maxProperties")
1178
+ if max_properties and len(property_names) > max_properties:
1179
+ required_properties = schema.get("required", [])
1180
+ number_of_optional_properties = max_properties - len(required_properties)
1181
+ optional_properties = [
1182
+ name for name in property_names if name not in required_properties
1183
+ ]
1184
+ selected_optional_properties = sample(
1185
+ optional_properties, number_of_optional_properties
1186
+ )
1187
+ property_names = required_properties + selected_optional_properties
1188
+
1189
+ for property_name in property_names:
1087
1190
  properties_schema = schema["properties"][property_name]
1088
1191
 
1089
1192
  property_type = properties_schema.get("type")
@@ -1102,9 +1205,6 @@ class OpenApiLibCore: # pylint: disable=too-many-instance-attributes
1102
1205
  if properties_schema.get("readOnly", False):
1103
1206
  continue
1104
1207
  if constrained_values := get_constrained_values(property_name):
1105
- # do not add properties that are configured to be ignored
1106
- if IGNORE in constrained_values:
1107
- continue
1108
1208
  json_data[property_name] = choice(constrained_values)
1109
1209
  continue
1110
1210
  if (
@@ -1131,6 +1231,7 @@ class OpenApiLibCore: # pylint: disable=too-many-instance-attributes
1131
1231
  json_data[property_name] = [array_data]
1132
1232
  continue
1133
1233
  json_data[property_name] = value_utils.get_valid_value(properties_schema)
1234
+
1134
1235
  return json_data
1135
1236
 
1136
1237
  @keyword
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: robotframework-openapitools
3
- Version: 0.1.3
3
+ Version: 0.2.1
4
4
  Summary: A set of Robot Framework libraries to test APIs for which the OAS is available.
5
5
  Home-page: https://github.com/MarketSquare/robotframework-openapitools
6
6
  License: Apache-2.0
@@ -1,15 +1,15 @@
1
1
  OpenApiDriver/__init__.py,sha256=34h5RkB8nBNRKPId4r_B_xzcgXJYD3m2QYwIaPfpv80,1331
2
- OpenApiDriver/openapi_executors.py,sha256=xVF12OUR2Swi9VnQauST0WcT2zO4LWvL5bELNqAkM1E,31970
2
+ OpenApiDriver/openapi_executors.py,sha256=XEuHUD-3mBNb8WNK8gmJoYkz2HAjzS-K9oQ0FTmgOoc,32851
3
3
  OpenApiDriver/openapi_reader.py,sha256=4kSM-hFd54ws-jq88inbienkaoC5sSDwfRuxLrHP7aA,4652
4
- OpenApiDriver/openapidriver.libspec,sha256=Po-Zqvpp4XO1iuoLikW1ruAcRdn40JbCzx0AdskfQ1k,27138
5
- OpenApiDriver/openapidriver.py,sha256=7FNVTWhjvQ_Xa-mXGbkA2O6N63cVSJ-BdlBKoemiB4Q,15546
4
+ OpenApiDriver/openapidriver.libspec,sha256=3yU3o0AhCFulFWmmFwW-w0LY7GQaYSaU8er64Dr8cCA,28323
5
+ OpenApiDriver/openapidriver.py,sha256=QRFcF1q9x88rqsD7XzBN25wPYqTbZldK4rSvpEdhQHo,15214
6
6
  OpenApiDriver/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  OpenApiLibCore/__init__.py,sha256=TOeGg8q0V8BNvdP9tEPE2MRQm7XyS1VzC5AP8y_qOPg,1591
8
- OpenApiLibCore/dto_base.py,sha256=Y0QYyC4-vJCwwZcxut5OpuPziSb-wQKwV8wqel6Wohk,12080
8
+ OpenApiLibCore/dto_base.py,sha256=L1jKJLOthqL7jjdfZ6HDmM3t967UiH7RWkvsAu6NURg,11794
9
9
  OpenApiLibCore/dto_utils.py,sha256=maYX9QqPaJtiEo8vIFQLsT2FOT-LUGVnNcVaca4zCDk,2903
10
- OpenApiLibCore/oas_cache.py,sha256=XTji4fGM8fl4qoAYBa8WEXwVTyH70Te9a4-hYT0F87w,112
11
- OpenApiLibCore/openapi_libcore.libspec,sha256=XXiCinBVYubHIxpoASB5Us_MiUnmMUV9LI8ztpVF0QY,33102
12
- OpenApiLibCore/openapi_libcore.py,sha256=DH3q0Fn_FGc_fm_pcQdpvWxTrE6zw2gSMObPDw-4ack,62223
10
+ OpenApiLibCore/oas_cache.py,sha256=Qg_Is5pAJZjZu5VmwEEarQs8teKrh3Y2psCcpDLU5Y4,379
11
+ OpenApiLibCore/openapi_libcore.libspec,sha256=9Kn1CGzUoIL1uzb5cpjQrJS7ZKxjHAvRqADzCzdGlKQ,33102
12
+ OpenApiLibCore/openapi_libcore.py,sha256=GHuhcpMiDNGCy-0pmTB5WRbUDzK8wpL5O07lZo0kPVQ,65826
13
13
  OpenApiLibCore/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
14
  OpenApiLibCore/value_utils.py,sha256=wO5ssYTuk4YWWMJb0kl5n20X2r0NG55FXvgLqQd8qvw,18145
15
15
  roboswag/__init__.py,sha256=-8ql4wuY_ftOZRdCxSmBCMW3WpDk7Ir__st9xcb9qCI,223
@@ -35,7 +35,7 @@ roboswag/validate/__init__.py,sha256=stpgQmvZvqlqPBjZ3Vxhd3wbX_Nb85jyIbj44_EhK_w
35
35
  roboswag/validate/core.py,sha256=CfUEhkXPFAzIppRSiGyh62j4BYW4vkjIXWEzRcJFD6o,84
36
36
  roboswag/validate/schema.py,sha256=jyD44GcYU_JQLw5hb1wK-DwxOsbJ-FstoNHwIVVMqoo,711
37
37
  roboswag/validate/text_response.py,sha256=P7WEC6ot1OG3YDEXRtmOwIFwki8jgq8fMb-L77X4vIo,527
38
- robotframework_openapitools-0.1.3.dist-info/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
39
- robotframework_openapitools-0.1.3.dist-info/METADATA,sha256=mA6B3a1yiaGocKPt3nBBKolaO_ye6M0k8cQHn_UGcV4,1610
40
- robotframework_openapitools-0.1.3.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
41
- robotframework_openapitools-0.1.3.dist-info/RECORD,,
38
+ robotframework_openapitools-0.2.1.dist-info/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
39
+ robotframework_openapitools-0.2.1.dist-info/METADATA,sha256=tT_w_nW-DgGsHRjhoWUQxRg92sQTdjTG7gzdPf19ndE,1610
40
+ robotframework_openapitools-0.2.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
41
+ robotframework_openapitools-0.2.1.dist-info/RECORD,,