From 6984ee28e77f7c4f172f225fa1877cbb5a49d435 Mon Sep 17 00:00:00 2001 From: Daniel Fernandez Date: Thu, 1 Dec 2016 14:08:05 -0700 Subject: [PATCH 1/3] Addresses issue #261 with providing more detail information missing dependencies with ImportError Exceptions --- src/runtime/assemblymanager.cs | 32 ++++++++++++++++++++++++++++++++ src/runtime/importhook.cs | 30 +++++++++++++++++++++++++++++- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/src/runtime/assemblymanager.cs b/src/runtime/assemblymanager.cs index 5d9759375..70134db5f 100644 --- a/src/runtime/assemblymanager.cs +++ b/src/runtime/assemblymanager.cs @@ -338,6 +338,38 @@ public static bool LoadImplicit(string name, bool warn = true) return loaded; } + //=================================================================== + // Return the Assembly for a given name + //=================================================================== + internal static Assembly GetAssembly(string name) + { + string[] names = name.Split('.'); + string s = ""; + HashSet assembliesSet = null; + for (int i = 0; i < names.Length; i++) + { + s = (i == 0) ? names[0] : s + "." + names[i]; + if (assembliesSet == null) + { + assembliesSet = new HashSet(AppDomain.CurrentDomain.GetAssemblies()); + } + Assembly a = FindLoadedAssembly(s); + if (a == null) + { + a = LoadAssemblyPath(s); + } + if (a == null) + { + a = LoadAssembly(s); + } + if (a != null && assembliesSet.Contains(a)) + { + return a; + } + } + return null; + } + //=================================================================== // Scans an assembly for exported namespaces, adding them to the diff --git a/src/runtime/importhook.cs b/src/runtime/importhook.cs index 8f8f032db..0da6431dd 100644 --- a/src/runtime/importhook.cs +++ b/src/runtime/importhook.cs @@ -278,7 +278,35 @@ public static IntPtr __import__(IntPtr self, IntPtr args, IntPtr kw) { // May be called when a module being imported imports a module. // In particular, I've seen decimal import copy import org.python.core - return Runtime.PyObject_Call(py_import, args, kw); + var res = Runtime.PyObject_Call(py_import, args, kw); + + // Check if there is an ImportError Exception if so + // determine which dependencies are missing + if(Exceptions.ExceptionMatches(Exceptions.ImportError)) + { + var target_assembly = AssemblyManager.GetAssembly(realname); + if (target_assembly != null) + { + System.Collections.Generic.List missing_dependencies = + new System.Collections.Generic.List(); + foreach (var assembly in target_assembly.GetReferencedAssemblies()) + { + var depedentAssembly = AssemblyManager.LoadAssembly(assembly.Name); + if (depedentAssembly == null) + missing_dependencies.Add(assembly.Name); + } + + if (missing_dependencies.Count > 0) + { + // We found missing dependencies + string error = String.Format("No module named {0} missing dependencies {1}", + realname, String.Join(", ", missing_dependencies)); + Exceptions.SetError(Exceptions.ImportError, error); + } + } + } + return res; + } } From 21f8a1b0f37f6021e2bdce988b85cdbd926926f5 Mon Sep 17 00:00:00 2001 From: Daniel Fernandez Date: Thu, 1 Dec 2016 22:25:29 -0700 Subject: [PATCH 2/3] Added unit test for fix for #261 added .NET DLL with missing dependency --- src/tests/test_suite/_missing_import_dependency.py | 5 +++++ src/tests/test_suite/test_import.py | 6 ++++++ 2 files changed, 11 insertions(+) create mode 100644 src/tests/test_suite/_missing_import_dependency.py diff --git a/src/tests/test_suite/_missing_import_dependency.py b/src/tests/test_suite/_missing_import_dependency.py new file mode 100644 index 000000000..bc69663dc --- /dev/null +++ b/src/tests/test_suite/_missing_import_dependency.py @@ -0,0 +1,5 @@ +import os +import clr +path_to_dll = os.path.join(os.path.dirname(__file__), "TestDependencyAssembly.dll") +clr.AddReference(path_to_dll) +from TestDependencyAssembly import TestDependency \ No newline at end of file diff --git a/src/tests/test_suite/test_import.py b/src/tests/test_suite/test_import.py index b6d155af3..5a9af0843 100644 --- a/src/tests/test_suite/test_import.py +++ b/src/tests/test_suite/test_import.py @@ -9,6 +9,12 @@ def testRealtiveMissingImport(self): from . import _missing_import except ImportError: pass + + def testMissingImportDepencency(self): + missing_dependency_name = "MissingDependencyAssembly" + with self.assertRaisesRegexp(ImportError, missing_dependency_name): + from . import _missing_import_dependency + def test_suite(): From 6c8c63c3ceb1fb9cdfbe97119408db90b2e83e89 Mon Sep 17 00:00:00 2001 From: Daniel Fernandez Date: Thu, 1 Dec 2016 22:33:47 -0700 Subject: [PATCH 3/3] Add C# dll to test missing dependency ImportError --- src/tests/test_suite/TestDependencyAssembly.dll | Bin 0 -> 4096 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/tests/test_suite/TestDependencyAssembly.dll diff --git a/src/tests/test_suite/TestDependencyAssembly.dll b/src/tests/test_suite/TestDependencyAssembly.dll new file mode 100644 index 0000000000000000000000000000000000000000..d33ce392a3ef55e73b40a60e80eb7d8885f2fa5e GIT binary patch literal 4096 zcmeHKTWl0n82)E_p%f`sxs~9+A_CIQE^VRpx^1_VN^f?TTCtJN&Yo@uW@px!+0s>G z>VpOoVhkbrral-Wi6)wmNW6r^i1CH!qmPhi;)BLVgAd^MpV{edw=EH4Vq*Na=RfDa zod5inbD0jFc!O$)s21(^ZKBKQ8R8P(8O=f5bl+!9bZOYHM zgH|oO6RrC02PzGqj|K$#h$m(}^dGJOQqefplHV9fP>CiZj_c^4q;GKyxKNE~6%dE_ z5l5Id6xmmrL}Ob`XcZ7A>aHN=@GR#Qz`lj3j>c7@uj_~uX8sM>5!$;34({(xKGCg| ztgufrZINiCHQE~MWTSOt0)K%;!Y>i+g|D+{;iTsnR@P;WcM&It8a|$+_b}iRhWn29 zC(vJFn&)<#b{aGTrYn6LiB>Z4htf)${1|v1WYQBjCR4((F^}lH;>TG}ztZnYJ)KY( z@1(2B8rlq%dg`Z-!1-R{PbBVAn6p~qJrYk!emngD{sxIJNX`p1t2EM{P@i1PUx{;~ zAexSl7V47Y5tTi8b;}jZR^a~?__PkVp0)xv(mvp|6qC49;x38%C4N%krzO^a?2<99y zOfe=L*RZYftU%afTT@21;Aq~G;)HN@$H*@f!tcCc${C}=)Mn+#U2J>AK~8jUv7pD! z7ab!zy`(6Y*Q{cB&S=5%jGW*#u}<1B4X;9)EV`b^MM_GMQkXb>loGC&5P4x`grygQ za3dMhq+pVmGKJ2eQAGD_C*UUxEo<4XXXtLg3heh=o^b4ZQaCe)E*6RX#0Y0z?pGb| zV0S=$&~RN4Ww)xlT&xiIU8OkB=Dqh#^LRLU{^anh;h)~#aP!9tRI4gVLybyG9R};x zG1j_L(8%4^r;D)AECKo8I?#rla}uP zE9k}2o63v7$zzpAiy?S>eaXol+ew(_pk`S9T_}V+bS%AnKWxaan8jB9Ne;hEL|cgF z7Fy-aPK4dHh|hZb?JyoEI#cSisR1Q9wpc$gLo62^_Aa$Tqjyr}| zJ38OEI?d4M%z0ARf}duEw|BFC1iqR0F&w4!usZ;oS!t0om4}a<=`2lSHIms|$W!Se zHn~a%;bV;W_Sp|Bm3I7!at?B^>)<;i$U4!pGM3@e8eCD1CCD*TTq%6-1H16xujI5c zrXg9g5!km8X#w@}Dl&C