Skip to content

Commit 0fb73bf

Browse files
committed
Add ref seq equals
1 parent eae961c commit 0fb73bf

File tree

4 files changed

+72
-15
lines changed

4 files changed

+72
-15
lines changed

python/CHANGELOG.rst

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
**Fixes**
66

77
- ``TreeSequence.dump_text`` now prints decoded metadata if there is a schema.
8-
(:user:`bejeffery`, :issue:`1860`, :issue:`1527`,
8+
(:user:`benjeffery`, :issue:`1860`, :issue:`1527`)
9+
10+
- Add missing ``ReferenceSequence.__eq__`` method.
11+
(:user:`benjeffery`, :issue:`2063`, :pr:`2085`)
912

1013

1114
----------------------

python/tests/test_reference_sequence.py

Lines changed: 52 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -148,42 +148,80 @@ def test_repr(self):
148148
assert repr(refseq).startswith("ReferenceSequence")
149149

150150

151-
class TestAssertEquals:
152-
def test_success_self(self, ts_fixture):
151+
class TestEquals:
152+
def test_equal_self(self, ts_fixture):
153153
ts_fixture.reference_sequence.assert_equals(ts_fixture.reference_sequence)
154+
assert ts_fixture.reference_sequence == ts_fixture.reference_sequence
155+
assert not ts_fixture.reference_sequence != ts_fixture.reference_sequence
156+
assert ts_fixture.reference_sequence.equals(ts_fixture.reference_sequence)
154157

155-
def test_success_empty(self):
158+
def test_equal_empty(self):
156159
tables = tskit.TableCollection(1)
157160
tables.reference_sequence.assert_equals(tables.reference_sequence)
161+
assert tables.reference_sequence == tables.reference_sequence
162+
assert tables.reference_sequence.equals(tables.reference_sequence)
158163

159164
@pytest.mark.parametrize("attr", ["url", "data"])
160-
def test_fails_attr_missing(self, ts_fixture, attr):
165+
def test_unequal_attr_missing(self, ts_fixture, attr):
161166
t1 = ts_fixture.tables
162167
d = t1.asdict()
163168
del d["reference_sequence"][attr]
164169
t2 = tskit.TableCollection.fromdict(d)
165170
with pytest.raises(AssertionError, match=attr):
166171
t1.reference_sequence.assert_equals(t2.reference_sequence)
172+
assert t1.reference_sequence != t2.reference_sequence
173+
assert not t1.reference_sequence.equals(t2.reference_sequence)
167174
with pytest.raises(AssertionError, match=attr):
168175
t2.reference_sequence.assert_equals(t1.reference_sequence)
169-
170-
def test_fails_metadata_different(self, ts_fixture):
176+
assert t2.reference_sequence != t1.reference_sequence
177+
assert not t2.reference_sequence.equals(t1.reference_sequence)
178+
179+
@pytest.mark.parametrize(
180+
("attr", "val"),
181+
[
182+
("url", "foo"),
183+
("data", "bar"),
184+
("metadata", {"json": "runs the world"}),
185+
("metadata_schema", tskit.MetadataSchema(None)),
186+
],
187+
)
188+
def test_different_not_equal(self, ts_fixture, attr, val):
171189
t1 = ts_fixture.dump_tables()
172190
t2 = t1.copy()
173-
t1.reference_sequence.metadata = {"different": "metadata"}
174-
with pytest.raises(AssertionError, match="metadata"):
191+
setattr(t1.reference_sequence, attr, val)
192+
193+
with pytest.raises(AssertionError):
175194
t1.reference_sequence.assert_equals(t2.reference_sequence)
176-
with pytest.raises(AssertionError, match="metadata"):
195+
assert t1.reference_sequence != t2.reference_sequence
196+
assert not t1.reference_sequence.equals(t2.reference_sequence)
197+
with pytest.raises(AssertionError):
177198
t2.reference_sequence.assert_equals(t1.reference_sequence)
178-
179-
def test_fails_metadata_schema_different(self, ts_fixture):
199+
assert t2.reference_sequence != t1.reference_sequence
200+
assert not t2.reference_sequence.equals(t1.reference_sequence)
201+
202+
@pytest.mark.parametrize(
203+
("attr", "val"),
204+
[
205+
("metadata", {"json": "runs the world"}),
206+
("metadata_schema", tskit.MetadataSchema(None)),
207+
],
208+
)
209+
def test_different_but_ignore(self, ts_fixture, attr, val):
180210
t1 = ts_fixture.dump_tables()
181211
t2 = t1.copy()
182-
t1.reference_sequence.metadata_schema = tskit.MetadataSchema(None)
183-
with pytest.raises(AssertionError, match="schemas"):
212+
setattr(t1.reference_sequence, attr, val)
213+
214+
with pytest.raises(AssertionError):
184215
t1.reference_sequence.assert_equals(t2.reference_sequence)
185-
with pytest.raises(AssertionError, match="schemas"):
216+
assert t1.reference_sequence != t2.reference_sequence
217+
assert not t1.reference_sequence.equals(t2.reference_sequence)
218+
with pytest.raises(AssertionError):
186219
t2.reference_sequence.assert_equals(t1.reference_sequence)
220+
assert t2.reference_sequence != t1.reference_sequence
221+
assert not t2.reference_sequence.equals(t1.reference_sequence)
222+
223+
t2.reference_sequence.assert_equals(t1.reference_sequence, ignore_metadata=True)
224+
assert t2.reference_sequence.equals(t1.reference_sequence, ignore_metadata=True)
187225

188226

189227
class TestTreeSequenceProperties:

python/tskit/metadata.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -829,6 +829,12 @@ def metadata_bytes(self) -> Any:
829829
def nbytes(self) -> int:
830830
return len(self._ll_object.metadata) + len(self._ll_object.metadata_schema)
831831

832+
def equals(self, other) -> bool:
833+
return (
834+
self.metadata == other.metadata
835+
and self.metadata_schema == other.metadata_schema
836+
)
837+
832838
def assert_equals(self, other: MetadataProvider):
833839
if self.metadata_schema != other.metadata_schema:
834840
raise AssertionError(

python/tskit/tables.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2773,6 +2773,16 @@ def asdict(self) -> dict:
27732773
"url": self.url,
27742774
}
27752775

2776+
def __eq__(self, other):
2777+
return self.equals(other)
2778+
2779+
def equals(self, other, ignore_metadata=False):
2780+
try:
2781+
self.assert_equals(other, ignore_metadata)
2782+
return True
2783+
except AssertionError:
2784+
return False
2785+
27762786
def assert_equals(self, other, ignore_metadata=False):
27772787
if not ignore_metadata:
27782788
super().assert_equals(other)

0 commit comments

Comments
 (0)