schemathesis 3.36.0__py3-none-any.whl → 3.36.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.
@@ -245,6 +245,11 @@ def _iter_coverage_cases(
245
245
  if operation.body:
246
246
  for body in operation.body:
247
247
  schema = body.as_json_schema(operation)
248
+ # Definition could be a list for Open API 2.0
249
+ definition = body.definition if isinstance(body.definition, dict) else {}
250
+ examples = [example["value"] for example in definition.get("examples", {}).values() if "value" in example]
251
+ if examples:
252
+ schema.setdefault("examples", []).extend(examples)
248
253
  gen = coverage.cover_schema_iter(ctx, schema)
249
254
  value = next(gen, NOT_SET)
250
255
  if isinstance(value, NotSet):
schemathesis/auths.py CHANGED
@@ -450,6 +450,7 @@ class AuthStorage(Generic[Auth]):
450
450
  data: Auth | None = _provider_get(provider, case, context)
451
451
  if data is not None:
452
452
  provider.set(case, data, context)
453
+ case._has_explicit_auth = True
453
454
  break
454
455
 
455
456
 
@@ -4,7 +4,8 @@ import json
4
4
  from contextlib import contextmanager, suppress
5
5
  from dataclasses import dataclass, field
6
6
  from functools import lru_cache
7
- from typing import Any, Generator, TypeVar, cast
7
+ from itertools import combinations
8
+ from typing import Any, Generator, Iterator, TypeVar, cast
8
9
 
9
10
  import jsonschema
10
11
  from hypothesis import strategies as st
@@ -162,6 +163,7 @@ def cover_schema_iter(ctx: CoverageContext, schema: dict | bool) -> Generator[Ge
162
163
  schema = {}
163
164
  else:
164
165
  types = schema.get("type", [])
166
+ push_examples_to_properties(schema)
165
167
  if not isinstance(types, list):
166
168
  types = [types] # type: ignore[unreachable]
167
169
  if not types:
@@ -264,6 +266,8 @@ def _positive_string(ctx: CoverageContext, schema: dict) -> Generator[GeneratedV
264
266
  """Generate positive string values."""
265
267
  # Boundary and near boundary values
266
268
  min_length = schema.get("minLength")
269
+ if min_length == 0:
270
+ min_length = None
267
271
  max_length = schema.get("maxLength")
268
272
  example = schema.get("example")
269
273
  examples = schema.get("examples")
@@ -283,6 +287,12 @@ def _positive_string(ctx: CoverageContext, schema: dict) -> Generator[GeneratedV
283
287
  elif not min_length and not max_length:
284
288
  # Default positive value
285
289
  yield PositiveValue(ctx.generate_from_schema(schema))
290
+ elif "pattern" in schema:
291
+ # Without merging `maxLength` & `minLength` into a regex it is problematic
292
+ # to generate a valid value as the unredlying machinery will resort to filtering
293
+ # and it is unlikely that it will generate a string of that length
294
+ yield PositiveValue(ctx.generate_from_schema(schema))
295
+ return
286
296
 
287
297
  seen = set()
288
298
 
@@ -476,6 +486,10 @@ def _positive_object(ctx: CoverageContext, schema: dict, template: dict) -> Gene
476
486
  combo = {k: v for k, v in template.items() if k in required or k == name}
477
487
  if combo != template:
478
488
  yield PositiveValue(combo)
489
+ # Generate one combination for each size from 2 to N-1
490
+ for selection in select_combinations(optional):
491
+ combo = {k: v for k, v in template.items() if k in required or k in selection}
492
+ yield PositiveValue(combo)
479
493
  # Generate only required properties
480
494
  if set(properties) != required:
481
495
  only_required = {k: v for k, v in template.items() if k in required}
@@ -491,6 +505,11 @@ def _positive_object(ctx: CoverageContext, schema: dict, template: dict) -> Gene
491
505
  seen.clear()
492
506
 
493
507
 
508
+ def select_combinations(optional: list[str]) -> Iterator[tuple[str, ...]]:
509
+ for size in range(2, len(optional)):
510
+ yield next(combinations(optional, size))
511
+
512
+
494
513
  def _negative_enum(ctx: CoverageContext, value: list) -> Generator[GeneratedValue, None, None]:
495
514
  strategy = JSON_STRATEGY.filter(lambda x: x not in value)
496
515
  # The exact negative value is not important here
@@ -569,3 +588,16 @@ def _negative_type(ctx: CoverageContext, seen: set, ty: str | list[str]) -> Gene
569
588
  value = ctx.generate_from(negative_strategy, cached=True)
570
589
  yield NegativeValue(value)
571
590
  seen.add(_to_hashable_key(value))
591
+
592
+
593
+ def push_examples_to_properties(schema: dict[str, Any]) -> None:
594
+ """Push examples from the top-level 'examples' field to the corresponding properties."""
595
+ if "examples" in schema and "properties" in schema:
596
+ properties = schema["properties"]
597
+ for example in schema["examples"]:
598
+ for prop, value in example.items():
599
+ if prop in properties:
600
+ if "examples" not in properties[prop]:
601
+ properties[prop]["examples"] = []
602
+ if value not in schema["properties"][prop]["examples"]:
603
+ properties[prop]["examples"].append(value)
@@ -6,6 +6,7 @@ from dataclasses import dataclass
6
6
  from typing import TYPE_CHECKING, Callable, Optional
7
7
 
8
8
  if TYPE_CHECKING:
9
+ from ..types import RawAuth
9
10
  from ..models import Case
10
11
  from ..transports.responses import GenericResponse
11
12
  from requests.structures import CaseInsensitiveDict
@@ -21,6 +22,7 @@ class CheckContext:
21
22
  Provides access to broader test execution data beyond individual test cases.
22
23
  """
23
24
 
25
+ auth: RawAuth | None = None
24
26
  headers: CaseInsensitiveDict | None = None
25
27
 
26
28
 
schemathesis/models.py CHANGED
@@ -136,8 +136,7 @@ def prepare_request_data(kwargs: dict[str, Any]) -> PreparedRequestData:
136
136
  )
137
137
 
138
138
 
139
- @dataclass
140
- class TestPhase(Enum):
139
+ class TestPhase(str, Enum):
141
140
  __test__ = False
142
141
 
143
142
  EXPLICIT = "explicit"
@@ -184,6 +183,7 @@ class Case:
184
183
  # The way the case was generated (None for manually crafted ones)
185
184
  data_generation_method: DataGenerationMethod | None = None
186
185
  _auth: requests.auth.AuthBase | None = None
186
+ _has_explicit_auth: bool = False
187
187
 
188
188
  def __repr__(self) -> str:
189
189
  parts = [f"{self.__class__.__name__}("]
@@ -562,6 +562,8 @@ class Case:
562
562
  body=fast_deepcopy(self.body),
563
563
  generation_time=self.generation_time,
564
564
  id=self.id,
565
+ _auth=self._auth,
566
+ _has_explicit_auth=self._has_explicit_auth,
565
567
  )
566
568
 
567
569
 
@@ -11,7 +11,7 @@ if TYPE_CHECKING:
11
11
 
12
12
  from ...exceptions import OperationSchemaError
13
13
  from ...models import Case
14
- from ...types import NotSet
14
+ from ...types import NotSet, RawAuth
15
15
 
16
16
 
17
17
  @dataclass
@@ -19,15 +19,19 @@ class RunnerContext:
19
19
  """Holds context shared for a test run."""
20
20
 
21
21
  data: TestResultSet
22
+ auth: RawAuth | None
22
23
  seed: int | None
23
24
  stop_event: threading.Event
24
25
  unique_data: bool
25
26
  outcome_cache: dict[int, BaseException | None]
26
27
 
27
- __slots__ = ("data", "seed", "stop_event", "unique_data", "outcome_cache")
28
+ __slots__ = ("data", "auth", "seed", "stop_event", "unique_data", "outcome_cache")
28
29
 
29
- def __init__(self, *, seed: int | None, stop_event: threading.Event, unique_data: bool) -> None:
30
+ def __init__(
31
+ self, *, seed: int | None, auth: RawAuth | None, stop_event: threading.Event, unique_data: bool
32
+ ) -> None:
30
33
  self.data = TestResultSet(seed=seed)
34
+ self.auth = auth
31
35
  self.seed = seed
32
36
  self.stop_event = stop_event
33
37
  self.outcome_cache = {}
@@ -131,7 +131,7 @@ class BaseRunner:
131
131
  # If auth is explicitly provided, then the global provider is ignored
132
132
  if self.auth is not None:
133
133
  unregister_auth()
134
- ctx = RunnerContext(seed=self.seed, stop_event=stop_event, unique_data=self.unique_data)
134
+ ctx = RunnerContext(auth=self.auth, seed=self.seed, stop_event=stop_event, unique_data=self.unique_data)
135
135
  start_time = time.monotonic()
136
136
  initialized = None
137
137
  __probes = None
@@ -955,6 +955,7 @@ def network_test(
955
955
  headers["User-Agent"] = USER_AGENT
956
956
  if not dry_run:
957
957
  args = (
958
+ ctx,
958
959
  checks,
959
960
  targets,
960
961
  result,
@@ -973,6 +974,7 @@ def network_test(
973
974
 
974
975
  def _network_test(
975
976
  case: Case,
977
+ ctx: RunnerContext,
976
978
  checks: Iterable[CheckFunction],
977
979
  targets: Iterable[Target],
978
980
  result: TestResult,
@@ -1015,11 +1017,11 @@ def _network_test(
1015
1017
  run_targets(targets, context)
1016
1018
  status = Status.success
1017
1019
 
1018
- ctx = CheckContext(headers=CaseInsensitiveDict(headers) if headers else None)
1020
+ check_ctx = CheckContext(auth=ctx.auth, headers=CaseInsensitiveDict(headers) if headers else None)
1019
1021
  try:
1020
1022
  run_checks(
1021
1023
  case=case,
1022
- ctx=ctx,
1024
+ ctx=check_ctx,
1023
1025
  checks=checks,
1024
1026
  check_results=check_results,
1025
1027
  result=result,
@@ -1069,6 +1071,7 @@ def wsgi_test(
1069
1071
  headers = prepare_wsgi_headers(headers, auth, auth_type)
1070
1072
  if not dry_run:
1071
1073
  args = (
1074
+ ctx,
1072
1075
  checks,
1073
1076
  targets,
1074
1077
  result,
@@ -1085,6 +1088,7 @@ def wsgi_test(
1085
1088
 
1086
1089
  def _wsgi_test(
1087
1090
  case: Case,
1091
+ ctx: RunnerContext,
1088
1092
  checks: Iterable[CheckFunction],
1089
1093
  targets: Iterable[Target],
1090
1094
  result: TestResult,
@@ -1105,11 +1109,11 @@ def _wsgi_test(
1105
1109
  result.logs.extend(recorded.records)
1106
1110
  status = Status.success
1107
1111
  check_results: list[Check] = []
1108
- ctx = CheckContext(headers=CaseInsensitiveDict(headers) if headers else None)
1112
+ check_ctx = CheckContext(auth=ctx.auth, headers=CaseInsensitiveDict(headers) if headers else None)
1109
1113
  try:
1110
1114
  run_checks(
1111
1115
  case=case,
1112
- ctx=ctx,
1116
+ ctx=check_ctx,
1113
1117
  checks=checks,
1114
1118
  check_results=check_results,
1115
1119
  result=result,
@@ -1151,6 +1155,7 @@ def asgi_test(
1151
1155
 
1152
1156
  if not dry_run:
1153
1157
  args = (
1158
+ ctx,
1154
1159
  checks,
1155
1160
  targets,
1156
1161
  result,
@@ -1167,6 +1172,7 @@ def asgi_test(
1167
1172
 
1168
1173
  def _asgi_test(
1169
1174
  case: Case,
1175
+ ctx: RunnerContext,
1170
1176
  checks: Iterable[CheckFunction],
1171
1177
  targets: Iterable[Target],
1172
1178
  result: TestResult,
@@ -1183,11 +1189,11 @@ def _asgi_test(
1183
1189
  run_targets(targets, context)
1184
1190
  status = Status.success
1185
1191
  check_results: list[Check] = []
1186
- ctx = CheckContext(headers=CaseInsensitiveDict(headers) if headers else None)
1192
+ check_ctx = CheckContext(auth=ctx.auth, headers=CaseInsensitiveDict(headers) if headers else None)
1187
1193
  try:
1188
1194
  run_checks(
1189
1195
  case=case,
1190
- ctx=ctx,
1196
+ ctx=check_ctx,
1191
1197
  checks=checks,
1192
1198
  check_results=check_results,
1193
1199
  result=result,
@@ -348,7 +348,7 @@ def ignored_auth(ctx: CheckContext, response: GenericResponse, case: Case) -> bo
348
348
  security_parameters = _get_security_parameters(case.operation)
349
349
  # Authentication is required for this API operation and response is successful
350
350
  if security_parameters and 200 <= response.status_code < 300:
351
- auth = _contains_auth(ctx, response.request, security_parameters)
351
+ auth = _contains_auth(ctx, case, response.request, security_parameters)
352
352
  if auth == AuthKind.EXPLICIT:
353
353
  # Auth is explicitly set, it is expected to be valid
354
354
  # Check if invalid auth will give an error
@@ -412,11 +412,14 @@ def _get_security_parameters(operation: APIOperation) -> list[SecurityParameter]
412
412
 
413
413
 
414
414
  def _contains_auth(
415
- ctx: CheckContext, request: PreparedRequest, security_parameters: list[SecurityParameter]
415
+ ctx: CheckContext, case: Case, request: PreparedRequest, security_parameters: list[SecurityParameter]
416
416
  ) -> AuthKind | None:
417
417
  """Whether a request has authentication declared in the schema."""
418
418
  from requests.cookies import RequestsCookieJar
419
419
 
420
+ # If auth comes from explicit `auth` option or a custom auth, it is always explicit
421
+ if ctx.auth is not None or case._has_explicit_auth:
422
+ return AuthKind.EXPLICIT
420
423
  parsed = urlparse(request.url)
421
424
  query = parse_qs(parsed.query) # type: ignore
422
425
  # Load the `Cookie` header separately, because it is possible that `request._cookies` and the header are out of sync
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: schemathesis
3
- Version: 3.36.0
3
+ Version: 3.36.1
4
4
  Summary: Property-based testing framework for Open API and GraphQL based apps
5
5
  Project-URL: Documentation, https://schemathesis.readthedocs.io/en/stable/
6
6
  Project-URL: Changelog, https://schemathesis.readthedocs.io/en/stable/changelog.html
@@ -237,6 +237,7 @@ Schemathesis is used by a number of projects and companies, including direct usa
237
237
  - [Pixie](https://github.com/pixie-io/pixie)
238
238
  - [Qdrant](https://github.com/qdrant/qdrant)
239
239
  - Spotify ([Backstage](https://github.com/backstage/backstage))
240
+ - [Weechat](https://github.com/weechat/weechat)
240
241
  - WordPress ([OpenVerse](https://github.com/WordPress/openverse))
241
242
 
242
243
  ## Testimonials
@@ -1,12 +1,12 @@
1
1
  schemathesis/__init__.py,sha256=UW2Bq8hDDkcBeAAA7PzpBFXkOOxkmHox-mfQwzHDjL0,1914
2
2
  schemathesis/_compat.py,sha256=y4RZd59i2NCnZ91VQhnKeMn_8t3SgvLOk2Xm8nymUHY,1837
3
3
  schemathesis/_dependency_versions.py,sha256=pjEkkGAfOQJYNb-9UOo84V8nj_lKHr_TGDVdFwY2UU0,816
4
- schemathesis/_hypothesis.py,sha256=NTl1OXL9Us5rkvEroqtxlFcYz3_JVjcNbhPbEHi5B7E,14291
4
+ schemathesis/_hypothesis.py,sha256=Sj7pGspDGeevcPgLkCF1pV7T5HleF84nZd7FbDUs_vE,14646
5
5
  schemathesis/_lazy_import.py,sha256=aMhWYgbU2JOltyWBb32vnWBb6kykOghucEzI_F70yVE,470
6
6
  schemathesis/_override.py,sha256=TAjYB3eJQmlw9K_xiR9ptt9Wj7if4U7UFlUhGjpBAoM,1625
7
7
  schemathesis/_rate_limiter.py,sha256=q_XWst5hzuAyXQRiZc4s_bx7-JlPYZM_yKDmeavt3oo,242
8
8
  schemathesis/_xml.py,sha256=lwRaKEMQvl6SUySnhGgooNsdmXPnDh11YSPpbsW8dR8,6923
9
- schemathesis/auths.py,sha256=mYFOL2YDZl-6Lyh-dv3pMd5dRs4r_kO7UuGUHt6dC88,16790
9
+ schemathesis/auths.py,sha256=De97IS_iOlC36-jRhkZ2DUndjUpXYgsd8R-nA-iHn88,16837
10
10
  schemathesis/checks.py,sha256=YPUI1N5giGBy1072vd77e6HWelGAKrJUmJLEG4oqfF8,2630
11
11
  schemathesis/code_samples.py,sha256=rsdTo6ksyUs3ZMhqx0mmmkPSKUCFa--snIOYsXgZd80,4120
12
12
  schemathesis/constants.py,sha256=l1YQ7PXhEj9dyf9CTESVUpPOaFCH7iz-Fe8o4v6Th_s,2673
@@ -17,7 +17,7 @@ schemathesis/graphql.py,sha256=XiuKcfoOB92iLFC8zpz2msLkM0_V0TLdxPNBqrrGZ8w,216
17
17
  schemathesis/hooks.py,sha256=qXyVRfJdhsLk1GuJX47VAqkX0VPm6X6fK-cXhEnFLT4,14765
18
18
  schemathesis/lazy.py,sha256=uE8ef_7U_9ovs0-7UA7ssIiiDipJurJFHuxaUFOUETo,18956
19
19
  schemathesis/loaders.py,sha256=MoEhcdOEBJxNRn5X-ZNhWB9jZDHQQNpkNfEdQjf_NDw,4590
20
- schemathesis/models.py,sha256=ix-g8Z6a_V_U2DUc4iC7EmFQv-t4es4Lpt1RLlIz-ng,46294
20
+ schemathesis/models.py,sha256=YNZ9EXVw0WreTy_3hw2aZ9OPS-0W7xePlh5h0dLmgvs,46411
21
21
  schemathesis/parameters.py,sha256=PndmqQRlEYsCt1kWjSShPsFf6vj7X_7FRdz_-A95eNg,2258
22
22
  schemathesis/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
23
  schemathesis/sanitization.py,sha256=Lycn1VVfula9B6XpzkxTHja7CZ7RHqbUh9kBic0Yi4M,9056
@@ -60,9 +60,9 @@ schemathesis/fixups/utf8_bom.py,sha256=lWT9RNmJG8i-l5AXIpaCT3qCPUwRgzXPW3eoOjmZE
60
60
  schemathesis/generation/__init__.py,sha256=29Zys_tD6kfngaC4zHeC6TOBZQcmo7CWm7KDSYsHStQ,1581
61
61
  schemathesis/generation/_hypothesis.py,sha256=QDBzpcM9eXPgLGGdCPdGlxCtfMXD4YBN9_6Oz73lofI,1406
62
62
  schemathesis/generation/_methods.py,sha256=jCK09f4sedDfePrS-6BIiE-CcEE8fJ4ZHxq1BHoTltQ,1101
63
- schemathesis/generation/coverage.py,sha256=NnXpjkrJ8zjYgNCpGnvvqWx_YxLff-4kc_ET3Essfeg,22407
63
+ schemathesis/generation/coverage.py,sha256=gEB8J9qJTSVRdINVYUw0twCxPIwmuWF2FPJRIwSiy5A,23944
64
64
  schemathesis/internal/__init__.py,sha256=93HcdG3LF0BbQKbCteOsFMa1w6nXl8yTmx87QLNJOik,161
65
- schemathesis/internal/checks.py,sha256=z3kHi4zbn4RmG168KIvOYxwUE8jQ1xAnFXTaD1xarb4,1603
65
+ schemathesis/internal/checks.py,sha256=_DO0SlpfgiwEu5vkfS3hyXyC7BsGKKIPuAPgLhfGZ1M,1667
66
66
  schemathesis/internal/copy.py,sha256=DcL56z-d69kKR_5u8mlHvjSL1UTyUKNMAwexrwHFY1s,1031
67
67
  schemathesis/internal/datetime.py,sha256=zPLBL0XXLNfP-KYel3H2m8pnsxjsA_4d-zTOhJg2EPQ,136
68
68
  schemathesis/internal/deprecation.py,sha256=Ty5VBFBlufkITpP0WWTPIPbnB7biDi0kQgXVYWZp820,1273
@@ -77,8 +77,8 @@ schemathesis/runner/events.py,sha256=cRKKSDvHvKLBIyFBz-J0JtAKshbGGKco9eaMyLCgzsY
77
77
  schemathesis/runner/probes.py,sha256=no5AfO3kse25qvHevjeUfB0Q3C860V2AYzschUW3QMQ,5688
78
78
  schemathesis/runner/serialization.py,sha256=Rn8wUpxe8saWUBfSI60jK7-qPR-D2pY1ad1hD8qTHhE,20418
79
79
  schemathesis/runner/impl/__init__.py,sha256=1E2iME8uthYPBh9MjwVBCTFV-P3fi7AdphCCoBBspjs,199
80
- schemathesis/runner/impl/context.py,sha256=gEYE58DTRT38Jl__dSmqZhV_YI4mbR_JarnwXv0LeF0,2402
81
- schemathesis/runner/impl/core.py,sha256=ehNxUReBeSF62OpUzoeh_gBw-fb1ZExWebpHA6Oorh8,46965
80
+ schemathesis/runner/impl/context.py,sha256=KT3Dl1HIUM29Jpp_DwfoSx_NbWFH_7s6gw-p2Sr-N24,2505
81
+ schemathesis/runner/impl/core.py,sha256=bAPwfhLJrXLlPN6BDNGyQoO9v35YlmeuxAmyFTNQg5Y,47197
82
82
  schemathesis/runner/impl/solo.py,sha256=y5QSxgK8nBCEjZVD5BpFvYUXmB6tEjk6TwxAo__NejA,2911
83
83
  schemathesis/runner/impl/threadpool.py,sha256=yNR5LYE8f3N_4t42OwSgy0_qdGgBPM7d11F9c9oEAAs,15075
84
84
  schemathesis/service/__init__.py,sha256=cDVTCFD1G-vvhxZkJUwiToTAEQ-0ByIoqwXvJBCf_V8,472
@@ -105,7 +105,7 @@ schemathesis/specs/graphql/validation.py,sha256=uINIOt-2E7ZuQV2CxKzwez-7L9tDtqzM
105
105
  schemathesis/specs/openapi/__init__.py,sha256=HDcx3bqpa6qWPpyMrxAbM3uTo0Lqpg-BUNZhDJSJKnw,279
106
106
  schemathesis/specs/openapi/_cache.py,sha256=PAiAu4X_a2PQgD2lG5H3iisXdyg4SaHpU46bRZvfNkM,4320
107
107
  schemathesis/specs/openapi/_hypothesis.py,sha256=XgKq36ONJIWM-8ASnDpzOgcCcVz-uUQw74bOxcUC3n8,24201
108
- schemathesis/specs/openapi/checks.py,sha256=nriqejh-Y5ECCRYvfVenAgRik4xpejlCh22VpRo0RA4,22093
108
+ schemathesis/specs/openapi/checks.py,sha256=sOfnEoeu7aGTM7RXplhPy1iUaibxIzytjWtBp4at8S4,22288
109
109
  schemathesis/specs/openapi/constants.py,sha256=JqM_FHOenqS_MuUE9sxVQ8Hnw0DNM8cnKDwCwPLhID4,783
110
110
  schemathesis/specs/openapi/converter.py,sha256=TaYgc5BBHPdkN-n0lqpbeVgLu3eL3L8Wu3y_Vo3TJaQ,2800
111
111
  schemathesis/specs/openapi/definitions.py,sha256=nEsCKn_LgqYjZ9nNWp-8KUIrB4S94pT3GsV5A8UIzDw,94043
@@ -150,8 +150,8 @@ schemathesis/transports/auth.py,sha256=urSTO9zgFO1qU69xvnKHPFQV0SlJL3d7_Ojl0tLnZ
150
150
  schemathesis/transports/content_types.py,sha256=MiKOm-Hy5i75hrROPdpiBZPOTDzOwlCdnthJD12AJzI,2187
151
151
  schemathesis/transports/headers.py,sha256=hr_AIDOfUxsJxpHfemIZ_uNG3_vzS_ZeMEKmZjbYiBE,990
152
152
  schemathesis/transports/responses.py,sha256=OFD4ZLqwEFpo7F9vaP_SVgjhxAqatxIj38FS4XVq8Qs,1680
153
- schemathesis-3.36.0.dist-info/METADATA,sha256=HfnlCBEOL6RdgwQymCXcWVvoEfF26bVX_kdRspp4A6Y,12856
154
- schemathesis-3.36.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
155
- schemathesis-3.36.0.dist-info/entry_points.txt,sha256=VHyLcOG7co0nOeuk8WjgpRETk5P1E2iCLrn26Zkn5uk,158
156
- schemathesis-3.36.0.dist-info/licenses/LICENSE,sha256=PsPYgrDhZ7g9uwihJXNG-XVb55wj2uYhkl2DD8oAzY0,1103
157
- schemathesis-3.36.0.dist-info/RECORD,,
153
+ schemathesis-3.36.1.dist-info/METADATA,sha256=ysyAwX1ruHhcAtdGT2Ty2lpc4UpM0zyotuwzDprQd08,12904
154
+ schemathesis-3.36.1.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
155
+ schemathesis-3.36.1.dist-info/entry_points.txt,sha256=VHyLcOG7co0nOeuk8WjgpRETk5P1E2iCLrn26Zkn5uk,158
156
+ schemathesis-3.36.1.dist-info/licenses/LICENSE,sha256=PsPYgrDhZ7g9uwihJXNG-XVb55wj2uYhkl2DD8oAzY0,1103
157
+ schemathesis-3.36.1.dist-info/RECORD,,