##// END OF EJS Templates
Deprecate use of imp library, condense module_paths module to only one function, update tests
Alyssa Whitwell -
Show More
@@ -2,14 +2,7 b''
2 2
3 3 Utility functions for finding modules on sys.path.
4 4
5 `find_mod` finds named module on sys.path.
6
7 `get_init` helper function that finds __init__ file in a directory.
8
9 `find_module` variant of imp.find_module in std_lib that only returns
10 path to module and not an open file object as well.
11
12
5 `find_module` returns a path to module or None, given certain conditions.
13 6
14 7 """
15 8 #-----------------------------------------------------------------------------
@@ -25,7 +18,7 b' path to module and not an open file object as well.'
25 18 #-----------------------------------------------------------------------------
26 19
27 20 # Stdlib imports
28 import imp
21 import importlib
29 22 import os
30 23
31 24 # Third-party imports
@@ -44,81 +37,34 b' import os'
44 37 #-----------------------------------------------------------------------------
45 38 # Classes and functions
46 39 #-----------------------------------------------------------------------------
47 def find_module(name, path=None):
48 """imp.find_module variant that only return path of module.
49
50 The `imp.find_module` returns a filehandle that we are not interested in.
51 Also we ignore any bytecode files that `imp.find_module` finds.
52
53 Parameters
54 ----------
55 name : str
56 name of module to locate
57 path : list of str
58 list of paths to search for `name`. If path=None then search sys.path
59 40
60 Returns
61 -------
62 filename : str
63 Return full path of module or None if module is missing or does not have
64 .py or .pyw extension
65 """
66 if name is None:
67 return None
68 try:
69 file, filename, _ = imp.find_module(name, path)
70 except ImportError:
71 return None
72 if file is None:
73 return filename
74 else:
75 file.close()
76 if os.path.splitext(filename)[1] in [".py", ".pyc"]:
77 return filename
78 else:
79 return None
80
81 def get_init(dirname):
82 """Get __init__ file path for module directory
83
84 Parameters
85 ----------
86 dirname : str
87 Find the __init__ file in directory `dirname`
88
89 Returns
90 -------
91 init_path : str
92 Path to __init__ file
41 def find_mod(module_name):
93 42 """
94 fbase = os.path.join(dirname, "__init__")
95 for ext in [".py", ".pyw"]:
96 fname = fbase + ext
97 if os.path.isfile(fname):
98 return fname
43 Find module `module_name` on sys.path, and return the path to module `module_name`.
99 44
45 - If `module_name` refers to a module directory, then return path to __init__ file.
46 - If `module_name` is a directory without an __init__file, return None.
47 - If module is missing or does not have a `.py` or `.pyw` extension, return None.
48 - Note that we are not interested in running bytecode.
49 - Otherwise, return the fill path of the module.
100 50
101 def find_mod(module_name):
102 """Find module `module_name` on sys.path
103
104 Return the path to module `module_name`. If `module_name` refers to
105 a module directory then return path to __init__ file. Return full
106 path of module or None if module is missing or does not have .py or .pyw
107 extension. We are not interested in running bytecode.
108
109 51 Parameters
110 52 ----------
111 53 module_name : str
112 54
113 55 Returns
114 56 -------
115 modulepath : str
116 Path to module `module_name`.
57 module_path : str
58 Path to module `module_name`, its __init__.py, or None,
59 depending on above conditions.
117 60 """
118 parts = module_name.split(".")
119 basepath = find_module(parts[0])
120 for submodname in parts[1:]:
121 basepath = find_module(submodname, [basepath])
122 if basepath and os.path.isdir(basepath):
123 basepath = get_init(basepath)
124 return basepath
61 loader = importlib.util.find_spec(module_name)
62 module_path = loader.origin
63 if module_path is None:
64 return None
65 else:
66 split_path = module_path.split(".")
67 if split_path[1] in ["py", "pyw"]:
68 return module_path
69 else:
70 return None
@@ -66,62 +66,42 b' def teardown():'
66 66 shutil.rmtree(TMP_TEST_DIR)
67 67 sys.path = old_syspath
68 68
69
70 def test_get_init_1():
71 """See if get_init can find __init__.py in this testdir"""
72 with make_tempfile(join(TMP_TEST_DIR, "__init__.py")):
73 assert mp.get_init(TMP_TEST_DIR)
74
75 def test_get_init_2():
76 """See if get_init can find __init__.pyw in this testdir"""
77 with make_tempfile(join(TMP_TEST_DIR, "__init__.pyw")):
78 assert mp.get_init(TMP_TEST_DIR)
79
80 def test_get_init_3():
81 """get_init can't find __init__.pyc in this testdir"""
82 with make_tempfile(join(TMP_TEST_DIR, "__init__.pyc")):
83 nt.assert_is_none(mp.get_init(TMP_TEST_DIR))
84
85 def test_get_init_4():
86 """get_init can't find __init__ in empty testdir"""
87 nt.assert_is_none(mp.get_init(TMP_TEST_DIR))
88
89
90 69 def test_find_mod_1():
70 """
71 Search for a directory's file path.
72 Expected output: a path to that directory's __init__.py file.
73 """
91 74 modpath = join(TMP_TEST_DIR, "xmod", "__init__.py")
92 75 nt.assert_equal(mp.find_mod("xmod"), modpath)
93 76
94 77 def test_find_mod_2():
78 """
79 Search for a directory's file path.
80 Expected output: a path to that directory's __init__.py file.
81 TODO: Confirm why this is a duplicate test.
82 """
95 83 modpath = join(TMP_TEST_DIR, "xmod", "__init__.py")
96 84 nt.assert_equal(mp.find_mod("xmod"), modpath)
97 85
98 86 def test_find_mod_3():
87 """
88 Search for a directory + a filename without its .py extension
89 Expected output: full path with .py extension.
90 """
99 91 modpath = join(TMP_TEST_DIR, "xmod", "sub.py")
100 92 nt.assert_equal(mp.find_mod("xmod.sub"), modpath)
101 93
102 94 def test_find_mod_4():
95 """
96 Search for a filename without its .py extension
97 Expected output: full path with .py extension
98 """
103 99 modpath = join(TMP_TEST_DIR, "pack.py")
104 100 nt.assert_equal(mp.find_mod("pack"), modpath)
105 101
106 102 def test_find_mod_5():
107 modpath = join(TMP_TEST_DIR, "packpyc.pyc")
108 nt.assert_equal(mp.find_mod("packpyc"), modpath)
109
110 def test_find_module_1():
111 modpath = join(TMP_TEST_DIR, "xmod")
112 nt.assert_equal(mp.find_module("xmod"), modpath)
113
114 def test_find_module_2():
115 """Testing sys.path that is empty"""
116 nt.assert_is_none(mp.find_module("xmod", []))
117
118 def test_find_module_3():
119 """Testing sys.path that is empty"""
120 nt.assert_is_none(mp.find_module(None, None))
121
122 def test_find_module_4():
123 """Testing sys.path that is empty"""
124 nt.assert_is_none(mp.find_module(None))
125
126 def test_find_module_5():
127 nt.assert_is_none(mp.find_module("xmod.nopack"))
103 """
104 Search for a filename with a .pyc extension
105 Expected output: TODO: do we exclude or include .pyc files?
106 """
107 nt.assert_equal(mp.find_mod("packpyc"), None)
General Comments 0
You need to be logged in to leave comments. Login now