schemathesis 3.15.4__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.
- schemathesis/__init__.py +53 -25
- schemathesis/auths.py +507 -0
- schemathesis/checks.py +190 -25
- schemathesis/cli/__init__.py +27 -1219
- schemathesis/cli/__main__.py +4 -0
- schemathesis/cli/commands/__init__.py +133 -0
- schemathesis/cli/commands/data.py +10 -0
- schemathesis/cli/commands/run/__init__.py +602 -0
- schemathesis/cli/commands/run/context.py +228 -0
- schemathesis/cli/commands/run/events.py +60 -0
- schemathesis/cli/commands/run/executor.py +157 -0
- schemathesis/cli/commands/run/filters.py +53 -0
- schemathesis/cli/commands/run/handlers/__init__.py +46 -0
- schemathesis/cli/commands/run/handlers/base.py +45 -0
- schemathesis/cli/commands/run/handlers/cassettes.py +464 -0
- schemathesis/cli/commands/run/handlers/junitxml.py +60 -0
- schemathesis/cli/commands/run/handlers/output.py +1750 -0
- schemathesis/cli/commands/run/loaders.py +118 -0
- schemathesis/cli/commands/run/validation.py +256 -0
- schemathesis/cli/constants.py +5 -0
- schemathesis/cli/core.py +19 -0
- schemathesis/cli/ext/fs.py +16 -0
- schemathesis/cli/ext/groups.py +203 -0
- schemathesis/cli/ext/options.py +81 -0
- schemathesis/config/__init__.py +202 -0
- schemathesis/config/_auth.py +51 -0
- schemathesis/config/_checks.py +268 -0
- schemathesis/config/_diff_base.py +101 -0
- schemathesis/config/_env.py +21 -0
- schemathesis/config/_error.py +163 -0
- schemathesis/config/_generation.py +157 -0
- schemathesis/config/_health_check.py +24 -0
- schemathesis/config/_operations.py +335 -0
- schemathesis/config/_output.py +171 -0
- schemathesis/config/_parameters.py +19 -0
- schemathesis/config/_phases.py +253 -0
- schemathesis/config/_projects.py +543 -0
- schemathesis/config/_rate_limit.py +17 -0
- schemathesis/config/_report.py +120 -0
- schemathesis/config/_validator.py +9 -0
- schemathesis/config/_warnings.py +89 -0
- schemathesis/config/schema.json +975 -0
- schemathesis/core/__init__.py +72 -0
- schemathesis/core/adapter.py +34 -0
- schemathesis/core/compat.py +32 -0
- schemathesis/core/control.py +2 -0
- schemathesis/core/curl.py +100 -0
- schemathesis/core/deserialization.py +210 -0
- schemathesis/core/errors.py +588 -0
- schemathesis/core/failures.py +316 -0
- schemathesis/core/fs.py +19 -0
- schemathesis/core/hooks.py +20 -0
- schemathesis/core/jsonschema/__init__.py +13 -0
- schemathesis/core/jsonschema/bundler.py +183 -0
- schemathesis/core/jsonschema/keywords.py +40 -0
- schemathesis/core/jsonschema/references.py +222 -0
- schemathesis/core/jsonschema/types.py +41 -0
- schemathesis/core/lazy_import.py +15 -0
- schemathesis/core/loaders.py +107 -0
- schemathesis/core/marks.py +66 -0
- schemathesis/core/media_types.py +79 -0
- schemathesis/core/output/__init__.py +46 -0
- schemathesis/core/output/sanitization.py +54 -0
- schemathesis/core/parameters.py +45 -0
- schemathesis/core/rate_limit.py +60 -0
- schemathesis/core/registries.py +34 -0
- schemathesis/core/result.py +27 -0
- schemathesis/core/schema_analysis.py +17 -0
- schemathesis/core/shell.py +203 -0
- schemathesis/core/transforms.py +144 -0
- schemathesis/core/transport.py +223 -0
- schemathesis/core/validation.py +73 -0
- schemathesis/core/version.py +7 -0
- schemathesis/engine/__init__.py +28 -0
- schemathesis/engine/context.py +152 -0
- schemathesis/engine/control.py +44 -0
- schemathesis/engine/core.py +201 -0
- schemathesis/engine/errors.py +446 -0
- schemathesis/engine/events.py +284 -0
- schemathesis/engine/observations.py +42 -0
- schemathesis/engine/phases/__init__.py +108 -0
- schemathesis/engine/phases/analysis.py +28 -0
- schemathesis/engine/phases/probes.py +172 -0
- schemathesis/engine/phases/stateful/__init__.py +68 -0
- schemathesis/engine/phases/stateful/_executor.py +364 -0
- schemathesis/engine/phases/stateful/context.py +85 -0
- schemathesis/engine/phases/unit/__init__.py +220 -0
- schemathesis/engine/phases/unit/_executor.py +459 -0
- schemathesis/engine/phases/unit/_pool.py +82 -0
- schemathesis/engine/recorder.py +254 -0
- schemathesis/errors.py +47 -0
- schemathesis/filters.py +395 -0
- schemathesis/generation/__init__.py +25 -0
- schemathesis/generation/case.py +478 -0
- schemathesis/generation/coverage.py +1528 -0
- schemathesis/generation/hypothesis/__init__.py +121 -0
- schemathesis/generation/hypothesis/builder.py +992 -0
- schemathesis/generation/hypothesis/examples.py +56 -0
- schemathesis/generation/hypothesis/given.py +66 -0
- schemathesis/generation/hypothesis/reporting.py +285 -0
- schemathesis/generation/meta.py +227 -0
- schemathesis/generation/metrics.py +93 -0
- schemathesis/generation/modes.py +20 -0
- schemathesis/generation/overrides.py +127 -0
- schemathesis/generation/stateful/__init__.py +37 -0
- schemathesis/generation/stateful/state_machine.py +294 -0
- schemathesis/graphql/__init__.py +15 -0
- schemathesis/graphql/checks.py +109 -0
- schemathesis/graphql/loaders.py +285 -0
- schemathesis/hooks.py +270 -91
- schemathesis/openapi/__init__.py +13 -0
- schemathesis/openapi/checks.py +467 -0
- schemathesis/openapi/generation/__init__.py +0 -0
- schemathesis/openapi/generation/filters.py +72 -0
- schemathesis/openapi/loaders.py +315 -0
- schemathesis/pytest/__init__.py +5 -0
- schemathesis/pytest/control_flow.py +7 -0
- schemathesis/pytest/lazy.py +341 -0
- schemathesis/pytest/loaders.py +36 -0
- schemathesis/pytest/plugin.py +357 -0
- schemathesis/python/__init__.py +0 -0
- schemathesis/python/asgi.py +12 -0
- schemathesis/python/wsgi.py +12 -0
- schemathesis/schemas.py +682 -257
- schemathesis/specs/graphql/__init__.py +0 -1
- schemathesis/specs/graphql/nodes.py +26 -2
- schemathesis/specs/graphql/scalars.py +77 -12
- schemathesis/specs/graphql/schemas.py +367 -148
- schemathesis/specs/graphql/validation.py +33 -0
- schemathesis/specs/openapi/__init__.py +9 -1
- schemathesis/specs/openapi/_hypothesis.py +555 -318
- schemathesis/specs/openapi/adapter/__init__.py +10 -0
- schemathesis/specs/openapi/adapter/parameters.py +729 -0
- schemathesis/specs/openapi/adapter/protocol.py +59 -0
- schemathesis/specs/openapi/adapter/references.py +19 -0
- schemathesis/specs/openapi/adapter/responses.py +368 -0
- schemathesis/specs/openapi/adapter/security.py +144 -0
- schemathesis/specs/openapi/adapter/v2.py +30 -0
- schemathesis/specs/openapi/adapter/v3_0.py +30 -0
- schemathesis/specs/openapi/adapter/v3_1.py +30 -0
- schemathesis/specs/openapi/analysis.py +96 -0
- schemathesis/specs/openapi/checks.py +748 -82
- schemathesis/specs/openapi/converter.py +176 -37
- schemathesis/specs/openapi/definitions.py +599 -4
- schemathesis/specs/openapi/examples.py +581 -165
- schemathesis/specs/openapi/expressions/__init__.py +52 -5
- schemathesis/specs/openapi/expressions/extractors.py +25 -0
- schemathesis/specs/openapi/expressions/lexer.py +34 -31
- schemathesis/specs/openapi/expressions/nodes.py +97 -46
- schemathesis/specs/openapi/expressions/parser.py +35 -13
- schemathesis/specs/openapi/formats.py +122 -0
- schemathesis/specs/openapi/media_types.py +75 -0
- schemathesis/specs/openapi/negative/__init__.py +93 -73
- schemathesis/specs/openapi/negative/mutations.py +294 -103
- schemathesis/specs/openapi/negative/utils.py +0 -9
- schemathesis/specs/openapi/patterns.py +458 -0
- schemathesis/specs/openapi/references.py +60 -81
- schemathesis/specs/openapi/schemas.py +647 -666
- schemathesis/specs/openapi/serialization.py +53 -30
- schemathesis/specs/openapi/stateful/__init__.py +403 -68
- schemathesis/specs/openapi/stateful/control.py +87 -0
- schemathesis/specs/openapi/stateful/dependencies/__init__.py +232 -0
- schemathesis/specs/openapi/stateful/dependencies/inputs.py +428 -0
- schemathesis/specs/openapi/stateful/dependencies/models.py +341 -0
- schemathesis/specs/openapi/stateful/dependencies/naming.py +491 -0
- schemathesis/specs/openapi/stateful/dependencies/outputs.py +34 -0
- schemathesis/specs/openapi/stateful/dependencies/resources.py +339 -0
- schemathesis/specs/openapi/stateful/dependencies/schemas.py +447 -0
- schemathesis/specs/openapi/stateful/inference.py +254 -0
- schemathesis/specs/openapi/stateful/links.py +219 -78
- schemathesis/specs/openapi/types/__init__.py +3 -0
- schemathesis/specs/openapi/types/common.py +23 -0
- schemathesis/specs/openapi/types/v2.py +129 -0
- schemathesis/specs/openapi/types/v3.py +134 -0
- schemathesis/specs/openapi/utils.py +7 -6
- schemathesis/specs/openapi/warnings.py +75 -0
- schemathesis/transport/__init__.py +224 -0
- schemathesis/transport/asgi.py +26 -0
- schemathesis/transport/prepare.py +126 -0
- schemathesis/transport/requests.py +278 -0
- schemathesis/transport/serialization.py +329 -0
- schemathesis/transport/wsgi.py +175 -0
- schemathesis-4.4.2.dist-info/METADATA +213 -0
- schemathesis-4.4.2.dist-info/RECORD +192 -0
- {schemathesis-3.15.4.dist-info → schemathesis-4.4.2.dist-info}/WHEEL +1 -1
- schemathesis-4.4.2.dist-info/entry_points.txt +6 -0
- {schemathesis-3.15.4.dist-info → schemathesis-4.4.2.dist-info/licenses}/LICENSE +1 -1
- schemathesis/_compat.py +0 -57
- schemathesis/_hypothesis.py +0 -123
- schemathesis/auth.py +0 -214
- schemathesis/cli/callbacks.py +0 -240
- schemathesis/cli/cassettes.py +0 -351
- schemathesis/cli/context.py +0 -38
- schemathesis/cli/debug.py +0 -21
- schemathesis/cli/handlers.py +0 -11
- schemathesis/cli/junitxml.py +0 -41
- schemathesis/cli/options.py +0 -70
- schemathesis/cli/output/__init__.py +0 -1
- schemathesis/cli/output/default.py +0 -521
- schemathesis/cli/output/short.py +0 -40
- schemathesis/constants.py +0 -88
- schemathesis/exceptions.py +0 -257
- schemathesis/extra/_aiohttp.py +0 -27
- schemathesis/extra/_flask.py +0 -10
- schemathesis/extra/_server.py +0 -16
- schemathesis/extra/pytest_plugin.py +0 -251
- schemathesis/failures.py +0 -145
- schemathesis/fixups/__init__.py +0 -29
- schemathesis/fixups/fast_api.py +0 -30
- schemathesis/graphql.py +0 -5
- schemathesis/internal.py +0 -6
- schemathesis/lazy.py +0 -301
- schemathesis/models.py +0 -1113
- schemathesis/parameters.py +0 -91
- schemathesis/runner/__init__.py +0 -470
- schemathesis/runner/events.py +0 -242
- schemathesis/runner/impl/__init__.py +0 -3
- schemathesis/runner/impl/core.py +0 -791
- schemathesis/runner/impl/solo.py +0 -85
- schemathesis/runner/impl/threadpool.py +0 -367
- schemathesis/runner/serialization.py +0 -206
- schemathesis/serializers.py +0 -253
- schemathesis/service/__init__.py +0 -18
- schemathesis/service/auth.py +0 -10
- schemathesis/service/client.py +0 -62
- schemathesis/service/constants.py +0 -25
- schemathesis/service/events.py +0 -39
- schemathesis/service/handler.py +0 -46
- schemathesis/service/hosts.py +0 -74
- schemathesis/service/metadata.py +0 -42
- schemathesis/service/models.py +0 -21
- schemathesis/service/serialization.py +0 -184
- schemathesis/service/worker.py +0 -39
- schemathesis/specs/graphql/loaders.py +0 -215
- schemathesis/specs/openapi/constants.py +0 -7
- schemathesis/specs/openapi/expressions/context.py +0 -12
- schemathesis/specs/openapi/expressions/pointers.py +0 -29
- schemathesis/specs/openapi/filters.py +0 -44
- schemathesis/specs/openapi/links.py +0 -303
- schemathesis/specs/openapi/loaders.py +0 -453
- schemathesis/specs/openapi/parameters.py +0 -430
- schemathesis/specs/openapi/security.py +0 -129
- schemathesis/specs/openapi/validation.py +0 -24
- schemathesis/stateful.py +0 -358
- schemathesis/targets.py +0 -32
- schemathesis/types.py +0 -38
- schemathesis/utils.py +0 -475
- schemathesis-3.15.4.dist-info/METADATA +0 -202
- schemathesis-3.15.4.dist-info/RECORD +0 -99
- schemathesis-3.15.4.dist-info/entry_points.txt +0 -7
- /schemathesis/{extra → cli/ext}/__init__.py +0 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import sys
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
import click
|
|
8
|
+
|
|
9
|
+
from schemathesis.cli.commands.data import Data
|
|
10
|
+
from schemathesis.cli.commands.run import run as run_command
|
|
11
|
+
from schemathesis.cli.commands.run.handlers.output import display_header
|
|
12
|
+
from schemathesis.cli.constants import EXTENSIONS_DOCUMENTATION_URL
|
|
13
|
+
from schemathesis.cli.core import get_terminal_width
|
|
14
|
+
from schemathesis.cli.ext.groups import CommandWithGroupedOptions, GroupedOption, StyledGroup, should_use_color
|
|
15
|
+
from schemathesis.config import ConfigError, SchemathesisConfig
|
|
16
|
+
from schemathesis.core.errors import HookError, format_exception
|
|
17
|
+
from schemathesis.core.version import SCHEMATHESIS_VERSION
|
|
18
|
+
|
|
19
|
+
if sys.version_info < (3, 11):
|
|
20
|
+
from tomli import TOMLDecodeError
|
|
21
|
+
else:
|
|
22
|
+
from tomllib import TOMLDecodeError
|
|
23
|
+
|
|
24
|
+
CONTEXT_SETTINGS = {"help_option_names": ["-h", "--help"]}
|
|
25
|
+
ROOT_CONTEXT_SETTINGS: dict[str, Any] = {"help_option_names": []}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _set_no_color(ctx: click.Context, param: click.Parameter, value: bool) -> bool:
|
|
29
|
+
"""Eager callback to set color context before help is displayed."""
|
|
30
|
+
if value:
|
|
31
|
+
ctx.color = False
|
|
32
|
+
return value
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _show_help(ctx: click.Context, param: click.Parameter, value: bool) -> None:
|
|
36
|
+
"""Show help after processing color flags."""
|
|
37
|
+
if value:
|
|
38
|
+
if ctx.color is None:
|
|
39
|
+
ctx.color = should_use_color(ctx)
|
|
40
|
+
click.echo(ctx.get_help(), color=ctx.color)
|
|
41
|
+
ctx.exit()
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@click.group(context_settings=ROOT_CONTEXT_SETTINGS, cls=StyledGroup) # type: ignore[misc]
|
|
45
|
+
@click.option( # type: ignore[misc]
|
|
46
|
+
"--config-file",
|
|
47
|
+
"config_file",
|
|
48
|
+
help="The path to `schemathesis.toml` file to use for configuration",
|
|
49
|
+
metavar="PATH",
|
|
50
|
+
type=str,
|
|
51
|
+
)
|
|
52
|
+
@click.option( # type: ignore[misc]
|
|
53
|
+
"--no-color",
|
|
54
|
+
is_flag=True,
|
|
55
|
+
help="Disable colored output",
|
|
56
|
+
is_eager=True,
|
|
57
|
+
callback=_set_no_color,
|
|
58
|
+
expose_value=False,
|
|
59
|
+
)
|
|
60
|
+
@click.pass_context # type: ignore[misc]
|
|
61
|
+
@click.version_option() # type: ignore[misc]
|
|
62
|
+
@click.option( # type: ignore[misc]
|
|
63
|
+
"-h",
|
|
64
|
+
"--help",
|
|
65
|
+
is_flag=True,
|
|
66
|
+
help="Show this message and exit",
|
|
67
|
+
is_eager=True,
|
|
68
|
+
callback=_show_help,
|
|
69
|
+
expose_value=False,
|
|
70
|
+
)
|
|
71
|
+
def schemathesis(ctx: click.Context, config_file: str | None) -> None:
|
|
72
|
+
"""Property-based API testing for OpenAPI and GraphQL."""
|
|
73
|
+
try:
|
|
74
|
+
if config_file is not None:
|
|
75
|
+
config = SchemathesisConfig.from_path(config_file)
|
|
76
|
+
else:
|
|
77
|
+
config = SchemathesisConfig.discover()
|
|
78
|
+
except FileNotFoundError:
|
|
79
|
+
display_header(SCHEMATHESIS_VERSION)
|
|
80
|
+
click.secho(
|
|
81
|
+
f"❌ Failed to load configuration file from {config_file}",
|
|
82
|
+
fg="red",
|
|
83
|
+
bold=True,
|
|
84
|
+
)
|
|
85
|
+
click.echo("\nThe configuration file does not exist")
|
|
86
|
+
ctx.exit(1)
|
|
87
|
+
except (TOMLDecodeError, ConfigError) as exc:
|
|
88
|
+
display_header(SCHEMATHESIS_VERSION)
|
|
89
|
+
click.secho(
|
|
90
|
+
f"❌ Failed to load configuration file{f' from {config_file}' if config_file else ''}",
|
|
91
|
+
fg="red",
|
|
92
|
+
bold=True,
|
|
93
|
+
)
|
|
94
|
+
if isinstance(exc, TOMLDecodeError):
|
|
95
|
+
detail = "The configuration file content is not valid TOML"
|
|
96
|
+
else:
|
|
97
|
+
detail = "The loaded configuration is incorrect"
|
|
98
|
+
click.echo(f"\n{detail}\n\n{exc}")
|
|
99
|
+
ctx.exit(1)
|
|
100
|
+
except HookError as exc:
|
|
101
|
+
click.secho("Unable to load Schemathesis extension hooks", fg="red", bold=True)
|
|
102
|
+
formatted_module_name = click.style(f"'{exc.module_path}'", bold=True)
|
|
103
|
+
cause = exc.__cause__
|
|
104
|
+
assert isinstance(cause, Exception)
|
|
105
|
+
if isinstance(cause, ModuleNotFoundError) and cause.name == exc.module_path:
|
|
106
|
+
click.echo(
|
|
107
|
+
f"\nAn attempt to import the module {formatted_module_name} failed because it could not be found."
|
|
108
|
+
)
|
|
109
|
+
click.echo("\nEnsure the module name is correctly spelled and reachable from the current directory.")
|
|
110
|
+
else:
|
|
111
|
+
click.echo(f"\nAn error occurred while importing the module {formatted_module_name}. Traceback:")
|
|
112
|
+
message = format_exception(cause, with_traceback=True, skip_frames=1)
|
|
113
|
+
click.secho(f"\n{message}", fg="red")
|
|
114
|
+
click.echo(f"\nFor more information on how to work with hooks, visit {EXTENSIONS_DOCUMENTATION_URL}")
|
|
115
|
+
ctx.exit(1)
|
|
116
|
+
ctx.obj = Data(config=config)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
@dataclass
|
|
120
|
+
class Group:
|
|
121
|
+
name: str
|
|
122
|
+
|
|
123
|
+
__slots__ = ("name",)
|
|
124
|
+
|
|
125
|
+
def add_option(self, *args: Any, **kwargs: Any) -> None:
|
|
126
|
+
run.params.append(GroupedOption(args, group=self.name, **kwargs))
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
run = schemathesis.command(
|
|
130
|
+
short_help="Execute automated tests based on API specifications",
|
|
131
|
+
cls=CommandWithGroupedOptions,
|
|
132
|
+
context_settings={"terminal_width": get_terminal_width(), **CONTEXT_SETTINGS},
|
|
133
|
+
)(run_command)
|