From 1a4164611c3d905a42cca3667ad30a885e9d6074 Mon Sep 17 00:00:00 2001 From: Natchar Ratanasirigulchai Date: Fri, 27 Sep 2024 15:53:48 -0700 Subject: [PATCH 1/2] Bindings: UnknownSchema added data property Signed-off-by: Natchar Ratanasirigulchai --- src/opentimelineio/unknownSchema.h | 5 ++++ .../otio_serializableObjects.cpp | 3 +++ tests/test_unknown_schema.py | 26 +++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/src/opentimelineio/unknownSchema.h b/src/opentimelineio/unknownSchema.h index 0d13538b93..7d45c5878a 100644 --- a/src/opentimelineio/unknownSchema.h +++ b/src/opentimelineio/unknownSchema.h @@ -39,6 +39,11 @@ class OTIO_API_TYPE 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 4268a4cf64..f8825c9078 100644 --- a/src/py-opentimelineio/opentimelineio-bindings/otio_serializableObjects.cpp +++ b/src/py-opentimelineio/opentimelineio-bindings/otio_serializableObjects.cpp @@ -301,6 +301,9 @@ define_bases1(py::module m) 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) diff --git a/tests/test_unknown_schema.py b/tests/test_unknown_schema.py index 54e2b89b61..fdfcc44f66 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() From fbe8c3bf59664c27b29861129caab6a04ed73114 Mon Sep 17 00:00:00 2001 From: Natchar Ratanasirigulchai Date: Thu, 14 May 2026 09:21:53 -0700 Subject: [PATCH 2/2] UnknownSchema: return copy of data Signed-off-by: Natchar Ratanasirigulchai --- src/opentimelineio/unknownSchema.h | 1 + .../opentimelineio-bindings/otio_serializableObjects.cpp | 5 +++-- tests/test_unknown_schema.py | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/opentimelineio/unknownSchema.h b/src/opentimelineio/unknownSchema.h index 7d45c5878a..04b22a2b6f 100644 --- a/src/opentimelineio/unknownSchema.h +++ b/src/opentimelineio/unknownSchema.h @@ -39,6 +39,7 @@ class OTIO_API_TYPE UnknownSchema : public SerializableObject return _original_schema_version; } + /// @brief Return a copy of the data. AnyDictionary data() const noexcept { return _data; diff --git a/src/py-opentimelineio/opentimelineio-bindings/otio_serializableObjects.cpp b/src/py-opentimelineio/opentimelineio-bindings/otio_serializableObjects.cpp index f8825c9078..1c2efa480a 100644 --- a/src/py-opentimelineio/opentimelineio-bindings/otio_serializableObjects.cpp +++ b/src/py-opentimelineio/opentimelineio-bindings/otio_serializableObjects.cpp @@ -302,8 +302,9 @@ define_bases1(py::module m) 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) + AnyDictionary copy = schema->data(); + return any_to_py(copy, true /*top_level*/); + }) .def_property_readonly( "original_schema_name", &UnknownSchema::original_schema_name) diff --git a/tests/test_unknown_schema.py b/tests/test_unknown_schema.py index fdfcc44f66..bf5de86975 100644 --- a/tests/test_unknown_schema.py +++ b/tests/test_unknown_schema.py @@ -78,7 +78,7 @@ def test_unknown_to_dict(self): "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(