schemathesis 4.0.0a5__py3-none-any.whl → 4.0.0a7__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/cli/commands/run/__init__.py +13 -1
- schemathesis/cli/commands/run/handlers/output.py +1 -1
- schemathesis/cli/commands/run/validation.py +8 -0
- schemathesis/generation/__init__.py +1 -0
- schemathesis/generation/hypothesis/builder.py +14 -4
- schemathesis/specs/openapi/examples.py +37 -20
- schemathesis/specs/openapi/patterns.py +15 -0
- schemathesis/transport/requests.py +10 -1
- {schemathesis-4.0.0a5.dist-info → schemathesis-4.0.0a7.dist-info}/METADATA +47 -72
- {schemathesis-4.0.0a5.dist-info → schemathesis-4.0.0a7.dist-info}/RECORD +13 -13
- {schemathesis-4.0.0a5.dist-info → schemathesis-4.0.0a7.dist-info}/licenses/LICENSE +1 -1
- {schemathesis-4.0.0a5.dist-info → schemathesis-4.0.0a7.dist-info}/WHEEL +0 -0
- {schemathesis-4.0.0a5.dist-info → schemathesis-4.0.0a7.dist-info}/entry_points.txt +0 -0
@@ -239,7 +239,7 @@ DEFAULT_PHASES = ("examples", "coverage", "fuzzing", "stateful")
|
|
239
239
|
@grouped_option(
|
240
240
|
"--report",
|
241
241
|
"report_formats",
|
242
|
-
help="Generate test reports in specified
|
242
|
+
help="Generate test reports in formats specified as a comma-separated list",
|
243
243
|
type=CsvEnumChoice(ReportFormat),
|
244
244
|
is_eager=True,
|
245
245
|
metavar="FORMAT",
|
@@ -305,6 +305,16 @@ DEFAULT_PHASES = ("examples", "coverage", "fuzzing", "stateful")
|
|
305
305
|
multiple=True,
|
306
306
|
metavar="FEATURES",
|
307
307
|
)
|
308
|
+
@grouped_option(
|
309
|
+
"--experimental-coverage-unexpected-methods",
|
310
|
+
"coverage_unexpected_methods",
|
311
|
+
help="HTTP methods to use when generating test cases with methods not specified in the API during the coverage phase.",
|
312
|
+
type=CsvChoice(["get", "put", "post", "delete", "options", "head", "patch", "trace"], case_sensitive=False),
|
313
|
+
callback=validation.convert_http_methods,
|
314
|
+
metavar="",
|
315
|
+
default=None,
|
316
|
+
envvar="SCHEMATHESIS_EXPERIMENTAL_COVERAGE_UNEXPECTED_METHODS",
|
317
|
+
)
|
308
318
|
@grouped_option(
|
309
319
|
"--experimental-missing-required-header-allowed-statuses",
|
310
320
|
"missing_required_header_allowed_statuses",
|
@@ -489,6 +499,7 @@ def run(
|
|
489
499
|
set_cookie: dict[str, str],
|
490
500
|
set_path: dict[str, str],
|
491
501
|
experiments: list,
|
502
|
+
coverage_unexpected_methods: set[str] | None,
|
492
503
|
missing_required_header_allowed_statuses: list[str],
|
493
504
|
positive_data_acceptance_allowed_statuses: list[str],
|
494
505
|
negative_data_rejection_allowed_statuses: list[str],
|
@@ -655,6 +666,7 @@ def run(
|
|
655
666
|
graphql_allow_null=generation_graphql_allow_null,
|
656
667
|
codec=generation_codec,
|
657
668
|
with_security_parameters=generation_with_security_parameters,
|
669
|
+
unexpected_methods=coverage_unexpected_methods,
|
658
670
|
),
|
659
671
|
max_failures=max_failures,
|
660
672
|
continue_on_failure=continue_on_failure,
|
@@ -788,7 +788,7 @@ class OutputHandler(EventHandler):
|
|
788
788
|
warnings: WarningData = field(default_factory=WarningData)
|
789
789
|
errors: set[events.NonFatalError] = field(default_factory=set)
|
790
790
|
phases: dict[PhaseName, tuple[Status, PhaseSkipReason | None]] = field(
|
791
|
-
default_factory=lambda:
|
791
|
+
default_factory=lambda: dict.fromkeys(PhaseName, (Status.SKIP, None))
|
792
792
|
)
|
793
793
|
console: Console = field(default_factory=_default_console)
|
794
794
|
|
@@ -270,6 +270,14 @@ def reduce_list(ctx: click.core.Context, param: click.core.Parameter, value: tup
|
|
270
270
|
return reduce(operator.iadd, value, [])
|
271
271
|
|
272
272
|
|
273
|
+
def convert_http_methods(
|
274
|
+
ctx: click.core.Context, param: click.core.Parameter, value: list[str] | None
|
275
|
+
) -> set[str] | None:
|
276
|
+
if value is None:
|
277
|
+
return value
|
278
|
+
return {item.lower() for item in value}
|
279
|
+
|
280
|
+
|
273
281
|
def convert_status_codes(
|
274
282
|
ctx: click.core.Context, param: click.core.Parameter, value: list[str] | None
|
275
283
|
) -> list[str] | None:
|
@@ -128,7 +128,12 @@ def create_test(
|
|
128
128
|
and not config.given_kwargs
|
129
129
|
):
|
130
130
|
hypothesis_test = add_coverage(
|
131
|
-
hypothesis_test,
|
131
|
+
hypothesis_test,
|
132
|
+
operation,
|
133
|
+
config.generation.modes,
|
134
|
+
auth_storage,
|
135
|
+
config.as_strategy_kwargs,
|
136
|
+
config.generation.unexpected_methods,
|
132
137
|
)
|
133
138
|
|
134
139
|
setattr(hypothesis_test, SETTINGS_ATTRIBUTE_NAME, settings)
|
@@ -215,6 +220,7 @@ def add_coverage(
|
|
215
220
|
generation_modes: list[GenerationMode],
|
216
221
|
auth_storage: AuthStorage | None,
|
217
222
|
as_strategy_kwargs: dict[str, Any],
|
223
|
+
unexpected_methods: set[str] | None = None,
|
218
224
|
) -> Callable:
|
219
225
|
from schemathesis.specs.openapi.constants import LOCATION_TO_CONTAINER
|
220
226
|
|
@@ -227,7 +233,7 @@ def add_coverage(
|
|
227
233
|
for container in LOCATION_TO_CONTAINER.values()
|
228
234
|
if container in as_strategy_kwargs
|
229
235
|
}
|
230
|
-
for case in _iter_coverage_cases(operation, generation_modes):
|
236
|
+
for case in _iter_coverage_cases(operation, generation_modes, unexpected_methods):
|
231
237
|
if case.media_type and operation.schema.transport.get_first_matching_media_type(case.media_type) is None:
|
232
238
|
continue
|
233
239
|
adjust_urlencoded_payload(case)
|
@@ -362,7 +368,9 @@ def _stringify_value(val: Any, container_name: str) -> Any:
|
|
362
368
|
|
363
369
|
|
364
370
|
def _iter_coverage_cases(
|
365
|
-
operation: APIOperation,
|
371
|
+
operation: APIOperation,
|
372
|
+
generation_modes: list[GenerationMode],
|
373
|
+
unexpected_methods: set[str] | None = None,
|
366
374
|
) -> Generator[Case, None, None]:
|
367
375
|
from schemathesis.specs.openapi.constants import LOCATION_TO_CONTAINER
|
368
376
|
from schemathesis.specs.openapi.examples import find_in_responses, find_matching_in_responses
|
@@ -374,6 +382,8 @@ def _iter_coverage_cases(
|
|
374
382
|
|
375
383
|
instant = Instant()
|
376
384
|
responses = find_in_responses(operation)
|
385
|
+
# NOTE: The HEAD method is excluded
|
386
|
+
unexpected_methods = unexpected_methods or {"get", "put", "post", "delete", "options", "patch", "trace"}
|
377
387
|
for parameter in operation.iter_parameters():
|
378
388
|
location = parameter.location
|
379
389
|
name = parameter.name
|
@@ -488,7 +498,7 @@ def _iter_coverage_cases(
|
|
488
498
|
)
|
489
499
|
if GenerationMode.NEGATIVE in generation_modes:
|
490
500
|
# Generate HTTP methods that are not specified in the spec
|
491
|
-
methods =
|
501
|
+
methods = unexpected_methods - set(operation.schema[operation.path])
|
492
502
|
for method in sorted(methods):
|
493
503
|
instant = Instant()
|
494
504
|
data = template.unmodified()
|
@@ -399,45 +399,62 @@ def find_matching_in_responses(examples: dict[str, list], param: str) -> Iterato
|
|
399
399
|
if not isinstance(example, dict):
|
400
400
|
continue
|
401
401
|
# Unwrapping example from `{"item": [{...}]}`
|
402
|
-
if isinstance(example, dict)
|
403
|
-
inner =
|
404
|
-
if
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
402
|
+
if isinstance(example, dict):
|
403
|
+
inner = next((value for key, value in example.items() if key.lower() == schema_name.lower()), None)
|
404
|
+
if inner is not None:
|
405
|
+
if isinstance(inner, list):
|
406
|
+
for sub_example in inner:
|
407
|
+
if isinstance(sub_example, dict):
|
408
|
+
for found in _find_matching_in_responses(
|
409
|
+
sub_example, schema_name, param, normalized, is_id_param
|
410
|
+
):
|
411
|
+
if found is not NOT_FOUND:
|
412
|
+
yield found
|
413
|
+
continue
|
414
|
+
if isinstance(inner, dict):
|
415
|
+
example = inner
|
416
|
+
for found in _find_matching_in_responses(example, schema_name, param, normalized, is_id_param):
|
417
|
+
if found is not NOT_FOUND:
|
418
|
+
yield found
|
415
419
|
|
416
420
|
|
417
421
|
def _find_matching_in_responses(
|
418
422
|
example: dict[str, Any], schema_name: str, param: str, normalized: str, is_id_param: bool
|
419
|
-
) -> Any:
|
423
|
+
) -> Iterator[Any]:
|
420
424
|
# Check for exact match
|
421
425
|
if param in example:
|
422
|
-
|
426
|
+
yield example[param]
|
427
|
+
return
|
423
428
|
if is_id_param and param[:-2] in example:
|
424
|
-
|
429
|
+
value = example[param[:-2]]
|
430
|
+
if isinstance(value, list):
|
431
|
+
for sub_example in value:
|
432
|
+
for found in _find_matching_in_responses(sub_example, schema_name, param, normalized, is_id_param):
|
433
|
+
if found is not NOT_FOUND:
|
434
|
+
yield found
|
435
|
+
return
|
436
|
+
else:
|
437
|
+
yield value
|
438
|
+
return
|
425
439
|
|
426
440
|
# Check for case-insensitive match
|
427
441
|
for key in example:
|
428
442
|
if key.lower() == normalized:
|
429
|
-
|
443
|
+
yield example[key]
|
444
|
+
return
|
430
445
|
else:
|
431
446
|
# If no match found and it's an ID parameter, try additional checks
|
432
447
|
if is_id_param:
|
433
448
|
# Check for 'id' if parameter is '{something}Id'
|
434
449
|
if "id" in example:
|
435
|
-
|
450
|
+
yield example["id"]
|
451
|
+
return
|
436
452
|
# Check for '{schemaName}Id' or '{schemaName}_id'
|
437
453
|
if normalized == "id" or normalized.startswith(schema_name.lower()):
|
438
454
|
for key in (schema_name, schema_name.lower()):
|
439
455
|
for suffix in ("_id", "Id"):
|
440
456
|
with_suffix = f"{key}{suffix}"
|
441
457
|
if with_suffix in example:
|
442
|
-
|
443
|
-
|
458
|
+
yield example[with_suffix]
|
459
|
+
return
|
460
|
+
yield NOT_FOUND
|
@@ -124,6 +124,21 @@ def _handle_anchored_pattern(parsed: list, pattern: str, min_length: int | None,
|
|
124
124
|
|
125
125
|
for op, value in pattern_parts:
|
126
126
|
if op == LITERAL:
|
127
|
+
# Check if the literal comes from a bracketed expression,
|
128
|
+
# e.g. Python regex parses "[+]" as a single LITERAL token.
|
129
|
+
if pattern[current_position] == "[":
|
130
|
+
# Find the matching closing bracket.
|
131
|
+
end_idx = current_position + 1
|
132
|
+
while end_idx < len(pattern):
|
133
|
+
# Check for an unescaped closing bracket.
|
134
|
+
if pattern[end_idx] == "]" and (end_idx == current_position + 1 or pattern[end_idx - 1] != "\\"):
|
135
|
+
end_idx += 1
|
136
|
+
break
|
137
|
+
end_idx += 1
|
138
|
+
# Append the entire character set.
|
139
|
+
result += pattern[current_position:end_idx]
|
140
|
+
current_position = end_idx
|
141
|
+
continue
|
127
142
|
if pattern[current_position] == "\\":
|
128
143
|
# Escaped value
|
129
144
|
current_position += 2
|
@@ -56,12 +56,21 @@ class RequestsTransport(BaseTransport["Case", Response, "requests.Session"]):
|
|
56
56
|
for key, value in additional_headers.items():
|
57
57
|
final_headers.setdefault(key, value)
|
58
58
|
|
59
|
+
params = case.query
|
60
|
+
|
61
|
+
# Replace empty dictionaries with empty strings, so the parameters actually present in the query string
|
62
|
+
if any(value == {} for value in (params or {}).values()):
|
63
|
+
params = deepclone(params)
|
64
|
+
for key, value in params.items():
|
65
|
+
if value == {}:
|
66
|
+
params[key] = ""
|
67
|
+
|
59
68
|
data = {
|
60
69
|
"method": case.method,
|
61
70
|
"url": url,
|
62
71
|
"cookies": case.cookies,
|
63
72
|
"headers": final_headers,
|
64
|
-
"params":
|
73
|
+
"params": params,
|
65
74
|
**extra,
|
66
75
|
}
|
67
76
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: schemathesis
|
3
|
-
Version: 4.0.
|
3
|
+
Version: 4.0.0a7
|
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
|
@@ -117,62 +117,47 @@ Description-Content-Type: text/markdown
|
|
117
117
|
|
118
118
|
## Schemathesis
|
119
119
|
|
120
|
-
|
121
|
-
|
122
|
-
> This branch is under active development, with substantial changes expected before stabilization. While V4 is fully functional and passing tests, some features are missing, and the documentation may be outdated.
|
123
|
-
|
124
|
-
> For the stable release, see the [V3 branch](https://github.com/schemathesis/schemathesis/tree/v3).
|
125
|
-
|
126
|
-
> 💡 Have feedback? Share your thoughts in [this discussion](https://github.com/schemathesis/schemathesis/discussions/2677)!
|
127
|
-
|
128
|
-
Schemathesis is an API testing tool that automatically finds crashes and validates spec compliance.
|
129
|
-
|
130
|
-
<p align="center">
|
131
|
-
<img src="https://raw.githubusercontent.com/schemathesis/schemathesis/master/img/demo.gif" alt="Schemathesis Demo"/>
|
132
|
-
</p>
|
120
|
+
Schemathesis automatically generates and runs API tests from your OpenAPI or GraphQL schema to find bugs and spec violations.
|
133
121
|
|
134
122
|
<p align="center">
|
135
|
-
<
|
123
|
+
<img src="https://raw.githubusercontent.com/schemathesis/schemathesis/master/img/demo.gif" alt="Schemathesis automatically finding a server error"/>
|
124
|
+
<br>
|
125
|
+
<i>Automatically finding specification violations and server errors</i>
|
136
126
|
</p>
|
137
127
|
|
138
|
-
|
139
|
-
|
140
|
-
- 🎯 **Catches Hard-to-Find Bugs**: Automatically uncover crashes and spec violations that manual testing might miss.
|
141
|
-
|
142
|
-
- ⚡ **Accelerates Testing**: Generate a wide range of test cases directly from your API schema.
|
143
|
-
|
144
|
-
- 🧩 **Integrates Seamlessly**: Works with popular API formats such as OpenAPI and GraphQL, and easily integrates into your existing CI/CD workflows.
|
128
|
+
> **Note:** This is the V4 branch under active development. While fully functional and passing tests, some features may be missing, and documentation is being updated. For the stable release, see the [V3 branch](https://github.com/schemathesis/schemathesis/tree/v3).
|
145
129
|
|
146
|
-
|
130
|
+
## Why Schemathesis?
|
147
131
|
|
148
|
-
-
|
149
|
-
|
150
|
-
-
|
132
|
+
- 📑 **Schema-Based Testing** - Transform API documentation into a comprehensive test suite
|
133
|
+
- 🚀 **Zero Configuration** - Begin testing immediately with a valid OpenAPI or GraphQL schema
|
134
|
+
- ⚙️ **CI-Ready** - Integrate API testing into existing pipelines without complex configuration
|
135
|
+
- 🛡️ **Effective Coverage** - Find edge cases no manual testing could uncover
|
136
|
+
- 🔬 **Research-Backed**: [Recognized](https://dl.acm.org/doi/10.1145/3617175) in [academic research](https://ieeexplore.ieee.org/document/9793781) as a state-of-the-art API testing tool
|
151
137
|
|
152
138
|
## Installation
|
153
139
|
|
154
|
-
Use Schemathesis via Docker, or install it from [PyPI](https://pypi.org/project/schemathesis/)
|
155
|
-
|
156
140
|
```console
|
157
|
-
#
|
158
|
-
$
|
141
|
+
# Using uv (recommended)
|
142
|
+
$ uv pip install schemathesis
|
159
143
|
|
160
|
-
#
|
144
|
+
# Using pip
|
161
145
|
$ pip install schemathesis
|
146
|
+
|
147
|
+
# Using Docker
|
148
|
+
$ docker pull schemathesis/schemathesis:stable
|
162
149
|
```
|
163
150
|
|
164
|
-
##
|
151
|
+
## Usage
|
165
152
|
|
166
|
-
|
153
|
+
### Command Line
|
167
154
|
|
168
155
|
```console
|
169
|
-
|
170
|
-
|
171
|
-
# Or when installed with pip
|
172
|
-
schemathesis run --checks all https://example.schemathesis.io/openapi.json
|
156
|
+
# Run tests against a schema URL
|
157
|
+
$ st run https://example.schemathesis.io/openapi.json
|
173
158
|
```
|
174
159
|
|
175
|
-
|
160
|
+
### Python Library
|
176
161
|
|
177
162
|
```python
|
178
163
|
import schemathesis
|
@@ -185,36 +170,35 @@ def test_api(case):
|
|
185
170
|
case.call_and_validate()
|
186
171
|
```
|
187
172
|
|
188
|
-
|
189
|
-
|
190
|
-
Schemathesis can be easily integrated into your CI/CD pipeline using GitHub Actions. Add this block to your GitHub Actions to run Schemathesis against your API:
|
173
|
+
### CI/CD Integration
|
191
174
|
|
192
175
|
```yaml
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
schema: "https://example.schemathesis.io/openapi.json"
|
176
|
+
# GitHub Actions example
|
177
|
+
steps:
|
178
|
+
- uses: schemathesis/action@v1
|
179
|
+
with:
|
180
|
+
schema: "https://example.schemathesis.io/openapi.json"
|
199
181
|
```
|
200
182
|
|
201
|
-
|
183
|
+
## Documentation
|
184
|
+
|
185
|
+
📚 **[Read the full documentation](https://schemathesis.readthedocs.io/)** for guides, examples, and reference material.
|
202
186
|
|
203
187
|
## Who's Using Schemathesis?
|
204
188
|
|
205
|
-
Schemathesis is used by
|
189
|
+
Schemathesis is used by companies and open-source projects including:
|
206
190
|
|
207
|
-
- Abstract Machines ([Magistrala](https://github.com/absmach/magistrala))
|
208
|
-
- Bundesstelle für Open Data ([smard-api](https://github.com/bundesAPI/smard-api))
|
209
|
-
- [CheckMK](https://github.com/Checkmk/checkmk)
|
210
|
-
- Chronosphere.io ([Calyptia](https://github.com/chronosphereio/calyptia-api))
|
211
|
-
- HXSecurity ([DongTai](https://github.com/HXSecurity/DongTai))
|
212
191
|
- Netflix ([Dispatch](https://github.com/Netflix/dispatch))
|
213
|
-
- [Pixie](https://github.com/pixie-io/pixie)
|
214
|
-
- [Qdrant](https://github.com/qdrant/qdrant)
|
215
192
|
- Spotify ([Backstage](https://github.com/backstage/backstage))
|
216
|
-
- [Weechat](https://github.com/weechat/weechat)
|
217
193
|
- WordPress ([OpenVerse](https://github.com/WordPress/openverse))
|
194
|
+
- Chronosphere.io ([Calyptia](https://github.com/chronosphereio/calyptia-api))
|
195
|
+
- [Qdrant](https://github.com/qdrant/qdrant)
|
196
|
+
- [Pixie](https://github.com/pixie-io/pixie)
|
197
|
+
- [CheckMK](https://github.com/Checkmk/checkmk)
|
198
|
+
- [Weechat](https://github.com/weechat/weechat)
|
199
|
+
- HXSecurity ([DongTai](https://github.com/HXSecurity/DongTai))
|
200
|
+
- Abstract Machines ([Magistrala](https://github.com/absmach/magistrala))
|
201
|
+
- Bundesstelle für Open Data ([smard-api](https://github.com/bundesAPI/smard-api))
|
218
202
|
|
219
203
|
## Testimonials
|
220
204
|
|
@@ -230,7 +214,7 @@ Schemathesis is used by a number of projects and companies, including direct usa
|
|
230
214
|
|
231
215
|
---
|
232
216
|
|
233
|
-
"_The tool is
|
217
|
+
"_The tool is amazing as it can test negative scenarios instead of me and much faster!_"
|
234
218
|
|
235
219
|
<div>Luděk Nový - <strong>JetBrains</strong></div>
|
236
220
|
|
@@ -250,24 +234,15 @@ Schemathesis is used by a number of projects and companies, including direct usa
|
|
250
234
|
|
251
235
|
## Contributing
|
252
236
|
|
253
|
-
We welcome contributions
|
254
|
-
|
255
|
-
### How to Contribute
|
256
|
-
|
257
|
-
1. Discuss ideas and questions through [GitHub issues](https://github.com/schemathesis/schemathesis/issues) or on our [Discord channel](https://discord.gg/R9ASRAmHnA).
|
258
|
-
2. For code contributions, see our [contributing guidelines](https://github.com/schemathesis/schemathesis/blob/master/CONTRIBUTING.rst).
|
259
|
-
3. Share your experience and thoughts using [this feedback form](https://forms.gle/kJ4hSxc1Yp6Ga96t5).
|
260
|
-
|
261
|
-
### Why Your Input Matters
|
262
|
-
|
263
|
-
- Enables us to develop useful features and fix bugs faster
|
264
|
-
- Improves our test suite and documentation
|
237
|
+
We welcome contributions! Your input directly influences Schemathesis development.
|
265
238
|
|
266
|
-
|
239
|
+
- Discuss ideas in [GitHub issues](https://github.com/schemathesis/schemathesis/issues) or our [Discord server](https://discord.gg/R9ASRAmHnA)
|
240
|
+
- See our [contributing guidelines](https://github.com/schemathesis/schemathesis/blob/master/CONTRIBUTING.rst) for code contributions
|
241
|
+
- Share your experience using [this feedback form](https://forms.gle/kJ4hSxc1Yp6Ga96t5)
|
267
242
|
|
268
243
|
## Get in Touch
|
269
244
|
|
270
|
-
|
245
|
+
Need assistance with integration or have specific questions? Contact us at <a href="mailto:support@schemathesis.io">support@schemathesis.io</a>.
|
271
246
|
|
272
247
|
## Acknowledgements
|
273
248
|
|
@@ -12,7 +12,7 @@ schemathesis/cli/constants.py,sha256=rUixnqorraUFDtOu3Nmm1x_k0qbgmW9xW96kQB_fBCQ
|
|
12
12
|
schemathesis/cli/core.py,sha256=Qm5xvpIIMwJDTeR3N3TjKhMCHV5d5Rp0UstVS2GjWgw,459
|
13
13
|
schemathesis/cli/hooks.py,sha256=vTrA8EN99whRns5K5AnExViQ6WL9cak5RGsC-ZBEiJM,1458
|
14
14
|
schemathesis/cli/commands/__init__.py,sha256=FFalEss3D7mnCRO0udtYb65onXSjQCCOv8sOSjqvTTM,1059
|
15
|
-
schemathesis/cli/commands/run/__init__.py,sha256=
|
15
|
+
schemathesis/cli/commands/run/__init__.py,sha256=ACIRF3eP-Za56sY5OMSdLdbrmopPvJblDel4Jl-vBtw,23745
|
16
16
|
schemathesis/cli/commands/run/checks.py,sha256=lLtBCt6NhhQisrWo8aC6i0M3dSXlbjGWTTlOyjzatks,3278
|
17
17
|
schemathesis/cli/commands/run/context.py,sha256=pUwSlS7UwW2cq1nJXfKZFEaWDipsQAElCO4tdv1qYJA,7739
|
18
18
|
schemathesis/cli/commands/run/events.py,sha256=Dj-xvIr-Hkms8kvh4whNwKSk1Q2Hx4NIENi_4A8nQO8,1224
|
@@ -21,12 +21,12 @@ schemathesis/cli/commands/run/filters.py,sha256=MdymOZtzOolvXCNBIdfHbBbWEXVF7Se0
|
|
21
21
|
schemathesis/cli/commands/run/hypothesis.py,sha256=hdEHim_Hc2HwCGxAiRTf4t2OfQf0IeCUhyjNT_btB1o,2553
|
22
22
|
schemathesis/cli/commands/run/loaders.py,sha256=VedoeIE1tgFBqVokWxOoUReAjBl-Zhx87RjCEBtCVfs,4840
|
23
23
|
schemathesis/cli/commands/run/reports.py,sha256=OjyakiV0lpNDBZb1xsb_2HmLtcqhTThPYMpJGXyNNO8,2147
|
24
|
-
schemathesis/cli/commands/run/validation.py,sha256=
|
24
|
+
schemathesis/cli/commands/run/validation.py,sha256=cpGG5hFc4lHVemXrQXRvrlNlqBmMqtvx9yUwbOhc2TI,13008
|
25
25
|
schemathesis/cli/commands/run/handlers/__init__.py,sha256=TPZ3KdGi8m0fjlN0GjA31MAXXn1qI7uU4FtiDwroXZI,1915
|
26
26
|
schemathesis/cli/commands/run/handlers/base.py,sha256=yDsTtCiztLksfk7cRzg8JlaAVOfS-zwK3tsJMOXAFyc,530
|
27
27
|
schemathesis/cli/commands/run/handlers/cassettes.py,sha256=SVk13xPhsQduCpgvvBwzEMDNTju-SHQCW90xTQ6iL1U,18525
|
28
28
|
schemathesis/cli/commands/run/handlers/junitxml.py,sha256=c24UiwXqRCnv2eWQWEaNXLOghMI9JtGoZ9RTJY4ao6M,2350
|
29
|
-
schemathesis/cli/commands/run/handlers/output.py,sha256=
|
29
|
+
schemathesis/cli/commands/run/handlers/output.py,sha256=n25QDGvYMXPKRPHBDckkDVwkkieY3Gq4HHSG0h3paTA,58800
|
30
30
|
schemathesis/cli/ext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
31
31
|
schemathesis/cli/ext/fs.py,sha256=OA3mRzra4rq3NyDTcBvlRh0WJrh4ByN-QQ8loI04m88,408
|
32
32
|
schemathesis/cli/ext/groups.py,sha256=kQ37t6qeArcKaY2y5VxyK3_KwAkBKCVm58IYV8gewds,2720
|
@@ -72,7 +72,7 @@ schemathesis/engine/phases/unit/__init__.py,sha256=LcBQpGNPeEFB9XPGpcHBcH-C7nF-e
|
|
72
72
|
schemathesis/engine/phases/unit/_executor.py,sha256=buMEr7e01SFSeNuEQNGMf4hoiLxX9_sp0JhH4LBAk9M,12928
|
73
73
|
schemathesis/engine/phases/unit/_pool.py,sha256=9OgmFd-ov1AAvcZGquK40PXkGLp7f2qCjZoPZuoZl4A,2529
|
74
74
|
schemathesis/experimental/__init__.py,sha256=jYY3Mq6okqTRTMudPzcaT0JVjzJW5IN_ZVJdGU0stBs,2011
|
75
|
-
schemathesis/generation/__init__.py,sha256=
|
75
|
+
schemathesis/generation/__init__.py,sha256=sWTRPTh-qDNkSfpM9rYI3v8zskH8_wFKUuPRg18fZI8,1627
|
76
76
|
schemathesis/generation/case.py,sha256=Rt5MCUtPVYVQzNyjUx8magocPJpHV1svyuqQSTwUE-I,7306
|
77
77
|
schemathesis/generation/coverage.py,sha256=hyDb465tBoCWE7nI-ZJjhTUzk7f2WDufaadWdSAkdr0,39276
|
78
78
|
schemathesis/generation/meta.py,sha256=36h6m4E7jzLGa8TCvl7eBl_xUWLiRul3qxzexl5cB58,2515
|
@@ -80,7 +80,7 @@ schemathesis/generation/modes.py,sha256=t_EvKr2aOXYMsEfdMu4lLF4KCGcX1LVVyvzTkcpJ
|
|
80
80
|
schemathesis/generation/overrides.py,sha256=FhqcFoliEvgW6MZyFPYemfLgzKt3Miy8Cud7OMOCb7g,3045
|
81
81
|
schemathesis/generation/targets.py,sha256=_rN2qgxTE2EfvygiN-Fy3WmDnRH0ERohdx3sKRDaYhU,2120
|
82
82
|
schemathesis/generation/hypothesis/__init__.py,sha256=Rl7QwvMBMJI7pBqTydplX6bXC420n0EGQHVm-vZgaYQ,1204
|
83
|
-
schemathesis/generation/hypothesis/builder.py,sha256=
|
83
|
+
schemathesis/generation/hypothesis/builder.py,sha256=6U4BaTx0VMVRXhmKrEakDSnHunIdEMQiBZfr89pdpP4,29618
|
84
84
|
schemathesis/generation/hypothesis/examples.py,sha256=6eGaKUEC3elmKsaqfKj1sLvM8EHc-PWT4NRBq4NI0Rs,1409
|
85
85
|
schemathesis/generation/hypothesis/given.py,sha256=sTZR1of6XaHAPWtHx2_WLlZ50M8D5Rjux0GmWkWjDq4,2337
|
86
86
|
schemathesis/generation/hypothesis/reporting.py,sha256=uDVow6Ya8YFkqQuOqRsjbzsbyP4KKfr3jA7ZaY4FuKY,279
|
@@ -117,11 +117,11 @@ schemathesis/specs/openapi/checks.py,sha256=m3n5N3_iZcS7inJojW47FF6dfbUQzrBH-bXw
|
|
117
117
|
schemathesis/specs/openapi/constants.py,sha256=JqM_FHOenqS_MuUE9sxVQ8Hnw0DNM8cnKDwCwPLhID4,783
|
118
118
|
schemathesis/specs/openapi/converter.py,sha256=lil8IewM5j8tvt4lpA9g_KITvIwx1M96i45DNSHNjoc,3505
|
119
119
|
schemathesis/specs/openapi/definitions.py,sha256=8htclglV3fW6JPBqs59lgM4LnA25Mm9IptXBPb_qUT0,93949
|
120
|
-
schemathesis/specs/openapi/examples.py,sha256=
|
120
|
+
schemathesis/specs/openapi/examples.py,sha256=Xvjp60QUcLaeGsJRbi2i6XM15_4uO0ceVoClIaJehiE,21062
|
121
121
|
schemathesis/specs/openapi/formats.py,sha256=ViVF3aFeFI1ctwGQbiRDXhU3so82P0BCaF2aDDbUUm8,2816
|
122
122
|
schemathesis/specs/openapi/media_types.py,sha256=ADedOaNWjbAtAekyaKmNj9fY6zBTeqcNqBEjN0EWNhI,1014
|
123
123
|
schemathesis/specs/openapi/parameters.py,sha256=hv1reNpSjVuzFbtMpSTwWZ75zcWTOy5ZE0ah6AVEqAo,14565
|
124
|
-
schemathesis/specs/openapi/patterns.py,sha256
|
124
|
+
schemathesis/specs/openapi/patterns.py,sha256=NLnGybcana_kYLVKVEjkEyAzdClAV0xKe4Oy4NVayMI,12834
|
125
125
|
schemathesis/specs/openapi/references.py,sha256=YjD1xMlaYS7xLt6PrrVS20R72ZWHuFZFTa8Llzf54Rg,8808
|
126
126
|
schemathesis/specs/openapi/schemas.py,sha256=VSeacEAVJJ6EKJ-llwOaX4aalzUTXyWP8s4wbxTqtWc,54720
|
127
127
|
schemathesis/specs/openapi/security.py,sha256=6UWYMhL-dPtkTineqqBFNKca1i4EuoTduw-EOLeE0aQ,7149
|
@@ -143,11 +143,11 @@ schemathesis/specs/openapi/stateful/links.py,sha256=8oHpmb-yBa3kZKoCv9ytndpOp80d
|
|
143
143
|
schemathesis/transport/__init__.py,sha256=z-mRNSOlMBKwQyaEIhpmYv0plWTmK5dJqc9UmQOry80,3949
|
144
144
|
schemathesis/transport/asgi.py,sha256=qTClt6oT_xUEWnRHokACN_uqCNNUZrRPT6YG0PjbElY,926
|
145
145
|
schemathesis/transport/prepare.py,sha256=qQ6zXBw5NN2AIM0bzLAc5Ryc3dmMb0R6xN14lnR49pU,3826
|
146
|
-
schemathesis/transport/requests.py,sha256=
|
146
|
+
schemathesis/transport/requests.py,sha256=j5wI1Uo_PnVuP1eV8l6ddsXosyxAPQ1mLSyWEZmTI9I,8747
|
147
147
|
schemathesis/transport/serialization.py,sha256=jIMra1LqRGav0OX3Hx7mvORt38ll4cd2DKit2D58FN0,10531
|
148
148
|
schemathesis/transport/wsgi.py,sha256=RWSuUXPrl91GxAy8a4jyNNozOWVMRBxKx_tljlWA_Lo,5697
|
149
|
-
schemathesis-4.0.
|
150
|
-
schemathesis-4.0.
|
151
|
-
schemathesis-4.0.
|
152
|
-
schemathesis-4.0.
|
153
|
-
schemathesis-4.0.
|
149
|
+
schemathesis-4.0.0a7.dist-info/METADATA,sha256=l_31cA1530vqN9M094EGpnFezX2Sk-YyJDq8_pSWcro,10427
|
150
|
+
schemathesis-4.0.0a7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
151
|
+
schemathesis-4.0.0a7.dist-info/entry_points.txt,sha256=hiK3un-xfgPdwj9uj16YVDtTNpO128bmk0U82SMv8ZQ,152
|
152
|
+
schemathesis-4.0.0a7.dist-info/licenses/LICENSE,sha256=2Ve4J8v5jMQAWrT7r1nf3bI8Vflk3rZVQefiF2zpxwg,1121
|
153
|
+
schemathesis-4.0.0a7.dist-info/RECORD,,
|
@@ -1,7 +1,7 @@
|
|
1
1
|
MIT License
|
2
2
|
|
3
3
|
Copyright (c) 2019 Kiwi.com
|
4
|
-
Copyright (c) 2020-
|
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
|
File without changes
|
File without changes
|