diff --git a/.importlinter b/.importlinter new file mode 100644 index 0000000..b25b736 --- /dev/null +++ b/.importlinter @@ -0,0 +1,13 @@ +[importlinter] +root_package = impulse + +[importlinter:contract:layers] +name = Layered architecture +type = layers +containers = impulse +layers = + cli + adapters + application + ports + dotfile diff --git a/justfile b/justfile index 2495bbd..1764d38 100644 --- a/justfile +++ b/justfile @@ -55,6 +55,8 @@ lint: @uv run ruff check @echo Running mypy... @uv run mypy src/impulse tests + @echo Linting imports... + @uv run lint-imports @echo @echo '👍 {{GREEN}} Linting all good.{{NORMAL}}' diff --git a/pyproject.toml b/pyproject.toml index f70ff5c..a9286c4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -75,12 +75,9 @@ line_length = 99 warn_unused_ignores = true warn_redundant_casts = true - -[tool.uv.sources] -import-linter = { workspace = true } - [dependency-groups] dev = [ + "import-linter>=2.8", "mypy>=1.18.2", "pre-commit>=4.3.0", "pyupgrade>=3.21.0", diff --git a/uv.lock b/uv.lock index 6f9c525..65f736d 100644 --- a/uv.lock +++ b/uv.lock @@ -317,6 +317,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769, upload-time = "2022-07-01T12:21:02.467Z" }, ] +[[package]] +name = "import-linter" +version = "2.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "grimp" }, + { name = "rich" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/93/04844b8878cf08bc88ba3e2cea1c664449bc9695d29aa5d5357872b6aa4a/import_linter-2.8.tar.gz", hash = "sha256:02078bd7e00dafb65fa22d9ece73d52229d1114377e25122435ddec8b6c22156", size = 286931, upload-time = "2025-12-08T14:10:41.586Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/b6/1f7b7e85e7c96c4d8f351c353fce9635f1de7fea7a2fe8aaf2124fe3ca43/import_linter-2.8-py3-none-any.whl", hash = "sha256:9f75fe4f624471807299ba1365652e06c36fe91ffd6b188b84f7d75aaa711fa7", size = 44900, upload-time = "2025-12-08T14:10:39.737Z" }, +] + [[package]] name = "impulse" version = "2.2" @@ -329,6 +345,7 @@ dependencies = [ [package.dev-dependencies] dev = [ + { name = "import-linter" }, { name = "mypy" }, { name = "pre-commit" }, { name = "pyupgrade" }, @@ -349,6 +366,7 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ + { name = "import-linter", specifier = ">=2.8" }, { name = "mypy", specifier = ">=1.18.2" }, { name = "pre-commit", specifier = ">=4.3.0" }, { name = "pyupgrade", specifier = ">=3.21.0" }, @@ -380,6 +398,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, ] +[[package]] +name = "markdown-it-py" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, +] + [[package]] name = "markupsafe" version = "3.0.3" @@ -465,6 +495,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, ] +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + [[package]] name = "mypy" version = "1.18.2" @@ -698,6 +737,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, ] +[[package]] +name = "rich" +version = "14.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fb/d2/8920e102050a0de7bfabeb4c4614a49248cf8d5d7a8d01885fbb24dc767a/rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4", size = 219990, upload-time = "2025-10-09T14:16:53.064Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/7a/b0178788f8dc6cafce37a212c99565fa1fe7872c70c6c9c1e1a372d9d88f/rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd", size = 243393, upload-time = "2025-10-09T14:16:51.245Z" }, +] + [[package]] name = "roman-numerals-py" version = "3.1.0"