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.
- schemathesis/_hypothesis.py +5 -0
- schemathesis/auths.py +1 -0
- schemathesis/generation/coverage.py +33 -1
- schemathesis/internal/checks.py +2 -0
- schemathesis/models.py +4 -2
- schemathesis/runner/impl/context.py +7 -3
- schemathesis/runner/impl/core.py +13 -7
- schemathesis/specs/openapi/checks.py +5 -2
- {schemathesis-3.36.0.dist-info → schemathesis-3.36.1.dist-info}/METADATA +2 -1
- {schemathesis-3.36.0.dist-info → schemathesis-3.36.1.dist-info}/RECORD +13 -13
- {schemathesis-3.36.0.dist-info → schemathesis-3.36.1.dist-info}/WHEEL +0 -0
- {schemathesis-3.36.0.dist-info → schemathesis-3.36.1.dist-info}/entry_points.txt +0 -0
- {schemathesis-3.36.0.dist-info → schemathesis-3.36.1.dist-info}/licenses/LICENSE +0 -0
schemathesis/_hypothesis.py
CHANGED
|
@@ -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
|
@@ -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
|
|
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)
|
schemathesis/internal/checks.py
CHANGED
|
@@ -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
|
-
|
|
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__(
|
|
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 = {}
|
schemathesis/runner/impl/core.py
CHANGED
|
@@ -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
|
-
|
|
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=
|
|
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
|
-
|
|
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=
|
|
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
|
-
|
|
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=
|
|
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.
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
63
|
+
schemathesis/generation/coverage.py,sha256=gEB8J9qJTSVRdINVYUw0twCxPIwmuWF2FPJRIwSiy5A,23944
|
|
64
64
|
schemathesis/internal/__init__.py,sha256=93HcdG3LF0BbQKbCteOsFMa1w6nXl8yTmx87QLNJOik,161
|
|
65
|
-
schemathesis/internal/checks.py,sha256=
|
|
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=
|
|
81
|
-
schemathesis/runner/impl/core.py,sha256=
|
|
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=
|
|
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.
|
|
154
|
-
schemathesis-3.36.
|
|
155
|
-
schemathesis-3.36.
|
|
156
|
-
schemathesis-3.36.
|
|
157
|
-
schemathesis-3.36.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|