diff --git a/fastavro/_schema.pyx b/fastavro/_schema.pyx index d622f710..1c36b34f 100644 --- a/fastavro/_schema.pyx +++ b/fastavro/_schema.pyx @@ -72,12 +72,12 @@ cpdef schema_name(schema, parent_ns): ) namespace = schema.get("namespace", parent_ns) - if not namespace: - return namespace, name - elif "." in name: - return "", name - else: + if "." in name: + return name.rsplit(".", 1)[0], name + elif namespace: return namespace, f"{namespace}.{name}" + else: + return "", name cpdef expand_schema(schema): diff --git a/fastavro/_schema_py.py b/fastavro/_schema_py.py index d3021458..bb8fb543 100644 --- a/fastavro/_schema_py.py +++ b/fastavro/_schema_py.py @@ -103,12 +103,12 @@ def schema_name(schema: DictSchema, parent_ns: str) -> Tuple[str, str]: ) namespace = schema.get("namespace", parent_ns) - if not namespace: - return namespace, name - elif "." in name: - return "", name - else: + if "." in name: + return name.rsplit(".", 1)[0], name + elif namespace: return namespace, f"{namespace}.{name}" + else: + return "", name def expand_schema(schema: Schema) -> Schema: diff --git a/tests/test_schema.py b/tests/test_schema.py index 9a2f4551..91af0a1a 100644 --- a/tests/test_schema.py +++ b/tests/test_schema.py @@ -1334,3 +1334,24 @@ def test_special_case_defaults(field_type, default_value): } fastavro.parse_schema(schema) + + +def test_namespace_respected(): + """https://github.com/fastavro/fastavro/issues/690""" + schema = { + "type": "record", + "name": "explicit_namespace.foo", + "fields": [ + { + "name": "field1", + "type": { + "type": "record", + "name": "bar", + "fields": [{"name": "bar_field", "type": "int"}], + }, + }, + {"name": "field2", "type": "explicit_namespace.bar"}, + ], + } + + fastavro.parse_schema(schema)