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 def __init__(self): 

11 self.always_from_toolz = { 

12 toolz.pipe, 

13 } 

14 

15 def _load_toolz(self, fullname): 

16 rv = {} 

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

18 try: 

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

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

21 except ImportError: 

22 pass 

23 try: 

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

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

26 except ImportError: 

27 pass 

28 if not rv: 

29 raise ImportError(fullname) 

30 return rv 

31 

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

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

34 if package == 'tlz': 

35 return self 

36 

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

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

39 return sys.modules[fullname] 

40 spec = ModuleSpec(fullname, self) 

41 module = self.create_module(spec) 

42 sys.modules[fullname] = module 

43 self.exec_module(module) 

44 return module 

45 

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

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

48 if package == 'tlz': 

49 return ModuleSpec(fullname, self) 

50 

51 def create_module(self, spec): 

52 return types.ModuleType(spec.name) 

53 

54 def exec_module(self, module): 

55 toolz_mods = self._load_toolz(module.__name__) 

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

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

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

59 package = fast_mod.__package__ 

60 if package is not None: 

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

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

63 if not module.__doc__: 

64 module.__doc__ = fast_mod.__doc__ 

65 

66 # show file from toolz during introspection 

67 try: 

68 module.__file__ = slow_mod.__file__ 

69 except AttributeError: 

70 pass 

71 

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

73 tv = slow_mod.__dict__.get(k) 

74 try: 

75 hash(tv) 

76 except TypeError: 

77 tv = None 

78 if tv in self.always_from_toolz: 

79 module.__dict__[k] = tv 

80 elif ( 

81 isinstance(v, types.ModuleType) 

82 and v.__package__ == fast_mod.__name__ 

83 ): 

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

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

86 submodule = import_module(module_name) 

87 module.__dict__[k] = submodule 

88 

89 

90tlz_loader = TlzLoader() 

91sys.meta_path.append(tlz_loader) 

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