In what follows python is an alias for python3.7 or pypy3.7
or any later version (python3.8, pypy3.8 and so on).
Install the latest pip & setuptools packages versions
python -m pip install --upgrade pip setuptoolsDownload and install the latest stable version from PyPI repository
python -m pip install --upgrade repritDownload the latest version from GitHub repository
git clone https://github.com/lycantropos/reprit.git
cd repritInstall
python setup.py installLet's suppose we are defining a class and we want to have __repr__, that:
- Includes parameters involved in instance creation. For simple cases it should be possible to copy string & paste in some place (e.g. REPL session) and have similar object definition with as less work as possible. This helps a lot during debugging, logging, in failed test cases with randomly generated data, etc.
- In case of signature change method should handle this automatically for simple cases like renaming/removing/changing order of parameters.
This can be done like
>>> from reprit.base import generate_repr
>>> class DummyContainer:
... def __init__(self, positional, *variadic_positional, keyword_only, **variadic_keyword):
... self.positional = positional
... self.variadic_positional = variadic_positional
... self.keyword_only = keyword_only
... self.variadic_keyword = variadic_keyword
...
... __repr__ = generate_repr(__init__)after that
>>> DummyContainer(range(10), 2, 3, keyword_only='some', a={'sample': 42})
DummyContainer(range(0, 10), 2, 3, keyword_only='some', a={'sample': 42})or for a class with avoidance of built-in names clash & private'ish attributes & both
>>> from reprit import seekers
>>> from reprit.base import generate_repr
>>> class State:
... def __init__(self, id_, name, zip_):
... self.id = id_
... self._name = name
... self._zip = zip_
...
... __repr__ = generate_repr(__init__,
... field_seeker=seekers.complex_)after that
>>> State(1, 'Alabama', 36016)
State(1, 'Alabama', 36016)We can also tell to skip unspecified optional parameters
>>> from reprit.base import generate_repr
>>> class Employee:
... def __init__(self, name, email=None, manager=None):
... self.name = name
... self.email = email
... self.manager = manager
...
... __repr__ = generate_repr(__init__,
... skip_defaults=True)After that
>>> Employee('John Doe')
Employee('John Doe')
>>> Employee('John Doe',
... manager=Employee('Jane Doe'))
Employee('John Doe', manager=Employee('Jane Doe'))
>>> Employee('John Doe', 'johndoe@company.com', Employee('Jane Doe'))
Employee('John Doe', 'johndoe@company.com', Employee('Jane Doe'))Note: this method doesn't automatically handle changes during runtime
(e.g. if someone deletes instance field
or replaces __init__/__new__ method implementation),
in this case user should update __repr__ method as well.
Install bump2version.
Choose which version number category to bump following semver specification.
Test bumping version
bump2version --dry-run --verbose $CATEGORYwhere $CATEGORY is the target version number category name, possible
values are patch/minor/major.
Bump version
bump2version --verbose $CATEGORYThis will set version to major.minor.patch-alpha.
Test bumping version
bump2version --dry-run --verbose releaseBump version
bump2version --verbose releaseThis will set version to major.minor.patch.
Install dependencies
python -m pip install -r requirements-tests.txtPlain
pytestInside Docker container:
- with
CPythondocker-compose --file docker-compose.cpython.yml up
- with
PyPydocker-compose --file docker-compose.pypy.yml up
Bash script:
-
with
CPython./run-tests.sh
or
./run-tests.sh cpython
-
with
PyPy./run-tests.sh pypy
PowerShell script:
- with
CPythonor.\run-tests.ps1.\run-tests.ps1 cpython - with
PyPy.\run-tests.ps1 pypy