Salome HOME
CCAR: import_hook.py was too strict in ensure_list (ImportError raised)
[modules/kernel.git] / src / KERNEL_PY / import_hook.py
index 05781dd93a5988ba5ac92a65fccb46e0125483fc..fcbdb1602bf22f926c2579f0cb451126c3730260 100755 (executable)
@@ -1,5 +1,5 @@
 #  -*- coding: iso-8859-1 -*-
 #  -*- coding: iso-8859-1 -*-
-#  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+#  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
 #
 #  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 #  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
 #
 #  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 #  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -20,6 +20,7 @@
 #
 #  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
 #
 #  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
+
 """
 This module replaces the standard import mechanism with one
 that filters some imports that can't be done more than once.
 """
 This module replaces the standard import mechanism with one
 that filters some imports that can't be done more than once.
@@ -118,6 +119,7 @@ def import_module(partname, fqname, parent):
     """ Try to import module fqname
         It's parent is module parent and has name partname
     """
     """ Try to import module fqname
         It's parent is module parent and has name partname
     """
+    #print "import_module",partname, fqname, parent
     try:
        m = sys.modules[fqname]
     except KeyError:
     try:
        m = sys.modules[fqname]
     except KeyError:
@@ -128,6 +130,7 @@ def import_module(partname, fqname, parent):
 def ensure_fromlist(m, fromlist, recursive=0):
     """ Return the real modules list to be imported
     """
 def ensure_fromlist(m, fromlist, recursive=0):
     """ Return the real modules list to be imported
     """
+    #print "ensure_fromlist",m, fromlist, recursive
     l=[]
     for sub in fromlist:
         if sub == "*":
     l=[]
     for sub in fromlist:
         if sub == "*":
@@ -138,26 +141,38 @@ def ensure_fromlist(m, fromlist, recursive=0):
                     pass
                 else:
                     l.extend(ensure_fromlist(m, all, 1))
                     pass
                 else:
                     l.extend(ensure_fromlist(m, all, 1))
-        elif hasattr(m,sub):
-            submod=getattr(m,sub)
+        else:
+          #try to find if sub is an attribute (eventually dotted) of m
+          components=sub.split('.')
+          has_submod=True
+          submod=m
+          for comp in components:
+            if hasattr(submod,comp):
+              submod=getattr(submod, comp)
+            else:
+              has_submod=False
+              break
+
+          if has_submod:
+            #the attribute has been found
             if type(submod) == type(sys):
                l.append(("%s.%s" % (m.__name__, sub),submod))
             if type(submod) == type(sys):
                l.append(("%s.%s" % (m.__name__, sub),submod))
-        else:
+          else:
             subname="%s.%s" % (m.__name__, sub)
             submod = import_module(sub, subname, m)
             subname="%s.%s" % (m.__name__, sub)
             submod = import_module(sub, subname, m)
-            if not submod:
-               raise ImportError, "No module named " + subname
-            l.append((subname,submod))
+            #if not found ignore it
+            if submod:
+              l.append((subname,submod))
     return l
 
     return l
 
-def import_hook(name, globals=None, locals=None, fromlist=None, *args):
+def import_hook(name, globals=None, locals=None, fromlist=None, *args, **kwds):
     """ Import replacement for sharing modules among multiple interpreters
         Mostly update sys.modules before doing real import
     """
     #print "import_hook",name,fromlist
     m=get_shared_imported(name,fromlist)
 
     """ Import replacement for sharing modules among multiple interpreters
         Mostly update sys.modules before doing real import
     """
     #print "import_hook",name,fromlist
     m=get_shared_imported(name,fromlist)
 
-    module= original_import(name, globals, locals, fromlist, *args)
+    module= original_import(name, globals, locals, fromlist, *args, **kwds)
 
     if fromlist:
        #when fromlist is specified, module is the real module
 
     if fromlist:
        #when fromlist is specified, module is the real module