diff --git a/python/CHANGELOG.rst b/python/CHANGELOG.rst index 38bf55384f..ca12dad7a1 100644 --- a/python/CHANGELOG.rst +++ b/python/CHANGELOG.rst @@ -2,6 +2,10 @@ [X.X.X] - XXXX-XX-XX -------------------- +**Features** + +- :issue:`832` - Add ``metadata_bytes`` method to allow access to raw + TableCollection metadata (:user:`benjeffery`, :pr:`842`) -------------------- [0.3.1] - 2020-09-04 diff --git a/python/tests/test_tables.py b/python/tests/test_tables.py index 92f2ac5560..63e85dead5 100644 --- a/python/tests/test_tables.py +++ b/python/tests/test_tables.py @@ -2512,6 +2512,7 @@ def test_set_metadata(self): tc = tskit.TableCollection(1) # Default is empty bytes self.assertEqual(tc.metadata, b"") + self.assertEqual(tc.metadata_bytes, b"") tc.metadata_schema = self.metadata_schema md1 = self.metadata_example_data() @@ -2519,15 +2520,22 @@ def test_set_metadata(self): # Set tc.metadata = md1 self.assertEqual(tc.metadata, md1) + self.assertEqual(tc.metadata_bytes, tskit.canonical_json(md1).encode()) # Overwrite tc.metadata = md2 self.assertEqual(tc.metadata, md2) + self.assertEqual(tc.metadata_bytes, tskit.canonical_json(md2).encode()) # Del should fail with self.assertRaises(AttributeError): del tc.metadata + with self.assertRaises(AttributeError): + del tc.metadata_bytes # None should fail with self.assertRaises(exceptions.MetadataValidationError): tc.metadata = None + # Setting bytes should fail + with self.assertRaises(AttributeError): + tc.metadata_bytes = b"123" def test_default_metadata_schema(self): # Default should allow bytes @@ -2544,6 +2552,7 @@ def test_round_trip_metadata(self): tc.metadata_schema = self.metadata_schema tc.metadata = data self.assertDictEqual(tc.metadata, data) + self.assertEqual(tc.metadata_bytes, tskit.canonical_json(data).encode()) def test_bad_metadata(self): metadata = self.metadata_example_data() diff --git a/python/tskit/tables.py b/python/tskit/tables.py index c446d89549..57a33113e9 100644 --- a/python/tskit/tables.py +++ b/python/tskit/tables.py @@ -2074,6 +2074,13 @@ def metadata(self, metadata: Any) -> None: metadata ) + @property + def metadata_bytes(self) -> Any: + """ + The raw bytes of metadata for this TableCollection + """ + return self._ll_tables.metadata + def asdict(self): """ Returns a dictionary representation of this TableCollection.