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

1import sys 

2import os 

3 

4import pytest 

5 

6import gws 

7import gws.lib.importer as importer 

8 

9 

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', []) 

16 

17 yield getattr(gws, 'IMPORT_LOG') 

18 

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') 

24 

25 

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 } 

59 

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) 

64 

65 yield base 

66 

67 

68def test_app_module(): 

69 mod = importer.import_from_path(gws.c.APP_DIR + '/gws/lib/importer') 

70 assert mod.__name__ == 'gws.lib.importer' 

71 

72 

73def test_app_relative_path(): 

74 mod = importer.import_from_path('gws/lib/importer') 

75 assert mod.__name__ == 'gws.lib.importer' 

76 

77 

78def test_import_init(import_log, packages_path): 

79 importer.import_from_path(packages_path + '/p1') 

80 assert import_log == ['p1.init'] 

81 

82 

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'] 

86 

87 

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'] 

91 

92 

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'] 

96 

97 

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'] 

101 

102 

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'] 

106 

107 

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'] 

111 

112 

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'] 

117 

118 

119def test_err_not_found(import_log, packages_path): 

120 with pytest.raises(importer.Error): 

121 importer.import_from_path(packages_path + '/BLAH') 

122 

123 

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') 

127 

128 

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')