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 pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy