diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..8fc5e52 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,35 @@ +repos: + - repo: https://github.com/psf/black + rev: 20.8b1 + hooks: + - id: black + language_version: python3 + exclude: | + (?x)^( + versioneer\.py| + etuples/_version\.py| + doc/.*| + bin/.* + )$ + - repo: https://gitlab.com/pycqa/flake8 + rev: 3.8.4 + hooks: + - id: flake8 + exclude: | + (?x)^( + versioneer\.py| + etuples/_version\.py| + doc/.*| + bin/.* + )$ + - repo: https://github.com/pycqa/isort + rev: 5.5.2 + hooks: + - id: isort + exclude: | + (?x)^( + versioneer\.py| + etuples/_version\.py| + doc/.*| + bin/.* + )$ diff --git a/README.md b/README.md index 422ceb4..965edc6 100644 --- a/README.md +++ b/README.md @@ -133,11 +133,22 @@ Using `pip`: pip install etuples ``` -To install from source: +### Development + +First obtain the project source: ```bash git clone git@github.com:pythological/etuples.git -cd etuples -pip install -r requirements.txt +``` + +Create a virtual environment and install the development dependencies: +```bash +$ pip install -r requirements.txt +``` + +Set up `pre-commit` hooks: + +```bash +$ pre-commit install --install-hooks ``` Tests can be run with the provided `Makefile`: diff --git a/etuples/__init__.py b/etuples/__init__.py index 69bbf3a..b507301 100644 --- a/etuples/__init__.py +++ b/etuples/__init__.py @@ -1,7 +1,6 @@ -from .core import etuple -from .dispatch import etuplize, apply, rator, rands, term, operator, arguments - from ._version import get_versions +from .core import etuple +from .dispatch import apply, arguments, etuplize, operator, rands, rator, term __version__ = get_versions()["version"] del get_versions diff --git a/etuples/core.py b/etuples/core.py index 4bf1300..6c9f22e 100644 --- a/etuples/core.py +++ b/etuples/core.py @@ -1,9 +1,7 @@ import inspect import reprlib - from collections import deque -from collections.abc import Sequence, Generator - +from collections.abc import Generator, Sequence etuple_repr = reprlib.Repr() etuple_repr.maxstring = 100 @@ -256,7 +254,7 @@ def __repr__(self): def _repr_pretty_(self, p, cycle): if cycle: - p.text(f"e(...)") # pragma: no cover + p.text("e(...)") # pragma: no cover else: with p.group(2, "e(", ")"): p.breakable(sep="") diff --git a/etuples/dispatch.py b/etuples/dispatch.py index 3164ad2..e7e7a86 100644 --- a/etuples/dispatch.py +++ b/etuples/dispatch.py @@ -1,19 +1,18 @@ -from collections.abc import Callable, Sequence, Mapping - -from multipledispatch import dispatch +from collections.abc import Callable, Mapping, Sequence from cons.core import ConsError, ConsNull, ConsPair, car, cdr, cons +from multipledispatch import dispatch -from .core import etuple, ExpressionTuple, trampoline_eval, KwdPair +from .core import ExpressionTuple, KwdPair, etuple, trampoline_eval -try: - from packaging import version +try: # noqa: C901 import unification + from packaging import version if version.parse(unification.__version__) < version.parse("0.4.0"): raise ModuleNotFoundError() - from unification.core import _reify, _unify, isvar, construction_sentinel + from unification.core import _reify, _unify, construction_sentinel, isvar except ModuleNotFoundError: pass else: diff --git a/requirements.txt b/requirements.txt index 887d45b..29246c2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,5 @@ -e ./ logical-unification -ipython coveralls pydocstyle>=3.0.0 pytest>=5.0.0 @@ -10,3 +9,6 @@ pylint>=2.3.1 black>=19.3b0; platform.python_implementation!='PyPy' diff-cover versioneer +isort +coverage>=5.1 +pre-commit diff --git a/setup.cfg b/setup.cfg index e3f7b27..75bb4b5 100644 --- a/setup.cfg +++ b/setup.cfg @@ -29,4 +29,24 @@ exclude_lines = raise NotImplementedError if __name__ == .__main__.: assert False - ModuleNotFoundError \ No newline at end of file + ModuleNotFoundError + +[isort] +multi_line_output = 3 +include_trailing_comma = True +force_grid_wrap = 0 +use_parentheses = True +ensure_newline_before_comments = True +line_length = 88 + +[flake8] +max-line-length = 88 +extend-ignore = E203, W503 +per-file-ignores = + **/__init__.py:F401,E402,F403 + +[pylint] +max-line-length = 88 + +[pylint.messages_control] +disable = C0330, C0326 \ No newline at end of file diff --git a/setup.py b/setup.py index 3d0e3e0..44bb262 100644 --- a/setup.py +++ b/setup.py @@ -1,9 +1,10 @@ #!/usr/bin/env python -import versioneer - from os.path import exists + from setuptools import setup +import versioneer + setup( name="etuples", version=versioneer.get_version(), @@ -13,7 +14,10 @@ maintainer="Brandon T. Willard", maintainer_email="brandonwillard+etuples@gmail.com", packages=["etuples"], - install_requires=["cons", "multipledispatch",], + install_requires=[ + "cons", + "multipledispatch", + ], long_description=open("README.md").read() if exists("README.md") else "", long_description_content_type="text/markdown", python_requires=">=3.6", diff --git a/tests/test_core.py b/tests/test_core.py index 5ea1126..5a592a7 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -1,10 +1,9 @@ import sys +from operator import add import pytest -from operator import add - -from etuples.core import ExpressionTuple, etuple, KwdPair, InvalidExpression +from etuples.core import ExpressionTuple, InvalidExpression, KwdPair, etuple def test_ExpressionTuple(capsys): @@ -194,7 +193,7 @@ def test_pprint(): et = etuple(1, etuple("a", *range(20)), etuple(3, "b"), blah=etuple("c", 0)) assert ( pretty_mod.pretty(et) - == "e(\n 1,\n e('a', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19),\n e(3, 'b'),\n blah=e(c, 0))" + == "e(\n 1,\n e('a', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19),\n e(3, 'b'),\n blah=e(c, 0))" # noqa: E501 ) diff --git a/tests/test_dispatch.py b/tests/test_dispatch.py index e1b7744..5ebdbee 100644 --- a/tests/test_dispatch.py +++ b/tests/test_dispatch.py @@ -1,10 +1,10 @@ -from pytest import raises, importorskip - -from operator import add from collections.abc import Sequence +from operator import add + +from pytest import importorskip, raises -from etuples.core import ExpressionTuple, etuple, KwdPair -from etuples.dispatch import apply, rator, rands, etuplize +from etuples.core import ExpressionTuple, KwdPair, etuple +from etuples.dispatch import apply, etuplize, rands, rator class Node: @@ -113,11 +113,15 @@ def test_unification(): assert isinstance(res, ExpressionTuple) assert res == etuple(add, 1, 2) - et = etuple(a_lv,) + et = etuple( + a_lv, + ) res = reify(et, {a_lv: 1}) assert isinstance(res, ExpressionTuple) - et = etuple(a_lv,) + et = etuple( + a_lv, + ) # We choose to allow unification with regular tuples. if etuple(1) == (1,): res = unify(et, (1,))