Skip to content

Commit d87c4ed

Browse files
committed
Add more tests
1 parent 5dc3a65 commit d87c4ed

3 files changed

Lines changed: 80 additions & 15 deletions

File tree

src/curies/triples/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,8 @@
139139
exclude_subject_prefixes,
140140
exclude_triples,
141141
keep_object_prefixes,
142-
keep_prefixes,
142+
keep_prefixes_both,
143+
keep_prefixes_either,
143144
keep_references_both,
144145
keep_references_either,
145146
keep_subject_prefixes,
@@ -162,7 +163,8 @@
162163
"exclude_triples",
163164
"hash_triple",
164165
"keep_object_prefixes",
165-
"keep_prefixes",
166+
"keep_prefixes_both",
167+
"keep_prefixes_either",
166168
"keep_references_both",
167169
"keep_references_either",
168170
"keep_subject_prefixes",

src/curies/triples/filters.py

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
"exclude_subject_prefixes",
1717
"exclude_triples",
1818
"keep_object_prefixes",
19-
"keep_prefixes",
19+
"keep_prefixes_both",
20+
"keep_prefixes_either",
2021
"keep_references_both",
2122
"keep_references_either",
2223
"keep_subject_prefixes",
@@ -29,7 +30,7 @@
2930
def _filter(
3031
func: TriplePredicate[TripleType], triples: Iterable[TripleType], progress: bool = False
3132
) -> Iterable[TripleType]:
32-
if progress:
33+
if progress: # pragma: no cover
3334
try:
3435
from tqdm import tqdm
3536
except ImportError:
@@ -39,7 +40,7 @@ def _filter(
3940
return filter(func, triples)
4041

4142

42-
def keep_prefixes(
43+
def keep_prefixes_both(
4344
triples: Iterable[TripleType], prefixes: Iterable[str], *, progress: bool = False
4445
) -> Iterable[TripleType]:
4546
"""Keep triples whose subjects' and objects' prefixes are in the given prefixes.
@@ -57,12 +58,12 @@ def keep_prefixes(
5758
>>> m1 = Triple.from_curies(c1, exact_match.curie, c2)
5859
>>> m2 = Triple.from_curies(c2, exact_match.curie, c3)
5960
>>> m3 = Triple.from_curies(c1, exact_match.curie, c3)
60-
>>> assert list(keep_prefixes([m1, m2, m3], {"DOID", "mesh"})) == [m1]
61+
>>> assert list(keep_prefixes_both([m1, m2, m3], {"DOID", "mesh"})) == [m1]
6162
"""
62-
return _filter(_keep_prefixes_filter(prefixes), triples, progress=progress)
63+
return _filter(_keep_prefixes_both_filter(prefixes), triples, progress=progress)
6364

6465

65-
def _keep_prefixes_filter(prefixes: Iterable[str]) -> TriplePredicate[TripleType]:
66+
def _keep_prefixes_both_filter(prefixes: Iterable[str]) -> TriplePredicate[TripleType]:
6667
prefixes = set(prefixes)
6768
if len(prefixes) < 2:
6869
raise ValueError
@@ -73,6 +74,44 @@ def _func(triple: TripleType) -> bool:
7374
return _func
7475

7576

77+
def keep_prefixes_either(
78+
triples: Iterable[TripleType], prefixes: str | Iterable[str], *, progress: bool = False
79+
) -> Iterable[TripleType]:
80+
"""Keep triples whose subjects' and objects' prefixes are in the given prefixes.
81+
82+
:param triples: An iterable of triples
83+
:param prefixes: A set of prefixes to use for filtering the triples
84+
:param progress: Should a progress bar be shown?
85+
86+
:returns: A sub-iterable of triples whose subjects' and objects'
87+
prefixes are in the given prefixes
88+
89+
>>> from curies import Triple
90+
>>> from curies.vocabulary import exact_match
91+
>>> c1, c2, c3 = "DOID:0050577", "mesh:C562966", "umls:C4551571"
92+
>>> m1 = Triple.from_curies(c1, exact_match.curie, c2)
93+
>>> m2 = Triple.from_curies(c2, exact_match.curie, c3)
94+
>>> m3 = Triple.from_curies(c1, exact_match.curie, c3)
95+
>>> assert list(keep_prefixes_either([m1, m2, m3], {"DOID", "mesh"})) == [m1]
96+
"""
97+
return _filter(_keep_prefixes_either_filter(prefixes), triples, progress=progress)
98+
99+
100+
def _keep_prefixes_either_filter(prefixes: Iterable[str]) -> TriplePredicate[TripleType]:
101+
if isinstance(prefixes, str):
102+
103+
def _func(triple: TripleType) -> bool:
104+
return triple.subject.prefix == prefixes or triple.object.prefix == prefixes
105+
106+
else:
107+
prefixes = set(prefixes)
108+
109+
def _func(triple: TripleType) -> bool:
110+
return triple.subject.prefix in prefixes or triple.object.prefix in prefixes
111+
112+
return _func
113+
114+
76115
def keep_subject_prefixes(
77116
triples: Iterable[TripleType], prefixes: str | Iterable[str], *, progress: bool = False
78117
) -> Iterable[TripleType]:

tests/test_triples/test_filter.py

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,16 @@
1212
exclude_subject_prefixes,
1313
exclude_triples,
1414
keep_object_prefixes,
15-
keep_prefixes,
15+
keep_prefixes_both,
16+
keep_prefixes_either,
1617
keep_references_both,
1718
keep_references_either,
1819
keep_subject_prefixes,
1920
keep_triples_by_hash,
2021
)
2122
from curies.vocabulary import exact_match, subclass_of
2223

24+
p1, p2, p3 = "DOID", "mesh", "umls"
2325
c1, c2, c3, c4 = "DOID:0050577", "mesh:C562966", "umls:C4551571", "DOID:225"
2426
r1, r2, r3, r4 = (Reference.from_curie(c) for c in [c1, c2, c3, c4])
2527
m1 = Triple.from_curies(c1, exact_match.curie, c2)
@@ -51,18 +53,21 @@ def assert_triple_lists(self, expected: list[Triple], actual: Iterable[Triple])
5153

5254
def test_exclude_object_prefixes(self) -> None:
5355
"""Test excluding object prefixes."""
56+
self.assert_triple_lists([m1], exclude_object_prefixes(M123, "umls"))
5457
self.assert_triple_lists([m1], exclude_object_prefixes(M123, {"umls"}))
5558
self.assert_triple_lists([m2, m3], exclude_object_prefixes(M123, {"mesh"}))
5659
self.assert_triple_lists(M123, exclude_object_prefixes(M123, {"DOID"}))
5760

5861
def test_exclude_prefixes(self) -> None:
5962
"""Test excluding prefixes."""
63+
self.assert_triple_lists([m1], exclude_prefixes(M123, "umls"))
6064
self.assert_triple_lists([m1], exclude_prefixes(M123, {"umls"}))
6165
self.assert_triple_lists([m2], exclude_prefixes(M123, {"DOID"}))
6266
self.assert_triple_lists([m3], exclude_prefixes(M123, {"mesh"}))
6367

6468
def test_exclude_subject_prefixes(self) -> None:
6569
"""Test excluding subject prefixes."""
70+
self.assert_triple_lists([m2], exclude_subject_prefixes(M123, "DOID"))
6671
self.assert_triple_lists([m2], exclude_subject_prefixes(M123, {"DOID"}))
6772
self.assert_triple_lists(M123, exclude_subject_prefixes(M123, {"umls"}))
6873
self.assert_triple_lists([m1, m3], exclude_subject_prefixes(M123, {"mesh"}))
@@ -78,18 +83,33 @@ def test_exclude_triples(self) -> None:
7883

7984
def test_keep_object_prefixes(self) -> None:
8085
"""Test keeping object prefixes."""
86+
self.assert_triple_lists([m2, m3], keep_object_prefixes(M123, "umls"))
8187
self.assert_triple_lists([m2, m3], keep_object_prefixes(M123, {"umls"}))
8288

83-
def test_keep_prefixes(self) -> None:
89+
def test_keep_prefixes_both(self) -> None:
8490
"""Test keeping prefixes."""
85-
self.assert_triple_lists([], keep_prefixes(M123, {"NOPE", "also nope"}))
86-
self.assert_triple_lists([m1], keep_prefixes(M123, {"DOID", "mesh"}))
87-
self.assert_triple_lists([m1], keep_prefixes(M123, {"DOID", "umls"}))
88-
self.assert_triple_lists([m1], keep_prefixes(M123, {"mesh", "umls"}))
89-
self.assert_triple_lists(M123, keep_prefixes(M123, {"DOID", "umls", "mesh"}))
91+
with self.assertRaises(ValueError):
92+
keep_prefixes_both(M123, {"DOID"})
93+
self.assert_triple_lists([], keep_prefixes_both(M123, {"NOPE", "also nope"}))
94+
self.assert_triple_lists([m1], keep_prefixes_both(M123, {"DOID", "mesh"}))
95+
self.assert_triple_lists([m3], keep_prefixes_both(M123, {"DOID", "umls"}))
96+
self.assert_triple_lists([m2], keep_prefixes_both(M123, {"mesh", "umls"}))
97+
self.assert_triple_lists(M123, keep_prefixes_both(M123, {"DOID", "umls", "mesh"}))
98+
99+
def test_keep_prefixes_either(self) -> None:
100+
"""Test keeping prefixes."""
101+
self.assert_triple_lists([], keep_prefixes_either(M123, {"NOPE", "also nope"}))
102+
self.assert_triple_lists([m1, m2], keep_prefixes_either(M123, "mesh"))
103+
self.assert_triple_lists([m1, m3], keep_prefixes_either(M123, "DOID"))
104+
self.assert_triple_lists([m2, m3], keep_prefixes_either(M123, "umls"))
105+
self.assert_triple_lists([m1, m2, m3], keep_prefixes_either(M123, {"DOID", "mesh"}))
106+
self.assert_triple_lists([m1, m2, m3], keep_prefixes_either(M123, {"DOID", "umls"}))
107+
self.assert_triple_lists([m1, m2, m3], keep_prefixes_either(M123, {"mesh", "umls"}))
108+
self.assert_triple_lists(M123, keep_prefixes_either(M123, {"DOID", "umls", "mesh"}))
90109

91110
def test_keep_subject_prefixes(self) -> None:
92111
"""Test keeping subject prefixes."""
112+
self.assert_triple_lists([m1, m3], keep_subject_prefixes(M123, "DOID"))
93113
self.assert_triple_lists([m1, m3], keep_subject_prefixes(M123, {"DOID"}))
94114

95115
def test_keep_triple_by_hash(self) -> None:
@@ -106,6 +126,7 @@ def test_keep_triple_by_hash(self) -> None:
106126

107127
def test_keep_references_either(self) -> None:
108128
"""Test keeping references."""
129+
self.assert_triple_lists([m1, m3], keep_references_either(M123, r1))
109130
self.assert_triple_lists([m1, m3], keep_references_either(M123, [r1]))
110131
self.assert_triple_lists([m1, m2], keep_references_either(M123, [r2]))
111132
self.assert_triple_lists([m2, m3], keep_references_either(M123, [r3]))
@@ -115,13 +136,16 @@ def test_keep_references_either(self) -> None:
115136

116137
def test_keep_references_both(self) -> None:
117138
"""Test keeping references."""
139+
with self.assertRaises(ValueError):
140+
keep_references_both(M123, [r1])
118141
self.assert_triple_lists([m1], keep_references_both(M123, [r1, r2]))
119142
self.assert_triple_lists([m2], keep_references_both(M123, [r2, r3]))
120143
self.assert_triple_lists([m3], keep_references_both(M123, [r1, r3]))
121144
self.assert_triple_lists(M123, keep_references_both(M123, [r1, r2, r3]))
122145

123146
def test_exclude_references(self) -> None:
124147
"""Test exclude references."""
148+
self.assert_triple_lists([m2], exclude_references(M123, r1))
125149
self.assert_triple_lists([m2], exclude_references(M123, [r1]))
126150
self.assert_triple_lists([m3], exclude_references(M123, [r2]))
127151
self.assert_triple_lists([m1], exclude_references(M123, [r3]))

0 commit comments

Comments
 (0)