From e9ddcff58859e031706d1554cb1ae4dbd595ab97 Mon Sep 17 00:00:00 2001 From: Andreas Motl Date: Sun, 22 Sep 2024 04:07:58 +0200 Subject: [PATCH] MongoDB: Fix edge case when decoding MongoDB Extended JSON elements --- CHANGES.md | 1 + src/commons_codec/transform/mongodb.py | 2 +- tests/transform/mongodb/data.py | 6 ++++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index f80ba3f..98ee265 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,7 @@ # Changelog ## Unreleased +- MongoDB: Fixed edge case when decoding MongoDB Extended JSON elements ## 2024/09/19 v0.0.16 - MongoDB: Added `MongoDBFullLoadTranslator` and `MongoDBCrateDBConverter` diff --git a/src/commons_codec/transform/mongodb.py b/src/commons_codec/transform/mongodb.py index 3f19e85..69b6047 100644 --- a/src/commons_codec/transform/mongodb.py +++ b/src/commons_codec/transform/mongodb.py @@ -71,7 +71,7 @@ def decode_value(self, value: t.Any) -> t.Any: """ if isinstance(value, dict): # Decode item in BSON CANONICAL format. - if len(value) == 1: + if len(value) == 1 and next(iter(value)).startswith("$"): return self.decode_canonical(value) # Custom adjustments to compensate shape anomalies in source data. diff --git a/tests/transform/mongodb/data.py b/tests/transform/mongodb/data.py index ddcff7a..53e6265 100644 --- a/tests/transform/mongodb/data.py +++ b/tests/transform/mongodb/data.py @@ -55,7 +55,7 @@ "canonical": { "code_ascii": {"$code": "abab"}, "code_bytes": {"$code": "ab\u0000ab\u0000"}, - "code_scope": {"$code": "abab", "$scope": {"x": {"$numberInt": 42}}}, + "code_scope": {"$code": "abab", "$scope": {"x": {"$numberInt": "42"}}}, "date_iso8601": {"$date": "2015-09-23T10:32:42.33Z"}, "date_numberlong": {"$date": {"$numberLong": "1356351330000"}}, "dbref": { @@ -78,6 +78,7 @@ ], "list_dict": [ {"id": "bar", "value": {"$date": "2015-09-24T10:32:42.33Z"}}, + {"value": {"$date": "2015-09-24T10:32:42.33Z"}}, ], "list_int": [ {"$numberInt": "-2147483648"}, @@ -163,7 +164,7 @@ "code_scope": { "$code": "abab", "$scope": { - "x": {"$numberInt": 42}, + "x": 42, }, }, "date_iso8601": 1443004362000, @@ -187,6 +188,7 @@ ], "list_dict": [ {"id": "bar", "value": 1443090762000}, + {"value": 1443090762000}, ], "list_int": [ -2147483648,