Support for requirements-assisted development
Project description
Decorate an instance method with pre- and/or postconditions that must be fulfilled
Example usage
from requiresthat import requires, RequirementNotFulfilledError, APRIORI, POSTMORTEM, BEFOREANDAFTER
class C:
def __init__(self, data=None):
self.data = data
@requires(that='self.data is not None')
@requires(that='self.data == "spam"', when=APRIORI)
@requires(that='True is not False')
@requires(that='self.data != "spam"', when=POSTMORTEM)
@requires(that='len(self.data) >= 3', when=BEFOREANDAFTER)
def method(self):
self.data = 'ham'
X = C(data='spam')
X.method()
See the tests for more.
The that can be almost any valid Python statement which can be evaluated and whose veracity can be asserted, and the result thereof will decide whether or not the method fires/will be considered a success. Then details should be observed here.
The parameter when decides if the condition is a-priori, post-mortem, or before-and-after. The default is a-priori, meaning a precondition. Note that before-and-after does not mean during; you cannot mandate an invariant this way!
RequirementNotFulfilledError is the exception you have to deal with in case a condition is not met. NoCallableConstructError gets raised should you apply the decorator to a construct that is not callable. Both of these derive from the base class RequirementError.
Installation
The project is on PyPI, so simply run
python -m pip install requiresthat
If you want to cook it on your own, do this:
git clone https://gitlab.com/bedhanger/mwe.git
cd mwe/python/requiresthat
python -m venv --system-site-packages venv
source venv/bin/activate
python -m build
python -m pip install .
deactivate
It is recommended to carry out the build and install steps in a venv. This is shown in an exemplary manner in the snipped above that deals with building from scratch.
Running the tests
Build the package from scratch like shown above, but do not leave the venv (i.e., don’t call deactivate). Then
python -m pytest --verbose
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file requiresthat-2025.6.28.0.tar.gz.
File metadata
- Download URL: requiresthat-2025.6.28.0.tar.gz
- Upload date:
- Size: 4.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
354738716d4a479891716a914706279c0009a15aa59cb55e977bc2ecd3ec4988
|
|
| MD5 |
8c5834afcae6b243a8ea34f44e54eb78
|
|
| BLAKE2b-256 |
19052aa27aa15cd04ccf348d7a83bff5d82f790386195348db8647c02e6f7cbd
|
File details
Details for the file requiresthat-2025.6.28.0-py3-none-any.whl.
File metadata
- Download URL: requiresthat-2025.6.28.0-py3-none-any.whl
- Upload date:
- Size: 5.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
151d9052d166e50f24f0053b1622fb1c796156a5180e5040fcfb8418099db2c1
|
|
| MD5 |
a134b2f673a227c173fcd173c94a7952
|
|
| BLAKE2b-256 |
3674f9fb263954c06c7baa40fd492c1d9c41b45a96a2aea912166783f63fc253
|