diff --git a/src/opentimelineio/unknownSchema.h b/src/opentimelineio/unknownSchema.h index c60993095..fd200e5e8 100644 --- a/src/opentimelineio/unknownSchema.h +++ b/src/opentimelineio/unknownSchema.h @@ -39,6 +39,11 @@ class UnknownSchema : public SerializableObject return _original_schema_version; } + AnyDictionary data() const noexcept + { + return _data; + } + bool read_from(Reader&) override; void write_to(Writer&) const override; diff --git a/src/py-opentimelineio/opentimelineio-bindings/otio_serializableObjects.cpp b/src/py-opentimelineio/opentimelineio-bindings/otio_serializableObjects.cpp index e928336ad..d5e937c90 100644 --- a/src/py-opentimelineio/opentimelineio-bindings/otio_serializableObjects.cpp +++ b/src/py-opentimelineio/opentimelineio-bindings/otio_serializableObjects.cpp @@ -183,6 +183,9 @@ static void define_bases1(py::module m) { .def_property_readonly("is_unknown_schema", &SerializableObject::is_unknown_schema); py::class_>(m, "UnknownSchema") + .def_property_readonly("data", [](UnknownSchema* schema) { + auto ptr = schema->data().get_or_create_mutation_stamp(); + return (AnyDictionaryProxy*)(ptr); }, py::return_value_policy::take_ownership) .def_property_readonly("original_schema_name", &UnknownSchema::original_schema_name) .def_property_readonly("original_schema_version", &UnknownSchema::original_schema_version); diff --git a/tests/test_unknown_schema.py b/tests/test_unknown_schema.py index 54e2b89b6..fdfcc44f6 100644 --- a/tests/test_unknown_schema.py +++ b/tests/test_unknown_schema.py @@ -63,6 +63,32 @@ def test_is_unknown_schema(self): unknown = self.orig.media_reference.metadata["stuff"] self.assertTrue(unknown.is_unknown_schema) + def test_unknown_to_dict(self): + unknown = self.orig.media_reference.metadata["stuff"] + self.assertTrue(unknown.is_unknown_schema) + unknown_data = unknown.data + self.assertIsNotNone( + unknown_data + ) + + self.assertEqual( + unknown_data, + { + "some_data": 895, + "howlongami": otio.opentime.RationalTime(rate=30, value=100) + } + ) + + # Mutation of unkown_data should not mutate the unknown object. + unknown_data["some_data"] = 0 + self.assertEqual( + unknown.data, + { + "some_data": 895, + "howlongami": otio.opentime.RationalTime(rate=30, value=100) + } + ) + if __name__ == '__main__': unittest.main()