Coverage for gws-app/gws/lib/importer/_test.py: 0%
67 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-17 01:37 +0200
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-17 01:37 +0200
1import sys
2import os
4import pytest
6import gws
7import gws.lib.importer as importer
10@pytest.fixture
11def import_log():
12 _sys = {}
13 _sys['path'] = list(sys.path)
14 _sys['modules'] = dict(sys.modules)
15 setattr(gws, 'IMPORT_LOG', [])
17 yield getattr(gws, 'IMPORT_LOG')
19 sys.path.clear()
20 sys.path.extend(_sys['path'])
21 sys.modules.clear()
22 sys.modules.update(_sys['modules'])
23 delattr(gws, 'IMPORT_LOG')
26@pytest.fixture(scope='module')
27def packages_path(tmpdir_factory):
28 base = str(tmpdir_factory.mktemp('importer'))
29 files = {
30 "/p1/__init__.py":
31 "gws.IMPORT_LOG.append('p1.init')",
32 "/p1/mod.py":
33 "gws.IMPORT_LOG.append('p1.mod')",
34 "/p1/dot.py":
35 "gws.IMPORT_LOG.append('p1.dot'); from . import mod",
36 "/p2/deep/root/base/__init__.py":
37 "gws.IMPORT_LOG.append('p2.base.init')",
38 "/p2/deep/root/base/sub/__init__.py":
39 "gws.IMPORT_LOG.append('p2.base.sub.init')",
40 "/p2/deep/root/base/sub/sub2/__init__.py":
41 "gws.IMPORT_LOG.append('p2.base.sub.sub2.init')",
42 "/p2/deep/root/base/sub/sub2/mod.py":
43 "gws.IMPORT_LOG.append('p2.base.sub.sub2.mod')",
44 "/p3/mod.py":
45 "gws.IMPORT_LOG.append('p3.mod')",
46 "/p4/__init__.py":
47 "gws.IMPORT_LOG.append('p4.init'); from . import circular",
48 "/p4/mod.py":
49 "gws.IMPORT_LOG.append('p4.mod')",
50 "/p4/circular.py":
51 "gws.IMPORT_LOG.append('p4.circular'); from . import mod",
52 "/p5/a/same_name/__init__.py":
53 "gws.IMPORT_LOG.append('p5.a.same_name.init')",
54 "/p5/b/same_name/__init__.py":
55 "gws.IMPORT_LOG.append('p5.b.same_name.init')",
56 "/p0/err.py":
57 "syntax error",
58 }
60 for path, text in files.items():
61 path = base + path
62 os.makedirs(os.path.dirname(path), exist_ok=True)
63 gws.u.write_file(path, 'import gws; ' + text)
65 yield base
68def test_app_module():
69 mod = importer.import_from_path(gws.c.APP_DIR + '/gws/lib/importer')
70 assert mod.__name__ == 'gws.lib.importer'
73def test_app_relative_path():
74 mod = importer.import_from_path('gws/lib/importer')
75 assert mod.__name__ == 'gws.lib.importer'
78def test_import_init(import_log, packages_path):
79 importer.import_from_path(packages_path + '/p1')
80 assert import_log == ['p1.init']
83def test_import_named(import_log, packages_path):
84 importer.import_from_path(packages_path + '/p1/mod.py')
85 assert import_log == ['p1.init', 'p1.mod']
88def test_import_with_dot(import_log, packages_path):
89 importer.import_from_path(packages_path + '/p1/dot.py')
90 assert import_log == ['p1.init', 'p1.dot', 'p1.mod']
93def test_import_deep_init(import_log, packages_path):
94 importer.import_from_path(packages_path + '/p2/deep/root/base/sub/sub2')
95 assert import_log == ['p2.base.init', 'p2.base.sub.init', 'p2.base.sub.sub2.init']
98def test_import_deep_named(import_log, packages_path):
99 importer.import_from_path(packages_path + '/p2/deep/root/base/sub/sub2/mod.py')
100 assert import_log == ['p2.base.init', 'p2.base.sub.init', 'p2.base.sub.sub2.init', 'p2.base.sub.sub2.mod']
103def test_import_no_init(import_log, packages_path):
104 importer.import_from_path(packages_path + '/p3/mod.py')
105 assert import_log == ['p3.mod']
108def test_with_circular_dependency(import_log, packages_path):
109 importer.import_from_path(packages_path + '/p4/circular.py')
110 assert import_log == ['p4.init', 'p4.circular', 'p4.mod']
113def test_no_double_import(import_log, packages_path):
114 importer.import_from_path(packages_path + '/p3/mod.py')
115 importer.import_from_path(packages_path + '/p3/mod.py')
116 assert import_log == ['p3.mod']
119def test_err_not_found(import_log, packages_path):
120 with pytest.raises(importer.Error):
121 importer.import_from_path(packages_path + '/BLAH')
124def test_err_import_error(import_log, packages_path):
125 with pytest.raises(importer.Error):
126 importer.import_from_path(packages_path + '/p0/err.py')
129def test_err_same_name(import_log, packages_path):
130 importer.import_from_path(packages_path + '/p5/a/same_name')
131 with pytest.raises(importer.Error):
132 importer.import_from_path(packages_path + '/p5/b/same_name')