From 653ff9193183402e93a65199c732c79e31c3be76 Mon Sep 17 00:00:00 2001 From: Max R Date: Thu, 11 Jun 2026 10:56:54 -0400 Subject: [PATCH 01/14] Migrate setup.cfg to pyproject.toml --- .pre-commit-config.yaml | 7 ----- pyproject.toml | 65 ++++++++++++++++++++++++++++++++++++++++ setup.cfg | 66 ----------------------------------------- setup.py | 5 ---- 4 files changed, 65 insertions(+), 78 deletions(-) delete mode 100644 setup.cfg delete mode 100644 setup.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 22d2e81..8778e1f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -46,17 +46,10 @@ repos: hooks: - id: mypy additional_dependencies: - - aiohttp>=3 - - aiopathlib - - aiosqlite - - asyncio-for-ynab~=1.84.0 - coverage - - fasteners - pytest - pytest-asyncio - - rich>=10 - setuptools - - tenacity language_version: python3.12 - repo: https://github.com/mxr/sync-typing-deps rev: ac01d4cdd568460783aebd40cfafab4cbba822c5 # frozen: v0.3.0 diff --git a/pyproject.toml b/pyproject.toml index 9a6de74..91ba2a3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,6 +2,49 @@ build-backend = "setuptools.build_meta" requires = ["setuptools"] +[project] +authors = [{name = "Max R", email = "maxr@outlook.com"}] +classifiers = [ + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: Implementation :: CPython", + "Programming Language :: Python :: Implementation :: PyPy", +] +dependencies = [ + "aiohttp>=3", + "aiopathlib", + "aiosqlite", + "asyncio-for-ynab~=1.84.0", + "fasteners", + "rich>=10", + "tenacity", +] +description = "SQLite Export for YNAB - Export YNAB Data to SQLite" +keywords = ["ynab", "sqlite", "sql", "budget", "plan", "cli"] +license = "MIT" +license-files = ["LICENSE"] +name = "sqlite_export_for_ynab" +readme = "README.md" +requires-python = ">=3.12" +version = "2.9.0" + +[project.optional-dependencies] +dev = [ + "covdefaults>=2.1.0", + "coverage", + "pytest", + "pytest-asyncio", +] + +[project.scripts] +sqlite-export-for-ynab = "sqlite_export_for_ynab._main:main" + +[project.urls] +Homepage = "https://github.com/mxr/sqlite-export-for-ynab" + +[tool.coverage.run] +plugins = ["covdefaults"] + [tool.mypy] check_untyped_defs = true disallow_any_generics = true @@ -34,6 +77,12 @@ extend-select = [ "TC", # see flake8-type-checking ] +[tool.setuptools.package-data] +"*" = ["*.sql"] +sqlite_export_for_ynab = ["py.typed"] + +[tool.setuptools.packages.find] + [tool.sqlfluff.layout.type.comma] line_position = "leading" spacing_before = "touch" @@ -65,3 +114,19 @@ require_final_semicolon = true [tool.sqlfluff.rules.references.quoting] prefer_quoted_keywords = true + +[tool.tox] +env_list = ["py", "pypy3", "pre-commit"] + +[tool.tox.env.pre-commit] +commands = [["pre-commit", "run", "--all-files", "--show-diff-on-failure"]] +deps = ["pre-commit-uv"] +skip_install = true + +[tool.tox.env_run_base] +commands = [ + ["coverage", "erase"], + ["coverage", "run", "-m", "pytest", "{posargs:tests}"], + ["coverage", "report"], +] +extras = ["dev"] diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index b2155d8..0000000 --- a/setup.cfg +++ /dev/null @@ -1,66 +0,0 @@ -[metadata] -name = sqlite_export_for_ynab -version = 2.9.0 -description = SQLite Export for YNAB - Export YNAB Data to SQLite -long_description = file: README.md -long_description_content_type = text/markdown -url = https://github.com/mxr/sqlite-export-for-ynab -author = Max R -author_email = maxr@outlook.com -license = MIT -license_files = LICENSE -classifiers = - Programming Language :: Python :: 3 - Programming Language :: Python :: 3 :: Only - Programming Language :: Python :: Implementation :: CPython - Programming Language :: Python :: Implementation :: PyPy -keywords = ynab, sqlite, sql, budget, plan, cli - -[options] -packages = find: -install_requires = - aiohttp>=3 - aiopathlib - aiosqlite - asyncio-for-ynab~=1.84.0 - fasteners - rich>=10 - tenacity -python_requires = >=3.12 - -[options.entry_points] -console_scripts = - sqlite-export-for-ynab = sqlite_export_for_ynab._main:main - -[options.extras_require] -dev = - covdefaults>=2.1.0 - coverage - pytest - pytest-asyncio - -[options.package_data] -* = *.sql -sqlite_export_for_ynab = - py.typed - -[bdist_wheel] -universal = True - -[coverage:run] -plugins = covdefaults - -[tox:tox] -envlist = py,pypy3,pre-commit - -[testenv] -extras = dev -commands = - coverage erase - coverage run -m pytest {posargs:tests} - coverage report - -[testenv:pre-commit] -skip_install = true -deps = pre-commit-uv -commands = pre-commit run --all-files --show-diff-on-failure diff --git a/setup.py b/setup.py deleted file mode 100644 index a03590f..0000000 --- a/setup.py +++ /dev/null @@ -1,5 +0,0 @@ -from __future__ import annotations - -from setuptools import setup - -setup() From 8409f7dced04c2add229713c4abe2588e7d84743 Mon Sep 17 00:00:00 2001 From: Max R Date: Thu, 11 Jun 2026 10:57:17 -0400 Subject: [PATCH 02/14] Remove setup-cfg-fmt pre-commit hook --- .pre-commit-config.yaml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8778e1f..98c51b2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -13,11 +13,6 @@ repos: args: [--autofix, --trailing-commas] - id: pretty-format-yaml args: [--autofix] -- repo: https://github.com/asottile/setup-cfg-fmt - rev: 9339507e9522e953c07479c9f6abeec0f2fe4e12 # frozen: v3.2.0 - hooks: - - id: setup-cfg-fmt - args: [--min-py-version, '3.12'] - repo: https://github.com/asottile/reorder-python-imports rev: 7885866bd38c852b5e042c4aeef0285d715ffeee # frozen: v3.16.0 hooks: From ea307ad39f880795817e221d55a470be332e77d8 Mon Sep 17 00:00:00 2001 From: Max R Date: Thu, 11 Jun 2026 10:57:33 -0400 Subject: [PATCH 03/14] Update author email to noreply GitHub address --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 91ba2a3..fbd80c8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ build-backend = "setuptools.build_meta" requires = ["setuptools"] [project] -authors = [{name = "Max R", email = "maxr@outlook.com"}] +authors = [{name = "Max R", email = "mxr@users.noreply.github.com"}] classifiers = [ "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", From 8d314d5ccd2280441ea5c492cff6aa4a80741968 Mon Sep 17 00:00:00 2001 From: Max R Date: Thu, 11 Jun 2026 11:05:35 -0400 Subject: [PATCH 04/14] Use dependency-groups instead of optional-dependencies for dev deps --- .pre-commit-config.yaml | 4 ++++ pyproject.toml | 18 +++++++++--------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 98c51b2..133e800 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -46,6 +46,10 @@ repos: - pytest-asyncio - setuptools language_version: python3.12 +- repo: https://github.com/astral-sh/ty-pre-commit + rev: a71646c845a122391e3ce3a43502fcf4003d1efa # frozen: v0.0.48 + hooks: + - id: ty - repo: https://github.com/mxr/sync-typing-deps rev: ac01d4cdd568460783aebd40cfafab4cbba822c5 # frozen: v0.3.0 hooks: diff --git a/pyproject.toml b/pyproject.toml index fbd80c8..3bf7023 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,6 +2,14 @@ build-backend = "setuptools.build_meta" requires = ["setuptools"] +[dependency-groups] +dev = [ + "covdefaults>=2.1.0", + "coverage", + "pytest", + "pytest-asyncio", +] + [project] authors = [{name = "Max R", email = "mxr@users.noreply.github.com"}] classifiers = [ @@ -28,14 +36,6 @@ readme = "README.md" requires-python = ">=3.12" version = "2.9.0" -[project.optional-dependencies] -dev = [ - "covdefaults>=2.1.0", - "coverage", - "pytest", - "pytest-asyncio", -] - [project.scripts] sqlite-export-for-ynab = "sqlite_export_for_ynab._main:main" @@ -129,4 +129,4 @@ commands = [ ["coverage", "run", "-m", "pytest", "{posargs:tests}"], ["coverage", "report"], ] -extras = ["dev"] +dependency_groups = ["dev"] From 2e5f900457707020dd2d9eb1c811d562231e24ea Mon Sep 17 00:00:00 2001 From: Max R Date: Thu, 11 Jun 2026 11:41:20 -0400 Subject: [PATCH 05/14] update --- .pre-commit-config.yaml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 133e800..7f513c7 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -41,17 +41,24 @@ repos: hooks: - id: mypy additional_dependencies: + - aiohttp>=3 + - aiopathlib + - aiosqlite + - asyncio-for-ynab~=1.84.0 - coverage + - fasteners - pytest - pytest-asyncio + - rich>=10 - setuptools + - tenacity language_version: python3.12 - repo: https://github.com/astral-sh/ty-pre-commit rev: a71646c845a122391e3ce3a43502fcf4003d1efa # frozen: v0.0.48 hooks: - id: ty - repo: https://github.com/mxr/sync-typing-deps - rev: ac01d4cdd568460783aebd40cfafab4cbba822c5 # frozen: v0.3.0 + rev: 8e97e35c846b35976c59b973cd40690152b3c716 # frozen: v0.4.0 hooks: - id: sync-typing-deps - repo: https://github.com/zizmorcore/zizmor-pre-commit From 7034fc45484fcc0a4a817c0e3a3842df5df19a25 Mon Sep 17 00:00:00 2001 From: Max R Date: Thu, 11 Jun 2026 12:04:11 -0400 Subject: [PATCH 06/14] Update pyproject.toml --- pyproject.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 3bf7023..c94f0f5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -81,7 +81,8 @@ extend-select = [ "*" = ["*.sql"] sqlite_export_for_ynab = ["py.typed"] -[tool.setuptools.packages.find] +[tool.setuptools.packages] +find = {} [tool.sqlfluff.layout.type.comma] line_position = "leading" From 3bc7074cf2694bbfb2e7c0bee1ae62ae53b148a2 Mon Sep 17 00:00:00 2001 From: Max R Date: Thu, 11 Jun 2026 20:41:55 -0400 Subject: [PATCH 07/14] test --- tests/_main_test.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/_main_test.py b/tests/_main_test.py index 7782a08..b6cea48 100644 --- a/tests/_main_test.py +++ b/tests/_main_test.py @@ -1,6 +1,5 @@ from __future__ import annotations -from configparser import ConfigParser from pathlib import Path from unittest.mock import AsyncMock from unittest.mock import Mock @@ -875,9 +874,11 @@ async def test_async_main_parses_full_refresh_and_quiet(sync, tmp_path, monkeypa def test_main_version(capsys): - cp = ConfigParser() - cp.read(Path(__file__).parent.parent / "setup.cfg") - expected_version = cp["metadata"]["version"] + import tomllib + + with open(Path(__file__).parent.parent / "pyproject.toml", "rb") as f: + data = tomllib.load(f) + expected_version = data["project"]["version"] with pytest.raises(SystemExit) as excinfo: main(("--version",)) From f5ab88462d1686fbb3dec7a55cf57f74f9229051 Mon Sep 17 00:00:00 2001 From: Max R Date: Thu, 11 Jun 2026 21:21:25 -0400 Subject: [PATCH 08/14] isolated --- .pre-commit-config.yaml | 1 + tests/_main_test.py | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7f513c7..57390b7 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -57,6 +57,7 @@ repos: rev: a71646c845a122391e3ce3a43502fcf4003d1efa # frozen: v0.0.48 hooks: - id: ty + args: [--isolated] - repo: https://github.com/mxr/sync-typing-deps rev: 8e97e35c846b35976c59b973cd40690152b3c716 # frozen: v0.4.0 hooks: diff --git a/tests/_main_test.py b/tests/_main_test.py index b6cea48..19b1f44 100644 --- a/tests/_main_test.py +++ b/tests/_main_test.py @@ -1,5 +1,6 @@ from __future__ import annotations +import tomllib from pathlib import Path from unittest.mock import AsyncMock from unittest.mock import Mock @@ -874,8 +875,6 @@ async def test_async_main_parses_full_refresh_and_quiet(sync, tmp_path, monkeypa def test_main_version(capsys): - import tomllib - with open(Path(__file__).parent.parent / "pyproject.toml", "rb") as f: data = tomllib.load(f) expected_version = data["project"]["version"] From ae60f6bef8c2a94d739235f3014c8a4d6dc5bc2e Mon Sep 17 00:00:00 2001 From: Max R Date: Thu, 11 Jun 2026 21:36:23 -0400 Subject: [PATCH 09/14] noproject --- .pre-commit-config.yaml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 57390b7..fb1f6ce 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -57,7 +57,19 @@ repos: rev: a71646c845a122391e3ce3a43502fcf4003d1efa # frozen: v0.0.48 hooks: - id: ty - args: [--isolated] + args: [--no-project] + additional_dependencies: + - aiohttp>=3 + - aiopathlib + - aiosqlite + - asyncio-for-ynab~=1.84.0 + - coverage + - fasteners + - pytest + - pytest-asyncio + - rich>=10 + - setuptools + - tenacity - repo: https://github.com/mxr/sync-typing-deps rev: 8e97e35c846b35976c59b973cd40690152b3c716 # frozen: v0.4.0 hooks: From 48fa0f5b0c3ed7f7df82cb342204af51d60af11e Mon Sep 17 00:00:00 2001 From: Max R Date: Thu, 11 Jun 2026 21:38:32 -0400 Subject: [PATCH 10/14] bump --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index fb1f6ce..af58f99 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -19,7 +19,7 @@ repos: - id: reorder-python-imports args: [--py312-plus, --add-import, from __future__ import annotations] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: 22f0422809455ec89ffdcf5a00170ba816e42ddb # frozen: v0.15.16 + rev: 3b3f7c3f57fe9925356faf5fe6230835138be230 # frozen: v0.15.17 hooks: - id: ruff-check args: [--fix] From 26fecfb7d8a248802e649377aecec3eb69226a6a Mon Sep 17 00:00:00 2001 From: Max R Date: Thu, 11 Jun 2026 21:42:47 -0400 Subject: [PATCH 11/14] ty --- .pre-commit-config.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index af58f99..be236d5 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -59,6 +59,7 @@ repos: - id: ty args: [--no-project] additional_dependencies: + - ty - aiohttp>=3 - aiopathlib - aiosqlite From b81d7f16721020d1e7b67251a64918438f0e863b Mon Sep 17 00:00:00 2001 From: Max R Date: Thu, 11 Jun 2026 21:45:18 -0400 Subject: [PATCH 12/14] fix --- .pre-commit-config.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index be236d5..ab4832a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -58,8 +58,10 @@ repos: hooks: - id: ty args: [--no-project] + # vendored from https://github.com/astral-sh/ty-pre-commit/blob/4de226aa36d17b50c9f4c5773453662bc338f774/.pre-commit-hooks.yaml#L4 but altered to remove the --ty-version to force it to use the version from additional_dependencies + entry: uv check --quiet --preview-features=check-command additional_dependencies: - - ty + - ty==0.0.48 - aiohttp>=3 - aiopathlib - aiosqlite From 7da426956c3e067eace46040d167e484f74f835c Mon Sep 17 00:00:00 2001 From: Max R Date: Thu, 11 Jun 2026 21:51:57 -0400 Subject: [PATCH 13/14] fix --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ab4832a..441c07a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -57,7 +57,7 @@ repos: rev: a71646c845a122391e3ce3a43502fcf4003d1efa # frozen: v0.0.48 hooks: - id: ty - args: [--no-project] + args: [--isolated] # vendored from https://github.com/astral-sh/ty-pre-commit/blob/4de226aa36d17b50c9f4c5773453662bc338f774/.pre-commit-hooks.yaml#L4 but altered to remove the --ty-version to force it to use the version from additional_dependencies entry: uv check --quiet --preview-features=check-command additional_dependencies: From 5bb1853e27a90c9450401c6a52b5a2bf27617e02 Mon Sep 17 00:00:00 2001 From: Max R Date: Thu, 11 Jun 2026 22:11:04 -0400 Subject: [PATCH 14/14] fix --- .pre-commit-config.yaml | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 441c07a..838bc30 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -53,15 +53,11 @@ repos: - setuptools - tenacity language_version: python3.12 -- repo: https://github.com/astral-sh/ty-pre-commit - rev: a71646c845a122391e3ce3a43502fcf4003d1efa # frozen: v0.0.48 +- repo: https://github.com/mxr/mirrors-ty + rev: b0cc809b854427130bbdc84b922e0e38c6c6b8eb # frozen: v0.0.48 hooks: - id: ty - args: [--isolated] - # vendored from https://github.com/astral-sh/ty-pre-commit/blob/4de226aa36d17b50c9f4c5773453662bc338f774/.pre-commit-hooks.yaml#L4 but altered to remove the --ty-version to force it to use the version from additional_dependencies - entry: uv check --quiet --preview-features=check-command additional_dependencies: - - ty==0.0.48 - aiohttp>=3 - aiopathlib - aiosqlite @@ -74,7 +70,7 @@ repos: - setuptools - tenacity - repo: https://github.com/mxr/sync-typing-deps - rev: 8e97e35c846b35976c59b973cd40690152b3c716 # frozen: v0.4.0 + rev: 34b664ec01850e0d9cb4fe97c1a03d8ed71f393c # frozen: v0.5.0 hooks: - id: sync-typing-deps - repo: https://github.com/zizmorcore/zizmor-pre-commit