schemathesis 4.0.0a10__py3-none-any.whl → 4.0.0a11__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.
Files changed (92) hide show
  1. schemathesis/__init__.py +3 -7
  2. schemathesis/checks.py +17 -7
  3. schemathesis/cli/commands/__init__.py +51 -3
  4. schemathesis/cli/commands/data.py +10 -0
  5. schemathesis/cli/commands/run/__init__.py +147 -260
  6. schemathesis/cli/commands/run/context.py +2 -3
  7. schemathesis/cli/commands/run/events.py +4 -0
  8. schemathesis/cli/commands/run/executor.py +60 -73
  9. schemathesis/cli/commands/run/filters.py +15 -165
  10. schemathesis/cli/commands/run/handlers/cassettes.py +105 -104
  11. schemathesis/cli/commands/run/handlers/junitxml.py +5 -4
  12. schemathesis/cli/commands/run/handlers/output.py +26 -47
  13. schemathesis/cli/commands/run/loaders.py +35 -50
  14. schemathesis/cli/commands/run/validation.py +36 -161
  15. schemathesis/cli/core.py +5 -3
  16. schemathesis/cli/ext/fs.py +7 -5
  17. schemathesis/cli/ext/options.py +0 -21
  18. schemathesis/config/__init__.py +188 -0
  19. schemathesis/config/_auth.py +51 -0
  20. schemathesis/config/_checks.py +268 -0
  21. schemathesis/config/_diff_base.py +99 -0
  22. schemathesis/config/_env.py +21 -0
  23. schemathesis/config/_error.py +156 -0
  24. schemathesis/config/_generation.py +150 -0
  25. schemathesis/config/_health_check.py +24 -0
  26. schemathesis/config/_operations.py +313 -0
  27. schemathesis/config/_output.py +171 -0
  28. schemathesis/config/_parameters.py +19 -0
  29. schemathesis/config/_phases.py +151 -0
  30. schemathesis/config/_projects.py +495 -0
  31. schemathesis/config/_rate_limit.py +17 -0
  32. schemathesis/config/_report.py +116 -0
  33. schemathesis/config/_validator.py +9 -0
  34. schemathesis/config/schema.json +837 -0
  35. schemathesis/core/__init__.py +2 -0
  36. schemathesis/core/compat.py +16 -9
  37. schemathesis/core/errors.py +19 -2
  38. schemathesis/core/failures.py +6 -7
  39. schemathesis/core/hooks.py +20 -0
  40. schemathesis/core/output/__init__.py +14 -37
  41. schemathesis/core/output/sanitization.py +3 -146
  42. schemathesis/core/validation.py +16 -0
  43. schemathesis/engine/__init__.py +2 -4
  44. schemathesis/engine/context.py +41 -43
  45. schemathesis/engine/core.py +7 -5
  46. schemathesis/engine/phases/__init__.py +10 -0
  47. schemathesis/engine/phases/probes.py +8 -8
  48. schemathesis/engine/phases/stateful/_executor.py +68 -43
  49. schemathesis/engine/phases/unit/__init__.py +23 -15
  50. schemathesis/engine/phases/unit/_executor.py +77 -17
  51. schemathesis/engine/phases/unit/_pool.py +1 -1
  52. schemathesis/errors.py +2 -0
  53. schemathesis/filters.py +2 -3
  54. schemathesis/generation/__init__.py +6 -31
  55. schemathesis/generation/case.py +5 -3
  56. schemathesis/generation/coverage.py +153 -123
  57. schemathesis/generation/hypothesis/builder.py +40 -14
  58. schemathesis/generation/meta.py +3 -3
  59. schemathesis/generation/overrides.py +37 -1
  60. schemathesis/generation/stateful/state_machine.py +8 -1
  61. schemathesis/graphql/loaders.py +21 -12
  62. schemathesis/openapi/checks.py +12 -8
  63. schemathesis/openapi/generation/filters.py +10 -8
  64. schemathesis/openapi/loaders.py +22 -13
  65. schemathesis/pytest/lazy.py +2 -5
  66. schemathesis/pytest/plugin.py +11 -2
  67. schemathesis/schemas.py +13 -61
  68. schemathesis/specs/graphql/schemas.py +11 -15
  69. schemathesis/specs/openapi/_hypothesis.py +12 -8
  70. schemathesis/specs/openapi/checks.py +16 -18
  71. schemathesis/specs/openapi/examples.py +4 -3
  72. schemathesis/specs/openapi/formats.py +2 -2
  73. schemathesis/specs/openapi/negative/__init__.py +2 -2
  74. schemathesis/specs/openapi/patterns.py +46 -16
  75. schemathesis/specs/openapi/references.py +2 -3
  76. schemathesis/specs/openapi/schemas.py +11 -20
  77. schemathesis/specs/openapi/stateful/__init__.py +10 -5
  78. schemathesis/transport/prepare.py +7 -6
  79. schemathesis/transport/requests.py +3 -1
  80. schemathesis/transport/wsgi.py +3 -4
  81. {schemathesis-4.0.0a10.dist-info → schemathesis-4.0.0a11.dist-info}/METADATA +7 -8
  82. schemathesis-4.0.0a11.dist-info/RECORD +166 -0
  83. schemathesis/cli/commands/run/checks.py +0 -79
  84. schemathesis/cli/commands/run/hypothesis.py +0 -78
  85. schemathesis/cli/commands/run/reports.py +0 -72
  86. schemathesis/cli/hooks.py +0 -36
  87. schemathesis/engine/config.py +0 -59
  88. schemathesis/experimental/__init__.py +0 -72
  89. schemathesis-4.0.0a10.dist-info/RECORD +0 -153
  90. {schemathesis-4.0.0a10.dist-info → schemathesis-4.0.0a11.dist-info}/WHEEL +0 -0
  91. {schemathesis-4.0.0a10.dist-info → schemathesis-4.0.0a11.dist-info}/entry_points.txt +0 -0
  92. {schemathesis-4.0.0a10.dist-info → schemathesis-4.0.0a11.dist-info}/licenses/LICENSE +0 -0
@@ -43,7 +43,7 @@ from schemathesis.generation.overrides import Override, OverrideMark, check_no_o
43
43
  from schemathesis.openapi.checks import JsonSchemaError, MissingContentType
44
44
  from schemathesis.specs.openapi.stateful import links
45
45
 
46
- from ...generation import GenerationConfig, GenerationMode
46
+ from ...generation import GenerationMode
47
47
  from ...hooks import HookContext, HookDispatcher
48
48
  from ...schemas import APIOperation, APIOperationMap, ApiStatistic, BaseSchema, OperationDefinition
49
49
  from . import serialization
@@ -292,9 +292,7 @@ class BaseOpenAPISchema(BaseSchema):
292
292
  parameters = operation.get("parameters", ())
293
293
  return self.collect_parameters(itertools.chain(parameters, shared_parameters), operation)
294
294
 
295
- def get_all_operations(
296
- self, generation_config: GenerationConfig | None = None
297
- ) -> Generator[Result[APIOperation, InvalidSchema], None, None]:
295
+ def get_all_operations(self) -> Generator[Result[APIOperation, InvalidSchema], None, None]:
298
296
  """Iterate over all operations defined in the API.
299
297
 
300
298
  Each yielded item is either `Ok` or `Err`, depending on the presence of errors during schema processing.
@@ -352,9 +350,6 @@ class BaseOpenAPISchema(BaseSchema):
352
350
  entry,
353
351
  resolved,
354
352
  scope,
355
- with_security_parameters=generation_config.with_security_parameters
356
- if generation_config
357
- else None,
358
353
  )
359
354
  yield Ok(operation)
360
355
  except SCHEMA_PARSING_ERRORS as exc:
@@ -381,7 +376,9 @@ class BaseOpenAPISchema(BaseSchema):
381
376
  try:
382
377
  self.validate()
383
378
  except jsonschema.ValidationError as exc:
384
- raise InvalidSchema.from_jsonschema_error(exc, path=path, method=method) from None
379
+ raise InvalidSchema.from_jsonschema_error(
380
+ exc, path=path, method=method, config=self.config.output
381
+ ) from None
385
382
  raise InvalidSchema(SCHEMA_ERROR_MESSAGE, path=path, method=method) from error
386
383
 
387
384
  def validate(self) -> None:
@@ -417,7 +414,6 @@ class BaseOpenAPISchema(BaseSchema):
417
414
  raw: dict[str, Any],
418
415
  resolved: dict[str, Any],
419
416
  scope: str,
420
- with_security_parameters: bool | None = None,
421
417
  ) -> APIOperation:
422
418
  """Create JSON schemas for the query, body, etc from Swagger parameters definitions."""
423
419
  __tracebackhide__ = True
@@ -432,12 +428,8 @@ class BaseOpenAPISchema(BaseSchema):
432
428
  )
433
429
  for parameter in parameters:
434
430
  operation.add_parameter(parameter)
435
- with_security_parameters = (
436
- with_security_parameters
437
- if with_security_parameters is not None
438
- else self.generation_config.with_security_parameters
439
- )
440
- if with_security_parameters:
431
+ config = self.config.generation_for(operation=operation)
432
+ if config.with_security_parameters:
441
433
  self.security.process_definitions(self.raw_schema, operation, self.resolver)
442
434
  self.dispatch_hook("before_init_operation", HookContext(operation=operation), operation)
443
435
  return operation
@@ -545,21 +537,20 @@ class BaseOpenAPISchema(BaseSchema):
545
537
  hooks: HookDispatcher | None = None,
546
538
  auth_storage: AuthStorage | None = None,
547
539
  generation_mode: GenerationMode = GenerationMode.default(),
548
- generation_config: GenerationConfig | None = None,
549
540
  **kwargs: Any,
550
541
  ) -> SearchStrategy:
551
542
  return openapi_cases(
552
543
  operation=operation,
553
- auth_storage=auth_storage,
554
544
  hooks=hooks,
545
+ auth_storage=auth_storage,
555
546
  generation_mode=generation_mode,
556
- generation_config=generation_config or self.generation_config,
557
547
  **kwargs,
558
548
  )
559
549
 
560
550
  def get_parameter_serializer(self, operation: APIOperation, location: str) -> Callable | None:
561
551
  definitions = [item.definition for item in operation.iter_parameters() if item.location == location]
562
- if self.generation_config.with_security_parameters:
552
+ config = self.config.generation_for(operation=operation)
553
+ if config.with_security_parameters:
563
554
  security_parameters = self.security.get_security_definitions_as_parameters(
564
555
  self.raw_schema, operation, self.resolver, location
565
556
  )
@@ -713,7 +704,7 @@ class BaseOpenAPISchema(BaseSchema):
713
704
  JsonSchemaError.from_exception(
714
705
  operation=operation.label,
715
706
  exc=exc,
716
- output_config=operation.schema.output_config,
707
+ config=operation.schema.config.output,
717
708
  )
718
709
  )
719
710
  _maybe_raise_one_or_more(failures)
@@ -162,22 +162,25 @@ def create_state_machine(schema: BaseOpenAPISchema) -> type[APIStateMachine]:
162
162
  f"{link.source.label} -> {link.status_code} -> {link.name} -> {target.label}"
163
163
  )
164
164
  assert name not in rules, name
165
+ config = schema.config.generation_for(operation=target, phase="stateful")
165
166
  rules[name] = precondition(is_transition_allowed(bundle_name, link.source.label, target.label))(
166
167
  transition(
167
168
  name=name,
168
169
  target=catch_all,
169
170
  input=bundles[bundle_name].flatmap(
170
- into_step_input(target=target, link=link, modes=schema.generation_config.modes)
171
+ into_step_input(target=target, link=link, modes=config.modes)
171
172
  ),
172
173
  )
173
174
  )
174
175
  if target.label in roots.reliable or (not roots.reliable and target.label in roots.fallback):
175
176
  name = _normalize_name(f"RANDOM -> {target.label}")
176
- if len(schema.generation_config.modes) == 1:
177
- case_strategy = target.as_strategy(generation_mode=schema.generation_config.modes[0])
177
+ config = schema.config.generation_for(operation=target, phase="stateful")
178
+ if len(config.modes) == 1:
179
+ case_strategy = target.as_strategy(generation_mode=config.modes[0], __is_stateful_phase=True)
178
180
  else:
179
181
  _strategies = {
180
- method: target.as_strategy(generation_mode=method) for method in schema.generation_config.modes
182
+ method: target.as_strategy(generation_mode=method, __is_stateful_phase=True)
183
+ for method in config.modes
181
184
  }
182
185
 
183
186
  @st.composite # type: ignore[misc]
@@ -262,7 +265,9 @@ def into_step_input(
262
265
  and not link.merge_body
263
266
  ):
264
267
  kwargs["body"] = transition.request_body.value.ok()
265
- cases = strategies.combine([target.as_strategy(generation_mode=mode, **kwargs) for mode in modes])
268
+ cases = strategies.combine(
269
+ [target.as_strategy(generation_mode=mode, __is_stateful_phase=True, **kwargs) for mode in modes]
270
+ )
266
271
  case = draw(cases)
267
272
  if (
268
273
  transition.request_body is not None
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
  from typing import TYPE_CHECKING, Any, Mapping, cast
4
4
  from urllib.parse import quote, unquote, urljoin, urlsplit, urlunsplit
5
5
 
6
+ from schemathesis.config import SanitizationConfig
6
7
  from schemathesis.core import SCHEMATHESIS_TEST_CASE_HEADER, NotSet
7
8
  from schemathesis.core.errors import InvalidSchema
8
9
  from schemathesis.core.output.sanitization import sanitize_url, sanitize_value
@@ -81,19 +82,19 @@ def prepare_path(path: str, parameters: dict[str, Any] | None) -> str:
81
82
  raise InvalidSchema(f"Malformed path template: `{path}`\n\n {exc}") from exc
82
83
 
83
84
 
84
- def prepare_request(case: Case, headers: Mapping[str, Any] | None, sanitize: bool) -> PreparedRequest:
85
+ def prepare_request(case: Case, headers: Mapping[str, Any] | None, *, config: SanitizationConfig) -> PreparedRequest:
85
86
  import requests
86
87
 
87
88
  from schemathesis.transport.requests import REQUESTS_TRANSPORT
88
89
 
89
90
  base_url = normalize_base_url(case.operation.base_url)
90
91
  kwargs = REQUESTS_TRANSPORT.serialize_case(case, base_url=base_url, headers=headers)
91
- if sanitize:
92
- kwargs["url"] = sanitize_url(kwargs["url"])
93
- sanitize_value(kwargs["headers"])
92
+ if config.enabled:
93
+ kwargs["url"] = sanitize_url(kwargs["url"], config=config)
94
+ sanitize_value(kwargs["headers"], config=config)
94
95
  if kwargs["cookies"]:
95
- sanitize_value(kwargs["cookies"])
96
+ sanitize_value(kwargs["cookies"], config=config)
96
97
  if kwargs["params"]:
97
- sanitize_value(kwargs["params"])
98
+ sanitize_value(kwargs["params"], config=config)
98
99
 
99
100
  return requests.Request(**kwargs).prepare()
@@ -99,7 +99,9 @@ class RequestsTransport(BaseTransport["Case", Response, "requests.Session"]):
99
99
  verify = data.get("verify", True)
100
100
 
101
101
  try:
102
- with ratelimit(case.operation.schema.rate_limiter, case.operation.schema.base_url):
102
+ config = case.operation.schema.config
103
+ rate_limit = config.rate_limit_for(operation=case.operation)
104
+ with ratelimit(rate_limit, config.base_url):
103
105
  response = session.request(**data) # type: ignore
104
106
  return Response.from_requests(response, verify=verify)
105
107
  finally:
@@ -75,10 +75,9 @@ class WSGITransport(BaseTransport["Case", Response, "werkzeug.Client"]):
75
75
  client = session or wsgi.get_client(application)
76
76
  cookies = {**(case.cookies or {}), **(cookies or {})}
77
77
 
78
- with (
79
- cookie_handler(client, cookies),
80
- ratelimit(case.operation.schema.rate_limiter, case.operation.schema.base_url),
81
- ):
78
+ config = case.operation.schema.config
79
+ rate_limit = config.rate_limit_for(operation=case.operation)
80
+ with cookie_handler(client, cookies), ratelimit(rate_limit, config.base_url):
82
81
  start = time.monotonic()
83
82
  response = client.open(**data)
84
83
  elapsed = time.monotonic() - start
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: schemathesis
3
- Version: 4.0.0a10
3
+ Version: 4.0.0a11
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
@@ -29,7 +29,7 @@ Classifier: Programming Language :: Python :: Implementation :: CPython
29
29
  Classifier: Topic :: Software Development :: Testing
30
30
  Requires-Python: >=3.9
31
31
  Requires-Dist: backoff<3.0,>=2.1.2
32
- Requires-Dist: click<9.0,>=8.0
32
+ Requires-Dist: click<9,>=8.0
33
33
  Requires-Dist: colorama<1.0,>=0.4
34
34
  Requires-Dist: harfile<1.0,>=0.3.0
35
35
  Requires-Dist: httpx<1.0,>=0.22.0
@@ -45,6 +45,7 @@ Requires-Dist: pyyaml<7.0,>=5.1
45
45
  Requires-Dist: requests<3,>=2.22
46
46
  Requires-Dist: rich>=13.9.4
47
47
  Requires-Dist: starlette-testclient<1,>=0.4.1
48
+ Requires-Dist: tomli>=2.2.1
48
49
  Requires-Dist: typing-extensions>=4.12.2
49
50
  Requires-Dist: werkzeug<4,>=0.16.0
50
51
  Provides-Extra: bench
@@ -60,6 +61,7 @@ Requires-Dist: coverage[toml]>=5.3; extra == 'dev'
60
61
  Requires-Dist: fastapi>=0.86.0; extra == 'dev'
61
62
  Requires-Dist: flask<3.0,>=2.1.1; extra == 'dev'
62
63
  Requires-Dist: hypothesis-openapi<1,>=0.2; (python_version >= '3.10') and extra == 'dev'
64
+ Requires-Dist: mkdocs-material; extra == 'dev'
63
65
  Requires-Dist: pydantic>=1.10.2; extra == 'dev'
64
66
  Requires-Dist: pytest-asyncio<1.0,>=0.18.0; extra == 'dev'
65
67
  Requires-Dist: pytest-codspeed==2.2.1; extra == 'dev'
@@ -67,16 +69,12 @@ Requires-Dist: pytest-httpserver<2.0,>=1.0; extra == 'dev'
67
69
  Requires-Dist: pytest-mock<4.0,>=3.7.0; extra == 'dev'
68
70
  Requires-Dist: pytest-trio<1.0,>=0.8; extra == 'dev'
69
71
  Requires-Dist: pytest-xdist<4.0,>=3; extra == 'dev'
70
- Requires-Dist: sphinx; extra == 'dev'
71
- Requires-Dist: sphinx-click; extra == 'dev'
72
- Requires-Dist: sphinx-rtd-theme; extra == 'dev'
73
72
  Requires-Dist: strawberry-graphql[fastapi]>=0.109.0; extra == 'dev'
74
73
  Requires-Dist: syrupy<5.0,>=2; extra == 'dev'
74
+ Requires-Dist: tomli-w>=1.2.0; extra == 'dev'
75
75
  Requires-Dist: trustme<1.0,>=0.9.0; extra == 'dev'
76
76
  Provides-Extra: docs
77
- Requires-Dist: sphinx; extra == 'docs'
78
- Requires-Dist: sphinx-click; extra == 'docs'
79
- Requires-Dist: sphinx-rtd-theme; extra == 'docs'
77
+ Requires-Dist: mkdocs-material; extra == 'docs'
80
78
  Provides-Extra: tests
81
79
  Requires-Dist: aiohttp<4.0,>=3.9.1; extra == 'tests'
82
80
  Requires-Dist: coverage>=6; extra == 'tests'
@@ -91,6 +89,7 @@ Requires-Dist: pytest-trio<1.0,>=0.8; extra == 'tests'
91
89
  Requires-Dist: pytest-xdist<4.0,>=3; extra == 'tests'
92
90
  Requires-Dist: strawberry-graphql[fastapi]>=0.109.0; extra == 'tests'
93
91
  Requires-Dist: syrupy<5.0,>=2; extra == 'tests'
92
+ Requires-Dist: tomli-w>=1.2.0; extra == 'tests'
94
93
  Requires-Dist: trustme<1.0,>=0.9.0; extra == 'tests'
95
94
  Description-Content-Type: text/markdown
96
95
 
@@ -0,0 +1,166 @@
1
+ schemathesis/__init__.py,sha256=IznSJx_si-x3bBolTLGcq_NakcVoeMCtE11ctKuz9uE,1119
2
+ schemathesis/auths.py,sha256=t-YuPyoLqL7jlRUH-45JxO7Ir3pYxpe31CRmNIJh7rI,15423
3
+ schemathesis/checks.py,sha256=bNrebGDOryn2SmXcgMUVWhItCmGgiGSq54JMNvGiZjE,5421
4
+ schemathesis/errors.py,sha256=T8nobEi5tQX_SkwaYb8JFoIlF9F_vOQVprZ8EVPAhjA,931
5
+ schemathesis/filters.py,sha256=OEub50Ob5sf0Tn3iTeuIaxSMtepF7KVoiEM9wtt5GGA,13433
6
+ schemathesis/hooks.py,sha256=ZSGEnsLJ7UVezf4CcaJebVkjEpvwgJolJFZo5fjQNDc,13153
7
+ schemathesis/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ schemathesis/schemas.py,sha256=KyYuL04FAPEkc6mN53NioDEUgn7rmTDkvv5Q2_PGgoY,25824
9
+ schemathesis/cli/__init__.py,sha256=U9gjzWWpiFhaqevPjZbwyTNjABdpvXETI4HgwdGKnvs,877
10
+ schemathesis/cli/__main__.py,sha256=MWaenjaUTZIfNPFzKmnkTiawUri7DVldtg3mirLwzU8,92
11
+ schemathesis/cli/constants.py,sha256=rUixnqorraUFDtOu3Nmm1x_k0qbgmW9xW96kQB_fBCQ,338
12
+ schemathesis/cli/core.py,sha256=ue7YUdVo3YvuzGL4s6i62NL6YqNDeVPBSnQ1znrvG2w,480
13
+ schemathesis/cli/commands/__init__.py,sha256=rubTCCRGuMIbNYOl8yQEioiuHtTq__tWjkUtFWYGhqQ,3433
14
+ schemathesis/cli/commands/data.py,sha256=_ALywjIeCZjuaoDQFy-Kj8RZkEGqXd-Y95O47h8Jszs,171
15
+ schemathesis/cli/commands/run/__init__.py,sha256=wOrs_7aj-6nYBuuVnMTJ24u2s7C9_hsMwYYes0l5A-k,18818
16
+ schemathesis/cli/commands/run/context.py,sha256=15jijsCgwFZYLfWbeQZJ9lWD0b3Jp3NfWTURzh6Uyuc,7663
17
+ schemathesis/cli/commands/run/events.py,sha256=CuS5iZ5IoYl7d9ytvNmW73WEjjQ3SriEm1O9as8O2wU,1348
18
+ schemathesis/cli/commands/run/executor.py,sha256=x4vfwP3B5OUhx9fiZMH3shjDmTkXZUcRAm3by613_lY,5132
19
+ schemathesis/cli/commands/run/filters.py,sha256=pzkNRcf5vLPSsMfnvt711GNzRSBK5iZIFjPA0fiH1N4,1701
20
+ schemathesis/cli/commands/run/loaders.py,sha256=6j0ez7wduAUYbUT28ELKxMf-dYEWr_67m_KIuTSyNGk,4358
21
+ schemathesis/cli/commands/run/validation.py,sha256=xiDFkR_9lwRVLJXL-0paVMK1Q2JNu1qreDjwf1hoiGA,8502
22
+ schemathesis/cli/commands/run/handlers/__init__.py,sha256=TPZ3KdGi8m0fjlN0GjA31MAXXn1qI7uU4FtiDwroXZI,1915
23
+ schemathesis/cli/commands/run/handlers/base.py,sha256=yDsTtCiztLksfk7cRzg8JlaAVOfS-zwK3tsJMOXAFyc,530
24
+ schemathesis/cli/commands/run/handlers/cassettes.py,sha256=Gu0qcxzvHp1zMY-SVkY96T-Ifwtdh6oj-w0gE1MShnA,19157
25
+ schemathesis/cli/commands/run/handlers/junitxml.py,sha256=FX_347PcHhGLG7XY3eG8VwhB_8tSX4mOtqjZj_s6yLM,2402
26
+ schemathesis/cli/commands/run/handlers/output.py,sha256=i0UGeKKVY4o1eiMzFtg3azXvCOOSj1FS4ZdScW4Nm5Y,58198
27
+ schemathesis/cli/ext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
+ schemathesis/cli/ext/fs.py,sha256=3lvoAsEDDdih75ITJJNxemd3nwxX55gGWrI7uDxm0cM,447
29
+ schemathesis/cli/ext/groups.py,sha256=kQ37t6qeArcKaY2y5VxyK3_KwAkBKCVm58IYV8gewds,2720
30
+ schemathesis/cli/ext/options.py,sha256=6yYwZNJL__FCEEL7kI3r5MbVmbp3ZeQjm7DrZ6J_h7s,3347
31
+ schemathesis/config/__init__.py,sha256=A7KvfcX_o2sWBXiO798vDUYVDSEQisI9-L84mLyYFZM,6192
32
+ schemathesis/config/_auth.py,sha256=83RLVPm97W2thbn-yi01Rt94YwOxLG_a5VoxhEfjUjs,1528
33
+ schemathesis/config/_checks.py,sha256=F0r16eSSiICvoiTUkNNOE2PH73EGd8bikoeZdME_3Yw,10763
34
+ schemathesis/config/_diff_base.py,sha256=-XqS6cTzZC5fplz8_2RSZHDMSAPJhBBIEP6H8wcgHmo,4221
35
+ schemathesis/config/_env.py,sha256=8XfIyrnGNQuCDnfG0lwmKRFbasRUjgeQGBAMupsmtOU,613
36
+ schemathesis/config/_error.py,sha256=TxuuqQ1olwJc7P7ssfxXb1dB_Xn5uVsoazjvYvRxrxA,5437
37
+ schemathesis/config/_generation.py,sha256=gHLv3wiMuGKg47gwtq6Y6xLCJBE-pceIAlu6Jg4Kmlk,5136
38
+ schemathesis/config/_health_check.py,sha256=zC9inla5ibMBlEy5WyM4_TME7ju_KH3Bwfo21RI3Gks,561
39
+ schemathesis/config/_operations.py,sha256=l1jQHQY18OGefFtvePNPmYhr7hLT0Re0fAUMY5VO2G4,11584
40
+ schemathesis/config/_output.py,sha256=3G9SOi-4oNcQPHeNRG3HggFCwvcKOW1kF28a9m0H-pU,4434
41
+ schemathesis/config/_parameters.py,sha256=i76Hwaf834fBAMmtKfKTl1SFCicJ-Y-5tZt5QNGW2fA,618
42
+ schemathesis/config/_phases.py,sha256=C-OLJNwkVIdp9w4Uw6qNTV2inQZdaT6UGkS7anHxUdg,5090
43
+ schemathesis/config/_projects.py,sha256=U78ZixEIlWIFBXGHgMXrkKRNeol2PkOrHrSFRDvTIlk,18147
44
+ schemathesis/config/_rate_limit.py,sha256=ekEW-jP_Ichk_O6hYpj-h2TTTKfp7Fm0nyFUbvlWcbA,456
45
+ schemathesis/config/_report.py,sha256=FAmmOndCuXju2Eat5DX1lBMobIHWLNSGyJBb7Q32bLk,3739
46
+ schemathesis/config/_validator.py,sha256=IcE8geFZ0ZwR18rkIRs25i7pTl7Z84XbjYGUB-mqReU,258
47
+ schemathesis/config/schema.json,sha256=dJSUxWvrME5JoknxBgkOBtWKZgkgYy-I9RCWIDQRkFE,17843
48
+ schemathesis/contrib/__init__.py,sha256=wxpX86xrEGRAS3f7eugQfKVbnqV6ZfOqFBS_DmWxOok,120
49
+ schemathesis/contrib/openapi/__init__.py,sha256=-7mBZ9RQj0EGzzmC-HKiT5ZslwHcoWFqCVpRG0GHO_o,162
50
+ schemathesis/contrib/openapi/fill_missing_examples.py,sha256=BfBpuy3vCKbE_uILqPXnm7kxEDopAr5tNQwP5E9xX8A,585
51
+ schemathesis/core/__init__.py,sha256=5fAAKG6BAA5DP9qOUnMT1cG5LLN3tU7D7VdLyb-MxfM,1880
52
+ schemathesis/core/compat.py,sha256=9BWCrFoqN2sJIaiht_anxe8kLjYMR7t0iiOkXqLRUZ8,1058
53
+ schemathesis/core/control.py,sha256=IzwIc8HIAEMtZWW0Q0iXI7T1niBpjvcLlbuwOSmy5O8,130
54
+ schemathesis/core/curl.py,sha256=yuaCe_zHLGwUjEeloQi6W3tOA3cGdnHDNI17-5jia0o,1723
55
+ schemathesis/core/deserialization.py,sha256=ygIj4fNaOd0mJ2IvTsn6bsabBt_2AbSLCz-z9UqfpdQ,2406
56
+ schemathesis/core/errors.py,sha256=HbQJyxJbW0-GfhYvm-6nK20f4hiqsdDGEOy--agdvHE,16319
57
+ schemathesis/core/failures.py,sha256=MYyRnom-XeUEuBmq2ffdz34xhxmpSHWaQunfHtliVsY,8932
58
+ schemathesis/core/fs.py,sha256=ItQT0_cVwjDdJX9IiI7EnU75NI2H3_DCEyyUjzg_BgI,472
59
+ schemathesis/core/hooks.py,sha256=qhbkkRSf8URJ4LKv2wmKRINKpquUOgxQzWBHKWRWo3Q,475
60
+ schemathesis/core/lazy_import.py,sha256=aMhWYgbU2JOltyWBb32vnWBb6kykOghucEzI_F70yVE,470
61
+ schemathesis/core/loaders.py,sha256=SQQ-8m64-D2FaOgvwKZLyTtLJuzP3RPo7Ud2BERK1c0,3404
62
+ schemathesis/core/marks.py,sha256=SH7jsVuNRJjx2gZN9Ze5MY01u7FJiHeO0iruzKi5rm4,2135
63
+ schemathesis/core/media_types.py,sha256=vV0CEu34sDoZWXvu4R1Y1HosxVS4YXZV8iTov8fU3X0,2148
64
+ schemathesis/core/rate_limit.py,sha256=7tg9Znk11erTfw8-ANutjEmu7hbfUHZx_iEdkoaP174,1757
65
+ schemathesis/core/registries.py,sha256=T4jZB4y3zBHdeSgQc0pRbgSeMblvO-6z4I3zmzIfTi0,811
66
+ schemathesis/core/result.py,sha256=d449YvyONjqjDs-A5DAPgtAI96iT753K8sU6_1HLo2Q,461
67
+ schemathesis/core/transforms.py,sha256=63aeLkR93r3krq4CwYtDcoS_pFBky4L16c9DcFsBHuE,3535
68
+ schemathesis/core/transport.py,sha256=VqtVF4JxMuPXSBORzS8SOSLUnCEZL6gPOr0kuymMCAk,3249
69
+ schemathesis/core/validation.py,sha256=rnhzsqWukMWyrc7sRm0kZNHTePoPCQ3A4kLpLxrb0jM,1641
70
+ schemathesis/core/version.py,sha256=O-6yFbNocbD4RDwiBZLborxTp54htyKxBWTqpZDnPvg,202
71
+ schemathesis/core/output/__init__.py,sha256=SiHqONFskXl73AtP5dV29L14nZoKo7B-IeG52KZB32M,1446
72
+ schemathesis/core/output/sanitization.py,sha256=Ev3tae8dVwsYd7yVb2_1VBFYs92WFsQ4Eu1fGaymItE,2013
73
+ schemathesis/engine/__init__.py,sha256=QaFE-FinaTAaarteADo2RRMJ-Sz6hZB9TzD5KjMinIA,706
74
+ schemathesis/engine/context.py,sha256=1m6KiD2M9_fVRiUnYxFw2csUQeZV0N4FepR7w_DZCHA,3902
75
+ schemathesis/engine/control.py,sha256=QKUOs5VMphe7EcAIro_DDo9ZqdOU6ZVwTU1gMNndHWw,1006
76
+ schemathesis/engine/core.py,sha256=Pnpf1zNTxruUOnnJ9rQ-MskXj4WuA4A27_fWrf0hXWc,5609
77
+ schemathesis/engine/errors.py,sha256=8PHYsuq2qIEJHm2FDf_UnWa4IDc-DRFTPckLAr22yhE,16895
78
+ schemathesis/engine/events.py,sha256=gslRAWQKMPqBCQzLDS4wAbsKcVuONSy5SPqimJJJYT4,6250
79
+ schemathesis/engine/recorder.py,sha256=K3HfMARrT5mPWXPnYebjjcq5CcsBRhMrtZwEL9_Lvtg,8432
80
+ schemathesis/engine/phases/__init__.py,sha256=zzILnWjoDJQwNmvEmrj3HXVAKT2q7Vb614svjyt8E-U,2794
81
+ schemathesis/engine/phases/probes.py,sha256=MgjH3yLw0siiSnaESzDVww70Uz4dAyJ2W22H1Ome03Q,4964
82
+ schemathesis/engine/phases/stateful/__init__.py,sha256=lWo2RLrutNblHvohTzofQqL22GORwBRA8bf6jvLuGPg,2391
83
+ schemathesis/engine/phases/stateful/_executor.py,sha256=3_UV5r2O_nx4UCAF-m0xo_pdrvPwdZ_g_qQDr7JhTXE,13624
84
+ schemathesis/engine/phases/stateful/context.py,sha256=SKWsok-tlWbUDagiUmP7cLNW6DsgFDc_Afv0vQfWv6c,2964
85
+ schemathesis/engine/phases/unit/__init__.py,sha256=BvZh39LZmXg90Cy_Tn0cQY5y7eWzYvAEmJ43fGKFAt8,8715
86
+ schemathesis/engine/phases/unit/_executor.py,sha256=GE_uFbaaF7SuwL3K7HjSoDf5P3PFc7B1inhMhB3QRcE,14939
87
+ schemathesis/engine/phases/unit/_pool.py,sha256=iU0hdHDmohPnEv7_S1emcabuzbTf-Cznqwn0pGQ5wNQ,2480
88
+ schemathesis/generation/__init__.py,sha256=QA2BiS4nk9VmcBn8_Ad6vaIbj6B9ToigLHLVn-DjCwM,700
89
+ schemathesis/generation/case.py,sha256=dca80qoI4JZot84I7eqpxE_yWbNQ-iwKG6pXTIhxKP0,7486
90
+ schemathesis/generation/coverage.py,sha256=ISXKXTdfYLpdo6bOIW3--AiwWVWnwfOwKb1KQZ7AEM8,47913
91
+ schemathesis/generation/meta.py,sha256=5ikrlhdk424dWcYLekZSMoWJYRl9_IhI80GKZzhByi4,2512
92
+ schemathesis/generation/modes.py,sha256=t_EvKr2aOXYMsEfdMu4lLF4KCGcX1LVVyvzTkcpJqhk,663
93
+ schemathesis/generation/overrides.py,sha256=iPxnxPIKKhO9mwPwKszYv40VM4ylxFJvhzWvrC6qkOE,4385
94
+ schemathesis/generation/targets.py,sha256=_rN2qgxTE2EfvygiN-Fy3WmDnRH0ERohdx3sKRDaYhU,2120
95
+ schemathesis/generation/hypothesis/__init__.py,sha256=SVwM-rx07jPZzms0idWYACgUtWAxh49HRuTnaQ__zf0,1549
96
+ schemathesis/generation/hypothesis/builder.py,sha256=PYJaBbXMAPpM_9WkUmStQKoxQ67tWyJYybt6y4Izjg0,31487
97
+ schemathesis/generation/hypothesis/examples.py,sha256=6eGaKUEC3elmKsaqfKj1sLvM8EHc-PWT4NRBq4NI0Rs,1409
98
+ schemathesis/generation/hypothesis/given.py,sha256=sTZR1of6XaHAPWtHx2_WLlZ50M8D5Rjux0GmWkWjDq4,2337
99
+ schemathesis/generation/hypothesis/reporting.py,sha256=uDVow6Ya8YFkqQuOqRsjbzsbyP4KKfr3jA7ZaY4FuKY,279
100
+ schemathesis/generation/hypothesis/strategies.py,sha256=RurE81E06d99YKG48dizy9346ayfNswYTt38zewmGgw,483
101
+ schemathesis/generation/stateful/__init__.py,sha256=kXpCGbo1-QqfR2N0Z07tLw0Z5_tvbuG3Tk-WI_I1doI,653
102
+ schemathesis/generation/stateful/state_machine.py,sha256=h79_G8oUOU8TVJFFF6EKbrW8KPuz6E8gc7us0TC2lrA,12656
103
+ schemathesis/graphql/__init__.py,sha256=_eO6MAPHGgiADVGRntnwtPxmuvk666sAh-FAU4cG9-0,326
104
+ schemathesis/graphql/checks.py,sha256=IADbxiZjgkBWrC5yzHDtohRABX6zKXk5w_zpWNwdzYo,3186
105
+ schemathesis/graphql/loaders.py,sha256=bBXWLbwyF31nQILSVldysP1IEMrYle-j71n8nx1TZAE,5301
106
+ schemathesis/openapi/__init__.py,sha256=-KcsSAM19uOM0N5J4s-yTnQ1BFsptYhW1E51cEf6kVM,311
107
+ schemathesis/openapi/checks.py,sha256=5AP_pjTIJ7GcHNhTtGz-IOeoutZ4HqkxyoANrRKf23M,10825
108
+ schemathesis/openapi/loaders.py,sha256=18vdQZGUtwvHUrHZYRmKDoLzuNA5kBx3YdSTKEfuSzQ,7062
109
+ schemathesis/openapi/generation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
110
+ schemathesis/openapi/generation/filters.py,sha256=EBbgW9zH3wA4d9FyBWp4koiPrrIpNGFnousBDl9qJso,2079
111
+ schemathesis/pytest/__init__.py,sha256=7W0q-Thcw03IAQfXE_Mo8JPZpUdHJzfu85fjK1ZdfQM,88
112
+ schemathesis/pytest/control_flow.py,sha256=F8rAPsPeNv_sJiJgbZYtTpwKWjauZmqFUaKroY2GmQI,217
113
+ schemathesis/pytest/lazy.py,sha256=Wbyn3fYqcmDL7uOFO0PgVpR7--MP8g3Z8q1yArjmDEo,11824
114
+ schemathesis/pytest/loaders.py,sha256=oQJ78yyuIm3Ye9X7giVjDB1vYfaW5UY5YuhaTLm_ZFU,266
115
+ schemathesis/pytest/plugin.py,sha256=j8L3JV1ijf9dYpoLTDNJpdFnS2fbsYM3Gzv-3r2nk60,12454
116
+ schemathesis/python/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
117
+ schemathesis/python/asgi.py,sha256=5PyvuTBaivvyPUEi3pwJni91K1kX5Zc0u9c6c1D8a1Q,287
118
+ schemathesis/python/wsgi.py,sha256=uShAgo_NChbfYaV1117e6UHp0MTg7jaR0Sy_to3Jmf8,219
119
+ schemathesis/specs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
120
+ schemathesis/specs/graphql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
121
+ schemathesis/specs/graphql/_cache.py,sha256=QIcEFy2Koy5K0-u1nB-iab52LDlYsTm_9N5t42GplkM,770
122
+ schemathesis/specs/graphql/nodes.py,sha256=bE3G1kNmqJ8OV4igBvIK-UORrkQA6Nofduf87O3TD9I,541
123
+ schemathesis/specs/graphql/scalars.py,sha256=ERUECtwWuEe4_T_fpM6DQJKLrkvahbnaswM7oEOcC0M,1850
124
+ schemathesis/specs/graphql/schemas.py,sha256=EjvXLjti2w11AJF5Hi0m-AXVgtMXw4Z1BoCW1OQfQfU,14168
125
+ schemathesis/specs/graphql/validation.py,sha256=-W1Noc1MQmTb4RX-gNXMeU2qkgso4mzVfHxtdLkCPKM,1422
126
+ schemathesis/specs/openapi/__init__.py,sha256=C5HOsfuDJGq_3mv8CRBvRvb0Diy1p0BFdqyEXMS-loE,238
127
+ schemathesis/specs/openapi/_cache.py,sha256=HpglmETmZU0RCHxp3DO_sg5_B_nzi54Zuw9vGzzYCxY,4295
128
+ schemathesis/specs/openapi/_hypothesis.py,sha256=gLQjVkYkR8Z_dw3HzHeAKDm08qdTZphPHlM0Jzu0xe4,21576
129
+ schemathesis/specs/openapi/checks.py,sha256=oEnogK5H8c_GEJrYe-2_crhDKiOijYFdspVUjtOW1So,27469
130
+ schemathesis/specs/openapi/constants.py,sha256=JqM_FHOenqS_MuUE9sxVQ8Hnw0DNM8cnKDwCwPLhID4,783
131
+ schemathesis/specs/openapi/converter.py,sha256=lil8IewM5j8tvt4lpA9g_KITvIwx1M96i45DNSHNjoc,3505
132
+ schemathesis/specs/openapi/definitions.py,sha256=8htclglV3fW6JPBqs59lgM4LnA25Mm9IptXBPb_qUT0,93949
133
+ schemathesis/specs/openapi/examples.py,sha256=9dMY4d2WWz32JywKZzyLO5jdbMWcRqjjGHzhMqlqwIs,21129
134
+ schemathesis/specs/openapi/formats.py,sha256=CbuFP_pegtIQfG0AH2gTl0KCCAI6y1a_z6hGvjeIa5A,2810
135
+ schemathesis/specs/openapi/media_types.py,sha256=ADedOaNWjbAtAekyaKmNj9fY6zBTeqcNqBEjN0EWNhI,1014
136
+ schemathesis/specs/openapi/parameters.py,sha256=tVL61gDe9A8_jwoVKZZvpXKPerMyq7vkAvwdMsi44TI,14622
137
+ schemathesis/specs/openapi/patterns.py,sha256=cBj8W4wn7VLJd4nABaIH5f502-zBDiqljxLgPWUn-50,15609
138
+ schemathesis/specs/openapi/references.py,sha256=40YcDExPLR2B8EOwt-Csw-5MYFi2xj_DXf91J0Pc9d4,8855
139
+ schemathesis/specs/openapi/schemas.py,sha256=bTa7LEod5Oaqc42TD4JwUDCDLDwB4PYtkU60hsY9IQE,54672
140
+ schemathesis/specs/openapi/security.py,sha256=6UWYMhL-dPtkTineqqBFNKca1i4EuoTduw-EOLeE0aQ,7149
141
+ schemathesis/specs/openapi/serialization.py,sha256=VdDLmeHqxlWM4cxQQcCkvrU6XurivolwEEaT13ohelA,11972
142
+ schemathesis/specs/openapi/utils.py,sha256=ER4vJkdFVDIE7aKyxyYatuuHVRNutytezgE52pqZNE8,900
143
+ schemathesis/specs/openapi/expressions/__init__.py,sha256=hfuRtXD75tQFhzSo6QgDZ3zByyWeZRKevB8edszAVj4,2272
144
+ schemathesis/specs/openapi/expressions/errors.py,sha256=YLVhps-sYcslgVaahfcUYxUSHlIfWL-rQMeT5PZSMZ8,219
145
+ schemathesis/specs/openapi/expressions/extractors.py,sha256=Py3of3_vBACP4ljiZIcgd-xQCrWIpcMsfQFc0EtAUoA,470
146
+ schemathesis/specs/openapi/expressions/lexer.py,sha256=KFA8Z-Kh1IYUpKgwAnDtEucN9YLLpnFR1GQl8KddWlA,3987
147
+ schemathesis/specs/openapi/expressions/nodes.py,sha256=63LC4mQHy3a0_tKiGIVWaUHu9L9IWilq6R004GLpjyY,4077
148
+ schemathesis/specs/openapi/expressions/parser.py,sha256=e-ZxshrGE_5CVbgcZLYgdGSjdifgyzgKkLQp0dI0cJY,4503
149
+ schemathesis/specs/openapi/negative/__init__.py,sha256=eKiBWsMYjcJ0mNmh07IOnbVMHZ8k-fCidcohwBz8yJ4,3741
150
+ schemathesis/specs/openapi/negative/mutations.py,sha256=MIFVSWbZHW92KhpWruJT3XLisgc-rFnvYasRtwMmExs,19253
151
+ schemathesis/specs/openapi/negative/types.py,sha256=a7buCcVxNBG6ILBM3A7oNTAX0lyDseEtZndBuej8MbI,174
152
+ schemathesis/specs/openapi/negative/utils.py,sha256=ozcOIuASufLqZSgnKUACjX-EOZrrkuNdXX0SDnLoGYA,168
153
+ schemathesis/specs/openapi/stateful/__init__.py,sha256=AZoc9lTb0P6zeVf8Yf4D5ZcVecz2E1osCeDpv3WS-sw,14994
154
+ schemathesis/specs/openapi/stateful/control.py,sha256=QaXLSbwQWtai5lxvvVtQV3BLJ8n5ePqSKB00XFxp-MA,3695
155
+ schemathesis/specs/openapi/stateful/links.py,sha256=8oHpmb-yBa3kZKoCv9ytndpOp80dG1vVis2-EpbkeVA,11432
156
+ schemathesis/transport/__init__.py,sha256=z-mRNSOlMBKwQyaEIhpmYv0plWTmK5dJqc9UmQOry80,3949
157
+ schemathesis/transport/asgi.py,sha256=qTClt6oT_xUEWnRHokACN_uqCNNUZrRPT6YG0PjbElY,926
158
+ schemathesis/transport/prepare.py,sha256=wBqKgDyrIxaH1HOP7hjb5ERoSh0WkCBDu7yCaAJQlEY,3958
159
+ schemathesis/transport/requests.py,sha256=zGpTJiDjeX-H6WOJHf13TMe9WSblGCcrVbSEekj8zMU,8831
160
+ schemathesis/transport/serialization.py,sha256=jIMra1LqRGav0OX3Hx7mvORt38ll4cd2DKit2D58FN0,10531
161
+ schemathesis/transport/wsgi.py,sha256=Eva8iTYGSmdqV7-1WSUXLe3Ysdr8vTijTwadM6ybPxE,5736
162
+ schemathesis-4.0.0a11.dist-info/METADATA,sha256=fWWqGEuqISnHZCYthJw9bMx3XmndCWScfSUSMugrpJc,10380
163
+ schemathesis-4.0.0a11.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
164
+ schemathesis-4.0.0a11.dist-info/entry_points.txt,sha256=hiK3un-xfgPdwj9uj16YVDtTNpO128bmk0U82SMv8ZQ,152
165
+ schemathesis-4.0.0a11.dist-info/licenses/LICENSE,sha256=2Ve4J8v5jMQAWrT7r1nf3bI8Vflk3rZVQefiF2zpxwg,1121
166
+ schemathesis-4.0.0a11.dist-info/RECORD,,
@@ -1,79 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from dataclasses import dataclass
4
- from typing import Sequence
5
-
6
- from schemathesis import experimental
7
- from schemathesis.checks import CHECKS, CheckFunction, ChecksConfig
8
-
9
-
10
- @dataclass
11
- class CheckArguments:
12
- included_check_names: Sequence[str]
13
- excluded_check_names: Sequence[str]
14
- positive_data_acceptance_allowed_statuses: list[str] | None
15
- missing_required_header_allowed_statuses: list[str] | None
16
- negative_data_rejection_allowed_statuses: list[str] | None
17
- max_response_time: float | None
18
-
19
- __slots__ = (
20
- "included_check_names",
21
- "excluded_check_names",
22
- "positive_data_acceptance_allowed_statuses",
23
- "missing_required_header_allowed_statuses",
24
- "negative_data_rejection_allowed_statuses",
25
- "max_response_time",
26
- )
27
-
28
- def into(self) -> tuple[list[CheckFunction], ChecksConfig]:
29
- # Determine selected checks
30
- if "all" in self.included_check_names:
31
- selected_checks = CHECKS.get_all()
32
- else:
33
- selected_checks = CHECKS.get_by_names(self.included_check_names or [])
34
-
35
- # Prepare checks configuration
36
- checks_config: ChecksConfig = {}
37
-
38
- if experimental.POSITIVE_DATA_ACCEPTANCE.is_enabled:
39
- from schemathesis.openapi.checks import PositiveDataAcceptanceConfig
40
- from schemathesis.specs.openapi.checks import positive_data_acceptance
41
-
42
- selected_checks.append(positive_data_acceptance)
43
- if self.positive_data_acceptance_allowed_statuses:
44
- checks_config[positive_data_acceptance] = PositiveDataAcceptanceConfig(
45
- allowed_statuses=self.positive_data_acceptance_allowed_statuses
46
- )
47
-
48
- if self.missing_required_header_allowed_statuses:
49
- from schemathesis.openapi.checks import MissingRequiredHeaderConfig
50
- from schemathesis.specs.openapi.checks import missing_required_header
51
-
52
- selected_checks.append(missing_required_header)
53
- checks_config[missing_required_header] = MissingRequiredHeaderConfig(
54
- allowed_statuses=self.missing_required_header_allowed_statuses
55
- )
56
-
57
- if self.negative_data_rejection_allowed_statuses:
58
- from schemathesis.openapi.checks import NegativeDataRejectionConfig
59
- from schemathesis.specs.openapi.checks import negative_data_rejection
60
-
61
- checks_config[negative_data_rejection] = NegativeDataRejectionConfig(
62
- allowed_statuses=self.negative_data_rejection_allowed_statuses
63
- )
64
-
65
- if self.max_response_time is not None:
66
- from schemathesis.checks import max_response_time as _max_response_time
67
- from schemathesis.core.failures import MaxResponseTimeConfig
68
-
69
- checks_config[_max_response_time] = MaxResponseTimeConfig(self.max_response_time)
70
- selected_checks.append(_max_response_time)
71
-
72
- from schemathesis.specs.openapi.checks import unsupported_method
73
-
74
- selected_checks.append(unsupported_method)
75
-
76
- # Exclude checks based on their names
77
- selected_checks = [check for check in selected_checks if check.__name__ not in self.excluded_check_names]
78
-
79
- return selected_checks, checks_config
@@ -1,78 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from enum import Enum, unique
4
- from typing import TYPE_CHECKING, Any
5
-
6
- if TYPE_CHECKING:
7
- import hypothesis
8
-
9
- HYPOTHESIS_IN_MEMORY_DATABASE_IDENTIFIER = ":memory:"
10
-
11
- # Importing Hypothesis is expensive, hence we re-create the enums we need in CLI commands definitions
12
- # Hypothesis is stable, hence it should not be a problem and adding new variants should not be automatic
13
-
14
-
15
- @unique
16
- class HealthCheck(str, Enum):
17
- # We remove not relevant checks
18
- data_too_large = "data_too_large"
19
- filter_too_much = "filter_too_much"
20
- too_slow = "too_slow"
21
- large_base_example = "large_base_example"
22
- all = "all"
23
-
24
- def as_hypothesis(self) -> list[hypothesis.HealthCheck]:
25
- from hypothesis import HealthCheck
26
-
27
- if self.name == "all":
28
- return list(HealthCheck)
29
-
30
- return [HealthCheck[self.name]]
31
-
32
-
33
- def prepare_health_checks(
34
- hypothesis_suppress_health_check: list[HealthCheck] | None,
35
- ) -> list[hypothesis.HealthCheck] | None:
36
- if hypothesis_suppress_health_check is None:
37
- return None
38
-
39
- return [entry for health_check in hypothesis_suppress_health_check for entry in health_check.as_hypothesis()]
40
-
41
-
42
- def prepare_phases(no_shrink: bool = False) -> list[hypothesis.Phase] | None:
43
- from hypothesis import Phase
44
-
45
- phases = set(Phase) - {Phase.explain}
46
- if no_shrink:
47
- return list(phases - {Phase.shrink})
48
- return list(phases)
49
-
50
-
51
- def prepare_settings(
52
- database: str | None = None,
53
- derandomize: bool | None = None,
54
- max_examples: int | None = None,
55
- phases: list[hypothesis.Phase] | None = None,
56
- suppress_health_check: list[hypothesis.HealthCheck] | None = None,
57
- ) -> hypothesis.settings:
58
- import hypothesis
59
- from hypothesis.database import DirectoryBasedExampleDatabase, InMemoryExampleDatabase
60
-
61
- kwargs: dict[str, Any] = {
62
- key: value
63
- for key, value in (
64
- ("derandomize", derandomize),
65
- ("max_examples", max_examples),
66
- ("phases", phases),
67
- ("suppress_health_check", suppress_health_check),
68
- )
69
- if value is not None
70
- }
71
- if database is not None:
72
- if database.lower() == "none":
73
- kwargs["database"] = None
74
- elif database == HYPOTHESIS_IN_MEMORY_DATABASE_IDENTIFIER:
75
- kwargs["database"] = InMemoryExampleDatabase()
76
- else:
77
- kwargs["database"] = DirectoryBasedExampleDatabase(database)
78
- return hypothesis.settings(print_blob=False, deadline=None, verbosity=hypothesis.Verbosity.quiet, **kwargs)