schemathesis 3.25.6__py3-none-any.whl → 4.0.0a1__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 (221) hide show
  1. schemathesis/__init__.py +27 -65
  2. schemathesis/auths.py +102 -82
  3. schemathesis/checks.py +126 -46
  4. schemathesis/cli/__init__.py +11 -1760
  5. schemathesis/cli/__main__.py +4 -0
  6. schemathesis/cli/commands/__init__.py +37 -0
  7. schemathesis/cli/commands/run/__init__.py +662 -0
  8. schemathesis/cli/commands/run/checks.py +80 -0
  9. schemathesis/cli/commands/run/context.py +117 -0
  10. schemathesis/cli/commands/run/events.py +35 -0
  11. schemathesis/cli/commands/run/executor.py +138 -0
  12. schemathesis/cli/commands/run/filters.py +194 -0
  13. schemathesis/cli/commands/run/handlers/__init__.py +46 -0
  14. schemathesis/cli/commands/run/handlers/base.py +18 -0
  15. schemathesis/cli/commands/run/handlers/cassettes.py +494 -0
  16. schemathesis/cli/commands/run/handlers/junitxml.py +54 -0
  17. schemathesis/cli/commands/run/handlers/output.py +746 -0
  18. schemathesis/cli/commands/run/hypothesis.py +105 -0
  19. schemathesis/cli/commands/run/loaders.py +129 -0
  20. schemathesis/cli/{callbacks.py → commands/run/validation.py} +103 -174
  21. schemathesis/cli/constants.py +5 -52
  22. schemathesis/cli/core.py +17 -0
  23. schemathesis/cli/ext/fs.py +14 -0
  24. schemathesis/cli/ext/groups.py +55 -0
  25. schemathesis/cli/{options.py → ext/options.py} +39 -10
  26. schemathesis/cli/hooks.py +36 -0
  27. schemathesis/contrib/__init__.py +1 -3
  28. schemathesis/contrib/openapi/__init__.py +1 -3
  29. schemathesis/contrib/openapi/fill_missing_examples.py +3 -5
  30. schemathesis/core/__init__.py +58 -0
  31. schemathesis/core/compat.py +25 -0
  32. schemathesis/core/control.py +2 -0
  33. schemathesis/core/curl.py +58 -0
  34. schemathesis/core/deserialization.py +65 -0
  35. schemathesis/core/errors.py +370 -0
  36. schemathesis/core/failures.py +285 -0
  37. schemathesis/core/fs.py +19 -0
  38. schemathesis/{_lazy_import.py → core/lazy_import.py} +1 -0
  39. schemathesis/core/loaders.py +104 -0
  40. schemathesis/core/marks.py +66 -0
  41. schemathesis/{transports/content_types.py → core/media_types.py} +17 -13
  42. schemathesis/core/output/__init__.py +69 -0
  43. schemathesis/core/output/sanitization.py +197 -0
  44. schemathesis/core/rate_limit.py +60 -0
  45. schemathesis/core/registries.py +31 -0
  46. schemathesis/{internal → core}/result.py +1 -1
  47. schemathesis/core/transforms.py +113 -0
  48. schemathesis/core/transport.py +108 -0
  49. schemathesis/core/validation.py +38 -0
  50. schemathesis/core/version.py +7 -0
  51. schemathesis/engine/__init__.py +30 -0
  52. schemathesis/engine/config.py +59 -0
  53. schemathesis/engine/context.py +119 -0
  54. schemathesis/engine/control.py +36 -0
  55. schemathesis/engine/core.py +157 -0
  56. schemathesis/engine/errors.py +394 -0
  57. schemathesis/engine/events.py +337 -0
  58. schemathesis/engine/phases/__init__.py +66 -0
  59. schemathesis/{runner → engine/phases}/probes.py +50 -67
  60. schemathesis/engine/phases/stateful/__init__.py +65 -0
  61. schemathesis/engine/phases/stateful/_executor.py +326 -0
  62. schemathesis/engine/phases/stateful/context.py +85 -0
  63. schemathesis/engine/phases/unit/__init__.py +174 -0
  64. schemathesis/engine/phases/unit/_executor.py +321 -0
  65. schemathesis/engine/phases/unit/_pool.py +74 -0
  66. schemathesis/engine/recorder.py +241 -0
  67. schemathesis/errors.py +31 -0
  68. schemathesis/experimental/__init__.py +18 -14
  69. schemathesis/filters.py +103 -14
  70. schemathesis/generation/__init__.py +21 -37
  71. schemathesis/generation/case.py +190 -0
  72. schemathesis/generation/coverage.py +931 -0
  73. schemathesis/generation/hypothesis/__init__.py +30 -0
  74. schemathesis/generation/hypothesis/builder.py +585 -0
  75. schemathesis/generation/hypothesis/examples.py +50 -0
  76. schemathesis/generation/hypothesis/given.py +66 -0
  77. schemathesis/generation/hypothesis/reporting.py +14 -0
  78. schemathesis/generation/hypothesis/strategies.py +16 -0
  79. schemathesis/generation/meta.py +115 -0
  80. schemathesis/generation/modes.py +28 -0
  81. schemathesis/generation/overrides.py +96 -0
  82. schemathesis/generation/stateful/__init__.py +20 -0
  83. schemathesis/{stateful → generation/stateful}/state_machine.py +68 -81
  84. schemathesis/generation/targets.py +69 -0
  85. schemathesis/graphql/__init__.py +15 -0
  86. schemathesis/graphql/checks.py +115 -0
  87. schemathesis/graphql/loaders.py +131 -0
  88. schemathesis/hooks.py +99 -67
  89. schemathesis/openapi/__init__.py +13 -0
  90. schemathesis/openapi/checks.py +412 -0
  91. schemathesis/openapi/generation/__init__.py +0 -0
  92. schemathesis/openapi/generation/filters.py +63 -0
  93. schemathesis/openapi/loaders.py +178 -0
  94. schemathesis/pytest/__init__.py +5 -0
  95. schemathesis/pytest/control_flow.py +7 -0
  96. schemathesis/pytest/lazy.py +273 -0
  97. schemathesis/pytest/loaders.py +12 -0
  98. schemathesis/{extra/pytest_plugin.py → pytest/plugin.py} +106 -127
  99. schemathesis/python/__init__.py +0 -0
  100. schemathesis/python/asgi.py +12 -0
  101. schemathesis/python/wsgi.py +12 -0
  102. schemathesis/schemas.py +537 -261
  103. schemathesis/specs/graphql/__init__.py +0 -1
  104. schemathesis/specs/graphql/_cache.py +25 -0
  105. schemathesis/specs/graphql/nodes.py +1 -0
  106. schemathesis/specs/graphql/scalars.py +7 -5
  107. schemathesis/specs/graphql/schemas.py +215 -187
  108. schemathesis/specs/graphql/validation.py +11 -18
  109. schemathesis/specs/openapi/__init__.py +7 -1
  110. schemathesis/specs/openapi/_cache.py +122 -0
  111. schemathesis/specs/openapi/_hypothesis.py +146 -165
  112. schemathesis/specs/openapi/checks.py +565 -67
  113. schemathesis/specs/openapi/converter.py +33 -6
  114. schemathesis/specs/openapi/definitions.py +11 -18
  115. schemathesis/specs/openapi/examples.py +139 -23
  116. schemathesis/specs/openapi/expressions/__init__.py +37 -2
  117. schemathesis/specs/openapi/expressions/context.py +4 -6
  118. schemathesis/specs/openapi/expressions/extractors.py +23 -0
  119. schemathesis/specs/openapi/expressions/lexer.py +20 -18
  120. schemathesis/specs/openapi/expressions/nodes.py +38 -14
  121. schemathesis/specs/openapi/expressions/parser.py +26 -5
  122. schemathesis/specs/openapi/formats.py +45 -0
  123. schemathesis/specs/openapi/links.py +65 -165
  124. schemathesis/specs/openapi/media_types.py +32 -0
  125. schemathesis/specs/openapi/negative/__init__.py +7 -3
  126. schemathesis/specs/openapi/negative/mutations.py +24 -8
  127. schemathesis/specs/openapi/parameters.py +46 -30
  128. schemathesis/specs/openapi/patterns.py +137 -0
  129. schemathesis/specs/openapi/references.py +47 -57
  130. schemathesis/specs/openapi/schemas.py +478 -369
  131. schemathesis/specs/openapi/security.py +25 -7
  132. schemathesis/specs/openapi/serialization.py +11 -6
  133. schemathesis/specs/openapi/stateful/__init__.py +185 -73
  134. schemathesis/specs/openapi/utils.py +6 -1
  135. schemathesis/transport/__init__.py +104 -0
  136. schemathesis/transport/asgi.py +26 -0
  137. schemathesis/transport/prepare.py +99 -0
  138. schemathesis/transport/requests.py +221 -0
  139. schemathesis/{_xml.py → transport/serialization.py} +143 -28
  140. schemathesis/transport/wsgi.py +165 -0
  141. schemathesis-4.0.0a1.dist-info/METADATA +297 -0
  142. schemathesis-4.0.0a1.dist-info/RECORD +152 -0
  143. {schemathesis-3.25.6.dist-info → schemathesis-4.0.0a1.dist-info}/WHEEL +1 -1
  144. {schemathesis-3.25.6.dist-info → schemathesis-4.0.0a1.dist-info}/entry_points.txt +1 -1
  145. schemathesis/_compat.py +0 -74
  146. schemathesis/_dependency_versions.py +0 -17
  147. schemathesis/_hypothesis.py +0 -246
  148. schemathesis/_override.py +0 -49
  149. schemathesis/cli/cassettes.py +0 -375
  150. schemathesis/cli/context.py +0 -58
  151. schemathesis/cli/debug.py +0 -26
  152. schemathesis/cli/handlers.py +0 -16
  153. schemathesis/cli/junitxml.py +0 -43
  154. schemathesis/cli/output/__init__.py +0 -1
  155. schemathesis/cli/output/default.py +0 -790
  156. schemathesis/cli/output/short.py +0 -44
  157. schemathesis/cli/sanitization.py +0 -20
  158. schemathesis/code_samples.py +0 -149
  159. schemathesis/constants.py +0 -55
  160. schemathesis/contrib/openapi/formats/__init__.py +0 -9
  161. schemathesis/contrib/openapi/formats/uuid.py +0 -15
  162. schemathesis/contrib/unique_data.py +0 -41
  163. schemathesis/exceptions.py +0 -560
  164. schemathesis/extra/_aiohttp.py +0 -27
  165. schemathesis/extra/_flask.py +0 -10
  166. schemathesis/extra/_server.py +0 -17
  167. schemathesis/failures.py +0 -209
  168. schemathesis/fixups/__init__.py +0 -36
  169. schemathesis/fixups/fast_api.py +0 -41
  170. schemathesis/fixups/utf8_bom.py +0 -29
  171. schemathesis/graphql.py +0 -4
  172. schemathesis/internal/__init__.py +0 -7
  173. schemathesis/internal/copy.py +0 -13
  174. schemathesis/internal/datetime.py +0 -5
  175. schemathesis/internal/deprecation.py +0 -34
  176. schemathesis/internal/jsonschema.py +0 -35
  177. schemathesis/internal/transformation.py +0 -15
  178. schemathesis/internal/validation.py +0 -34
  179. schemathesis/lazy.py +0 -361
  180. schemathesis/loaders.py +0 -120
  181. schemathesis/models.py +0 -1234
  182. schemathesis/parameters.py +0 -86
  183. schemathesis/runner/__init__.py +0 -570
  184. schemathesis/runner/events.py +0 -329
  185. schemathesis/runner/impl/__init__.py +0 -3
  186. schemathesis/runner/impl/core.py +0 -1035
  187. schemathesis/runner/impl/solo.py +0 -90
  188. schemathesis/runner/impl/threadpool.py +0 -400
  189. schemathesis/runner/serialization.py +0 -411
  190. schemathesis/sanitization.py +0 -248
  191. schemathesis/serializers.py +0 -323
  192. schemathesis/service/__init__.py +0 -18
  193. schemathesis/service/auth.py +0 -11
  194. schemathesis/service/ci.py +0 -201
  195. schemathesis/service/client.py +0 -100
  196. schemathesis/service/constants.py +0 -38
  197. schemathesis/service/events.py +0 -57
  198. schemathesis/service/hosts.py +0 -107
  199. schemathesis/service/metadata.py +0 -46
  200. schemathesis/service/models.py +0 -49
  201. schemathesis/service/report.py +0 -255
  202. schemathesis/service/serialization.py +0 -199
  203. schemathesis/service/usage.py +0 -65
  204. schemathesis/specs/graphql/loaders.py +0 -344
  205. schemathesis/specs/openapi/filters.py +0 -49
  206. schemathesis/specs/openapi/loaders.py +0 -667
  207. schemathesis/specs/openapi/stateful/links.py +0 -92
  208. schemathesis/specs/openapi/validation.py +0 -25
  209. schemathesis/stateful/__init__.py +0 -133
  210. schemathesis/targets.py +0 -45
  211. schemathesis/throttling.py +0 -41
  212. schemathesis/transports/__init__.py +0 -5
  213. schemathesis/transports/auth.py +0 -15
  214. schemathesis/transports/headers.py +0 -35
  215. schemathesis/transports/responses.py +0 -52
  216. schemathesis/types.py +0 -35
  217. schemathesis/utils.py +0 -169
  218. schemathesis-3.25.6.dist-info/METADATA +0 -356
  219. schemathesis-3.25.6.dist-info/RECORD +0 -134
  220. /schemathesis/{extra → cli/ext}/__init__.py +0 -0
  221. {schemathesis-3.25.6.dist-info → schemathesis-4.0.0a1.dist-info}/licenses/LICENSE +0 -0
@@ -1,44 +0,0 @@
1
- import click
2
-
3
- from ...runner import events
4
- from ..context import ExecutionContext
5
- from ..handlers import EventHandler
6
- from . import default
7
-
8
-
9
- def handle_before_execution(context: ExecutionContext, event: events.BeforeExecution) -> None:
10
- if event.recursion_level > 0:
11
- context.operations_count += 1 # type: ignore
12
-
13
-
14
- def handle_after_execution(context: ExecutionContext, event: events.AfterExecution) -> None:
15
- context.operations_processed += 1
16
- context.results.append(event.result)
17
- context.hypothesis_output.extend(event.hypothesis_output)
18
- default.display_execution_result(context, event)
19
-
20
-
21
- class ShortOutputStyleHandler(EventHandler):
22
- def handle_event(self, context: ExecutionContext, event: events.ExecutionEvent) -> None:
23
- """Short output style shows single symbols in the progress bar.
24
-
25
- Otherwise, identical to the default output style.
26
- """
27
- if isinstance(event, events.Initialized):
28
- default.handle_initialized(context, event)
29
- if isinstance(event, events.BeforeProbing):
30
- default.handle_before_probing(context, event)
31
- if isinstance(event, events.AfterProbing):
32
- default.handle_after_probing(context, event)
33
- if isinstance(event, events.BeforeExecution):
34
- handle_before_execution(context, event)
35
- if isinstance(event, events.AfterExecution):
36
- handle_after_execution(context, event)
37
- if isinstance(event, events.Finished):
38
- if context.operations_count == context.operations_processed:
39
- click.echo()
40
- default.handle_finished(context, event)
41
- if isinstance(event, events.Interrupted):
42
- default.handle_interrupted(context, event)
43
- if isinstance(event, events.InternalError):
44
- default.handle_internal_error(context, event)
@@ -1,20 +0,0 @@
1
- from __future__ import annotations
2
- from dataclasses import dataclass
3
- from typing import TYPE_CHECKING
4
-
5
- from ..runner import events
6
- from ..sanitization import sanitize_serialized_check, sanitize_serialized_interaction
7
- from .handlers import EventHandler
8
-
9
- if TYPE_CHECKING:
10
- from .context import ExecutionContext
11
-
12
-
13
- @dataclass
14
- class SanitizationHandler(EventHandler):
15
- def handle_event(self, context: ExecutionContext, event: events.ExecutionEvent) -> None:
16
- if isinstance(event, events.AfterExecution):
17
- for check in event.result.checks:
18
- sanitize_serialized_check(check)
19
- for interaction in event.result.interactions:
20
- sanitize_serialized_interaction(interaction)
@@ -1,149 +0,0 @@
1
- from __future__ import annotations
2
- from enum import Enum
3
- from functools import lru_cache
4
- from shlex import quote
5
- from typing import TYPE_CHECKING
6
-
7
- from .constants import SCHEMATHESIS_TEST_CASE_HEADER
8
- from .types import Headers
9
-
10
- if TYPE_CHECKING:
11
- from requests.structures import CaseInsensitiveDict
12
-
13
-
14
- @lru_cache
15
- def get_excluded_headers() -> CaseInsensitiveDict:
16
- from requests.structures import CaseInsensitiveDict
17
- from requests.utils import default_headers
18
-
19
- # These headers are added automatically by Schemathesis or `requests`.
20
- # Do not show them in code samples to make them more readable
21
-
22
- return CaseInsensitiveDict(
23
- {
24
- "Content-Length": None,
25
- "Transfer-Encoding": None,
26
- SCHEMATHESIS_TEST_CASE_HEADER: None,
27
- **default_headers(),
28
- }
29
- )
30
-
31
-
32
- class CodeSampleStyle(str, Enum):
33
- """Controls the style of code samples for failure reproduction."""
34
-
35
- python = "python"
36
- curl = "curl"
37
-
38
- @property
39
- def verbose_name(self) -> str:
40
- return {
41
- self.curl: "cURL command",
42
- self.python: "Python code",
43
- }[self]
44
-
45
- @classmethod
46
- def default(cls) -> CodeSampleStyle:
47
- return cls.curl
48
-
49
- @classmethod
50
- def from_str(cls, value: str) -> CodeSampleStyle:
51
- try:
52
- return cls[value]
53
- except KeyError:
54
- available_styles = ", ".join(cls)
55
- raise ValueError(
56
- f"Invalid value for code sample style: {value}. Available styles: {available_styles}"
57
- ) from None
58
-
59
- def generate(
60
- self,
61
- *,
62
- method: str,
63
- url: str,
64
- body: str | bytes | None,
65
- headers: Headers | None,
66
- verify: bool,
67
- extra_headers: Headers | None = None,
68
- ) -> str:
69
- """Generate a code snippet for making HTTP requests."""
70
- handlers = {
71
- self.curl: _generate_curl,
72
- self.python: _generate_requests,
73
- }
74
- return handlers[self](
75
- method=method, url=url, body=body, headers=_filter_headers(headers, extra_headers), verify=verify
76
- )
77
-
78
-
79
- def _filter_headers(headers: Headers | None, extra: Headers | None = None) -> Headers:
80
- headers = headers.copy() if headers else {}
81
- if extra is not None:
82
- for key, value in extra.items():
83
- if key not in get_excluded_headers():
84
- headers[key] = value
85
- return headers
86
-
87
-
88
- def _generate_curl(
89
- *,
90
- method: str,
91
- url: str,
92
- body: str | bytes | None,
93
- headers: Headers,
94
- verify: bool,
95
- ) -> str:
96
- """Create a cURL command to reproduce an HTTP request."""
97
- command = f"curl -X {method}"
98
- for key, value in headers.items():
99
- header = f"{key}: {value}"
100
- command += f" -H {quote(header)}"
101
- if body:
102
- if isinstance(body, bytes):
103
- body = body.decode("utf-8", errors="replace")
104
- command += f" -d {quote(body)}"
105
- if not verify:
106
- command += " --insecure"
107
- return f"{command} {quote(url)}"
108
-
109
-
110
- def _generate_requests(
111
- *,
112
- method: str,
113
- url: str,
114
- body: str | bytes | None,
115
- headers: Headers,
116
- verify: bool,
117
- ) -> str:
118
- """Create a Python code to reproduce an HTTP request."""
119
- url = _escape_single_quotes(url)
120
- command = f"requests.{method.lower()}('{url}'"
121
- if body:
122
- command += f", data={repr(body)}"
123
- if headers:
124
- command += f", headers={repr(headers)}"
125
- if not verify:
126
- command += ", verify=False"
127
- command += ")"
128
- return command
129
-
130
-
131
- def _escape_single_quotes(url: str) -> str:
132
- """Escape single quotes in a string, so it is usable as in generated Python code.
133
-
134
- The usual ``str.replace`` is not suitable as it may convert already escaped quotes to not-escaped.
135
- """
136
- result = []
137
- escape = False
138
- for char in url:
139
- if escape:
140
- result.append(char)
141
- escape = False
142
- elif char == "\\":
143
- result.append(char)
144
- escape = True
145
- elif char == "'":
146
- result.append("\\'")
147
- else:
148
- result.append(char)
149
- return "".join(result)
schemathesis/constants.py DELETED
@@ -1,55 +0,0 @@
1
- from importlib import metadata
2
- from .types import NotSet
3
-
4
- try:
5
- SCHEMATHESIS_VERSION = metadata.version(__package__)
6
- except metadata.PackageNotFoundError:
7
- # Local run without installation
8
- SCHEMATHESIS_VERSION = "dev"
9
-
10
- NOT_SET = NotSet()
11
- USER_AGENT = f"schemathesis/{SCHEMATHESIS_VERSION}"
12
- SCHEMATHESIS_TEST_CASE_HEADER = "X-Schemathesis-TestCaseId"
13
- HYPOTHESIS_IN_MEMORY_DATABASE_IDENTIFIER = ":memory:"
14
- DISCORD_LINK = "https://discord.gg/R9ASRAmHnA"
15
- GITHUB_APP_LINK = "https://github.com/apps/schemathesis"
16
- # Maximum test running time
17
- DEFAULT_DEADLINE = 15000
18
- DEFAULT_RESPONSE_TIMEOUT = 10000
19
- DEFAULT_STATEFUL_RECURSION_LIMIT = 5
20
- HTTP_METHODS = frozenset({"get", "put", "post", "delete", "options", "head", "patch", "trace"})
21
- RECURSIVE_REFERENCE_ERROR_MESSAGE = (
22
- "Currently, Schemathesis can't generate data for this operation due to "
23
- "recursive references in the operation definition. See more information in "
24
- "this issue - https://github.com/schemathesis/schemathesis/issues/947"
25
- )
26
- GIVEN_AND_EXPLICIT_EXAMPLES_ERROR_MESSAGE = (
27
- "Unsupported test setup. Tests using `@schema.given` cannot be combined with explicit schema examples in the same "
28
- "function. Separate these tests into distinct functions to avoid conflicts."
29
- )
30
- SERIALIZERS_SUGGESTION_MESSAGE = (
31
- "You can register your own serializer with `schemathesis.serializer` "
32
- "and Schemathesis will be able to make API calls with this media type. \n"
33
- "See https://schemathesis.readthedocs.io/en/stable/how.html#payload-serialization for more information."
34
- )
35
- NO_LINKS_ERROR_MESSAGE = (
36
- "Stateful testing requires at least one OpenAPI link in the schema, but no links detected. "
37
- "Please add OpenAPI links to enable stateful testing or use stateless tests instead. \n"
38
- "See https://schemathesis.readthedocs.io/en/stable/stateful.html#how-to-specify-connections for more information."
39
- )
40
- EXTENSIONS_DOCUMENTATION_URL = "https://schemathesis.readthedocs.io/en/stable/extending.html"
41
- ISSUE_TRACKER_URL = (
42
- "https://github.com/schemathesis/schemathesis/issues/new?"
43
- "labels=Status%3A%20Needs%20Triage%2C+Type%3A+Bug&template=bug_report.md&title=%5BBUG%5D"
44
- )
45
- FLAKY_FAILURE_MESSAGE = "[FLAKY] Schemathesis was not able to reliably reproduce this failure"
46
- BOM_MARK = "\ufeff"
47
- WAIT_FOR_SCHEMA_INTERVAL = 0.05
48
- HOOKS_MODULE_ENV_VAR = "SCHEMATHESIS_HOOKS"
49
- API_NAME_ENV_VAR = "SCHEMATHESIS_API_NAME"
50
- BASE_URL_ENV_VAR = "SCHEMATHESIS_BASE_URL"
51
- WAIT_FOR_SCHEMA_ENV_VAR = "SCHEMATHESIS_WAIT_FOR_SCHEMA"
52
- REPORT_SUGGESTION_ENV_VAR = "SCHEMATHESIS_REPORT_SUGGESTION"
53
-
54
- TRUE_VALUES = ("y", "yes", "t", "true", "on", "1")
55
- FALSE_VALUES = ("n", "no", "f", "false", "off", "0")
@@ -1,9 +0,0 @@
1
- from . import uuid
2
-
3
-
4
- def install() -> None:
5
- uuid.install()
6
-
7
-
8
- def uninstall() -> None:
9
- uuid.uninstall()
@@ -1,15 +0,0 @@
1
- # Open API 2.0 / 3.0 do not include `uuid` in the list of built-in formats, hence it lives in `contrib`.
2
- FORMAT_NAME = "uuid"
3
-
4
-
5
- def install() -> None:
6
- from ....specs import openapi
7
- from hypothesis import strategies as st
8
-
9
- openapi.format(FORMAT_NAME, st.uuids().map(str))
10
-
11
-
12
- def uninstall() -> None:
13
- from ....specs import openapi
14
-
15
- openapi.unregister_string_format("uuid")
@@ -1,41 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import warnings
4
- from typing import TYPE_CHECKING
5
-
6
- from ..hooks import HookContext, register, unregister
7
-
8
- if TYPE_CHECKING:
9
- from ..models import Case
10
- from hypothesis import strategies as st
11
-
12
-
13
- def install() -> None:
14
- warnings.warn(
15
- "The `--contrib-unique-data` CLI option and the corresponding `schemathesis.contrib.unique_data` hook "
16
- "are **DEPRECATED**. The concept of this feature does not fit the core principles of Hypothesis where "
17
- "strategies are configurable on a per-example basis but this feature implies uniqueness across examples. "
18
- "This leads to cryptic error messages about external state and flaky test runs, "
19
- "therefore it will be removed in Schemathesis 4.0",
20
- DeprecationWarning,
21
- stacklevel=1,
22
- )
23
- register(before_generate_case)
24
-
25
-
26
- def uninstall() -> None:
27
- unregister(before_generate_case)
28
-
29
-
30
- def before_generate_case(context: HookContext, strategy: st.SearchStrategy[Case]) -> st.SearchStrategy[Case]:
31
- seen = set()
32
-
33
- def is_not_seen(case: Case) -> bool:
34
- # Calculate hash just once as it is costly
35
- hashed = hash(case)
36
- if hashed not in seen:
37
- seen.add(hashed)
38
- return True
39
- return False
40
-
41
- return strategy.filter(is_not_seen)