diff --git a/papis_extract/__init__.py b/papis_extract/__init__.py index e679e6a..a557b9c 100644 --- a/papis_extract/__init__.py +++ b/papis_extract/__init__.py @@ -8,10 +8,7 @@ import papis.strings from papis.document import Document from papis_extract import extractor, exporter -from papis_extract.formatter import ( - Formatter, - formatters -) +from papis_extract.formatter import Formatter, formatters logger = papis.logging.get_logger(__name__) @@ -52,6 +49,11 @@ papis.config.register_default_settings(DEFAULT_OPTIONS) ), help="Choose an output template to format annotations with.", ) +@click.option( + "--force/--no-force", + "-f", + help="Do not drop any annotations because they already exist.", +) def main( query: str, # _papis_id: bool, @@ -63,6 +65,7 @@ def main( write: bool, template: str, git: bool, + force: bool, ) -> None: """Extract annotations from any pdf document. @@ -84,7 +87,7 @@ def main( formatter = formatters[template] - run(documents, edit=manual, write=write, git=git, formatter=formatter) + run(documents, edit=manual, write=write, git=git, formatter=formatter, force=force) def run( @@ -93,11 +96,12 @@ def run( edit: bool = False, write: bool = False, git: bool = False, + force: bool = False, ) -> None: annotated_docs = extractor.start(documents) if write: exporter.to_notes( - formatter=formatter, annotated_docs=annotated_docs, edit=edit, git=git + formatter=formatter, annotated_docs=annotated_docs, edit=edit, git=git, force=force ) else: exporter.to_stdout(formatter=formatter, annotated_docs=annotated_docs) diff --git a/papis_extract/exporter.py b/papis_extract/exporter.py index 5d22270..80adb8c 100644 --- a/papis_extract/exporter.py +++ b/papis_extract/exporter.py @@ -25,7 +25,11 @@ def to_stdout(formatter: Formatter, annotated_docs: list[AnnotatedDocument]) -> def to_notes( - formatter: Formatter, annotated_docs: list[AnnotatedDocument], edit: bool, git: bool + formatter: Formatter, + annotated_docs: list[AnnotatedDocument], + edit: bool, + git: bool, + force: bool, ) -> None: """Write annotations into document notes. @@ -36,7 +40,7 @@ def to_notes( for entry in annotated_docs: formatted_annotations = formatter([entry]).split("\n") if formatted_annotations: - _add_annots_to_note(entry.document, formatted_annotations) + _add_annots_to_note(entry.document, formatted_annotations, force=force) if edit: papis.commands.edit.edit_notes(entry.document, git=git) @@ -46,11 +50,26 @@ def _add_annots_to_note( document: papis.document.Document, formatted_annotations: list[str], git: bool = False, + force: bool = False, ) -> None: - """Append new annotations to the end of a note. + """ + Append new annotations to the end of a note. - Looks through note to determine any new annotations which should be - added and adds them to the end of the note file. + This function appends new annotations to the end of a note file. It takes in a + document object containing the note, a list of formatted annotations to be + added, and optional flags git and force. If git is True, the changes will be + committed to git. If force is True, the annotations will be added even if they + already exist in the note. + + :param document: The document object representing the note + :type document: class:`papis.document.Document` + :param formatted_annotations: A list of already formatted annotations to be added + :type formatted_annotations: list[str] + :param git: Flag indicating whether to commit changes to git, defaults to False. + :type git: bool, optional + :param force: Flag indicating whether to force adding annotations even if they + already exist, defaults to False. + :type force: bool, optional """ logger.debug("Adding annotations to note.") notes_path = papis.notes.notes_path_ensured(document) @@ -59,9 +78,9 @@ def _add_annots_to_note( with open(notes_path, "r") as file_read: existing = file_read.readlines() - new_annotations: list[str] = _drop_existing_annotations( - formatted_annotations, existing - ) + new_annotations: list[str] = [] + if not force: + new_annotations = _drop_existing_annotations(formatted_annotations, existing) if not new_annotations: return diff --git a/tests/test_annotation.py b/tests/test_annotation.py index c14ee93..529a4c1 100644 --- a/tests/test_annotation.py +++ b/tests/test_annotation.py @@ -26,13 +26,14 @@ def test_formatting_replacements(fmt_string, expected): assert sut.format(fmt_string) == expected + @pytest.mark.parametrize( "fmt_string,expected", [ ("{{doc.title}}", "document-title"), ("{{doc.title}}-{{doc.author}}", "document-title-document-author"), ("{{quote}} ({{doc.author}})", "I am the text value (document-author)"), - ] + ], ) def test_formatting_document_access(fmt_string, expected): sut = Annotation( @@ -40,10 +41,11 @@ def test_formatting_document_access(fmt_string, expected): text="I am the text value", content="Whereas I represent the note", ) - doc = Document(data= {"title": "document-title", "author": "document-author"}) + doc = Document(data={"title": "document-title", "author": "document-author"}) assert sut.format(fmt_string, doc=doc) == expected + def test_colorname_matches_exact(): sut = Annotation("testfile", colors=(1.0, 0.0, 0.0), minimum_similarity_color=1.0) c_name = sut.colorname