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.

@@ -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
@@ -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 combine([STRATEGIES_FOR_TYPE[t] for t in ty if t in STRATEGIES_FOR_TYPE])
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, strategies
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 = strategies.combine(
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,
@@ -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
- kind = LoaderErrorKind.SYNTAX_ERROR
307
- message = SCHEMA_SYNTAX_ERROR
308
- extras = [entry for entry in str(exc).splitlines() if entry]
309
- raise LoaderError(kind, message, extras=extras) from exc
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 strategies.combine(_strategies)
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 strategies.combine(_strategies)
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-securuty-type"
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
- # Try to remove recursive references to avoid infinite recursion
220
- remaining_references = references.sanitize(schema)
221
- if reference in remaining_references:
222
- cycle = list(reference_path[reference_path.index(reference) :])
223
- raise InfiniteRecursiveReference(reference, cycle)
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
- schema, current_path = _resolve_bundled(schema, resolver, reference_path)
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
- subschema, _ = _resolve_bundled(subschema, resolver, current_path)
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
- sub, _ = _resolve_bundled(sub, resolver, current_path)
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, current_path)
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
- schema, current_path = _resolve_bundled(schema, resolver, reference_path)
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 = strategies.combine(
281
- [target.as_strategy(generation_mode=mode, phase=TestPhase.STATEFUL, **kwargs) for mode in modes]
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.10
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=jq2KSphzfLn63FNROrc3GwukTDt4ih4-RmF0Z4WSpu8,27582
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=DNzKEnXu7GjGSVe0244ZErmygUBA3nGSyVY6JP3ixD0,3740
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=6j0ez7wduAUYbUT28ELKxMf-dYEWr_67m_KIuTSyNGk,4358
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=fXE_NxvAxhyGag0_gC3xJwUrUkxZz4OKANQ1nYuGFQk,6311
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=uUUND4zF17hqs9L1VtNz41KtxcW-BB9JDsrNBA-w2-w,60813
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=wOCjNAScpiN-wJ4EM0QnJ_5o9nczW0WILFNfIR1qeKQ,38480
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=-DSFWcvD_PmekTyy0qZrJ1YYODh9C1KuAJJIytEnS1s,10733
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=moFFfOfzepjlJOrqLc60BrEmJ4oRzwJ3SM03y_nJNMU,24097
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=W3cqlbs80NxF9SAavOi7BhtNGzdxHO476lYxiWN0D08,4945
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=CQx2WJ3mKn5qmYRc90DqsG9w3Gx7DrB60S9HFz81STY,16663
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.10.dist-info/METADATA,sha256=BrfLLUJxe-ve_0xCRM77F5ksA27XYwnQaS_tf7pawQM,8541
183
- schemathesis-4.3.10.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
184
- schemathesis-4.3.10.dist-info/entry_points.txt,sha256=hiK3un-xfgPdwj9uj16YVDtTNpO128bmk0U82SMv8ZQ,152
185
- schemathesis-4.3.10.dist-info/licenses/LICENSE,sha256=2Ve4J8v5jMQAWrT7r1nf3bI8Vflk3rZVQefiF2zpxwg,1121
186
- schemathesis-4.3.10.dist-info/RECORD,,
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])