From 9dae2e5e841f288d811158cf7c4f60e756fd7e49 Mon Sep 17 00:00:00 2001 From: Jakob Schnitzer Date: Fri, 3 Jan 2025 11:29:24 +0100 Subject: [PATCH] add warning if DuplicateDetector is used --- pylintrc | 2 +- smart_importer/detector.py | 21 ++++++++++++++++++--- smart_importer/hooks.py | 13 +++++++++++-- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/pylintrc b/pylintrc index 9f744c4..3fe3ceb 100644 --- a/pylintrc +++ b/pylintrc @@ -1,2 +1,2 @@ [MESSAGES CONTROL] -disable = too-few-public-methods +disable = too-few-public-methods,cyclic-import diff --git a/smart_importer/detector.py b/smart_importer/detector.py index b5932f3..71b7bfa 100644 --- a/smart_importer/detector.py +++ b/smart_importer/detector.py @@ -1,8 +1,12 @@ """Duplicate detector hook.""" +from __future__ import annotations + import logging +from typing import Callable -from beangulp import similar +from beancount.core import data +from beangulp import Importer, similar from smart_importer.hooks import ImporterHook @@ -18,12 +22,23 @@ class DuplicateDetector(ImporterHook): entries to classify against. """ - def __init__(self, comparator=None, window_days=2): + def __init__( + self, + comparator: Callable[[data.Directive, data.Directive], bool] + | None = None, + window_days: int = 2, + ) -> None: super().__init__() self.comparator = comparator self.window_days = window_days - def __call__(self, importer, file, imported_entries, existing): + def __call__( + self, + importer: Importer, + file: str, + imported_entries: data.Directives, + existing: data.Directives, + ) -> data.Directives: """Add duplicate metadata for imported transactions. Args: diff --git a/smart_importer/hooks.py b/smart_importer/hooks.py index 1e3517a..3182d73 100644 --- a/smart_importer/hooks.py +++ b/smart_importer/hooks.py @@ -70,6 +70,15 @@ def patched_extract_method( return imported_entries - importer.extract = patched_extract_method - importer.deduplicate = lambda entries, existing: None + importer.extract = patched_extract_method # type: ignore + + # pylint: disable=import-outside-toplevel + from smart_importer.detector import DuplicateDetector + + if any(isinstance(hook, DuplicateDetector) for hook in hooks): + logger.warning( + "Use of DuplicateDetector detected - this is deprecated, " + "please use the beangulp.Importer.deduplicate method directly." + ) + importer.deduplicate = lambda entries, existing: None # type: ignore return importer