Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/tlz/_build_tlz.py: 81%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

67 statements  

1import sys 

2import types 

3import toolz 

4from importlib import import_module 

5from importlib.machinery import ModuleSpec 

6 

7 

8class TlzLoader: 

9 """ Finds and loads ``tlz`` modules when added to sys.meta_path""" 

10 

11 def __init__(self): 

12 self.always_from_toolz = { 

13 toolz.pipe, 

14 } 

15 

16 def _load_toolz(self, fullname): 

17 rv = {} 

18 package, dot, submodules = fullname.partition('.') 

19 try: 

20 module_name = ''.join(['cytoolz', dot, submodules]) 

21 rv['cytoolz'] = import_module(module_name) 

22 except ImportError: 

23 pass 

24 try: 

25 module_name = ''.join(['toolz', dot, submodules]) 

26 rv['toolz'] = import_module(module_name) 

27 except ImportError: 

28 pass 

29 if not rv: 

30 raise ImportError(fullname) 

31 return rv 

32 

33 def find_module(self, fullname, path=None): # pragma: py3 no cover 

34 package, dot, submodules = fullname.partition('.') 

35 if package == 'tlz': 

36 return self 

37 

38 def load_module(self, fullname): # pragma: py3 no cover 

39 if fullname in sys.modules: # pragma: no cover 

40 return sys.modules[fullname] 

41 spec = ModuleSpec(fullname, self) 

42 module = self.create_module(spec) 

43 sys.modules[fullname] = module 

44 self.exec_module(module) 

45 return module 

46 

47 def find_spec(self, fullname, path, target=None): # pragma: no cover 

48 package, dot, submodules = fullname.partition('.') 

49 if package == 'tlz': 

50 return ModuleSpec(fullname, self) 

51 

52 def create_module(self, spec): 

53 return types.ModuleType(spec.name) 

54 

55 def exec_module(self, module): 

56 toolz_mods = self._load_toolz(module.__name__) 

57 fast_mod = toolz_mods.get('cytoolz') or toolz_mods['toolz'] 

58 slow_mod = toolz_mods.get('toolz') or toolz_mods['cytoolz'] 

59 module.__dict__.update(toolz.merge(fast_mod.__dict__, module.__dict__)) 

60 package = fast_mod.__package__ 

61 if package is not None: 

62 package, dot, submodules = package.partition('.') 

63 module.__package__ = ''.join(['tlz', dot, submodules]) 

64 if not module.__doc__: 

65 module.__doc__ = fast_mod.__doc__ 

66 

67 # show file from toolz during introspection 

68 try: 

69 module.__file__ = slow_mod.__file__ 

70 except AttributeError: 

71 pass 

72 

73 for k, v in fast_mod.__dict__.items(): 

74 tv = slow_mod.__dict__.get(k) 

75 try: 

76 hash(tv) 

77 except TypeError: 

78 tv = None 

79 if tv in self.always_from_toolz: 

80 module.__dict__[k] = tv 

81 elif ( 

82 isinstance(v, types.ModuleType) 

83 and v.__package__ == fast_mod.__name__ 

84 ): 

85 package, dot, submodules = v.__name__.partition('.') 

86 module_name = ''.join(['tlz', dot, submodules]) 

87 submodule = import_module(module_name) 

88 module.__dict__[k] = submodule 

89 

90 

91tlz_loader = TlzLoader() 

92sys.meta_path.append(tlz_loader) 

93tlz_loader.exec_module(sys.modules['tlz'])