A Python library for design by contract (DbC) and checking values, exceptions, and side-effects. In a nutshell, deal empowers you to write bug-free code. By adding a few decorators to your code, you get for free tests, static analysis, formal verification, and much more. Read intro to get started.
Features
- Classic DbC: precondition, postcondition, invariant.
- Tracking exceptions and side-effects.
- Property-based testing.
- Static checker.
- Integration with pytest, flake8, sphinx, and hypothesis.
- Type annotations support.
- External validators support.
- Contracts for importing modules.
- Can be enabled or disabled on production.
- Colorless: annotate only what you want. Hence, easy integration into an existing project.
- Colorful: syntax highlighting for every piece of code in every command.
- Memory leaks detection: deal makes sure that pure functions don't leave unexpected objects in the memory.
- DRY: test discovery, error messages generation.
- Partial execution: linter executes contracts to statically check possible values.
- Formal verification: prove that your code works for all input (or find out when it doesn't).
- Zero-dependency runtime: there are some dependencies for analysis tools, but nothing of it is required on the production.
- Fast: each code change is benchmarked and profiled.
- Reliable: the library has 100% test coverage, partially verified, and runs on production by multiple companies since 2018.
Deal in 30 seconds
# the result is always non-negative
@deal.post(lambda result: result >= 0)
# the function has no side-effects
@deal.pure
def count(items: List[str], item: str) -> int:
return items.count(item)
# generate test function
test_count = deal.cases(count)
Now we can:
- Run
python3 -m deal lintorflake8to statically check errors. - Run
python3 -m deal testorpytestto generate and run tests. - Just use the function in the project and check errors in runtime.
Read more in the documentation.
Installation
python3 -m pip install --user 'deal[all]'
Contributing
Contributions are welcome! A few ideas what you can contribute:
- Add new checks for the linter.
- Improve documentation.
- Add more tests.
- Improve performance.
- Found a bug? Fix it!
- Made an article about deal? Great! Let's add it into the
README.md. - Don't have time to code? No worries! Just tell your friends and subscribers about the project. More users -> more contributors -> more cool features.
To run tests locally, all you need is task. Run task all to run all code formatters, linters, and tests.
Thank you :heart:
Release files for deal 4.24.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| deal-4.24.6.tar.gz | 723.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| deal-4.24.6-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 927.8 kB
Release files / deal-4.24.6.tar.gz
| Download URL | deal-4.24.6.tar.gz |
|---|---|
| Size | 723.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1cf4d4bbcb2e84767535e066d3888d2809662d7356dee420331380ff94210a1d
|
|
BLAKE2b-256 checksum How to use checksums |
c1da76d4c3898ed8901116c8ad9dc1e5babd466e50289ce3808de55f72760d0f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
python-requests/2.32.3
|
Release files / deal-4.24.6-py3-none-any.whl
| Download URL | deal-4.24.6-py3-none-any.whl |
|---|---|
| Size | 204.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
44afc0b11df6be5a4edd81409c7cd02ab0188ad9e90e93a71b4ef3d46d04c546
|
|
BLAKE2b-256 checksum How to use checksums |
714d2a940ef9caa02bb3d6ca2a78ecbcaf158e98da972a54bc3fd8f29f7d86a9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
python-requests/2.32.3
|