schemathesis 4.3.10__py3-none-any.whl → 4.3.11__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.
Potentially problematic release.
This version of schemathesis might be problematic. Click here for more details.
- schemathesis/cli/commands/__init__.py +6 -1
- schemathesis/cli/commands/run/loaders.py +5 -1
- schemathesis/config/__init__.py +6 -2
- schemathesis/generation/coverage.py +1 -2
- schemathesis/generation/hypothesis/builder.py +2 -4
- schemathesis/openapi/loaders.py +5 -4
- schemathesis/schemas.py +4 -3
- schemathesis/specs/openapi/adapter/security.py +1 -1
- schemathesis/specs/openapi/examples.py +24 -12
- schemathesis/specs/openapi/stateful/__init__.py +2 -3
- {schemathesis-4.3.10.dist-info → schemathesis-4.3.11.dist-info}/METADATA +2 -2
- {schemathesis-4.3.10.dist-info → schemathesis-4.3.11.dist-info}/RECORD +15 -16
- schemathesis/generation/hypothesis/strategies.py +0 -16
- {schemathesis-4.3.10.dist-info → schemathesis-4.3.11.dist-info}/WHEEL +0 -0
- {schemathesis-4.3.10.dist-info → schemathesis-4.3.11.dist-info}/entry_points.txt +0 -0
- {schemathesis-4.3.10.dist-info → schemathesis-4.3.11.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import sys
|
|
3
4
|
from dataclasses import dataclass
|
|
4
5
|
from typing import Any
|
|
5
6
|
|
|
6
7
|
import click
|
|
7
|
-
from tomli import TOMLDecodeError
|
|
8
8
|
|
|
9
9
|
from schemathesis.cli.commands.data import Data
|
|
10
10
|
from schemathesis.cli.commands.run import run as run_command
|
|
@@ -16,6 +16,11 @@ from schemathesis.config import ConfigError, SchemathesisConfig
|
|
|
16
16
|
from schemathesis.core.errors import HookError, format_exception
|
|
17
17
|
from schemathesis.core.version import SCHEMATHESIS_VERSION
|
|
18
18
|
|
|
19
|
+
if sys.version_info < (3, 11):
|
|
20
|
+
from tomli import TOMLDecodeError
|
|
21
|
+
else:
|
|
22
|
+
from tomllib import TOMLDecodeError
|
|
23
|
+
|
|
19
24
|
CONTEXT_SETTINGS = {"help_option_names": ["-h", "--help"]}
|
|
20
25
|
|
|
21
26
|
|
|
@@ -8,6 +8,7 @@ from __future__ import annotations
|
|
|
8
8
|
|
|
9
9
|
import os
|
|
10
10
|
import warnings
|
|
11
|
+
from json import JSONDecodeError
|
|
11
12
|
from typing import TYPE_CHECKING, Any, Callable
|
|
12
13
|
|
|
13
14
|
from schemathesis import graphql, openapi
|
|
@@ -35,7 +36,10 @@ def should_try_more(exc: LoaderError) -> bool:
|
|
|
35
36
|
import requests
|
|
36
37
|
from yaml.reader import ReaderError
|
|
37
38
|
|
|
38
|
-
if isinstance(exc.__cause__, ReaderError) and "characters are not allowed" in str(exc.__cause__)
|
|
39
|
+
if (isinstance(exc.__cause__, ReaderError) and "characters are not allowed" in str(exc.__cause__)) or (
|
|
40
|
+
isinstance(exc.__cause__, JSONDecodeError)
|
|
41
|
+
and ('"swagger"' in exc.__cause__.doc or '"openapi"' in exc.__cause__.doc)
|
|
42
|
+
):
|
|
39
43
|
return False
|
|
40
44
|
|
|
41
45
|
# We should not try other loaders for cases when we can't even establish connection
|
schemathesis/config/__init__.py
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import os
|
|
4
|
+
import sys
|
|
4
5
|
from dataclasses import dataclass
|
|
5
6
|
from os import PathLike
|
|
6
7
|
from random import Random
|
|
7
8
|
|
|
8
|
-
import tomli
|
|
9
|
-
|
|
10
9
|
from schemathesis.config._checks import (
|
|
11
10
|
CheckConfig,
|
|
12
11
|
ChecksConfig,
|
|
@@ -29,6 +28,11 @@ from schemathesis.config._phases import (
|
|
|
29
28
|
from schemathesis.config._projects import ProjectConfig, ProjectsConfig, SchemathesisWarning, get_workers_count
|
|
30
29
|
from schemathesis.config._report import DEFAULT_REPORT_DIRECTORY, ReportConfig, ReportFormat, ReportsConfig
|
|
31
30
|
|
|
31
|
+
if sys.version_info < (3, 11):
|
|
32
|
+
import tomli
|
|
33
|
+
else:
|
|
34
|
+
import tomllib as tomli
|
|
35
|
+
|
|
32
36
|
__all__ = [
|
|
33
37
|
"SchemathesisConfig",
|
|
34
38
|
"ConfigError",
|
|
@@ -9,7 +9,6 @@ from itertools import combinations
|
|
|
9
9
|
|
|
10
10
|
from schemathesis.core.jsonschema.bundler import BUNDLE_STORAGE_KEY
|
|
11
11
|
from schemathesis.core.jsonschema.keywords import ALL_KEYWORDS
|
|
12
|
-
from schemathesis.generation.hypothesis.strategies import combine
|
|
13
12
|
|
|
14
13
|
try:
|
|
15
14
|
from json.encoder import _make_iterencode # type: ignore[attr-defined]
|
|
@@ -81,7 +80,7 @@ STRATEGIES_FOR_TYPE = {
|
|
|
81
80
|
def get_strategy_for_type(ty: str | list[str]) -> st.SearchStrategy:
|
|
82
81
|
if isinstance(ty, str):
|
|
83
82
|
return STRATEGIES_FOR_TYPE[ty]
|
|
84
|
-
return
|
|
83
|
+
return st.one_of(STRATEGIES_FOR_TYPE[t] for t in ty if t in STRATEGIES_FOR_TYPE)
|
|
85
84
|
|
|
86
85
|
|
|
87
86
|
FORMAT_STRATEGIES = {**BUILT_IN_STRING_FORMATS, **get_default_format_strategies(), **STRING_FORMATS}
|
|
@@ -35,7 +35,7 @@ from schemathesis.core.transport import prepare_urlencoded
|
|
|
35
35
|
from schemathesis.core.validation import has_invalid_characters, is_latin_1_encodable
|
|
36
36
|
from schemathesis.generation import GenerationMode, coverage
|
|
37
37
|
from schemathesis.generation.case import Case
|
|
38
|
-
from schemathesis.generation.hypothesis import examples, setup
|
|
38
|
+
from schemathesis.generation.hypothesis import examples, setup
|
|
39
39
|
from schemathesis.generation.hypothesis.examples import add_single_example
|
|
40
40
|
from schemathesis.generation.hypothesis.given import GivenInput
|
|
41
41
|
from schemathesis.generation.meta import (
|
|
@@ -112,9 +112,7 @@ def create_test(
|
|
|
112
112
|
**config.as_strategy_kwargs,
|
|
113
113
|
}
|
|
114
114
|
generation = config.project.generation_for(operation=operation)
|
|
115
|
-
strategy =
|
|
116
|
-
[operation.as_strategy(generation_mode=mode, **strategy_kwargs) for mode in generation.modes]
|
|
117
|
-
)
|
|
115
|
+
strategy = st.one_of(operation.as_strategy(generation_mode=mode, **strategy_kwargs) for mode in generation.modes)
|
|
118
116
|
|
|
119
117
|
hypothesis_test = create_base_test(
|
|
120
118
|
test_function=test_func,
|
schemathesis/openapi/loaders.py
CHANGED
|
@@ -303,10 +303,11 @@ def _load_yaml(content: str) -> dict[str, Any]:
|
|
|
303
303
|
try:
|
|
304
304
|
return deserialize_yaml(content)
|
|
305
305
|
except yaml.YAMLError as exc:
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
306
|
+
raise LoaderError(
|
|
307
|
+
LoaderErrorKind.SYNTAX_ERROR,
|
|
308
|
+
SCHEMA_SYNTAX_ERROR,
|
|
309
|
+
extras=[entry for entry in str(exc).splitlines() if entry],
|
|
310
|
+
) from exc
|
|
310
311
|
|
|
311
312
|
|
|
312
313
|
SCHEMA_INVALID_ERROR = "The provided API schema does not appear to be a valid OpenAPI schema"
|
schemathesis/schemas.py
CHANGED
|
@@ -16,6 +16,8 @@ from typing import (
|
|
|
16
16
|
)
|
|
17
17
|
from urllib.parse import quote, unquote, urljoin, urlsplit, urlunsplit
|
|
18
18
|
|
|
19
|
+
from hypothesis import strategies as st
|
|
20
|
+
|
|
19
21
|
from schemathesis import transport
|
|
20
22
|
from schemathesis.config import ProjectConfig
|
|
21
23
|
from schemathesis.core import NOT_SET, NotSet, media_types
|
|
@@ -25,7 +27,6 @@ from schemathesis.core.result import Ok, Result
|
|
|
25
27
|
from schemathesis.core.transport import Response
|
|
26
28
|
from schemathesis.generation import GenerationMode
|
|
27
29
|
from schemathesis.generation.case import Case
|
|
28
|
-
from schemathesis.generation.hypothesis import strategies
|
|
29
30
|
from schemathesis.generation.hypothesis.given import GivenInput, given_proxy
|
|
30
31
|
from schemathesis.generation.meta import CaseMetadata
|
|
31
32
|
from schemathesis.hooks import HookDispatcherMark, _should_skip_hook
|
|
@@ -458,7 +459,7 @@ class BaseSchema(Mapping):
|
|
|
458
459
|
for operation in self.get_all_operations()
|
|
459
460
|
if isinstance(operation, Ok)
|
|
460
461
|
]
|
|
461
|
-
return
|
|
462
|
+
return st.one_of(_strategies)
|
|
462
463
|
|
|
463
464
|
def find_operation_by_label(self, label: str) -> APIOperation | None:
|
|
464
465
|
raise NotImplementedError
|
|
@@ -500,7 +501,7 @@ class APIOperationMap(Mapping):
|
|
|
500
501
|
_strategies = [
|
|
501
502
|
operation.as_strategy(generation_mode=generation_mode, **kwargs) for operation in self._data.values()
|
|
502
503
|
]
|
|
503
|
-
return
|
|
504
|
+
return st.one_of(_strategies)
|
|
504
505
|
|
|
505
506
|
|
|
506
507
|
P = TypeVar("P", bound=OperationParameter)
|
|
@@ -7,7 +7,7 @@ if TYPE_CHECKING:
|
|
|
7
7
|
from schemathesis.core.compat import RefResolver
|
|
8
8
|
from schemathesis.specs.openapi.adapter.protocol import SpecificationAdapter
|
|
9
9
|
|
|
10
|
-
ORIGINAL_SECURITY_TYPE_KEY = "x-original-
|
|
10
|
+
ORIGINAL_SECURITY_TYPE_KEY = "x-original-security-type"
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
@dataclass
|
|
@@ -12,7 +12,6 @@ from hypothesis_jsonschema import from_schema
|
|
|
12
12
|
from schemathesis.config import GenerationConfig
|
|
13
13
|
from schemathesis.core.compat import RefResolutionError, RefResolver
|
|
14
14
|
from schemathesis.core.errors import InfiniteRecursiveReference, UnresolvableReference
|
|
15
|
-
from schemathesis.core.jsonschema import references
|
|
16
15
|
from schemathesis.core.jsonschema.bundler import BUNDLE_STORAGE_KEY
|
|
17
16
|
from schemathesis.core.transforms import deepclone
|
|
18
17
|
from schemathesis.core.transport import DEFAULT_RESPONSE_TIMEOUT
|
|
@@ -216,11 +215,11 @@ def _resolve_bundled(
|
|
|
216
215
|
if isinstance(reference, str):
|
|
217
216
|
# Check if this reference is already in the current path
|
|
218
217
|
if reference in reference_path:
|
|
219
|
-
#
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
218
|
+
# Real infinite recursive references are caught at the bundling stage.
|
|
219
|
+
# This recursion happens because of how the example phase generates data - it explores everything,
|
|
220
|
+
# so it is the easiest way to break such cycles
|
|
221
|
+
cycle = list(reference_path[reference_path.index(reference) :])
|
|
222
|
+
raise InfiniteRecursiveReference(reference, cycle)
|
|
224
223
|
|
|
225
224
|
new_path = reference_path + (reference,)
|
|
226
225
|
|
|
@@ -238,7 +237,11 @@ def _expand_subschemas(
|
|
|
238
237
|
*, schema: dict[str, Any] | bool, resolver: RefResolver, reference_path: tuple[str, ...]
|
|
239
238
|
) -> Generator[tuple[dict[str, Any] | bool, tuple[str, ...]], None, None]:
|
|
240
239
|
"""Expand schema and all its subschemas."""
|
|
241
|
-
|
|
240
|
+
try:
|
|
241
|
+
schema, current_path = _resolve_bundled(schema, resolver, reference_path)
|
|
242
|
+
except InfiniteRecursiveReference:
|
|
243
|
+
return
|
|
244
|
+
|
|
242
245
|
yield (schema, current_path)
|
|
243
246
|
|
|
244
247
|
if isinstance(schema, dict):
|
|
@@ -250,13 +253,19 @@ def _expand_subschemas(
|
|
|
250
253
|
yield (subschema, current_path)
|
|
251
254
|
|
|
252
255
|
# For allOf, merge all alternatives
|
|
253
|
-
if "allOf" in schema:
|
|
256
|
+
if "allOf" in schema and schema["allOf"]:
|
|
254
257
|
subschema = deepclone(schema["allOf"][0])
|
|
255
|
-
|
|
258
|
+
try:
|
|
259
|
+
subschema, expanded_path = _resolve_bundled(subschema, resolver, current_path)
|
|
260
|
+
except InfiniteRecursiveReference:
|
|
261
|
+
return
|
|
256
262
|
|
|
257
263
|
for sub in schema["allOf"][1:]:
|
|
258
264
|
if isinstance(sub, dict):
|
|
259
|
-
|
|
265
|
+
try:
|
|
266
|
+
sub, _ = _resolve_bundled(sub, resolver, current_path)
|
|
267
|
+
except InfiniteRecursiveReference:
|
|
268
|
+
return
|
|
260
269
|
for key, value in sub.items():
|
|
261
270
|
if key == "properties":
|
|
262
271
|
subschema.setdefault("properties", {}).update(value)
|
|
@@ -269,7 +278,7 @@ def _expand_subschemas(
|
|
|
269
278
|
else:
|
|
270
279
|
subschema[key] = value
|
|
271
280
|
|
|
272
|
-
yield (subschema,
|
|
281
|
+
yield (subschema, expanded_path)
|
|
273
282
|
|
|
274
283
|
|
|
275
284
|
def extract_inner_examples(examples: dict[str, Any] | list, schema: BaseOpenAPISchema) -> Generator[Any, None, None]:
|
|
@@ -353,7 +362,10 @@ def extract_from_schema(
|
|
|
353
362
|
) -> Generator[Any, None, None]:
|
|
354
363
|
"""Extract all examples from a single schema definition."""
|
|
355
364
|
# This implementation supports only `properties` and `items`
|
|
356
|
-
|
|
365
|
+
try:
|
|
366
|
+
schema, current_path = _resolve_bundled(schema, resolver, reference_path)
|
|
367
|
+
except InfiniteRecursiveReference:
|
|
368
|
+
return
|
|
357
369
|
|
|
358
370
|
if "properties" in schema:
|
|
359
371
|
variants = {}
|
|
@@ -15,7 +15,6 @@ from schemathesis.core.transforms import UNRESOLVABLE
|
|
|
15
15
|
from schemathesis.engine.recorder import ScenarioRecorder
|
|
16
16
|
from schemathesis.generation import GenerationMode
|
|
17
17
|
from schemathesis.generation.case import Case
|
|
18
|
-
from schemathesis.generation.hypothesis import strategies
|
|
19
18
|
from schemathesis.generation.meta import ComponentInfo, TestPhase
|
|
20
19
|
from schemathesis.generation.stateful import STATEFUL_TESTS_LABEL
|
|
21
20
|
from schemathesis.generation.stateful.state_machine import APIStateMachine, StepInput, StepOutput, _normalize_name
|
|
@@ -277,8 +276,8 @@ def into_step_input(
|
|
|
277
276
|
|
|
278
277
|
is_applied = bool(kwargs)
|
|
279
278
|
|
|
280
|
-
cases =
|
|
281
|
-
|
|
279
|
+
cases = st.one_of(
|
|
280
|
+
target.as_strategy(generation_mode=mode, phase=TestPhase.STATEFUL, **kwargs) for mode in modes
|
|
282
281
|
)
|
|
283
282
|
case = draw(cases)
|
|
284
283
|
if (
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: schemathesis
|
|
3
|
-
Version: 4.3.
|
|
3
|
+
Version: 4.3.11
|
|
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://github.com/schemathesis/schemathesis/blob/master/CHANGELOG.md
|
|
@@ -46,7 +46,7 @@ Requires-Dist: pyyaml<7.0,>=5.1
|
|
|
46
46
|
Requires-Dist: requests<3,>=2.22
|
|
47
47
|
Requires-Dist: rich>=13.9.4
|
|
48
48
|
Requires-Dist: starlette-testclient<1,>=0.4.1
|
|
49
|
-
Requires-Dist: tomli>=2.2.1
|
|
49
|
+
Requires-Dist: tomli>=2.2.1; python_version < '3.11'
|
|
50
50
|
Requires-Dist: typing-extensions>=4.12.2
|
|
51
51
|
Requires-Dist: werkzeug<4,>=0.16.0
|
|
52
52
|
Provides-Extra: bench
|
|
@@ -5,19 +5,19 @@ schemathesis/errors.py,sha256=K3irHIZkrBH2-9LIjlgXlm8RNC41Nffd39ncfwagUvw,1053
|
|
|
5
5
|
schemathesis/filters.py,sha256=IevPA5A04GfRLLjmkFLZ0CLhjNO3RmpZq_yw6MqjLIA,13515
|
|
6
6
|
schemathesis/hooks.py,sha256=q2wqYNgpMCO8ImSBkbrWDSwN0BSELelqJMgAAgGvv2M,14836
|
|
7
7
|
schemathesis/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
|
-
schemathesis/schemas.py,sha256=
|
|
8
|
+
schemathesis/schemas.py,sha256=Rn4WHRTe1dGVtoHO1c2N7K13THevuWxeAt8wyvMZmy0,27547
|
|
9
9
|
schemathesis/cli/__init__.py,sha256=U9gjzWWpiFhaqevPjZbwyTNjABdpvXETI4HgwdGKnvs,877
|
|
10
10
|
schemathesis/cli/__main__.py,sha256=MWaenjaUTZIfNPFzKmnkTiawUri7DVldtg3mirLwzU8,92
|
|
11
11
|
schemathesis/cli/constants.py,sha256=CVcQNHEiX-joAQmyuEVKWPOSxDHsOw_EXXZsEclzLuY,341
|
|
12
12
|
schemathesis/cli/core.py,sha256=ue7YUdVo3YvuzGL4s6i62NL6YqNDeVPBSnQ1znrvG2w,480
|
|
13
|
-
schemathesis/cli/commands/__init__.py,sha256=
|
|
13
|
+
schemathesis/cli/commands/__init__.py,sha256=cZowfGwoby-2LmOS6ViRXjSTHe--vaTLndIbXbwF188,3833
|
|
14
14
|
schemathesis/cli/commands/data.py,sha256=_ALywjIeCZjuaoDQFy-Kj8RZkEGqXd-Y95O47h8Jszs,171
|
|
15
15
|
schemathesis/cli/commands/run/__init__.py,sha256=_ApiSVh9q-TsJQ_-IiVBNnLCtTCDMTnOLwuJhOvbCp4,18925
|
|
16
16
|
schemathesis/cli/commands/run/context.py,sha256=vej33l5yOhlJ5gLXDwat9WCW_XdhrHNc9pdIQQYddoY,9004
|
|
17
17
|
schemathesis/cli/commands/run/events.py,sha256=ew0TQOc9T2YBZynYWv95k9yfAk8-hGuZDLMxjT8EhvY,1595
|
|
18
18
|
schemathesis/cli/commands/run/executor.py,sha256=_koznTX0DoELPN_1mxr9K_Qg7-9MPXWdld1MFn3YG_Y,5329
|
|
19
19
|
schemathesis/cli/commands/run/filters.py,sha256=pzkNRcf5vLPSsMfnvt711GNzRSBK5iZIFjPA0fiH1N4,1701
|
|
20
|
-
schemathesis/cli/commands/run/loaders.py,sha256=
|
|
20
|
+
schemathesis/cli/commands/run/loaders.py,sha256=eRgP1ZPfhOfxR7iXQ_CfV9r_8jP1DN4tg2aORuZLmOM,4538
|
|
21
21
|
schemathesis/cli/commands/run/validation.py,sha256=DQaMiBLN2tYT9hONvv8xnyPvNXZH768UlOdUxTd5kZs,9193
|
|
22
22
|
schemathesis/cli/commands/run/handlers/__init__.py,sha256=TPZ3KdGi8m0fjlN0GjA31MAXXn1qI7uU4FtiDwroXZI,1915
|
|
23
23
|
schemathesis/cli/commands/run/handlers/base.py,sha256=qUtDvtr3F6were_BznfnaPpMibGJMnQ5CA9aEzcIUBc,1306
|
|
@@ -28,7 +28,7 @@ schemathesis/cli/ext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
|
|
|
28
28
|
schemathesis/cli/ext/fs.py,sha256=dHQYBjQozQmuSSfXVp-2KWFK0ESOb_w-lV2SptfMfco,461
|
|
29
29
|
schemathesis/cli/ext/groups.py,sha256=kQ37t6qeArcKaY2y5VxyK3_KwAkBKCVm58IYV8gewds,2720
|
|
30
30
|
schemathesis/cli/ext/options.py,sha256=6yYwZNJL__FCEEL7kI3r5MbVmbp3ZeQjm7DrZ6J_h7s,3347
|
|
31
|
-
schemathesis/config/__init__.py,sha256=
|
|
31
|
+
schemathesis/config/__init__.py,sha256=5jckLTurHbe8uEn656_2rVU-xLAUOUDazUwyECXaT90,6391
|
|
32
32
|
schemathesis/config/_auth.py,sha256=83RLVPm97W2thbn-yi01Rt94YwOxLG_a5VoxhEfjUjs,1528
|
|
33
33
|
schemathesis/config/_checks.py,sha256=F0r16eSSiICvoiTUkNNOE2PH73EGd8bikoeZdME_3Yw,10763
|
|
34
34
|
schemathesis/config/_diff_base.py,sha256=U7wuE4480EjP3K16mfC528TP5q7Q5IwAZwZLqRIrS1E,4300
|
|
@@ -93,17 +93,16 @@ schemathesis/engine/phases/unit/_executor.py,sha256=YDibV3lkC2UMHLvh1FSmnlaQ-SJS
|
|
|
93
93
|
schemathesis/engine/phases/unit/_pool.py,sha256=iU0hdHDmohPnEv7_S1emcabuzbTf-Cznqwn0pGQ5wNQ,2480
|
|
94
94
|
schemathesis/generation/__init__.py,sha256=tvNO2FLiY8z3fZ_kL_QJhSgzXfnT4UqwSXMHCwfLI0g,645
|
|
95
95
|
schemathesis/generation/case.py,sha256=SLMw6zkzmeiZdaIij8_0tjTF70BrMlRSWREaqWii0uM,12508
|
|
96
|
-
schemathesis/generation/coverage.py,sha256=
|
|
96
|
+
schemathesis/generation/coverage.py,sha256=xQSqeffVlmRGk-MZMcQZwSMhMluO8fS4d9Q7Is-viQ4,60747
|
|
97
97
|
schemathesis/generation/meta.py,sha256=tXhUZBEdpQMn68uMx1SW8Vv59Uf6Wl6yzs-VB9lu_8o,2589
|
|
98
98
|
schemathesis/generation/metrics.py,sha256=cZU5HdeAMcLFEDnTbNE56NuNq4P0N4ew-g1NEz5-kt4,2836
|
|
99
99
|
schemathesis/generation/modes.py,sha256=Q1fhjWr3zxabU5qdtLvKfpMFZJAwlW9pnxgenjeXTyU,481
|
|
100
100
|
schemathesis/generation/overrides.py,sha256=xI2djHsa42fzP32xpxgxO52INixKagf5DjDAWJYswM8,3890
|
|
101
101
|
schemathesis/generation/hypothesis/__init__.py,sha256=68BHULoXQC1WjFfw03ga5lvDGZ-c-J7H_fNEuUzFWRw,4976
|
|
102
|
-
schemathesis/generation/hypothesis/builder.py,sha256=
|
|
102
|
+
schemathesis/generation/hypothesis/builder.py,sha256=pnPfJIXBYKyju98xiGUvavh5W2xvuO89RO_NOsvdxYQ,38443
|
|
103
103
|
schemathesis/generation/hypothesis/examples.py,sha256=6eGaKUEC3elmKsaqfKj1sLvM8EHc-PWT4NRBq4NI0Rs,1409
|
|
104
104
|
schemathesis/generation/hypothesis/given.py,sha256=sTZR1of6XaHAPWtHx2_WLlZ50M8D5Rjux0GmWkWjDq4,2337
|
|
105
105
|
schemathesis/generation/hypothesis/reporting.py,sha256=uDVow6Ya8YFkqQuOqRsjbzsbyP4KKfr3jA7ZaY4FuKY,279
|
|
106
|
-
schemathesis/generation/hypothesis/strategies.py,sha256=RurE81E06d99YKG48dizy9346ayfNswYTt38zewmGgw,483
|
|
107
106
|
schemathesis/generation/stateful/__init__.py,sha256=s7jiJEnguIj44IsRyMi8afs-8yjIUuBbzW58bH5CHjs,1042
|
|
108
107
|
schemathesis/generation/stateful/state_machine.py,sha256=25kkYImw5byNwuTtt97aNE3kTHAF8rZ-p3ax_bmd3JI,9135
|
|
109
108
|
schemathesis/graphql/__init__.py,sha256=_eO6MAPHGgiADVGRntnwtPxmuvk666sAh-FAU4cG9-0,326
|
|
@@ -111,7 +110,7 @@ schemathesis/graphql/checks.py,sha256=IADbxiZjgkBWrC5yzHDtohRABX6zKXk5w_zpWNwdzY
|
|
|
111
110
|
schemathesis/graphql/loaders.py,sha256=2tgG4HIvFmjHLr_KexVXnT8hSBM-dKG_fuXTZgE97So,9445
|
|
112
111
|
schemathesis/openapi/__init__.py,sha256=-KcsSAM19uOM0N5J4s-yTnQ1BFsptYhW1E51cEf6kVM,311
|
|
113
112
|
schemathesis/openapi/checks.py,sha256=nrkkagRqg-HOsDCAMbJqCnHyBZEA2PpRV_AB8lI_I9c,13080
|
|
114
|
-
schemathesis/openapi/loaders.py,sha256
|
|
113
|
+
schemathesis/openapi/loaders.py,sha256=aaCIf6P8R33l6DBNGD_99m_wruYOPR7ecyL5hT6UChg,10710
|
|
115
114
|
schemathesis/openapi/generation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
116
115
|
schemathesis/openapi/generation/filters.py,sha256=pY9cUZdL_kQK80Z2aylTOqqa12zmaYUlYC5BfYgeQMk,2395
|
|
117
116
|
schemathesis/pytest/__init__.py,sha256=7W0q-Thcw03IAQfXE_Mo8JPZpUdHJzfu85fjK1ZdfQM,88
|
|
@@ -133,7 +132,7 @@ schemathesis/specs/openapi/_hypothesis.py,sha256=O8vN-koBjzBVZfpD3pmgIt6ecU4ddAP
|
|
|
133
132
|
schemathesis/specs/openapi/checks.py,sha256=12ks0V2F8-YKPkItgAc0ZrxsHufWWlsgj-jpj-cF40A,31578
|
|
134
133
|
schemathesis/specs/openapi/converter.py,sha256=4a6-8STT5snF7B-t6IsOIGdK5rV16oNqsdvWL7VFf2M,6472
|
|
135
134
|
schemathesis/specs/openapi/definitions.py,sha256=8htclglV3fW6JPBqs59lgM4LnA25Mm9IptXBPb_qUT0,93949
|
|
136
|
-
schemathesis/specs/openapi/examples.py,sha256=
|
|
135
|
+
schemathesis/specs/openapi/examples.py,sha256=uHV1HRqFhwpGNsBWHt7WmehyIyr8d-n-VeKKs4FRt2c,24475
|
|
137
136
|
schemathesis/specs/openapi/formats.py,sha256=4tYRdckauHxkJCmOhmdwDq_eOpHPaKloi89lzMPbPzw,3975
|
|
138
137
|
schemathesis/specs/openapi/media_types.py,sha256=F5M6TKl0s6Z5X8mZpPsWDEdPBvxclKRcUOc41eEwKbo,2472
|
|
139
138
|
schemathesis/specs/openapi/patterns.py,sha256=GqPZEXMRdWENQxanWjBOalIZ2MQUjuxk21kmdiI703E,18027
|
|
@@ -146,7 +145,7 @@ schemathesis/specs/openapi/adapter/parameters.py,sha256=bVo7sgN5oCH2GVDXlqAMrwN0
|
|
|
146
145
|
schemathesis/specs/openapi/adapter/protocol.py,sha256=VDF6COcilHEUnmw76YBVur8bFiTFQHsNvaO9pR_i_KM,2709
|
|
147
146
|
schemathesis/specs/openapi/adapter/references.py,sha256=6M59pJy_U_sLh3Xzgu6-izWXtz3bjXnqJYSD65wRHtk,549
|
|
148
147
|
schemathesis/specs/openapi/adapter/responses.py,sha256=UXcYb048SeS0MhydQY518IgYD0s0Q5YpLsBbdX5-5-s,13276
|
|
149
|
-
schemathesis/specs/openapi/adapter/security.py,sha256=
|
|
148
|
+
schemathesis/specs/openapi/adapter/security.py,sha256=F3K3_LsdUI61O8C-tUhWd3CyBjlwZ_ujhIoUZqzb90A,4945
|
|
150
149
|
schemathesis/specs/openapi/adapter/v2.py,sha256=2Rd1cTv7_I5QrBPLVfa2yD80NAErxV3tdeACjtEfXAA,1280
|
|
151
150
|
schemathesis/specs/openapi/adapter/v3_0.py,sha256=8bOE9WUDrvPivGs0w-S1PP2TXgWuaoTzMdg2_WWbi-E,1272
|
|
152
151
|
schemathesis/specs/openapi/adapter/v3_1.py,sha256=Hi4iMQdLDAeqSVYjafXbRb5yolWuqMz9A954tE2SCQY,1282
|
|
@@ -160,7 +159,7 @@ schemathesis/specs/openapi/negative/__init__.py,sha256=B78vps314fJOMZwlPdv7vUHo7
|
|
|
160
159
|
schemathesis/specs/openapi/negative/mutations.py,sha256=9U352xJsdZBR-Zfy1V7_X3a5i91LIUS9Zqotrzp3BLA,21000
|
|
161
160
|
schemathesis/specs/openapi/negative/types.py,sha256=a7buCcVxNBG6ILBM3A7oNTAX0lyDseEtZndBuej8MbI,174
|
|
162
161
|
schemathesis/specs/openapi/negative/utils.py,sha256=ozcOIuASufLqZSgnKUACjX-EOZrrkuNdXX0SDnLoGYA,168
|
|
163
|
-
schemathesis/specs/openapi/stateful/__init__.py,sha256=
|
|
162
|
+
schemathesis/specs/openapi/stateful/__init__.py,sha256=EkGiy1ksv0lH7IDBfR6Bdo1D9kaT5dLIJUwoz-p7hkw,16594
|
|
164
163
|
schemathesis/specs/openapi/stateful/control.py,sha256=QaXLSbwQWtai5lxvvVtQV3BLJ8n5ePqSKB00XFxp-MA,3695
|
|
165
164
|
schemathesis/specs/openapi/stateful/inference.py,sha256=B99jSTDVi2yKxU7-raIb91xpacOrr0nZkEZY5Ej3eCY,9783
|
|
166
165
|
schemathesis/specs/openapi/stateful/links.py,sha256=SSA66mU50FFBz7e6sA37CfL-Vt0OY3gont72oFSvZYU,8163
|
|
@@ -179,8 +178,8 @@ schemathesis/transport/prepare.py,sha256=erYXRaxpQokIDzaIuvt_csHcw72iHfCyNq8VNEz
|
|
|
179
178
|
schemathesis/transport/requests.py,sha256=wriRI9fprTplE_qEZLEz1TerX6GwkE3pwr6ZnU2o6vQ,10648
|
|
180
179
|
schemathesis/transport/serialization.py,sha256=GwO6OAVTmL1JyKw7HiZ256tjV4CbrRbhQN0ep1uaZwI,11157
|
|
181
180
|
schemathesis/transport/wsgi.py,sha256=kQtasFre6pjdJWRKwLA_Qb-RyQHCFNpaey9ubzlFWKI,5907
|
|
182
|
-
schemathesis-4.3.
|
|
183
|
-
schemathesis-4.3.
|
|
184
|
-
schemathesis-4.3.
|
|
185
|
-
schemathesis-4.3.
|
|
186
|
-
schemathesis-4.3.
|
|
181
|
+
schemathesis-4.3.11.dist-info/METADATA,sha256=yx5kZtdpuluVpHR7jIERaQlKLfLpYa7h__hOuJMAyyU,8566
|
|
182
|
+
schemathesis-4.3.11.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
183
|
+
schemathesis-4.3.11.dist-info/entry_points.txt,sha256=hiK3un-xfgPdwj9uj16YVDtTNpO128bmk0U82SMv8ZQ,152
|
|
184
|
+
schemathesis-4.3.11.dist-info/licenses/LICENSE,sha256=2Ve4J8v5jMQAWrT7r1nf3bI8Vflk3rZVQefiF2zpxwg,1121
|
|
185
|
+
schemathesis-4.3.11.dist-info/RECORD,,
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from functools import reduce
|
|
4
|
-
from operator import or_
|
|
5
|
-
from typing import TYPE_CHECKING
|
|
6
|
-
|
|
7
|
-
if TYPE_CHECKING:
|
|
8
|
-
from hypothesis import strategies as st
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def combine(strategies: list[st.SearchStrategy] | tuple[st.SearchStrategy]) -> st.SearchStrategy:
|
|
12
|
-
"""Combine a list of strategies into a single one.
|
|
13
|
-
|
|
14
|
-
If the input is `[a, b, c]`, then the result is equivalent to `a | b | c`.
|
|
15
|
-
"""
|
|
16
|
-
return reduce(or_, strategies[1:], strategies[0])
|
|
File without changes
|
|
File without changes
|
|
File without changes
|