Commit graph

23 commits

Author SHA1 Message Date
81912f1a81
Make linters check for unused function arguments 2024-10-16 11:23:54 +02:00
25c718fe6a
Make Python 3.13 the new default 2024-10-16 01:32:14 +02:00
153094eef5
Add Q, R, C, and GF2 fields
- add `lalib.fields.base.Field`, a blueprint for all concrete fields,
  providing a unified interface to be used outside of the
  `lalib.fields` sub-package
- implement `lalib.fields.complex_.ComplexField`, or `C` for short,
  the field over the complex numbers (modeled as `complex` numbers)
- implement `lalib.fields.galois.GaloisField2`, or `GF2` for short,
  the (finite) field over the two elements `one` and `zero`
  + adapt `lalib.elements.galois.GF2Element.__eq__()` to return
    `NotImplemented` instead of `False` for non-castable `other`s
    => this fixes a minor issue with `pytest.approx()`
- implement `lalib.fields.rational.RationalField`, or `Q` for short,
  the field over the rational numbers (modeled as `fractions.Fraction`s)
- implement `lalib.fields.real.RealField`, or `R` for short,
  the field over the real numbers (modeled as `float`s)
- organize top-level imports for `lalib.fields`,
  making `Q`, `R`, `C`, and `GF2` importable with
  `from lalib.fields import *`
- provide extensive unit and integration tests for the new objects:
  + test generic and common behavior in `tests.fields.test_base`
  + test specific behavior is other modules
  + test the well-known math axioms for all fields (integration tests)
  + test the new objects' docstrings
  + add "pytest-repeat" to run randomized tests many times
2024-10-14 15:17:42 +02:00
3d9f990c68
Reset random.seed() before every test case 2024-09-27 16:04:37 +02:00
4c0c7887e5
Allow and unify the usage of TODOs 2024-09-27 15:29:33 +02:00
3cecf0d989
Add GF2 type for Galois field elements
- add `GF2` class in the `lalib.elements` sub-package
  implementing a typical Galois field with two elements
- the singleton objects `one` and `zero` are the concrete
  instances of the `GF2` type for the end users
- besides the typical Galois arithmetic, `one` and `zero`
  behave like the built-in numbers `1` and `0`
  and implement the `numbers.Rational` interface
- add exhaustive docstrings with usage examples
- add (unit) test cases with 100% coverage
2024-09-18 18:04:35 +02:00
d405c22c90
Enforce PEP257 strictly ...
... and put docstrings for class constructors
into `.__init__()` methods

Source: https://peps.python.org/pep-0257/#multi-line-docstrings
2024-09-18 15:17:53 +02:00
d9dcea8379
Do not allow mere "pragma: no cover"s 2024-09-18 15:15:24 +02:00
9083cebe18
Fix missing empty line ...
... to make overview on sections clearer
2024-09-18 15:08:19 +02:00
5d2f430893
Bump version 2024-09-10 03:55:36 +02:00
fbc9b5f134
Prepare release v0.4.2 2024-09-10 03:39:30 +02:00
0b5cc56925
Drop nox-poetry support
Whereas nox-poetry is a nice project,
it is not (yet) widely supported.

The `install_pinned()` function inside the "noxfile.py"
achieves most of its functionality.

Also, there is a chance poetry will be replaced in this project.

So, we no longer drag nox-poetry along.
2024-09-10 03:28:17 +02:00
b92d871acf
Integrate readthedocs.io
We publish the docs to readthedocs.io
2024-09-10 03:12:22 +02:00
3f8b5cb146
Integrate codecov.io
We publish the test coverage reporting to codecov.io
2024-09-10 03:10:26 +02:00
7a5246556a
Set up pre-commit hooks
- add pre-commit hooks:
  + run `nox -s lint` on staged *.py files
  + run common pre-commit hooks for validations that could not be
    achieved with tools in the develop environment so easily
- add pre-merge hook:
  + run `nox -s _pre-commit-test-hook` before merges
    * ignores the paths to staged files
      passed in by the pre-commit framework
    * runs all test cases instead
2024-09-10 02:32:56 +02:00
c07a9ed19f
Set up a documentation tool
- use sphinx to document the developed package
- create nox session "docs" to build the docs
2024-09-10 02:09:09 +02:00
6945cdef0a
Add coverage reporting to the test suite
- the nox session "test-coverage" triggers further nox sessions
  that run the test suite for all supported Python versions
- the nox session "_test-coverage-run" runs the test suite for
  a particular Python version using the coverage tool
- the nox session "_test-coverage-report" combines the individual
  coverage reports
2024-09-10 02:01:23 +02:00
01d270e39c
Add doctests to the test suite
- use xdoctest to validate code snippets in docstrings
- make xdoctest part of the nox session "test" via
  the new `test_docstrings()` test case
- add nox session "test-docstrings" for convenience;
  also, `xdoctest.doctest_module()` does not discover
  docstrings that are imported at the root of the package
  => each new module with docstrings must be added to
     `test_docstrings()` by hand, which is likely forgotten
  => the nox session "test-docstrings" should run on CI
2024-09-10 01:57:02 +02:00
4100a7f3f5
Add __version__ identifier
- `lalib.__version__` is dynamically assigned
- the format is "x.y.z[.dev0|aN|bN|rcN|.postM]"
  where x, y, z, M, and N are non-negative integers
  + x, y, and z model the "major", "minor", and "patch"
    parts of semantic versioning
    (See: https://semver.org/#semantic-versioning-200)
  + M is a single digit and N either 1 or 2
  => This complies with (a strict subset of) PEP440
- add unit tests for the `__version__` identifier
2024-09-10 01:45:47 +02:00
b8ceee39c5
Set up a test suite
- use pytest as the test suite and
  measure test coverage with coverage.py
- add package for the test suite under tests/
- add nox session "test" to run the test suite
  for all supported Python versions
- use flake8 to lint pytest for consistent style
2024-09-10 01:38:26 +02:00
ecf1420742
Set up code linting tools
- use flake8 as the main linting tool with the following plug-ins:
  + flake8-annotations
  + flake8-bandit
  + flake8-black
  + flake8-broken-line
  + flake8-bugbear
  + flake8-commas
  + flake8-comprehensions
  + flake8-debugger
  + flake8-docstrings
  + flake8-eradicate
  + flake8-isort
  + flake8-quotes
  + flake8-string-format
  + flake8-pyproject
  + pep8-naming
  + pydoclint
- use mypy for static type checking
- use ruff for linting for future compatibility
- add nox session "lint" to run these tools
- add `ruff check --fix ...` in nox session "format"
- lint all source files => no errors found
2024-09-10 01:33:54 +02:00
fb407631d9
Set up code formatting tools
- auto-format code with:
  + autoflake => * remove unused imports and variables
                 * remove duplicate dict keys
                 * expand star imports
  + black => enforce an uncompromising code style
  + isort => enforce a consistent import style
             compliant with Google's Python style guide
- add nox session "format" to run these tools
2024-09-10 01:27:34 +02:00
e832333ed9
Initialize the project
- describe how a local develop environment can be set up
- we use poetry to manage the project
  => add pyproject.toml and poetry.lock files
- add a package for the source code
  => "src" layout structure to ensure that pytest runs the tests
     against a packaged version installed in a virtual environment
     and not the *.py files in the project directory
     (Source: https://hynek.me/articles/testing-packaging/)
- ignore poetry's artifacts in git
2024-09-10 01:15:36 +02:00