schemathesis 3.38.4__py3-none-any.whl → 3.38.6__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.
@@ -224,6 +224,12 @@ def _iter_coverage_cases(
224
224
  from .specs.openapi.constants import LOCATION_TO_CONTAINER
225
225
  from .specs.openapi.examples import find_in_responses, find_matching_in_responses
226
226
 
227
+ def _stringify_value(val: Any) -> str:
228
+ if isinstance(val, list):
229
+ # use comma-separated values style for arrays
230
+ return ",".join(json.dumps(sub) for sub in val)
231
+ return json.dumps(val)
232
+
227
233
  generators: dict[tuple[str, str], Generator[coverage.GeneratedValue, None, None]] = {}
228
234
  template: dict[str, Any] = {}
229
235
  responses = find_in_responses(operation)
@@ -240,8 +246,8 @@ def _iter_coverage_cases(
240
246
  location = parameter.location
241
247
  name = parameter.name
242
248
  container = template.setdefault(LOCATION_TO_CONTAINER[location], {})
243
- if location in ("header", "cookie") and not isinstance(value.value, str):
244
- container[name] = json.dumps(value.value)
249
+ if location in ("header", "cookie", "path") and not isinstance(value.value, str):
250
+ container[name] = _stringify_value(value.value)
245
251
  else:
246
252
  container[name] = value.value
247
253
  generators[(location, name)] = gen
@@ -286,12 +292,13 @@ def _iter_coverage_cases(
286
292
  case.data_generation_method = DataGenerationMethod.positive
287
293
  case.meta = _make_meta(description="Default positive test case")
288
294
  yield case
295
+
289
296
  for (location, name), gen in generators.items():
290
297
  container_name = LOCATION_TO_CONTAINER[location]
291
298
  container = template[container_name]
292
299
  for value in gen:
293
- if location in ("header", "cookie") and not isinstance(value.value, str):
294
- generated = json.dumps(value.value)
300
+ if location in ("header", "cookie", "path") and not isinstance(value.value, str):
301
+ generated = _stringify_value(value.value)
295
302
  else:
296
303
  generated = value.value
297
304
  case = operation.make_case(**{**template, container_name: {**container, name: generated}})
@@ -340,10 +347,13 @@ def _iter_coverage_cases(
340
347
  optional = sorted(all_params - required)
341
348
 
342
349
  # Helper function to create and yield a case
343
- def make_case(container_values: dict, description: str, _location: str, _container_name: str) -> Case:
344
- if _location in ("header", "cookie"):
350
+ def make_case(
351
+ container_values: dict, description: str, _location: str, _container_name: str, _parameter: str | None
352
+ ) -> Case:
353
+ if _location in ("header", "cookie", "path"):
345
354
  container = {
346
- name: json.dumps(val) if not isinstance(val, str) else val for name, val in container_values.items()
355
+ name: _stringify_value(val) if not isinstance(val, str) else val
356
+ for name, val in container_values.items()
347
357
  }
348
358
  else:
349
359
  container = container_values
@@ -353,6 +363,7 @@ def _iter_coverage_cases(
353
363
  case.meta = _make_meta(
354
364
  description=description,
355
365
  location=_location,
366
+ parameter=_parameter,
356
367
  parameter_location=_location,
357
368
  )
358
369
  return case
@@ -377,12 +388,12 @@ def _iter_coverage_cases(
377
388
  coverage.CoverageContext(data_generation_methods=[DataGenerationMethod.negative]),
378
389
  subschema,
379
390
  ):
380
- yield make_case(more.value, more.description, _location, _container_name)
391
+ yield make_case(more.value, more.description, _location, _container_name, more.parameter)
381
392
 
382
393
  # 1. Generate only required properties
383
394
  if required and all_params != required:
384
395
  only_required = {k: v for k, v in base_container.items() if k in required}
385
- yield make_case(only_required, "Only required properties", location, container_name)
396
+ yield make_case(only_required, "Only required properties", location, container_name, None)
386
397
  if DataGenerationMethod.negative in data_generation_methods:
387
398
  subschema = _combination_schema(only_required, required, parameter_set)
388
399
  yield from _yield_negative(subschema, location, container_name)
@@ -391,7 +402,9 @@ def _iter_coverage_cases(
391
402
  for opt_param in optional:
392
403
  combo = {k: v for k, v in base_container.items() if k in required or k == opt_param}
393
404
  if combo != base_container:
394
- yield make_case(combo, f"All required properties and optional '{opt_param}'", location, container_name)
405
+ yield make_case(
406
+ combo, f"All required properties and optional '{opt_param}'", location, container_name, None
407
+ )
395
408
  if DataGenerationMethod.negative in data_generation_methods:
396
409
  subschema = _combination_schema(combo, required, parameter_set)
397
410
  yield from _yield_negative(subschema, location, container_name)
@@ -402,7 +415,9 @@ def _iter_coverage_cases(
402
415
  for combination in combinations(optional, size):
403
416
  combo = {k: v for k, v in base_container.items() if k in required or k in combination}
404
417
  if combo != base_container:
405
- yield make_case(combo, f"All required and {size} optional properties", location, container_name)
418
+ yield make_case(
419
+ combo, f"All required and {size} optional properties", location, container_name, None
420
+ )
406
421
 
407
422
 
408
423
  def _make_meta(
@@ -39,7 +39,7 @@ NUMERIC_STRATEGY: st.SearchStrategy = st.integers() | FLOAT_STRATEGY
39
39
  JSON_STRATEGY: st.SearchStrategy = st.recursive(
40
40
  st.none() | st.booleans() | NUMERIC_STRATEGY | st.text(), json_recursive_strategy
41
41
  )
42
- ARRAY_STRATEGY: st.SearchStrategy = st.lists(JSON_STRATEGY)
42
+ ARRAY_STRATEGY: st.SearchStrategy = st.lists(JSON_STRATEGY, min_size=2)
43
43
  OBJECT_STRATEGY: st.SearchStrategy = st.dictionaries(st.text(), JSON_STRATEGY)
44
44
 
45
45
 
@@ -63,23 +63,31 @@ class GeneratedValue:
63
63
  value: Any
64
64
  data_generation_method: DataGenerationMethod
65
65
  description: str
66
+ parameter: str | None
66
67
  location: str | None
67
68
 
68
- __slots__ = ("value", "data_generation_method", "description", "location")
69
+ __slots__ = ("value", "data_generation_method", "description", "parameter", "location")
69
70
 
70
71
  @classmethod
71
72
  def with_positive(cls, value: Any, *, description: str) -> GeneratedValue:
72
73
  return cls(
73
- value=value, data_generation_method=DataGenerationMethod.positive, description=description, location=None
74
+ value=value,
75
+ data_generation_method=DataGenerationMethod.positive,
76
+ description=description,
77
+ location=None,
78
+ parameter=None,
74
79
  )
75
80
 
76
81
  @classmethod
77
- def with_negative(cls, value: Any, *, description: str, location: str) -> GeneratedValue:
82
+ def with_negative(
83
+ cls, value: Any, *, description: str, location: str, parameter: str | None = None
84
+ ) -> GeneratedValue:
78
85
  return cls(
79
86
  value=value,
80
87
  data_generation_method=DataGenerationMethod.negative,
81
88
  description=description,
82
89
  location=location,
90
+ parameter=parameter,
83
91
  )
84
92
 
85
93
 
@@ -218,11 +226,11 @@ def _encode(o: Any) -> str:
218
226
  return "".join(_iterencode(o, 0))
219
227
 
220
228
 
221
- def _to_hashable_key(value: T, _encode: Callable = _encode) -> T | tuple[type, str]:
229
+ def _to_hashable_key(value: T, _encode: Callable = _encode) -> tuple[type, str | T]:
222
230
  if isinstance(value, (dict, list)):
223
231
  serialized = _encode(value)
224
232
  return (type(value), serialized)
225
- return value
233
+ return (type(value), value)
226
234
 
227
235
 
228
236
  def _cover_positive_for_type(
@@ -425,7 +433,8 @@ def cover_schema_iter(
425
433
  elif key == "allOf":
426
434
  nctx = ctx.with_negative()
427
435
  if len(value) == 1:
428
- yield from cover_schema_iter(nctx, value[0], seen)
436
+ with nctx.location(0):
437
+ yield from cover_schema_iter(nctx, value[0], seen)
429
438
  else:
430
439
  with _ignore_unfixable():
431
440
  canonical = canonicalish(schema)
@@ -755,6 +764,7 @@ def _negative_properties(
755
764
  {**template, key: value.value},
756
765
  description=f"Object with invalid '{key}' value: {value.description}",
757
766
  location=nctx.current_location,
767
+ parameter=key,
758
768
  )
759
769
 
760
770
 
schemathesis/hooks.py CHANGED
@@ -13,7 +13,6 @@ from .internal.deprecation import deprecated_property
13
13
 
14
14
  if TYPE_CHECKING:
15
15
  from hypothesis import strategies as st
16
- from hypothesis.vendor.pretty import RepresentationPrinter
17
16
 
18
17
  from .models import APIOperation, Case
19
18
  from .schemas import BaseSchema
@@ -33,8 +32,7 @@ class RegisteredHook:
33
32
  signature: inspect.Signature
34
33
  scopes: list[HookScope]
35
34
 
36
- def _repr_pretty_(self, printer: RepresentationPrinter, cycle: bool) -> None:
37
- return None
35
+ def _repr_pretty_(self, *args: Any, **kwargs: Any) -> None: ...
38
36
 
39
37
 
40
38
  @dataclass
schemathesis/models.py CHANGED
@@ -64,7 +64,6 @@ if TYPE_CHECKING:
64
64
  import requests.auth
65
65
  import werkzeug
66
66
  from hypothesis import strategies as st
67
- from hypothesis.vendor.pretty import RepresentationPrinter
68
67
  from requests.structures import CaseInsensitiveDict
69
68
 
70
69
  from .auths import AuthStorage
@@ -250,8 +249,7 @@ class Case:
250
249
  cookies=self._get_diff("cookies"),
251
250
  )
252
251
 
253
- def _repr_pretty_(self, printer: RepresentationPrinter, cycle: bool) -> None:
254
- return None
252
+ def _repr_pretty_(self, *args: Any, **kwargs: Any) -> None: ...
255
253
 
256
254
  @deprecated_property(removed_in="4.0", replacement="`operation`")
257
255
  def endpoint(self) -> APIOperation:
@@ -668,8 +666,7 @@ class OperationDefinition(Generic[D]):
668
666
 
669
667
  __slots__ = ("raw", "resolved", "scope")
670
668
 
671
- def _repr_pretty_(self, printer: RepresentationPrinter, cycle: bool) -> None:
672
- return None
669
+ def _repr_pretty_(self, *args: Any, **kwargs: Any) -> None: ...
673
670
 
674
671
 
675
672
  C = TypeVar("C", bound=Case)
@@ -1174,8 +1171,7 @@ class TestResult:
1174
1171
  # DEPRECATED: Seed is the same per test run
1175
1172
  seed: int | None = None
1176
1173
 
1177
- def _repr_pretty_(self, printer: RepresentationPrinter, cycle: bool) -> None:
1178
- return None
1174
+ def _repr_pretty_(self, *args: Any, **kwargs: Any) -> None: ...
1179
1175
 
1180
1176
  def mark_errored(self) -> None:
1181
1177
  self.is_errored = True
@@ -1270,8 +1266,7 @@ class TestResultSet:
1270
1266
  generic_errors: list[OperationSchemaError] = field(default_factory=list)
1271
1267
  warnings: list[str] = field(default_factory=list)
1272
1268
 
1273
- def _repr_pretty_(self, printer: RepresentationPrinter, cycle: bool) -> None:
1274
- return None
1269
+ def _repr_pretty_(self, *args: Any, **kwargs: Any) -> None: ...
1275
1270
 
1276
1271
  def __iter__(self) -> Iterator[TestResult]:
1277
1272
  return iter(self.results)
@@ -9,8 +9,6 @@ from dataclasses import dataclass, field
9
9
  from typing import TYPE_CHECKING, Any, Generator, Generic, TypeVar
10
10
 
11
11
  if TYPE_CHECKING:
12
- from hypothesis.vendor.pretty import RepresentationPrinter
13
-
14
12
  from .models import APIOperation
15
13
 
16
14
 
@@ -57,8 +55,7 @@ class ParameterSet(Generic[P]):
57
55
 
58
56
  items: list[P] = field(default_factory=list)
59
57
 
60
- def _repr_pretty_(self, printer: RepresentationPrinter, cycle: bool) -> None:
61
- return None
58
+ def _repr_pretty_(self, *args: Any, **kwargs: Any) -> None: ...
62
59
 
63
60
  def add(self, parameter: P) -> None:
64
61
  """Add a new parameter."""
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
- from typing import TYPE_CHECKING
4
+ from typing import TYPE_CHECKING, Any
5
5
 
6
6
  from ...constants import NOT_SET
7
7
  from ...internal.checks import CheckConfig
@@ -10,8 +10,6 @@ from ...models import TestResult, TestResultSet
10
10
  if TYPE_CHECKING:
11
11
  import threading
12
12
 
13
- from hypothesis.vendor.pretty import RepresentationPrinter
14
-
15
13
  from ..._override import CaseOverride
16
14
  from ...exceptions import OperationSchemaError
17
15
  from ...models import Case
@@ -52,8 +50,7 @@ class RunnerContext:
52
50
  self.checks_config = checks_config
53
51
  self.override = override
54
52
 
55
- def _repr_pretty_(self, printer: RepresentationPrinter, cycle: bool) -> None:
56
- return None
53
+ def _repr_pretty_(self, *args: Any, **kwargs: Any) -> None: ...
57
54
 
58
55
  @property
59
56
  def is_stopped(self) -> bool:
schemathesis/schemas.py CHANGED
@@ -49,7 +49,6 @@ from .utils import PARAMETRIZE_MARKER, GivenInput, given_proxy
49
49
  if TYPE_CHECKING:
50
50
  import hypothesis
51
51
  from hypothesis.strategies import SearchStrategy
52
- from hypothesis.vendor.pretty import RepresentationPrinter
53
52
  from pyrate_limiter import Limiter
54
53
 
55
54
  from .stateful import Stateful, StatefulTest
@@ -103,8 +102,7 @@ class BaseSchema(Mapping):
103
102
  def __post_init__(self) -> None:
104
103
  self.hook = to_filterable_hook(self.hooks) # type: ignore[method-assign]
105
104
 
106
- def _repr_pretty_(self, printer: RepresentationPrinter, cycle: bool) -> None:
107
- return None
105
+ def _repr_pretty_(self, *args: Any, **kwargs: Any) -> None: ...
108
106
 
109
107
  def include(
110
108
  self,
@@ -391,14 +391,14 @@ def ignored_auth(ctx: CheckContext, response: GenericResponse, case: Case) -> bo
391
391
  # Check if invalid auth will give an error
392
392
  _remove_auth_from_case(case, security_parameters)
393
393
  new_response = case.operation.schema.transport.send(case)
394
- if 200 <= new_response.status_code < 300:
394
+ if new_response.status_code != 401:
395
395
  _update_response(response, new_response)
396
396
  _raise_no_auth_error(new_response, case.operation.verbose_name, "that requires authentication")
397
397
  # Try to set invalid auth and check if it succeeds
398
398
  for parameter in security_parameters:
399
399
  _set_auth_for_case(case, parameter)
400
400
  new_response = case.operation.schema.transport.send(case)
401
- if 200 <= new_response.status_code < 300:
401
+ if new_response.status_code != 401:
402
402
  _update_response(response, new_response)
403
403
  _raise_no_auth_error(new_response, case.operation.verbose_name, "with any auth")
404
404
  _remove_auth_from_case(case, security_parameters)
@@ -9,8 +9,6 @@ from ...parameters import Parameter
9
9
  from .converter import to_json_schema_recursive
10
10
 
11
11
  if TYPE_CHECKING:
12
- from hypothesis.vendor.pretty import RepresentationPrinter
13
-
14
12
  from ...models import APIOperation
15
13
 
16
14
 
@@ -23,9 +21,7 @@ class OpenAPIParameter(Parameter):
23
21
  nullable_field: ClassVar[str]
24
22
  supported_jsonschema_keywords: ClassVar[tuple[str, ...]]
25
23
 
26
- def _repr_pretty_(self, printer: RepresentationPrinter, cycle: bool) -> None:
27
- return None
28
-
24
+ def _repr_pretty_(self, *args: Any, **kwargs: Any) -> None: ...
29
25
  @property
30
26
  def description(self) -> str | None:
31
27
  """A brief parameter description."""
@@ -44,21 +44,38 @@ def _handle_parsed_pattern(parsed: list, pattern: str, min_length: int | None, m
44
44
  if parsed[0][0] == ANCHOR:
45
45
  # Starts with an anchor
46
46
  op, value = parsed[1]
47
- leading_anchor = pattern[0]
48
- return leading_anchor + _update_quantifier(op, value, pattern[1:], min_length, max_length)
47
+ anchor_length = _get_anchor_length(parsed[0][1])
48
+ leading_anchor = pattern[:anchor_length]
49
+ return leading_anchor + _update_quantifier(op, value, pattern[anchor_length:], min_length, max_length)
49
50
  if parsed[1][0] == ANCHOR:
50
51
  # Ends with an anchor
51
52
  op, value = parsed[0]
52
- trailing_anchor = pattern[-1]
53
- return _update_quantifier(op, value, pattern[:-1], min_length, max_length) + trailing_anchor
53
+ anchor_length = _get_anchor_length(parsed[1][1])
54
+ trailing_anchor = pattern[-anchor_length:]
55
+ return _update_quantifier(op, value, pattern[:-anchor_length], min_length, max_length) + trailing_anchor
54
56
  elif len(parsed) == 3 and parsed[0][0] == ANCHOR and parsed[2][0] == ANCHOR:
55
57
  op, value = parsed[1]
56
- leading_anchor = pattern[0]
57
- trailing_anchor = pattern[-1]
58
- return leading_anchor + _update_quantifier(op, value, pattern[1:-1], min_length, max_length) + trailing_anchor
58
+ leading_anchor_length = _get_anchor_length(parsed[0][1])
59
+ trailing_anchor_length = _get_anchor_length(parsed[2][1])
60
+ leading_anchor = pattern[:leading_anchor_length]
61
+ trailing_anchor = pattern[-trailing_anchor_length:]
62
+ return (
63
+ leading_anchor
64
+ + _update_quantifier(
65
+ op, value, pattern[leading_anchor_length:-trailing_anchor_length], min_length, max_length
66
+ )
67
+ + trailing_anchor
68
+ )
59
69
  return pattern
60
70
 
61
71
 
72
+ def _get_anchor_length(node_type: int) -> int:
73
+ """Determine the length of the anchor based on its type."""
74
+ if node_type in {sre.AT_BEGINNING_STRING, sre.AT_END_STRING, sre.AT_BOUNDARY, sre.AT_NON_BOUNDARY}:
75
+ return 2 # \A, \Z, \b, or \B
76
+ return 1 # ^ or $ or their multiline/locale/unicode variants
77
+
78
+
62
79
  def _update_quantifier(op: int, value: tuple, pattern: str, min_length: int | None, max_length: int | None) -> str:
63
80
  """Update the quantifier based on the operation type and given constraints."""
64
81
  if op in REPEATS:
@@ -113,7 +130,7 @@ def _strip_quantifier(pattern: str) -> str:
113
130
  return pattern[:-2]
114
131
  if pattern.endswith(("?", "*", "+")):
115
132
  pattern = pattern[:-1]
116
- if pattern.endswith("}"):
133
+ if pattern.endswith("}") and "{" in pattern:
117
134
  # Find the start of the exact quantifier and drop everything since that index
118
135
  idx = pattern.rfind("{")
119
136
  pattern = pattern[:idx]
@@ -21,7 +21,6 @@ if TYPE_CHECKING:
21
21
  import requests
22
22
  import werkzeug
23
23
  from _typeshed.wsgi import WSGIApplication
24
- from hypothesis.vendor.pretty import RepresentationPrinter
25
24
  from starlette_testclient._testclient import ASGI2App, ASGI3App
26
25
 
27
26
  from ..models import Case
@@ -35,8 +34,7 @@ class RequestConfig:
35
34
  proxy: str | None = None
36
35
  cert: RequestCert | None = None
37
36
 
38
- def _repr_pretty_(self, printer: RepresentationPrinter, cycle: bool) -> None:
39
- return None
37
+ def _repr_pretty_(self, *args: Any, **kwargs: Any) -> None: ...
40
38
 
41
39
  @property
42
40
  def prepared_timeout(self) -> float | None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: schemathesis
3
- Version: 3.38.4
3
+ Version: 3.38.6
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
@@ -9,8 +9,7 @@ Project-URL: Funding, https://github.com/sponsors/Stranger6667
9
9
  Project-URL: Source Code, https://github.com/schemathesis/schemathesis
10
10
  Author-email: Dmitry Dygalo <dmitry@dygalo.dev>
11
11
  Maintainer-email: Dmitry Dygalo <dmitry@dygalo.dev>
12
- License-Expression: MIT
13
- License-File: LICENSE
12
+ License: MIT
14
13
  Keywords: graphql,hypothesis,openapi,pytest,testing
15
14
  Classifier: Development Status :: 5 - Production/Stable
16
15
  Classifier: Environment :: Console
@@ -1,7 +1,7 @@
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=lm0J9uQFENfm7-6_wEaNKshGF1wmZebfZJ9G_sUhlqE,20839
4
+ schemathesis/_hypothesis.py,sha256=SHFQKVeKsKX55D7Rfb2DTG7gq7h-jLXMGGD8RG81ac4,21339
5
5
  schemathesis/_lazy_import.py,sha256=aMhWYgbU2JOltyWBb32vnWBb6kykOghucEzI_F70yVE,470
6
6
  schemathesis/_override.py,sha256=TAjYB3eJQmlw9K_xiR9ptt9Wj7if4U7UFlUhGjpBAoM,1625
7
7
  schemathesis/_patches.py,sha256=Hsbpn4UVeXUQD2Kllrbq01CSWsTYENWa0VJTyhX5C2k,895
@@ -15,14 +15,14 @@ schemathesis/exceptions.py,sha256=5zjPlyVoQNJGbwufplL6ZVV7FEBPBNPHGdlQRJ7xnhE,20
15
15
  schemathesis/failures.py,sha256=fybNkCF2rqH90e3KW_XwpgZnSM6f7_FERcxHT9Pd3NM,7911
16
16
  schemathesis/filters.py,sha256=f3c_yXIBwIin-9Y0qU2TkcC1NEM_Mw34jGUHQc0BOyw,17026
17
17
  schemathesis/graphql.py,sha256=XiuKcfoOB92iLFC8zpz2msLkM0_V0TLdxPNBqrrGZ8w,216
18
- schemathesis/hooks.py,sha256=f0AUPxyBenpe1YGIWDY_uwSRoT2mE4Tp4Qase7f0L08,14953
18
+ schemathesis/hooks.py,sha256=p5AXgjVGtka0jn9MOeyBaRUtNbqZTs4iaJqytYTacHc,14856
19
19
  schemathesis/lazy.py,sha256=Ddhkk7Tpc_VcRGYkCtKDmP2gpjxVmEZ3b01ZTNjbm8I,19004
20
20
  schemathesis/loaders.py,sha256=MoEhcdOEBJxNRn5X-ZNhWB9jZDHQQNpkNfEdQjf_NDw,4590
21
- schemathesis/models.py,sha256=2kMMJ3JVe4_91uhRxgsZ_G1FOyksxTiYAo52M5asWLA,49868
22
- schemathesis/parameters.py,sha256=_LN3NL5XwoRfvjcU8o2ArrNFK9sbBZo25UFdxuywkRw,2425
21
+ schemathesis/models.py,sha256=s0lt63sBShsgKoM_kqLPb56jIeHSwTfk-TDQmQowXH8,49669
22
+ schemathesis/parameters.py,sha256=izlu4MFYT1RWrC4RBxrV6weeCal-ODbdLQLMb0PYCZY,2327
23
23
  schemathesis/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
24
  schemathesis/sanitization.py,sha256=Lycn1VVfula9B6XpzkxTHja7CZ7RHqbUh9kBic0Yi4M,9056
25
- schemathesis/schemas.py,sha256=KyG8IUNv7_3tPBzT9ARGDmUVEPvHHj6f1wW7GYbfvI4,20623
25
+ schemathesis/schemas.py,sha256=kwgdRD7JdE0iovuZVqArQCf_Dqfo2CsqqWYeR_bgsZo,20526
26
26
  schemathesis/serializers.py,sha256=HyYVSVR71FhWfIErnH6OoGLOa4tkh9mTeVUTIpzEW24,11739
27
27
  schemathesis/targets.py,sha256=XIGRghvEzbmEJjse9aZgNEj67L3jAbiazm2rxURWgDE,2351
28
28
  schemathesis/throttling.py,sha256=aisUc4MJDGIOGUAs9L2DlWWpdd4KyAFuNVKhYoaUC9M,1719
@@ -61,7 +61,7 @@ schemathesis/fixups/utf8_bom.py,sha256=lWT9RNmJG8i-l5AXIpaCT3qCPUwRgzXPW3eoOjmZE
61
61
  schemathesis/generation/__init__.py,sha256=29Zys_tD6kfngaC4zHeC6TOBZQcmo7CWm7KDSYsHStQ,1581
62
62
  schemathesis/generation/_hypothesis.py,sha256=74fzLPHugZgMQXerWYFAMqCAjtAXz5E4gek7Gnkhli4,1756
63
63
  schemathesis/generation/_methods.py,sha256=r8oVlJ71_gXcnEhU-byw2E0R2RswQQFm8U7yGErSqbw,1204
64
- schemathesis/generation/coverage.py,sha256=hMtISl3fYaTmE78sFCBd42BPJfPvgSEZJztlXnKxTRo,38310
64
+ schemathesis/generation/coverage.py,sha256=6VCaQ8bUtBmbG-DCOS11rXHA-s6hiIzVtbXAB0pYMZU,38604
65
65
  schemathesis/internal/__init__.py,sha256=93HcdG3LF0BbQKbCteOsFMa1w6nXl8yTmx87QLNJOik,161
66
66
  schemathesis/internal/checks.py,sha256=SBx2gesB-XzgVSMX_u7Mb416jSxJ68eQKtcdkWlkyOo,2441
67
67
  schemathesis/internal/copy.py,sha256=DcL56z-d69kKR_5u8mlHvjSL1UTyUKNMAwexrwHFY1s,1031
@@ -79,7 +79,7 @@ schemathesis/runner/events.py,sha256=cRKKSDvHvKLBIyFBz-J0JtAKshbGGKco9eaMyLCgzsY
79
79
  schemathesis/runner/probes.py,sha256=no5AfO3kse25qvHevjeUfB0Q3C860V2AYzschUW3QMQ,5688
80
80
  schemathesis/runner/serialization.py,sha256=vZi1wd9HX9Swp9VJ_hZFeDgy3Y726URpHra-TbPvQhk,20762
81
81
  schemathesis/runner/impl/__init__.py,sha256=1E2iME8uthYPBh9MjwVBCTFV-P3fi7AdphCCoBBspjs,199
82
- schemathesis/runner/impl/context.py,sha256=hjJoDHpL9wUXVUGlC-Mx82tUpNAi7qecEB847T-XEvY,3043
82
+ schemathesis/runner/impl/context.py,sha256=8pedlvOnh7pjvEMveaSWCUiG4s12ST4EZCJqcWLu5Bg,2950
83
83
  schemathesis/runner/impl/core.py,sha256=3bCwPcZB1br-clz3oQz8KV9yF9hZK7t3F29ZEq2ErBQ,47642
84
84
  schemathesis/runner/impl/solo.py,sha256=y5QSxgK8nBCEjZVD5BpFvYUXmB6tEjk6TwxAo__NejA,2911
85
85
  schemathesis/runner/impl/threadpool.py,sha256=yNR5LYE8f3N_4t42OwSgy0_qdGgBPM7d11F9c9oEAAs,15075
@@ -107,7 +107,7 @@ schemathesis/specs/graphql/validation.py,sha256=uINIOt-2E7ZuQV2CxKzwez-7L9tDtqzM
107
107
  schemathesis/specs/openapi/__init__.py,sha256=HDcx3bqpa6qWPpyMrxAbM3uTo0Lqpg-BUNZhDJSJKnw,279
108
108
  schemathesis/specs/openapi/_cache.py,sha256=PAiAu4X_a2PQgD2lG5H3iisXdyg4SaHpU46bRZvfNkM,4320
109
109
  schemathesis/specs/openapi/_hypothesis.py,sha256=nU8UDn1PzGCre4IVmwIuO9-CZv1KJe1fYY0d2BojhSo,22981
110
- schemathesis/specs/openapi/checks.py,sha256=ugo7-6iAu2fX8OmQgyvSunMO9Nt9cr6PNdT3vyX8Z4I,23914
110
+ schemathesis/specs/openapi/checks.py,sha256=NZwcqmLnINq3rUUUmdof0GGB0AjaqSF5dOQy08nsJPg,23902
111
111
  schemathesis/specs/openapi/constants.py,sha256=JqM_FHOenqS_MuUE9sxVQ8Hnw0DNM8cnKDwCwPLhID4,783
112
112
  schemathesis/specs/openapi/converter.py,sha256=Yxw9lS_JKEyi-oJuACT07fm04bqQDlAu-iHwzkeDvE4,3546
113
113
  schemathesis/specs/openapi/definitions.py,sha256=WTkWwCgTc3OMxfKsqh6YDoGfZMTThSYrHGp8h0vLAK0,93935
@@ -116,8 +116,8 @@ schemathesis/specs/openapi/formats.py,sha256=3KtEC-8nQRwMErS-WpMadXsr8R0O-NzYwFi
116
116
  schemathesis/specs/openapi/links.py,sha256=C4Uir2P_EcpqME8ee_a1vdUM8Tm3ZcKNn2YsGjZiMUQ,17935
117
117
  schemathesis/specs/openapi/loaders.py,sha256=5B1cgYEBj3h2psPQxzrQ5Xq5owLVGw-u9HsCQIx7yFE,25705
118
118
  schemathesis/specs/openapi/media_types.py,sha256=dNTxpRQbY3SubdVjh4Cjb38R6Bc9MF9BsRQwPD87x0g,1017
119
- schemathesis/specs/openapi/parameters.py,sha256=ri_LBnGHLHxDFBw-tExJ54kCfnhgECWRd-tIceCGHiE,14757
120
- schemathesis/specs/openapi/patterns.py,sha256=IK2BkXI1xByEz5if6jvydFE07nq5rDa4k_-2xX7ifG8,4715
119
+ schemathesis/specs/openapi/parameters.py,sha256=LUahlWKCDSlp94v2IA1Q90pyeECgO6FmrqbzCU-9Z0Y,14658
120
+ schemathesis/specs/openapi/patterns.py,sha256=aEOiJeqI_qcE9bE2Viz6TUA8UppiTHm6QFxrLJryag8,5520
121
121
  schemathesis/specs/openapi/references.py,sha256=euxM02kQGMHh4Ss1jWjOY_gyw_HazafKITIsvOEiAvI,9831
122
122
  schemathesis/specs/openapi/schemas.py,sha256=MLU2h9DrQNCDkk74MFFSj-8BsKjkJsf9lJQHPxLFVps,53845
123
123
  schemathesis/specs/openapi/security.py,sha256=Z-6pk2Ga1PTUtBe298KunjVHsNh5A-teegeso7zcPIE,7138
@@ -147,14 +147,14 @@ schemathesis/stateful/sink.py,sha256=bHYlgh-fMwg1Srxk_XGs0-WV34YccotwH9PGrxCK57A
147
147
  schemathesis/stateful/state_machine.py,sha256=PFztY82W5enuXjO6k4Mz8fbHmDJ7Z8OLYZRWtuBeyjg,12956
148
148
  schemathesis/stateful/statistic.py,sha256=2-uU5xpT9CbMulKgJWLZN6MUpC0Fskf5yXTt4ef4NFA,542
149
149
  schemathesis/stateful/validation.py,sha256=23qSZjC1_xRmtCX4OqsyG6pGxdlo6IZYid695ZpDQyU,3747
150
- schemathesis/transports/__init__.py,sha256=kFM_0RcBjjw5Jg5ddBhWi98pvC0WrVsR_irJNAb4FQs,13048
150
+ schemathesis/transports/__init__.py,sha256=k35qBp-657qnHE9FfCowqO3rqOgCwSUnrdl2vAV3hnQ,12951
151
151
  schemathesis/transports/asgi.py,sha256=bwW9vMd1h89Jh7I4jHJVwSNUQzHvc7-JOD5u4hSHZd8,212
152
152
  schemathesis/transports/auth.py,sha256=urSTO9zgFO1qU69xvnKHPFQV0SlJL3d7_Ojl0tLnZwo,1143
153
153
  schemathesis/transports/content_types.py,sha256=MiKOm-Hy5i75hrROPdpiBZPOTDzOwlCdnthJD12AJzI,2187
154
154
  schemathesis/transports/headers.py,sha256=hr_AIDOfUxsJxpHfemIZ_uNG3_vzS_ZeMEKmZjbYiBE,990
155
155
  schemathesis/transports/responses.py,sha256=OFD4ZLqwEFpo7F9vaP_SVgjhxAqatxIj38FS4XVq8Qs,1680
156
- schemathesis-3.38.4.dist-info/METADATA,sha256=hXln3HxI_xM3plasHcuEeu6OkknqAZgZBAZr-LJZxE0,12956
157
- schemathesis-3.38.4.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
158
- schemathesis-3.38.4.dist-info/entry_points.txt,sha256=VHyLcOG7co0nOeuk8WjgpRETk5P1E2iCLrn26Zkn5uk,158
159
- schemathesis-3.38.4.dist-info/licenses/LICENSE,sha256=PsPYgrDhZ7g9uwihJXNG-XVb55wj2uYhkl2DD8oAzY0,1103
160
- schemathesis-3.38.4.dist-info/RECORD,,
156
+ schemathesis-3.38.6.dist-info/METADATA,sha256=CbrAdVVhZVREx6pwkPRARvVXqETpf8YE34flEN3Tr4I,12923
157
+ schemathesis-3.38.6.dist-info/WHEEL,sha256=WJ9WQ4-pUYxfD_tEj5GvKSG9KSULNumqkTQdolV8mME,87
158
+ schemathesis-3.38.6.dist-info/entry_points.txt,sha256=VHyLcOG7co0nOeuk8WjgpRETk5P1E2iCLrn26Zkn5uk,158
159
+ schemathesis-3.38.6.dist-info/licenses/LICENSE,sha256=PsPYgrDhZ7g9uwihJXNG-XVb55wj2uYhkl2DD8oAzY0,1103
160
+ schemathesis-3.38.6.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.25.0
2
+ Generator: hatchling 1.26.2
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any