diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e7183f5..a1642ad 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -13,13 +13,8 @@ repos: args: [--autofix, --trailing-commas] - id: pretty-format-yaml args: [--autofix] -- repo: https://github.com/asottile/reorder-python-imports - rev: 5e38415c12154247a099c7023c210e3d458275b5 # frozen: v3.17.0 - hooks: - - id: reorder-python-imports - args: [--py312-plus, --add-import, from __future__ import annotations] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: 2700fd5671c633760d912769c041bfcde2b9a01b # frozen: v0.15.22 + rev: cb8c523fd4835aba42af70f4cad5568db4df0b6c # frozen: v0.16.0 hooks: - id: ruff-check args: [--fix] @@ -50,11 +45,11 @@ repos: - pytest - pytest-asyncio - rich>=10 - - setuptools - tenacity + - types-setuptools language_version: python3.12 - repo: https://github.com/mxr/mirrors-ty - rev: febed8a7b2665e80a9d3855c59ac716a6284d628 # frozen: v0.0.61 + rev: d7f08bf6b37691c482773f198ba01539eb331d6a # frozen: v0.0.63 hooks: - id: ty additional_dependencies: @@ -67,14 +62,14 @@ repos: - pytest - pytest-asyncio - rich>=10 - - setuptools - tenacity + - types-setuptools - repo: https://github.com/mxr/sync-typing-deps - rev: c2ec0c01a31703615c17e3fe11d1fe28c003f1d8 # frozen: v0.5.3 + rev: a8b960f5e2bb3627b5a1fc8171fe224cdd64ff0a # frozen: v0.5.4 hooks: - id: sync-typing-deps - repo: https://github.com/zizmorcore/zizmor-pre-commit - rev: 64a97fb7fa63188393d3215c6e312f5f9c6d0f78 # frozen: v1.27.0 + rev: 067260dc5fe6ea86b7551bfd6f8b3ba4e6c93129 # frozen: v1.28.0 hooks: - id: zizmor args: [--no-progress, --fix] diff --git a/pyproject.toml b/pyproject.toml index aa70cba..131c0f5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -69,14 +69,19 @@ target-version = "py312" [tool.ruff.lint] extend-select = [ - "UP", # see pyupgrade - "B", # see flake8-bugbear "A", # see flake8-builtins + "B", # see flake8-bugbear "C4", # see flake8-comprehension + "I", # sort imports "SIM", # see flake8-simplify "TC", # see flake8-type-checking + "UP", # see pyupgrade ] +[tool.ruff.lint.isort] +force-single-line = true +required-imports = ["from __future__ import annotations"] + [tool.setuptools.package-data] sqlite_export_for_ynab = ["py.typed"] "sqlite_export_for_ynab.ddl" = ["*.sql"] diff --git a/sqlite_export_for_ynab/_main.py b/sqlite_export_for_ynab/_main.py index f5dc4e1..edfccf8 100644 --- a/sqlite_export_for_ynab/_main.py +++ b/sqlite_export_for_ynab/_main.py @@ -8,16 +8,18 @@ from dataclasses import dataclass from dataclasses import fields from datetime import date +from datetime import datetime from datetime import timedelta from importlib import resources from importlib.metadata import version from itertools import batched from pathlib import Path +from typing import TYPE_CHECKING from typing import Any from typing import Literal +from typing import get_args from typing import overload from typing import override -from typing import TYPE_CHECKING import aiosqlite import asyncio_for_ynab # noqa: F401 @@ -84,28 +86,24 @@ def render(self, task: Task) -> Text: ) -_EntryTable = ( - Literal["accounts"] - | Literal["account_periodic_values"] - | Literal["category_groups"] - | Literal["categories"] - | Literal["payees"] - | Literal["transactions"] - | Literal["subtransactions"] - | Literal["scheduled_transactions"] - | Literal["scheduled_subtransactions"] -) -_Endpoint = ( - Literal["accounts"] - | Literal["categories"] - | Literal["payees"] - | Literal["transactions"] - | Literal["scheduled_transactions"] -) -_ENDPOINTS = tuple(lit.__args__[0] for lit in _Endpoint.__args__) +_EntryTable = Literal[ + "accounts", + "account_periodic_values", + "category_groups", + "categories", + "payees", + "transactions", + "subtransactions", + "scheduled_transactions", + "scheduled_subtransactions", +] +_Endpoint = Literal[ + "accounts", "categories", "payees", "transactions", "scheduled_transactions" +] +_ENDPOINTS = get_args(_Endpoint) _ALL_RELATIONS = frozenset( ("plans", "flat_transactions", "scheduled_flat_transactions") - + tuple(lit.__args__[0] for lit in _EntryTable.__args__) + + get_args(_EntryTable) ) _ENV_TOKEN = "YNAB_PERSONAL_ACCESS_TOKEN" @@ -556,28 +554,20 @@ async def insert_nested_entries( context: _Context, plan_id: str, entries: list[dict[str, Any]], - desc: ( - Literal["Accounts"] - | Literal["Categories"] - | Literal["Transactions"] - | Literal["Scheduled Transactions"] - ), + desc: (Literal["Accounts", "Categories", "Transactions", "Scheduled Transactions"]), entries_name: ( - Literal["accounts"] - | Literal["category_groups"] - | Literal["transactions"] - | Literal["scheduled_transactions"] + Literal["accounts", "category_groups", "transactions", "scheduled_transactions"] ), subentries_name: ( - Literal["account_periodic_values"] - | Literal["categories"] - | Literal["subtransactions"] + Literal["account_periodic_values", "categories", "subtransactions"] ), subentries_table_name: ( - Literal["account_periodic_values"] - | Literal["categories"] - | Literal["subtransactions"] - | Literal["scheduled_subtransactions"] + Literal[ + "account_periodic_values", + "categories", + "subtransactions", + "scheduled_subtransactions", + ] ), ) -> None: if not entries: @@ -713,7 +703,7 @@ async def get_transactions( async def _get( self, transactions_api: TransactionsApi, plan_id: str ) -> TransactionsResponse: - today = date.today() + today = datetime.now().astimezone().date() responses = await asyncio.gather( *( self._chunk(transactions_api, plan_id, sd, ud) diff --git a/testing/fixtures.py b/testing/fixtures.py index a570f51..425873a 100644 --- a/testing/fixtures.py +++ b/testing/fixtures.py @@ -29,7 +29,6 @@ from asyncio_for_ynab import TransactionsResponse from asyncio_for_ynab import TransactionsResponseData - PLAN_ID_1 = str(uuid4()) PLAN_ID_2 = str(uuid4()) diff --git a/tests/_main_test.py b/tests/_main_test.py index df59dda..83c8add 100644 --- a/tests/_main_test.py +++ b/tests/_main_test.py @@ -15,16 +15,16 @@ from sqlite_export_for_ynab import default_db_path from sqlite_export_for_ynab._main import _ALL_RELATIONS -from sqlite_export_for_ynab._main import _Context -from sqlite_export_for_ynab._main import _context from sqlite_export_for_ynab._main import _ENV_TOKEN -from sqlite_export_for_ynab._main import _get_plan_summaries from sqlite_export_for_ynab._main import _PACKAGE from sqlite_export_for_ynab._main import _PROGRESS_COLUMNS +from sqlite_export_for_ynab._main import ChunkedTransactionsApi +from sqlite_export_for_ynab._main import _Context +from sqlite_export_for_ynab._main import _context +from sqlite_export_for_ynab._main import _get_plan_summaries from sqlite_export_for_ynab._main import _quarterly from sqlite_export_for_ynab._main import async_main from sqlite_export_for_ynab._main import asyncio_for_ynab -from sqlite_export_for_ynab._main import ChunkedTransactionsApi from sqlite_export_for_ynab._main import contents from sqlite_export_for_ynab._main import get_last_knowledge_of_server from sqlite_export_for_ynab._main import get_relations @@ -41,8 +41,6 @@ from testing.fixtures import ACCOUNT_ID_1 from testing.fixtures import ACCOUNT_ID_2 from testing.fixtures import ACCOUNTS -from testing.fixtures import accounts_response -from testing.fixtures import categories_response from testing.fixtures import CATEGORY_GOAL_TARGET_DATE_1 from testing.fixtures import CATEGORY_GROUP_ID_1 from testing.fixtures import CATEGORY_GROUP_ID_2 @@ -61,10 +59,8 @@ from testing.fixtures import PAYEE_ID_1 from testing.fixtures import PAYEE_ID_2 from testing.fixtures import PAYEES -from testing.fixtures import payees_response from testing.fixtures import PLAN_ID_1 from testing.fixtures import PLAN_ID_2 -from testing.fixtures import plan_response from testing.fixtures import PLANS from testing.fixtures import SCHEDULED_SUBTRANSACTION_ID_1 from testing.fixtures import SCHEDULED_SUBTRANSACTION_ID_2 @@ -72,7 +68,6 @@ from testing.fixtures import SCHEDULED_TRANSACTION_ID_2 from testing.fixtures import SCHEDULED_TRANSACTION_ID_3 from testing.fixtures import SCHEDULED_TRANSACTIONS -from testing.fixtures import scheduled_transactions_response from testing.fixtures import SERVER_KNOWLEDGE_1 from testing.fixtures import SERVER_KNOWLEDGE_2 from testing.fixtures import SUBTRANSACTION_ID_1 @@ -83,6 +78,11 @@ from testing.fixtures import TRANSACTION_ID_2 from testing.fixtures import TRANSACTION_ID_3 from testing.fixtures import TRANSACTIONS +from testing.fixtures import accounts_response +from testing.fixtures import categories_response +from testing.fixtures import payees_response +from testing.fixtures import plan_response +from testing.fixtures import scheduled_transactions_response from testing.fixtures import transactions_response