77
88from flatdata .generator .tree .builder import build_ast
99from flatdata .generator .tree .nodes .trivial .namespace import Namespace
10+ from flatdata .generator .tree .nodes .node import Node
1011
1112from .generators .cpp import CppGenerator
1213from .generators .dot import DotGenerator
@@ -69,7 +70,7 @@ def render_python_module(self, module_name=None, archive_name=None, root_namespa
6970 if specified, archive type is returned along with the model
7071 :param root_namespace: Root namespace to pick in case of multiple top level namespaces.
7172 """
72- root_namespace = self ._find_root_namespace (self .tree , root_namespace )
73+ root_namespace = self ._find_root_namespace (self .tree , archive_name , root_namespace )
7374 module_code = self .render ("py" )
7475 module = types .ModuleType (module_name if module_name is not None else root_namespace .name )
7576 #pylint: disable=exec-used
@@ -90,7 +91,7 @@ def _create_generator(cls, name):
9091 return generator_type ()
9192
9293 @staticmethod
93- def _find_root_namespace (tree , root_namespace = None ):
94+ def _find_root_namespace (tree , archive_name , root_namespace = None ):
9495 root_children = tree .root .children
9596 root_namespaces = [
9697 child for child in root_children
@@ -103,6 +104,13 @@ def _find_root_namespace(tree, root_namespace=None):
103104 if namespace .name == root_namespace :
104105 return namespace
105106 raise RuntimeError ("Invalid root namespace provided. Could not find root namespace in archive." )
107+ elif archive_name :
108+ for namespace in root_namespaces :
109+ archive_path = namespace .name + Node .PATH_SEPARATOR + archive_name
110+ archive_node = namespace .get (archive_path )
111+ if archive_node is not None :
112+ return namespace
113+ raise RuntimeError ("Archive direct parent namespace is not a root namespace." )
106114 elif len (root_namespaces ) > 1 :
107115 raise RuntimeError ("Ambiguous root namespace. Could not find root archive." )
108116
0 commit comments