chore: Implement Annotation sort and equality dunders
This commit is contained in:
parent
d840609ecb
commit
db47ad686d
2 changed files with 67 additions and 2 deletions
|
|
@ -1,4 +1,6 @@
|
||||||
import math
|
import math
|
||||||
|
from functools import total_ordering
|
||||||
|
from types import NotImplementedType
|
||||||
from typing import Any, cast
|
from typing import Any, cast
|
||||||
|
|
||||||
import chevron
|
import chevron
|
||||||
|
|
@ -20,6 +22,7 @@ COLORS: dict[str, tuple[float, float, float]] = {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@total_ordering
|
||||||
class Annotation:
|
class Annotation:
|
||||||
"""A PDF annotation object.
|
"""A PDF annotation object.
|
||||||
|
|
||||||
|
|
@ -144,3 +147,35 @@ class Annotation:
|
||||||
|
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
return f"Annotation(type={self.type}, file='{self.file}', color={self.color}, tag='{self.tag}', page={self.page}, content='{self.content}', note='{self.note}', minimum_similarity_color={self.minimum_similarity_color})"
|
return f"Annotation(type={self.type}, file='{self.file}', color={self.color}, tag='{self.tag}', page={self.page}, content='{self.content}', note='{self.note}', minimum_similarity_color={self.minimum_similarity_color})"
|
||||||
|
|
||||||
|
def __eq__(self, other: object) -> bool | NotImplementedType:
|
||||||
|
if not isinstance(other, Annotation):
|
||||||
|
return NotImplemented
|
||||||
|
|
||||||
|
return (
|
||||||
|
self.content.lower(),
|
||||||
|
self.note.lower(),
|
||||||
|
self.type,
|
||||||
|
self.file,
|
||||||
|
self.color,
|
||||||
|
self.tag,
|
||||||
|
self.page,
|
||||||
|
) == (
|
||||||
|
other.content.lower(),
|
||||||
|
other.note.lower(),
|
||||||
|
other.type,
|
||||||
|
other.file,
|
||||||
|
other.color,
|
||||||
|
other.tag,
|
||||||
|
other.page,
|
||||||
|
)
|
||||||
|
|
||||||
|
def __lt__(self, other: object) -> bool:
|
||||||
|
if not hasattr(other, "page"):
|
||||||
|
return NotImplemented
|
||||||
|
|
||||||
|
other = cast("Annotation", other)
|
||||||
|
selfpage = self.page if self.page != 0 else float("inf")
|
||||||
|
otherpage = other.page if other.page != 0 else float("inf")
|
||||||
|
|
||||||
|
return selfpage < otherpage
|
||||||
|
|
|
||||||
|
|
@ -4,12 +4,42 @@ from papis.document import Document
|
||||||
from papis_extract.annotation import Annotation
|
from papis_extract.annotation import Annotation
|
||||||
|
|
||||||
|
|
||||||
def test_value_comparison_works():
|
def test_value_inequality_comparison():
|
||||||
sut = Annotation("myfile", content="Here be content!", note="and a note")
|
sut = Annotation("myfile", content="Here be content!", note="and a note")
|
||||||
other = Annotation("myfile", content="Here be different content!", note="but still a note")
|
other = Annotation(
|
||||||
|
"myfile", content="Here be different content!", note="but still a note"
|
||||||
|
)
|
||||||
assert sut != other
|
assert sut != other
|
||||||
|
|
||||||
|
|
||||||
|
def test_oder_lt_comparison():
|
||||||
|
sut = Annotation("myfile", content="Here be content!", note="and a note", page=2)
|
||||||
|
other = Annotation(
|
||||||
|
"myfile", content="Here be different content!", note="but still a note", page=10
|
||||||
|
)
|
||||||
|
assert sut < other
|
||||||
|
|
||||||
|
|
||||||
|
def test_oder_ge_comparison():
|
||||||
|
big = Annotation("mf", content="ct", note="nt", page=10)
|
||||||
|
small = Annotation("mf", content="ct", note="nt", page=2)
|
||||||
|
alsosmall = Annotation("mf", content="ct", note="nt", page=2)
|
||||||
|
assert big >= small
|
||||||
|
assert small >= alsosmall
|
||||||
|
|
||||||
|
|
||||||
|
def test_oder_gt_comparison_single_nopage():
|
||||||
|
zeropage = Annotation("mf", content="ct", note="nt", page=0)
|
||||||
|
small = Annotation("mf", content="ct", note="nt", page=2)
|
||||||
|
assert zeropage > small
|
||||||
|
|
||||||
|
|
||||||
|
def test_oder_le_comparison_all_nopage():
|
||||||
|
zeropage = Annotation("mf", content="ct", note="nt", page=0)
|
||||||
|
small = Annotation("mf", content="ct", note="nt", page=0)
|
||||||
|
assert zeropage <= small
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"fmt_string,expected",
|
"fmt_string,expected",
|
||||||
[
|
[
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue