schemathesis 3.13.0__py3-none-any.whl → 4.4.2__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 (245) hide show
  1. schemathesis/__init__.py +53 -25
  2. schemathesis/auths.py +507 -0
  3. schemathesis/checks.py +190 -25
  4. schemathesis/cli/__init__.py +27 -1016
  5. schemathesis/cli/__main__.py +4 -0
  6. schemathesis/cli/commands/__init__.py +133 -0
  7. schemathesis/cli/commands/data.py +10 -0
  8. schemathesis/cli/commands/run/__init__.py +602 -0
  9. schemathesis/cli/commands/run/context.py +228 -0
  10. schemathesis/cli/commands/run/events.py +60 -0
  11. schemathesis/cli/commands/run/executor.py +157 -0
  12. schemathesis/cli/commands/run/filters.py +53 -0
  13. schemathesis/cli/commands/run/handlers/__init__.py +46 -0
  14. schemathesis/cli/commands/run/handlers/base.py +45 -0
  15. schemathesis/cli/commands/run/handlers/cassettes.py +464 -0
  16. schemathesis/cli/commands/run/handlers/junitxml.py +60 -0
  17. schemathesis/cli/commands/run/handlers/output.py +1750 -0
  18. schemathesis/cli/commands/run/loaders.py +118 -0
  19. schemathesis/cli/commands/run/validation.py +256 -0
  20. schemathesis/cli/constants.py +5 -0
  21. schemathesis/cli/core.py +19 -0
  22. schemathesis/cli/ext/fs.py +16 -0
  23. schemathesis/cli/ext/groups.py +203 -0
  24. schemathesis/cli/ext/options.py +81 -0
  25. schemathesis/config/__init__.py +202 -0
  26. schemathesis/config/_auth.py +51 -0
  27. schemathesis/config/_checks.py +268 -0
  28. schemathesis/config/_diff_base.py +101 -0
  29. schemathesis/config/_env.py +21 -0
  30. schemathesis/config/_error.py +163 -0
  31. schemathesis/config/_generation.py +157 -0
  32. schemathesis/config/_health_check.py +24 -0
  33. schemathesis/config/_operations.py +335 -0
  34. schemathesis/config/_output.py +171 -0
  35. schemathesis/config/_parameters.py +19 -0
  36. schemathesis/config/_phases.py +253 -0
  37. schemathesis/config/_projects.py +543 -0
  38. schemathesis/config/_rate_limit.py +17 -0
  39. schemathesis/config/_report.py +120 -0
  40. schemathesis/config/_validator.py +9 -0
  41. schemathesis/config/_warnings.py +89 -0
  42. schemathesis/config/schema.json +975 -0
  43. schemathesis/core/__init__.py +72 -0
  44. schemathesis/core/adapter.py +34 -0
  45. schemathesis/core/compat.py +32 -0
  46. schemathesis/core/control.py +2 -0
  47. schemathesis/core/curl.py +100 -0
  48. schemathesis/core/deserialization.py +210 -0
  49. schemathesis/core/errors.py +588 -0
  50. schemathesis/core/failures.py +316 -0
  51. schemathesis/core/fs.py +19 -0
  52. schemathesis/core/hooks.py +20 -0
  53. schemathesis/core/jsonschema/__init__.py +13 -0
  54. schemathesis/core/jsonschema/bundler.py +183 -0
  55. schemathesis/core/jsonschema/keywords.py +40 -0
  56. schemathesis/core/jsonschema/references.py +222 -0
  57. schemathesis/core/jsonschema/types.py +41 -0
  58. schemathesis/core/lazy_import.py +15 -0
  59. schemathesis/core/loaders.py +107 -0
  60. schemathesis/core/marks.py +66 -0
  61. schemathesis/core/media_types.py +79 -0
  62. schemathesis/core/output/__init__.py +46 -0
  63. schemathesis/core/output/sanitization.py +54 -0
  64. schemathesis/core/parameters.py +45 -0
  65. schemathesis/core/rate_limit.py +60 -0
  66. schemathesis/core/registries.py +34 -0
  67. schemathesis/core/result.py +27 -0
  68. schemathesis/core/schema_analysis.py +17 -0
  69. schemathesis/core/shell.py +203 -0
  70. schemathesis/core/transforms.py +144 -0
  71. schemathesis/core/transport.py +223 -0
  72. schemathesis/core/validation.py +73 -0
  73. schemathesis/core/version.py +7 -0
  74. schemathesis/engine/__init__.py +28 -0
  75. schemathesis/engine/context.py +152 -0
  76. schemathesis/engine/control.py +44 -0
  77. schemathesis/engine/core.py +201 -0
  78. schemathesis/engine/errors.py +446 -0
  79. schemathesis/engine/events.py +284 -0
  80. schemathesis/engine/observations.py +42 -0
  81. schemathesis/engine/phases/__init__.py +108 -0
  82. schemathesis/engine/phases/analysis.py +28 -0
  83. schemathesis/engine/phases/probes.py +172 -0
  84. schemathesis/engine/phases/stateful/__init__.py +68 -0
  85. schemathesis/engine/phases/stateful/_executor.py +364 -0
  86. schemathesis/engine/phases/stateful/context.py +85 -0
  87. schemathesis/engine/phases/unit/__init__.py +220 -0
  88. schemathesis/engine/phases/unit/_executor.py +459 -0
  89. schemathesis/engine/phases/unit/_pool.py +82 -0
  90. schemathesis/engine/recorder.py +254 -0
  91. schemathesis/errors.py +47 -0
  92. schemathesis/filters.py +395 -0
  93. schemathesis/generation/__init__.py +25 -0
  94. schemathesis/generation/case.py +478 -0
  95. schemathesis/generation/coverage.py +1528 -0
  96. schemathesis/generation/hypothesis/__init__.py +121 -0
  97. schemathesis/generation/hypothesis/builder.py +992 -0
  98. schemathesis/generation/hypothesis/examples.py +56 -0
  99. schemathesis/generation/hypothesis/given.py +66 -0
  100. schemathesis/generation/hypothesis/reporting.py +285 -0
  101. schemathesis/generation/meta.py +227 -0
  102. schemathesis/generation/metrics.py +93 -0
  103. schemathesis/generation/modes.py +20 -0
  104. schemathesis/generation/overrides.py +127 -0
  105. schemathesis/generation/stateful/__init__.py +37 -0
  106. schemathesis/generation/stateful/state_machine.py +294 -0
  107. schemathesis/graphql/__init__.py +15 -0
  108. schemathesis/graphql/checks.py +109 -0
  109. schemathesis/graphql/loaders.py +285 -0
  110. schemathesis/hooks.py +270 -91
  111. schemathesis/openapi/__init__.py +13 -0
  112. schemathesis/openapi/checks.py +467 -0
  113. schemathesis/openapi/generation/__init__.py +0 -0
  114. schemathesis/openapi/generation/filters.py +72 -0
  115. schemathesis/openapi/loaders.py +315 -0
  116. schemathesis/pytest/__init__.py +5 -0
  117. schemathesis/pytest/control_flow.py +7 -0
  118. schemathesis/pytest/lazy.py +341 -0
  119. schemathesis/pytest/loaders.py +36 -0
  120. schemathesis/pytest/plugin.py +357 -0
  121. schemathesis/python/__init__.py +0 -0
  122. schemathesis/python/asgi.py +12 -0
  123. schemathesis/python/wsgi.py +12 -0
  124. schemathesis/schemas.py +683 -247
  125. schemathesis/specs/graphql/__init__.py +0 -1
  126. schemathesis/specs/graphql/nodes.py +27 -0
  127. schemathesis/specs/graphql/scalars.py +86 -0
  128. schemathesis/specs/graphql/schemas.py +395 -123
  129. schemathesis/specs/graphql/validation.py +33 -0
  130. schemathesis/specs/openapi/__init__.py +9 -1
  131. schemathesis/specs/openapi/_hypothesis.py +578 -317
  132. schemathesis/specs/openapi/adapter/__init__.py +10 -0
  133. schemathesis/specs/openapi/adapter/parameters.py +729 -0
  134. schemathesis/specs/openapi/adapter/protocol.py +59 -0
  135. schemathesis/specs/openapi/adapter/references.py +19 -0
  136. schemathesis/specs/openapi/adapter/responses.py +368 -0
  137. schemathesis/specs/openapi/adapter/security.py +144 -0
  138. schemathesis/specs/openapi/adapter/v2.py +30 -0
  139. schemathesis/specs/openapi/adapter/v3_0.py +30 -0
  140. schemathesis/specs/openapi/adapter/v3_1.py +30 -0
  141. schemathesis/specs/openapi/analysis.py +96 -0
  142. schemathesis/specs/openapi/checks.py +753 -74
  143. schemathesis/specs/openapi/converter.py +176 -37
  144. schemathesis/specs/openapi/definitions.py +599 -4
  145. schemathesis/specs/openapi/examples.py +581 -165
  146. schemathesis/specs/openapi/expressions/__init__.py +52 -5
  147. schemathesis/specs/openapi/expressions/extractors.py +25 -0
  148. schemathesis/specs/openapi/expressions/lexer.py +34 -31
  149. schemathesis/specs/openapi/expressions/nodes.py +97 -46
  150. schemathesis/specs/openapi/expressions/parser.py +35 -13
  151. schemathesis/specs/openapi/formats.py +122 -0
  152. schemathesis/specs/openapi/media_types.py +75 -0
  153. schemathesis/specs/openapi/negative/__init__.py +117 -68
  154. schemathesis/specs/openapi/negative/mutations.py +294 -104
  155. schemathesis/specs/openapi/negative/utils.py +3 -6
  156. schemathesis/specs/openapi/patterns.py +458 -0
  157. schemathesis/specs/openapi/references.py +60 -81
  158. schemathesis/specs/openapi/schemas.py +648 -650
  159. schemathesis/specs/openapi/serialization.py +53 -30
  160. schemathesis/specs/openapi/stateful/__init__.py +404 -69
  161. schemathesis/specs/openapi/stateful/control.py +87 -0
  162. schemathesis/specs/openapi/stateful/dependencies/__init__.py +232 -0
  163. schemathesis/specs/openapi/stateful/dependencies/inputs.py +428 -0
  164. schemathesis/specs/openapi/stateful/dependencies/models.py +341 -0
  165. schemathesis/specs/openapi/stateful/dependencies/naming.py +491 -0
  166. schemathesis/specs/openapi/stateful/dependencies/outputs.py +34 -0
  167. schemathesis/specs/openapi/stateful/dependencies/resources.py +339 -0
  168. schemathesis/specs/openapi/stateful/dependencies/schemas.py +447 -0
  169. schemathesis/specs/openapi/stateful/inference.py +254 -0
  170. schemathesis/specs/openapi/stateful/links.py +219 -78
  171. schemathesis/specs/openapi/types/__init__.py +3 -0
  172. schemathesis/specs/openapi/types/common.py +23 -0
  173. schemathesis/specs/openapi/types/v2.py +129 -0
  174. schemathesis/specs/openapi/types/v3.py +134 -0
  175. schemathesis/specs/openapi/utils.py +7 -6
  176. schemathesis/specs/openapi/warnings.py +75 -0
  177. schemathesis/transport/__init__.py +224 -0
  178. schemathesis/transport/asgi.py +26 -0
  179. schemathesis/transport/prepare.py +126 -0
  180. schemathesis/transport/requests.py +278 -0
  181. schemathesis/transport/serialization.py +329 -0
  182. schemathesis/transport/wsgi.py +175 -0
  183. schemathesis-4.4.2.dist-info/METADATA +213 -0
  184. schemathesis-4.4.2.dist-info/RECORD +192 -0
  185. {schemathesis-3.13.0.dist-info → schemathesis-4.4.2.dist-info}/WHEEL +1 -1
  186. schemathesis-4.4.2.dist-info/entry_points.txt +6 -0
  187. {schemathesis-3.13.0.dist-info → schemathesis-4.4.2.dist-info/licenses}/LICENSE +1 -1
  188. schemathesis/_compat.py +0 -41
  189. schemathesis/_hypothesis.py +0 -115
  190. schemathesis/cli/callbacks.py +0 -188
  191. schemathesis/cli/cassettes.py +0 -253
  192. schemathesis/cli/context.py +0 -36
  193. schemathesis/cli/debug.py +0 -21
  194. schemathesis/cli/handlers.py +0 -11
  195. schemathesis/cli/junitxml.py +0 -41
  196. schemathesis/cli/options.py +0 -51
  197. schemathesis/cli/output/__init__.py +0 -1
  198. schemathesis/cli/output/default.py +0 -508
  199. schemathesis/cli/output/short.py +0 -40
  200. schemathesis/constants.py +0 -79
  201. schemathesis/exceptions.py +0 -207
  202. schemathesis/extra/_aiohttp.py +0 -27
  203. schemathesis/extra/_flask.py +0 -10
  204. schemathesis/extra/_server.py +0 -16
  205. schemathesis/extra/pytest_plugin.py +0 -216
  206. schemathesis/failures.py +0 -131
  207. schemathesis/fixups/__init__.py +0 -29
  208. schemathesis/fixups/fast_api.py +0 -30
  209. schemathesis/lazy.py +0 -227
  210. schemathesis/models.py +0 -1041
  211. schemathesis/parameters.py +0 -88
  212. schemathesis/runner/__init__.py +0 -460
  213. schemathesis/runner/events.py +0 -240
  214. schemathesis/runner/impl/__init__.py +0 -3
  215. schemathesis/runner/impl/core.py +0 -755
  216. schemathesis/runner/impl/solo.py +0 -85
  217. schemathesis/runner/impl/threadpool.py +0 -367
  218. schemathesis/runner/serialization.py +0 -189
  219. schemathesis/serializers.py +0 -233
  220. schemathesis/service/__init__.py +0 -3
  221. schemathesis/service/client.py +0 -46
  222. schemathesis/service/constants.py +0 -12
  223. schemathesis/service/events.py +0 -39
  224. schemathesis/service/handler.py +0 -39
  225. schemathesis/service/models.py +0 -7
  226. schemathesis/service/serialization.py +0 -153
  227. schemathesis/service/worker.py +0 -40
  228. schemathesis/specs/graphql/loaders.py +0 -215
  229. schemathesis/specs/openapi/constants.py +0 -7
  230. schemathesis/specs/openapi/expressions/context.py +0 -12
  231. schemathesis/specs/openapi/expressions/pointers.py +0 -29
  232. schemathesis/specs/openapi/filters.py +0 -44
  233. schemathesis/specs/openapi/links.py +0 -302
  234. schemathesis/specs/openapi/loaders.py +0 -453
  235. schemathesis/specs/openapi/parameters.py +0 -413
  236. schemathesis/specs/openapi/security.py +0 -129
  237. schemathesis/specs/openapi/validation.py +0 -24
  238. schemathesis/stateful.py +0 -349
  239. schemathesis/targets.py +0 -32
  240. schemathesis/types.py +0 -38
  241. schemathesis/utils.py +0 -436
  242. schemathesis-3.13.0.dist-info/METADATA +0 -202
  243. schemathesis-3.13.0.dist-info/RECORD +0 -91
  244. schemathesis-3.13.0.dist-info/entry_points.txt +0 -6
  245. /schemathesis/{extra → cli/ext}/__init__.py +0 -0
@@ -0,0 +1,213 @@
1
+ Metadata-Version: 2.4
2
+ Name: schemathesis
3
+ Version: 4.4.2
4
+ Summary: Property-based testing framework for Open API and GraphQL based apps
5
+ Project-URL: Documentation, https://schemathesis.readthedocs.io/en/stable/
6
+ Project-URL: Changelog, https://github.com/schemathesis/schemathesis/blob/master/CHANGELOG.md
7
+ Project-URL: Bug Tracker, https://github.com/schemathesis/schemathesis
8
+ Project-URL: Funding, https://github.com/sponsors/Stranger6667
9
+ Project-URL: Source Code, https://github.com/schemathesis/schemathesis
10
+ Author-email: Dmitry Dygalo <dmitry@dygalo.dev>
11
+ Maintainer-email: Dmitry Dygalo <dmitry@dygalo.dev>
12
+ License-Expression: MIT
13
+ License-File: LICENSE
14
+ Keywords: graphql,hypothesis,openapi,pytest,testing
15
+ Classifier: Development Status :: 5 - Production/Stable
16
+ Classifier: Environment :: Console
17
+ Classifier: Framework :: Hypothesis
18
+ Classifier: Framework :: Pytest
19
+ Classifier: Intended Audience :: Developers
20
+ Classifier: License :: OSI Approved :: MIT License
21
+ Classifier: Operating System :: OS Independent
22
+ Classifier: Programming Language :: Python :: 3 :: Only
23
+ Classifier: Programming Language :: Python :: 3.9
24
+ Classifier: Programming Language :: Python :: 3.10
25
+ Classifier: Programming Language :: Python :: 3.11
26
+ Classifier: Programming Language :: Python :: 3.12
27
+ Classifier: Programming Language :: Python :: 3.13
28
+ Classifier: Programming Language :: Python :: 3.14
29
+ Classifier: Programming Language :: Python :: Implementation :: CPython
30
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
31
+ Classifier: Topic :: Software Development :: Testing
32
+ Requires-Python: >=3.9
33
+ Requires-Dist: backoff<3.0,>=2.1.2
34
+ Requires-Dist: click<9,>=8.0
35
+ Requires-Dist: colorama<1.0,>=0.4
36
+ Requires-Dist: harfile<1.0,>=0.4.0
37
+ Requires-Dist: httpx<1.0,>=0.22.0
38
+ Requires-Dist: hypothesis-graphql<1,>=0.11.1
39
+ Requires-Dist: hypothesis-jsonschema<0.24,>=0.23.1
40
+ Requires-Dist: hypothesis<7,>=6.108.0
41
+ Requires-Dist: jsonschema[format]<5.0,>=4.18.0
42
+ Requires-Dist: junit-xml<2.0,>=1.9
43
+ Requires-Dist: pyrate-limiter<4.0,>=3.0
44
+ Requires-Dist: pytest-subtests<0.15.0,>=0.11
45
+ Requires-Dist: pytest<9,>=8
46
+ Requires-Dist: pyyaml<7.0,>=5.1
47
+ Requires-Dist: requests<3,>=2.22
48
+ Requires-Dist: rich>=13.9.4
49
+ Requires-Dist: starlette-testclient<1,>=0.4.1
50
+ Requires-Dist: tomli>=2.2.1; python_version < '3.11'
51
+ Requires-Dist: typing-extensions>=4.12.2
52
+ Requires-Dist: werkzeug<4,>=0.16.0
53
+ Provides-Extra: bench
54
+ Requires-Dist: pytest-codspeed==4.2.0; extra == 'bench'
55
+ Provides-Extra: cov
56
+ Requires-Dist: coverage-enable-subprocess; extra == 'cov'
57
+ Requires-Dist: coverage[toml]>=5.3; extra == 'cov'
58
+ Provides-Extra: dev
59
+ Requires-Dist: aiohttp<4.0,>=3.9.1; extra == 'dev'
60
+ Requires-Dist: coverage-enable-subprocess; extra == 'dev'
61
+ Requires-Dist: coverage>=6; extra == 'dev'
62
+ Requires-Dist: coverage[toml]>=5.3; extra == 'dev'
63
+ Requires-Dist: fastapi>=0.86.0; extra == 'dev'
64
+ Requires-Dist: flask<3.0,>=2.1.1; extra == 'dev'
65
+ Requires-Dist: hypothesis-openapi<1,>=0.2; (python_version >= '3.10') and extra == 'dev'
66
+ Requires-Dist: mkdocs-material; extra == 'dev'
67
+ Requires-Dist: mkdocstrings[python]; extra == 'dev'
68
+ Requires-Dist: pydantic>=1.10.2; extra == 'dev'
69
+ Requires-Dist: pytest-asyncio<2.0,>=1.0; extra == 'dev'
70
+ Requires-Dist: pytest-codspeed==4.2.0; extra == 'dev'
71
+ Requires-Dist: pytest-httpserver<2.0,>=1.0; extra == 'dev'
72
+ Requires-Dist: pytest-mock<4.0,>=3.7.0; extra == 'dev'
73
+ Requires-Dist: pytest-trio<1.0,>=0.8; extra == 'dev'
74
+ Requires-Dist: pytest-xdist<4.0,>=3; extra == 'dev'
75
+ Requires-Dist: strawberry-graphql[fastapi]>=0.109.0; extra == 'dev'
76
+ Requires-Dist: syrupy<5.0,>=2; extra == 'dev'
77
+ Requires-Dist: tomli-w>=1.2.0; extra == 'dev'
78
+ Requires-Dist: trustme<1.0,>=0.9.0; extra == 'dev'
79
+ Provides-Extra: docs
80
+ Requires-Dist: mkdocs-material; extra == 'docs'
81
+ Requires-Dist: mkdocstrings[python]; extra == 'docs'
82
+ Provides-Extra: tests
83
+ Requires-Dist: aiohttp<4.0,>=3.9.1; extra == 'tests'
84
+ Requires-Dist: coverage>=6; extra == 'tests'
85
+ Requires-Dist: fastapi>=0.86.0; extra == 'tests'
86
+ Requires-Dist: flask<3.0,>=2.1.1; extra == 'tests'
87
+ Requires-Dist: hypothesis-openapi<1,>=0.2; (python_version >= '3.10') and extra == 'tests'
88
+ Requires-Dist: pydantic>=1.10.2; extra == 'tests'
89
+ Requires-Dist: pytest-asyncio<2.0,>=1.0; extra == 'tests'
90
+ Requires-Dist: pytest-httpserver<2.0,>=1.0; extra == 'tests'
91
+ Requires-Dist: pytest-mock<4.0,>=3.7.0; extra == 'tests'
92
+ Requires-Dist: pytest-trio<1.0,>=0.8; extra == 'tests'
93
+ Requires-Dist: pytest-xdist<4.0,>=3; extra == 'tests'
94
+ Requires-Dist: strawberry-graphql[fastapi]>=0.109.0; extra == 'tests'
95
+ Requires-Dist: syrupy<5.0,>=2; extra == 'tests'
96
+ Requires-Dist: tomli-w>=1.2.0; extra == 'tests'
97
+ Requires-Dist: trustme<1.0,>=0.9.0; extra == 'tests'
98
+ Description-Content-Type: text/markdown
99
+
100
+ <p align="center">
101
+ <a href="https://github.com/schemathesis/schemathesis/actions" target="_blank">
102
+ <img src="https://github.com/schemathesis/schemathesis/actions/workflows/build.yml/badge.svg" alt="Build">
103
+ </a>
104
+ <a href="https://codecov.io/gh/schemathesis/schemathesis/branch/master" target="_blank">
105
+ <img src="https://codecov.io/gh/schemathesis/schemathesis/branch/master/graph/badge.svg" alt="Coverage">
106
+ </a>
107
+ <a href="https://pypi.org/project/schemathesis/" target="_blank">
108
+ <img src="https://img.shields.io/pypi/v/schemathesis.svg" alt="Version">
109
+ </a>
110
+ <a href="https://pypi.org/project/schemathesis/" target="_blank">
111
+ <img src="https://img.shields.io/pypi/pyversions/schemathesis.svg" alt="Python versions">
112
+ </a>
113
+ <a href="https://discord.gg/R9ASRAmHnA" target="_blank">
114
+ <img src="https://img.shields.io/discord/938139740912369755" alt="Discord">
115
+ </a>
116
+ <a href="https://opensource.org/licenses/MIT" target="_blank">
117
+ <img src="https://img.shields.io/pypi/l/schemathesis.svg" alt="License">
118
+ </a>
119
+ </p>
120
+
121
+ ## Schemathesis
122
+
123
+ > **Catch API bugs before your users do.**
124
+
125
+ Schemathesis automatically generates thousands of test cases from your OpenAPI or GraphQL schema and finds edge cases that break your API.
126
+
127
+ <p align="center">
128
+ <img src="https://raw.githubusercontent.com/schemathesis/schemathesis/master/img/demo.gif" alt="Schemathesis automatically finding a server error"/>
129
+ <br>
130
+ <i>Finding bugs that manual testing missed</i>
131
+ </p>
132
+
133
+ ## Try it now
134
+
135
+ ```console
136
+ # Test a demo API - finds real bugs in 30 seconds
137
+ uvx schemathesis run https://example.schemathesis.io/openapi.json
138
+
139
+ # Test your own API
140
+ uvx schemathesis run https://your-api.com/openapi.json
141
+ ```
142
+
143
+
144
+ ## What problems does it solve?
145
+
146
+ - 💥 **500 errors** that crash your API on edge case inputs
147
+ - 📋 **Schema violations** where your API returns different data than documented
148
+ - 🚪 **Validation bypasses** where invalid data gets accepted
149
+ - 🔗 **Integration failures** when responses don't match client expectations
150
+ - 🔄 **Stateful bugs** where operations work individually but fail in realistic workflows
151
+
152
+
153
+ > ⚠️ **Upgrading from older versions?** Check our [Migration Guide](https://github.com/schemathesis/schemathesis/blob/master/MIGRATION.md) for key changes.
154
+
155
+ # Installation & Usage
156
+
157
+ **Command Line:**
158
+ ```console
159
+ uv pip install schemathesis
160
+ schemathesis run https://your-api.com/openapi.json
161
+ ```
162
+
163
+ **Python Tests:**
164
+ ```python
165
+ import schemathesis
166
+
167
+ schema = schemathesis.openapi.from_url("https://your-api.com/openapi.json")
168
+
169
+ @schema.parametrize()
170
+ def test_api(case):
171
+ # Tests with random data, edge cases, and invalid inputs
172
+ case.call_and_validate()
173
+
174
+ # Stateful testing: Tests workflows like: create user -> get user -> delete user
175
+ APIWorkflow = schema.as_state_machine()
176
+ # Creates a test class for pytest/unittest
177
+ TestAPI = APIWorkflow.TestCase
178
+ ```
179
+
180
+ **CI/CD:**
181
+ ```yaml
182
+ - uses: schemathesis/action@v2
183
+ with:
184
+ schema: "https://your-api.com/openapi.json"
185
+ ```
186
+
187
+ ## Who uses it
188
+
189
+ Used by teams at **[Spotify](https://github.com/backstage/backstage)**, **[WordPress](https://github.com/WordPress/openverse)**, **JetBrains**, **Red Hat**, and dozens of other companies.
190
+
191
+
192
+ > "_Schemathesis is the best tool for fuzz testing of REST APIs on the market. We at Red Hat use it for examining our applications in functional and integration testing levels._" - Dmitry Misharov, RedHat
193
+
194
+ ## Documentation
195
+
196
+ 📚 **[Documentation](https://schemathesis.readthedocs.io/en/stable/)** with guides, examples, and API reference.
197
+
198
+ ## Get Help
199
+
200
+ - 💬 [Discord community](https://discord.gg/R9ASRAmHnA)
201
+ - 🐛 [GitHub issues](https://github.com/schemathesis/schemathesis/issues)
202
+
203
+ ## Contributing
204
+
205
+ We welcome contributions! See our [contributing guidelines](CONTRIBUTING.md) and join discussions in [issues](https://github.com/schemathesis/schemathesis/issues) or [Discord](https://discord.gg/R9ASRAmHnA).
206
+
207
+ ## Acknowledgements
208
+
209
+ Schemathesis is built on top of <a href="https://hypothesis.works/" target="_blank">Hypothesis</a>, a powerful property-based testing library for Python.
210
+
211
+ ## License
212
+
213
+ This project is licensed under the terms of the [MIT license](https://opensource.org/licenses/MIT).
@@ -0,0 +1,192 @@
1
+ schemathesis/__init__.py,sha256=wr8u9k85xMua6RJX4Qv9xBlK8nGHFFZTYLtdc3OObrc,1587
2
+ schemathesis/auths.py,sha256=UNMX7Fo_9V-JzkOuiANdWWYsbtmWU_yFaPKG0q34T1I,17414
3
+ schemathesis/checks.py,sha256=F_lsC5JTUKm_ByvilBN_9IpbL4mJiidfLgS8ir2ZDoQ,6873
4
+ schemathesis/errors.py,sha256=K3irHIZkrBH2-9LIjlgXlm8RNC41Nffd39ncfwagUvw,1053
5
+ schemathesis/filters.py,sha256=IevPA5A04GfRLLjmkFLZ0CLhjNO3RmpZq_yw6MqjLIA,13515
6
+ schemathesis/hooks.py,sha256=q2wqYNgpMCO8ImSBkbrWDSwN0BSELelqJMgAAgGvv2M,14836
7
+ schemathesis/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ schemathesis/schemas.py,sha256=BBijCKhFZ-eDxoiW0UtRKa9r_rQNqsGs8VikIQecu60,28029
9
+ schemathesis/cli/__init__.py,sha256=U9gjzWWpiFhaqevPjZbwyTNjABdpvXETI4HgwdGKnvs,877
10
+ schemathesis/cli/__main__.py,sha256=MWaenjaUTZIfNPFzKmnkTiawUri7DVldtg3mirLwzU8,92
11
+ schemathesis/cli/constants.py,sha256=CVcQNHEiX-joAQmyuEVKWPOSxDHsOw_EXXZsEclzLuY,341
12
+ schemathesis/cli/core.py,sha256=ue7YUdVo3YvuzGL4s6i62NL6YqNDeVPBSnQ1znrvG2w,480
13
+ schemathesis/cli/commands/__init__.py,sha256=R61W6syrRHfxMz5S9tOODFNOQsK29SKb5jwdixh07jo,4830
14
+ schemathesis/cli/commands/data.py,sha256=_ALywjIeCZjuaoDQFy-Kj8RZkEGqXd-Y95O47h8Jszs,171
15
+ schemathesis/cli/commands/run/__init__.py,sha256=mw5hrtsbtZJOcBpKvrDWvhlh712zsHqpGMlT3ntty3E,19085
16
+ schemathesis/cli/commands/run/context.py,sha256=vej33l5yOhlJ5gLXDwat9WCW_XdhrHNc9pdIQQYddoY,9004
17
+ schemathesis/cli/commands/run/events.py,sha256=ew0TQOc9T2YBZynYWv95k9yfAk8-hGuZDLMxjT8EhvY,1595
18
+ schemathesis/cli/commands/run/executor.py,sha256=_koznTX0DoELPN_1mxr9K_Qg7-9MPXWdld1MFn3YG_Y,5329
19
+ schemathesis/cli/commands/run/filters.py,sha256=RZwW_p8DFvzRZhmpwA9s26GXcviDGk4P4iS6rYT-s8M,1675
20
+ schemathesis/cli/commands/run/loaders.py,sha256=Tc5cnHgIw4kzSQCGRg1Kpz8_m8BDTcTrzS9-l6MDWS8,4506
21
+ schemathesis/cli/commands/run/validation.py,sha256=SDVW31NjTPuYiRd_l-A2oFaGP9II2Gk9ktlKVSWfLek,9177
22
+ schemathesis/cli/commands/run/handlers/__init__.py,sha256=TPZ3KdGi8m0fjlN0GjA31MAXXn1qI7uU4FtiDwroXZI,1915
23
+ schemathesis/cli/commands/run/handlers/base.py,sha256=5stD6-oRKKew-lojl70DbKhCikNnnBgW80aVdC5Tmjk,1284
24
+ schemathesis/cli/commands/run/handlers/cassettes.py,sha256=2sXW9jykEFw4HCv25ycRfRd8uw5VV1e26Cp14O7PVhs,19245
25
+ schemathesis/cli/commands/run/handlers/junitxml.py,sha256=qiFvM4-SlM67sep003SkLqPslzaEb4nOm3bkzw-DO-Q,2602
26
+ schemathesis/cli/commands/run/handlers/output.py,sha256=lUaRAQyBOmRk8z8-DRe_9-Vtv4uWKvJ1kesmljSlJkg,68344
27
+ schemathesis/cli/ext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
+ schemathesis/cli/ext/fs.py,sha256=dHQYBjQozQmuSSfXVp-2KWFK0ESOb_w-lV2SptfMfco,461
29
+ schemathesis/cli/ext/groups.py,sha256=rx19uTkUTCALNqF-P7RN_0NVUFLDoZcHJij1vnBnxR4,7415
30
+ schemathesis/cli/ext/options.py,sha256=LCTrNkP8U-hLH72zZEWk9MJuHvbL7n8tUa3596_0H8g,3271
31
+ schemathesis/config/__init__.py,sha256=yRPtVUWjSTqTPlzjsbDXsgz7wsAaO2JTxjINhj3P0U4,6470
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=KaomyZy-paOgWQyKF9ezTNU2_BAHXJeDD7Fcn1cCYKY,4300
35
+ schemathesis/config/_env.py,sha256=8XfIyrnGNQuCDnfG0lwmKRFbasRUjgeQGBAMupsmtOU,613
36
+ schemathesis/config/_error.py,sha256=0QnXO7Zagr69aYsX46GHm5xcTDd_18m8pFQBb0SsYvY,5777
37
+ schemathesis/config/_generation.py,sha256=vKb-M1u7SQuNucnmRDMlMXtqZCwnxMVKMXWAeiHRzUA,5688
38
+ schemathesis/config/_health_check.py,sha256=zC9inla5ibMBlEy5WyM4_TME7ju_KH3Bwfo21RI3Gks,561
39
+ schemathesis/config/_operations.py,sha256=kXmyMWcX-ysgj8Z85mnC_vZpOqihJ0RQb5LcAtczZLw,12398
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=vezsRZAdDmtPcOjwdwAmtdb6Hkkj9gMRsdVKah71Zio,8777
43
+ schemathesis/config/_projects.py,sha256=LKZZdLOfXo0c96Xch_ami-YWO9nLuA2KLYmFUKtNHXE,20051
44
+ schemathesis/config/_rate_limit.py,sha256=ekEW-jP_Ichk_O6hYpj-h2TTTKfp7Fm0nyFUbvlWcbA,456
45
+ schemathesis/config/_report.py,sha256=ZECDpaCY4WWHD5UbjvgZoSjLz-rlTvfd5Ivzdgzqf2I,3891
46
+ schemathesis/config/_validator.py,sha256=IcE8geFZ0ZwR18rkIRs25i7pTl7Z84XbjYGUB-mqReU,258
47
+ schemathesis/config/_warnings.py,sha256=Fe_91RiEtFrSpjLhq5ddfA1tbebBZtSuqDQUIwBYy1w,3137
48
+ schemathesis/config/schema.json,sha256=3syuvrHthkMT--J-b06mEfWIGeeVeiMTbZvCWD_OVDI,21081
49
+ schemathesis/core/__init__.py,sha256=tackPPn7JRsEfNf57-_7zPJKQd-SWdGW17og2ZPhf6s,2067
50
+ schemathesis/core/adapter.py,sha256=zwJ0vNhalrF9sYXN8_0pMSkJ71GPDnUBKqBCVsnuVIY,951
51
+ schemathesis/core/compat.py,sha256=B8iesdVim1NcqMDMkVr-Nw_m6sbdF68H66WVV_jeRlQ,1026
52
+ schemathesis/core/control.py,sha256=IzwIc8HIAEMtZWW0Q0iXI7T1niBpjvcLlbuwOSmy5O8,130
53
+ schemathesis/core/curl.py,sha256=xSBCHH-leCcVAuSRNTBxROXcNiKN8o2Ll2JlSM-fcak,3073
54
+ schemathesis/core/deserialization.py,sha256=BZpTlQdG_1FGnP7au5-hKu3ugs_RUz77Hgiy59rJONI,7601
55
+ schemathesis/core/errors.py,sha256=eBu6oyDr_hgjI6M8_f8wZPDni4lYAW1R5V9h4Z739FQ,21130
56
+ schemathesis/core/failures.py,sha256=yFpAxWdEnm0Ri8z8RqRI9H7vcLH5ztOeSIi4m4SGx5g,8996
57
+ schemathesis/core/fs.py,sha256=ItQT0_cVwjDdJX9IiI7EnU75NI2H3_DCEyyUjzg_BgI,472
58
+ schemathesis/core/hooks.py,sha256=qhbkkRSf8URJ4LKv2wmKRINKpquUOgxQzWBHKWRWo3Q,475
59
+ schemathesis/core/lazy_import.py,sha256=aMhWYgbU2JOltyWBb32vnWBb6kykOghucEzI_F70yVE,470
60
+ schemathesis/core/loaders.py,sha256=04WRkiWfWPH4xjgi0nMO1NyjGw8zvraIq6PqMqCq1c4,3590
61
+ schemathesis/core/marks.py,sha256=SH7jsVuNRJjx2gZN9Ze5MY01u7FJiHeO0iruzKi5rm4,2135
62
+ schemathesis/core/media_types.py,sha256=a7dXPw6w8RMmDOw8e6hgg2Ey2oRHiANZxEzuElDMfZo,2269
63
+ schemathesis/core/parameters.py,sha256=SSyIJzkJ-5r4TiYYebC7jCHi1Rt2hvTNlEog-3Yvjc8,1022
64
+ schemathesis/core/rate_limit.py,sha256=7tg9Znk11erTfw8-ANutjEmu7hbfUHZx_iEdkoaP174,1757
65
+ schemathesis/core/registries.py,sha256=ksWLxPcohKInH9DwB56KNK0AwGO0Gk5LR2z_Q7cRvps,884
66
+ schemathesis/core/result.py,sha256=d449YvyONjqjDs-A5DAPgtAI96iT753K8sU6_1HLo2Q,461
67
+ schemathesis/core/schema_analysis.py,sha256=DfDqmFNywKhUE-6Y-mTcoH3wF4jwrH4_ZK-Z41h-DdQ,351
68
+ schemathesis/core/shell.py,sha256=sBHY-YWqrNhjnbvyBbAmEniPs5OwAFOOj8tAA52KU1Q,5832
69
+ schemathesis/core/transforms.py,sha256=n_inn8Vb-CFiDUd9Z8E7JIp2kn2eAnxO8DD3OSwOTiM,4310
70
+ schemathesis/core/transport.py,sha256=LQcamAkFqJ0HuXQzepevAq2MCJW-uq5Nm-HE9yc7HMI,7503
71
+ schemathesis/core/validation.py,sha256=b0USkKzkWvdz3jOW1JXYc_TfYshfKZeP7xAUnMqcNoc,2303
72
+ schemathesis/core/version.py,sha256=dOBUWrY3-uA2NQXJp9z7EtZgkR6jYeLg8sMhQCL1mcI,205
73
+ schemathesis/core/jsonschema/__init__.py,sha256=gBZGsXIpK2EFfcp8x0b69dqzWAm2OeZHepKImkkLvoE,320
74
+ schemathesis/core/jsonschema/bundler.py,sha256=a8cQMJ7EQe3eWvS3haS2ZpxOUwzA4PY4OLI0Uyx045A,8472
75
+ schemathesis/core/jsonschema/keywords.py,sha256=ssys1lgo4T_-B0VjWTAp91cga1wxwufxlb3-MI75ioY,796
76
+ schemathesis/core/jsonschema/references.py,sha256=c2Q4IKWUbwENNtkbFaqf8r3LLZu6GFE5YLnYQlg5tPg,6069
77
+ schemathesis/core/jsonschema/types.py,sha256=C7f9g8yKFuoxC5_0YNIh8QAyGU0-tj8pzTMfMDjjjVM,1248
78
+ schemathesis/core/output/__init__.py,sha256=SiHqONFskXl73AtP5dV29L14nZoKo7B-IeG52KZB32M,1446
79
+ schemathesis/core/output/sanitization.py,sha256=Ev3tae8dVwsYd7yVb2_1VBFYs92WFsQ4Eu1fGaymItE,2013
80
+ schemathesis/engine/__init__.py,sha256=QaFE-FinaTAaarteADo2RRMJ-Sz6hZB9TzD5KjMinIA,706
81
+ schemathesis/engine/context.py,sha256=5VVnFVRXePK_aJFpyw9p-apZM1wYDr5eQgGSssbSloQ,5390
82
+ schemathesis/engine/control.py,sha256=FXzP8dxL47j1Giqpy2-Bsr_MdMw9YiATSK_UfpFwDtk,1348
83
+ schemathesis/engine/core.py,sha256=rucLeczgmvFuyZAUqWMYziDd7AWOAwiZT7Dp5S8g76M,6897
84
+ schemathesis/engine/errors.py,sha256=ozUEukw4fCJEEWvekfRbBvizEtC3yV4QsB_wJS6t8OU,17481
85
+ schemathesis/engine/events.py,sha256=03Oufa6yuVUTwLohtHbkph0bOKVObAAg3NORsuoU_2Q,7058
86
+ schemathesis/engine/observations.py,sha256=T-5R8GeVIqvxpCMxc6vZ04UUxUTx3w7689r3Dc6bIcE,1416
87
+ schemathesis/engine/recorder.py,sha256=Q_Bufl9vADke7W_jVppC-34wF72oGqs7kZXBPpJwafc,8635
88
+ schemathesis/engine/phases/__init__.py,sha256=p96yAJQf_ZwRPyGrfGREK8S9hG6rJPwSSAbB7D0Go88,3544
89
+ schemathesis/engine/phases/analysis.py,sha256=E6jlwac_vE37BDeOQDQy8K9TlyY51XIorn3OJUp4VYE,979
90
+ schemathesis/engine/phases/probes.py,sha256=YogjJcZJcTMS8sMdGnG4oXKmMUj_4r_J7MY-BBJtCRU,5690
91
+ schemathesis/engine/phases/stateful/__init__.py,sha256=Lz1rgNqCfUSIz173XqCGsiMuUI5bh4L-RIFexU1-c_Q,2461
92
+ schemathesis/engine/phases/stateful/_executor.py,sha256=-yI5H7gUFHaNgINZ9e8lyp8-mYtgVOfH7UHAeI5n8Qw,15539
93
+ schemathesis/engine/phases/stateful/context.py,sha256=A7X1SLDOWFpCvFN9IiIeNVZM0emjqatmJL_k9UsO7vM,2946
94
+ schemathesis/engine/phases/unit/__init__.py,sha256=VQPueqKenVy6bHaoT2EtYkAlj8idd-uOvWWAswfDrLU,9125
95
+ schemathesis/engine/phases/unit/_executor.py,sha256=xnVSz3bWtYtxmkKrG4xpD2NdWbKJrpA2ylyeUx8mDS8,17906
96
+ schemathesis/engine/phases/unit/_pool.py,sha256=iU0hdHDmohPnEv7_S1emcabuzbTf-Cznqwn0pGQ5wNQ,2480
97
+ schemathesis/generation/__init__.py,sha256=tvNO2FLiY8z3fZ_kL_QJhSgzXfnT4UqwSXMHCwfLI0g,645
98
+ schemathesis/generation/case.py,sha256=GNVuhdJn77KI05uTzSOvHDDCRrcQIhodFkzZij53yjc,19084
99
+ schemathesis/generation/coverage.py,sha256=l_5iowdYjoXaZJS8TdjbXpEif20o-TIGI4xWmdwNNwU,67284
100
+ schemathesis/generation/meta.py,sha256=rxoPmFoGDoG-AWtHzfv0hDUKZU9eCe0FgNRZI8-gXy8,6730
101
+ schemathesis/generation/metrics.py,sha256=cZU5HdeAMcLFEDnTbNE56NuNq4P0N4ew-g1NEz5-kt4,2836
102
+ schemathesis/generation/modes.py,sha256=Q1fhjWr3zxabU5qdtLvKfpMFZJAwlW9pnxgenjeXTyU,481
103
+ schemathesis/generation/overrides.py,sha256=LCafw4GlG3OLVjhwKd2uMC3dAYRQMy9QL-7JUXncnEA,4265
104
+ schemathesis/generation/hypothesis/__init__.py,sha256=gohglcUDguZAQTVaS7A2gmOMyZuL1qWJw5rE80gEXBQ,4794
105
+ schemathesis/generation/hypothesis/builder.py,sha256=_4Cg8fXY9p3dKf_cCNUNaohqRmayPkUuz_PON0WIows,40171
106
+ schemathesis/generation/hypothesis/examples.py,sha256=uHzgJDvQo6Fg5c3Ez5N9DbEfuO4ULnfjE0xcRHUyn4c,1712
107
+ schemathesis/generation/hypothesis/given.py,sha256=9NO3aLV32Jdi7ZK0gOrIaUFCo5TSMPBZKpxpwdH4wRU,2321
108
+ schemathesis/generation/hypothesis/reporting.py,sha256=emvD7Re-JKl2uUeHgmLx6cHFg56_cT8TnmU6BQ9BJF4,11479
109
+ schemathesis/generation/stateful/__init__.py,sha256=s7jiJEnguIj44IsRyMi8afs-8yjIUuBbzW58bH5CHjs,1042
110
+ schemathesis/generation/stateful/state_machine.py,sha256=ITnL_2iQ3mToStjvawU9NUOQTMhxx9SWamhMQGHpfXg,9570
111
+ schemathesis/graphql/__init__.py,sha256=_eO6MAPHGgiADVGRntnwtPxmuvk666sAh-FAU4cG9-0,326
112
+ schemathesis/graphql/checks.py,sha256=IADbxiZjgkBWrC5yzHDtohRABX6zKXk5w_zpWNwdzYo,3186
113
+ schemathesis/graphql/loaders.py,sha256=2tgG4HIvFmjHLr_KexVXnT8hSBM-dKG_fuXTZgE97So,9445
114
+ schemathesis/openapi/__init__.py,sha256=-KcsSAM19uOM0N5J4s-yTnQ1BFsptYhW1E51cEf6kVM,311
115
+ schemathesis/openapi/checks.py,sha256=icUnRTkfFNP0nOYCyaj7hFHO8gJic0XPKxP0xHkm0Qw,13062
116
+ schemathesis/openapi/loaders.py,sha256=aaCIf6P8R33l6DBNGD_99m_wruYOPR7ecyL5hT6UChg,10710
117
+ schemathesis/openapi/generation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
118
+ schemathesis/openapi/generation/filters.py,sha256=pY9cUZdL_kQK80Z2aylTOqqa12zmaYUlYC5BfYgeQMk,2395
119
+ schemathesis/pytest/__init__.py,sha256=7W0q-Thcw03IAQfXE_Mo8JPZpUdHJzfu85fjK1ZdfQM,88
120
+ schemathesis/pytest/control_flow.py,sha256=RM1RCHCozJOSi9NZFOAlgu0P91bxXb-gWiK-KnE38Dw,223
121
+ schemathesis/pytest/lazy.py,sha256=u4sxm935zyGinFkiKN_lIuz-erg4gRYDiLjHykM0Fd8,13419
122
+ schemathesis/pytest/loaders.py,sha256=Sbv8e5F77_x4amLP50iwubfm6kpOhx7LhLFGsVXW5Ys,925
123
+ schemathesis/pytest/plugin.py,sha256=pLf0pNS1QVQ_EFZLKOrbKpKXZ8FSRjiYJMwUDt8tRFM,14960
124
+ schemathesis/python/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
125
+ schemathesis/python/asgi.py,sha256=5PyvuTBaivvyPUEi3pwJni91K1kX5Zc0u9c6c1D8a1Q,287
126
+ schemathesis/python/wsgi.py,sha256=uShAgo_NChbfYaV1117e6UHp0MTg7jaR0Sy_to3Jmf8,219
127
+ schemathesis/specs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
128
+ schemathesis/specs/graphql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
129
+ schemathesis/specs/graphql/nodes.py,sha256=bE3G1kNmqJ8OV4igBvIK-UORrkQA6Nofduf87O3TD9I,541
130
+ schemathesis/specs/graphql/scalars.py,sha256=6lew8mnwhrtg23leiEbG43mLGPLlRln8mClCY94XpDA,2680
131
+ schemathesis/specs/graphql/schemas.py,sha256=ihgDWLouXu5HrjaSEjzsEW97ktOQvdu8pyDODjx_nu0,14802
132
+ schemathesis/specs/graphql/validation.py,sha256=-W1Noc1MQmTb4RX-gNXMeU2qkgso4mzVfHxtdLkCPKM,1422
133
+ schemathesis/specs/openapi/__init__.py,sha256=C5HOsfuDJGq_3mv8CRBvRvb0Diy1p0BFdqyEXMS-loE,238
134
+ schemathesis/specs/openapi/_hypothesis.py,sha256=2Ce3dvmrMqTFw_popNtKL25C1X7r0E8Yh2GFIaPfx_4,27782
135
+ schemathesis/specs/openapi/analysis.py,sha256=mmVaQlCWzeUWDozIov2P8SB-3Hd4fDmvQ4q8SyCjxMw,3767
136
+ schemathesis/specs/openapi/checks.py,sha256=IyO_cemvIvAUlvH2uGtOZ0Ura4KRGulOcZIeSkiXOd4,32267
137
+ schemathesis/specs/openapi/converter.py,sha256=OlvGCCDAiIZS_osM9OQBvDGzwEToUZmVWwzQa4wQNws,6463
138
+ schemathesis/specs/openapi/definitions.py,sha256=8htclglV3fW6JPBqs59lgM4LnA25Mm9IptXBPb_qUT0,93949
139
+ schemathesis/specs/openapi/examples.py,sha256=_rXuj8yeuNGcOIlS_S25fOJ9d8ntyhQks_m8LclqDG0,26568
140
+ schemathesis/specs/openapi/formats.py,sha256=4tYRdckauHxkJCmOhmdwDq_eOpHPaKloi89lzMPbPzw,3975
141
+ schemathesis/specs/openapi/media_types.py,sha256=F5M6TKl0s6Z5X8mZpPsWDEdPBvxclKRcUOc41eEwKbo,2472
142
+ schemathesis/specs/openapi/patterns.py,sha256=GqPZEXMRdWENQxanWjBOalIZ2MQUjuxk21kmdiI703E,18027
143
+ schemathesis/specs/openapi/references.py,sha256=Jez2KpfsDIwXSvxZCmRQtlHk2X9UZ-JZkKAJaCPSLk8,2981
144
+ schemathesis/specs/openapi/schemas.py,sha256=H5ip1IhV8wlkdvEmJNzH7f4zUQTOkGDBBmbF_w6QZiA,35912
145
+ schemathesis/specs/openapi/serialization.py,sha256=RPNdadne5wdhsGmjSvgKLRF58wpzpRx3wura8PsHM3o,12152
146
+ schemathesis/specs/openapi/utils.py,sha256=XkOJT8qD-6uhq-Tmwxk_xYku1Gy5F9pKL3ldNg_DRZw,522
147
+ schemathesis/specs/openapi/warnings.py,sha256=nBPqq2Zi5RkDmdH3ZCunVOqpvnR3LCBJQIcXCj6qMXo,2480
148
+ schemathesis/specs/openapi/adapter/__init__.py,sha256=YEovBgLjnXd3WGPMJXq0KbSGHezkRlEv4dNRO7_evfk,249
149
+ schemathesis/specs/openapi/adapter/parameters.py,sha256=sxFl4yj6eiM-NM7-J0PHhK-5dCpK0qesZLVSJwaPO5s,28780
150
+ schemathesis/specs/openapi/adapter/protocol.py,sha256=VDF6COcilHEUnmw76YBVur8bFiTFQHsNvaO9pR_i_KM,2709
151
+ schemathesis/specs/openapi/adapter/references.py,sha256=6M59pJy_U_sLh3Xzgu6-izWXtz3bjXnqJYSD65wRHtk,549
152
+ schemathesis/specs/openapi/adapter/responses.py,sha256=_nYZTEShJqA2OZvRjgACXnrPUqufZUKAOSAkeruBUnc,13970
153
+ schemathesis/specs/openapi/adapter/security.py,sha256=kJzEEn5aQmWlOj-hnW-KRIjrRILPxNh_yvlu7xsQYQM,5146
154
+ schemathesis/specs/openapi/adapter/v2.py,sha256=2Rd1cTv7_I5QrBPLVfa2yD80NAErxV3tdeACjtEfXAA,1280
155
+ schemathesis/specs/openapi/adapter/v3_0.py,sha256=8bOE9WUDrvPivGs0w-S1PP2TXgWuaoTzMdg2_WWbi-E,1272
156
+ schemathesis/specs/openapi/adapter/v3_1.py,sha256=Hi4iMQdLDAeqSVYjafXbRb5yolWuqMz9A954tE2SCQY,1282
157
+ schemathesis/specs/openapi/expressions/__init__.py,sha256=hfuRtXD75tQFhzSo6QgDZ3zByyWeZRKevB8edszAVj4,2272
158
+ schemathesis/specs/openapi/expressions/errors.py,sha256=YLVhps-sYcslgVaahfcUYxUSHlIfWL-rQMeT5PZSMZ8,219
159
+ schemathesis/specs/openapi/expressions/extractors.py,sha256=IvOrgq_1IWNnirOSV_wLi0UcWOTiL-mLvBLFzLwRpVA,498
160
+ schemathesis/specs/openapi/expressions/lexer.py,sha256=ZbYPbVX-2c2Dan-6fi4NrDlFT6N55Wrz-4921TKHlZs,4030
161
+ schemathesis/specs/openapi/expressions/nodes.py,sha256=qaFpAM3seIzmlYLr9So2kRCSNrteZTa7djcRiOD_ji4,4811
162
+ schemathesis/specs/openapi/expressions/parser.py,sha256=e-ZxshrGE_5CVbgcZLYgdGSjdifgyzgKkLQp0dI0cJY,4503
163
+ schemathesis/specs/openapi/negative/__init__.py,sha256=lHEyJijzgDzrMVtdrEovQYibPYGeA0phWQTjtsus-dA,5240
164
+ schemathesis/specs/openapi/negative/mutations.py,sha256=32l3SRGLZVHEifqrbBP9h93fnBMzowl3cvW3TRFEjZk,26290
165
+ schemathesis/specs/openapi/negative/types.py,sha256=a7buCcVxNBG6ILBM3A7oNTAX0lyDseEtZndBuej8MbI,174
166
+ schemathesis/specs/openapi/negative/utils.py,sha256=ozcOIuASufLqZSgnKUACjX-EOZrrkuNdXX0SDnLoGYA,168
167
+ schemathesis/specs/openapi/stateful/__init__.py,sha256=dHGlTZEZ3fbvQRnzsNKXzyDJewgXIo29UPVSV4SaQFI,17746
168
+ schemathesis/specs/openapi/stateful/control.py,sha256=QaXLSbwQWtai5lxvvVtQV3BLJ8n5ePqSKB00XFxp-MA,3695
169
+ schemathesis/specs/openapi/stateful/inference.py,sha256=B99jSTDVi2yKxU7-raIb91xpacOrr0nZkEZY5Ej3eCY,9783
170
+ schemathesis/specs/openapi/stateful/links.py,sha256=HpAXXaY7goDBxHodnv_-SBOUER-43WbhixwfnCXfE84,8631
171
+ schemathesis/specs/openapi/stateful/dependencies/__init__.py,sha256=y81dasYvGGwE7PQsUxvOx1SE5HWBpgc8NuOJ-XnKYAA,8563
172
+ schemathesis/specs/openapi/stateful/dependencies/inputs.py,sha256=sQydINThS6vp9-OnTKCb_unoVP4m3Ho-0xTG0K7ps8Q,15915
173
+ schemathesis/specs/openapi/stateful/dependencies/models.py,sha256=KwsQBKZPFe3p1OmePbXdnbtUU75Gz_n296qmm-vy7_A,12956
174
+ schemathesis/specs/openapi/stateful/dependencies/naming.py,sha256=hJILmWaAE8HPSuLvwYAOwbeMkgKH1G0h6ta-OI7dHcA,13796
175
+ schemathesis/specs/openapi/stateful/dependencies/outputs.py,sha256=zvVUfQWNIuhMkKDpz5hsVGkkvkefLt1EswpJAnHajOw,1186
176
+ schemathesis/specs/openapi/stateful/dependencies/resources.py,sha256=ZW2ZlkYhmOn5o3ClVebYjPmcV_o6yNcKtkl-QRc5SwE,12405
177
+ schemathesis/specs/openapi/stateful/dependencies/schemas.py,sha256=qhaLy-_wIvEc5v8Cndbol5sr2EsYThm8Ri3PTA84zcU,14862
178
+ schemathesis/specs/openapi/types/__init__.py,sha256=dqSD8_lRW2o1TnnfLfWf8oP-wruczKQk5VXIo3-onPQ,94
179
+ schemathesis/specs/openapi/types/common.py,sha256=mFNqeVURRtM9OCFBo4oSGEm7MQawk31BYfwggS8Iwl8,834
180
+ schemathesis/specs/openapi/types/v2.py,sha256=4K0PQO8852UK1eQs42FT5sp_o3fVi9DiLT8_WVE-4v8,3709
181
+ schemathesis/specs/openapi/types/v3.py,sha256=6z3GdXG91CznqL2oRhrJKnMT1nLbJhf4l-eZBZyGvf0,3309
182
+ schemathesis/transport/__init__.py,sha256=0tkMdYJqYPb9YPQuJdpCtdBaz523jkIp1Rwkb6vADCc,8321
183
+ schemathesis/transport/asgi.py,sha256=qTClt6oT_xUEWnRHokACN_uqCNNUZrRPT6YG0PjbElY,926
184
+ schemathesis/transport/prepare.py,sha256=4LmGSiguR-rQZAKIX32Mlykp3IohsksTqYwbcN75PVE,4846
185
+ schemathesis/transport/requests.py,sha256=eYVazvvTKfwPQqunq-hF7puiBW0mruz07AEo8USi0QY,10730
186
+ schemathesis/transport/serialization.py,sha256=sUf-xGNg7XDMS96O4aIDji2CTj6zRVNvuC_xmn0yjkY,11169
187
+ schemathesis/transport/wsgi.py,sha256=QiTtb-1umJspvi4YBgvnvQ0RQyuYKTWAc89STN6UfLs,5932
188
+ schemathesis-4.4.2.dist-info/METADATA,sha256=YKo65idgqMBgdlyf63BiSTczIIOhr67EBvqQeF4gcpM,8924
189
+ schemathesis-4.4.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
190
+ schemathesis-4.4.2.dist-info/entry_points.txt,sha256=hiK3un-xfgPdwj9uj16YVDtTNpO128bmk0U82SMv8ZQ,152
191
+ schemathesis-4.4.2.dist-info/licenses/LICENSE,sha256=2Ve4J8v5jMQAWrT7r1nf3bI8Vflk3rZVQefiF2zpxwg,1121
192
+ schemathesis-4.4.2.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry 1.0.7
2
+ Generator: hatchling 1.27.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -0,0 +1,6 @@
1
+ [console_scripts]
2
+ schemathesis = schemathesis.cli:schemathesis
3
+ st = schemathesis.cli:schemathesis
4
+
5
+ [pytest11]
6
+ schemathesis = schemathesis.pytest.plugin
@@ -1,7 +1,7 @@
1
1
  MIT License
2
2
 
3
3
  Copyright (c) 2019 Kiwi.com
4
- Copyright (c) 2020-2022 Dmitry Dygalo
4
+ Copyright (c) 2020-2025 Dmitry Dygalo & Schemathesis.io
5
5
 
6
6
  Permission is hereby granted, free of charge, to any person obtaining a copy
7
7
  of this software and associated documentation files (the "Software"), to deal
schemathesis/_compat.py DELETED
@@ -1,41 +0,0 @@
1
- import hypothesis_jsonschema._from_schema
2
- import jsonschema
3
- from hypothesis import strategies as st
4
- from hypothesis.errors import InvalidArgument
5
-
6
- # pylint: disable=unused-import
7
-
8
- try:
9
- from importlib import metadata
10
- except ImportError:
11
- import importlib_metadata as metadata # type: ignore
12
-
13
-
14
- def _get_format_filter(
15
- format_name: str,
16
- checker: jsonschema.FormatChecker,
17
- strategy: st.SearchStrategy[str],
18
- ) -> st.SearchStrategy[str]:
19
- def check_valid(string: str) -> str:
20
- try:
21
- checker.check(string, format=format_name)
22
- except jsonschema.FormatError as err:
23
- raise InvalidArgument(
24
- f"Got string={string!r} from strategy {strategy!r}, but this "
25
- f"is not a valid value for the {format_name!r} checker."
26
- ) from err
27
- return string
28
-
29
- return strategy.map(check_valid)
30
-
31
-
32
- def _install_hypothesis_jsonschema_compatibility_shim() -> None:
33
- """Monkey patch ``hypothesis-jsonschema`` for compatibility reasons.
34
-
35
- Open API < 3.1 uses ``binary`` or ``file`` values for the ``format`` keyword, intended to be used in
36
- the non-JSON context of binary data. As hypothesis-jsonschema follows the JSON Schema semantic, formats that imply
37
- non-string values are invalid.
38
-
39
- Note that this solution is temporary.
40
- """
41
- hypothesis_jsonschema._from_schema._get_format_filter = _get_format_filter
@@ -1,115 +0,0 @@
1
- """High-level API for creating Hypothesis tests."""
2
- import asyncio
3
- from typing import Any, Callable, Dict, List, Optional, Tuple
4
-
5
- import hypothesis
6
- from hypothesis import Phase
7
- from hypothesis import strategies as st
8
- from hypothesis.errors import Unsatisfiable
9
- from hypothesis.internal.reflection import proxies
10
- from hypothesis_jsonschema._canonicalise import HypothesisRefResolutionError
11
-
12
- from .constants import DEFAULT_DEADLINE, DataGenerationMethod
13
- from .exceptions import InvalidSchema
14
- from .hooks import GLOBAL_HOOK_DISPATCHER, HookContext, HookDispatcher
15
- from .models import APIOperation, Case
16
- from .utils import GivenInput
17
-
18
-
19
- def create_test(
20
- *,
21
- operation: APIOperation,
22
- test: Callable,
23
- settings: Optional[hypothesis.settings] = None,
24
- seed: Optional[int] = None,
25
- data_generation_method: DataGenerationMethod = DataGenerationMethod.default(),
26
- _given_args: Tuple[GivenInput, ...] = (),
27
- _given_kwargs: Optional[Dict[str, GivenInput]] = None,
28
- ) -> Callable:
29
- """Create a Hypothesis test."""
30
- hook_dispatcher = getattr(test, "_schemathesis_hooks", None)
31
- strategy = operation.as_strategy(hooks=hook_dispatcher, data_generation_method=data_generation_method)
32
- _given_kwargs = (_given_kwargs or {}).copy()
33
- _given_kwargs.setdefault("case", strategy)
34
-
35
- # Each generated test should be a unique function. It is especially important for the case when Schemathesis runs
36
- # tests in multiple threads because Hypothesis stores some internal attributes on function objects and re-writing
37
- # them from different threads may lead to unpredictable side-effects.
38
-
39
- @proxies(test) # type: ignore
40
- def test_function(*args: Any, **kwargs: Any) -> Any:
41
- return test(*args, **kwargs)
42
-
43
- wrapped_test = hypothesis.given(*_given_args, **_given_kwargs)(test_function)
44
- if seed is not None:
45
- wrapped_test = hypothesis.seed(seed)(wrapped_test)
46
- if asyncio.iscoroutinefunction(test):
47
- wrapped_test.hypothesis.inner_test = make_async_test(test) # type: ignore
48
- setup_default_deadline(wrapped_test)
49
- if settings is not None:
50
- wrapped_test = settings(wrapped_test)
51
- existing_settings = getattr(wrapped_test, "_hypothesis_internal_use_settings", None)
52
- if existing_settings and Phase.explicit in existing_settings.phases:
53
- wrapped_test = add_examples(wrapped_test, operation, hook_dispatcher=hook_dispatcher)
54
- return wrapped_test
55
-
56
-
57
- def setup_default_deadline(wrapped_test: Callable) -> None:
58
- # Quite hacky, but it is the simplest way to set up the default deadline value without affecting non-Schemathesis
59
- # tests globally
60
- existing_settings = getattr(wrapped_test, "_hypothesis_internal_use_settings", None)
61
- if existing_settings is not None and existing_settings.deadline == hypothesis.settings.default.deadline:
62
- new_settings = hypothesis.settings(existing_settings, deadline=DEFAULT_DEADLINE)
63
- wrapped_test._hypothesis_internal_use_settings = new_settings # type: ignore
64
-
65
-
66
- def make_async_test(test: Callable) -> Callable:
67
- def async_run(*args: Any, **kwargs: Any) -> None:
68
- loop = asyncio.get_event_loop()
69
- coro = test(*args, **kwargs)
70
- future = asyncio.ensure_future(coro, loop=loop)
71
- loop.run_until_complete(future)
72
-
73
- return async_run
74
-
75
-
76
- def add_examples(test: Callable, operation: APIOperation, hook_dispatcher: Optional[HookDispatcher] = None) -> Callable:
77
- """Add examples to the Hypothesis test, if they are specified in the schema."""
78
- try:
79
- examples: List[Case] = [get_single_example(strategy) for strategy in operation.get_strategies_from_examples()]
80
- except (InvalidSchema, HypothesisRefResolutionError, Unsatisfiable):
81
- # Invalid schema:
82
- # In this case, the user didn't pass `--validate-schema=false` and see an error in the output anyway,
83
- # and no tests will be executed. For this reason, examples can be skipped
84
- # Recursive references: This test will be skipped anyway
85
- # Unsatisfiable:
86
- # The underlying schema is not satisfiable and test will raise an error for the same reason.
87
- # Skipping this exception here allows us to continue the testing process for other operations.
88
- # Still, we allow to run user-defined hooks
89
- examples = []
90
- context = HookContext(operation) # context should be passed here instead
91
- GLOBAL_HOOK_DISPATCHER.dispatch("before_add_examples", context, examples)
92
- operation.schema.hooks.dispatch("before_add_examples", context, examples)
93
- if hook_dispatcher:
94
- hook_dispatcher.dispatch("before_add_examples", context, examples)
95
- for example in examples:
96
- test = hypothesis.example(case=example)(test)
97
- return test
98
-
99
-
100
- def get_single_example(strategy: st.SearchStrategy[Case]) -> Case:
101
- @hypothesis.given(strategy) # type: ignore
102
- @hypothesis.settings( # type: ignore
103
- database=None,
104
- max_examples=1,
105
- deadline=None,
106
- verbosity=hypothesis.Verbosity.quiet,
107
- phases=(hypothesis.Phase.generate,),
108
- suppress_health_check=hypothesis.HealthCheck.all(),
109
- )
110
- def example_generating_inner_function(ex: Case) -> None:
111
- examples.append(ex)
112
-
113
- examples: List[Case] = []
114
- example_generating_inner_function()
115
- return examples[0]