99import sys
1010from types import ModuleType
1111
12- from .version import version as __version__
12+ from .version import version as __version__ # NOQA:F401
1313
1414
1515def _py_abspath (path ):
1616 """
1717 special version of abspath
1818 that will leave paths from jython jars alone
1919 """
20- if path .startswith (' __pyclasspath__' ):
20+ if path .startswith (" __pyclasspath__" ):
2121
2222 return path
2323 else :
@@ -28,6 +28,7 @@ def distribution_version(name):
2828 """try to get the version of the named distribution,
2929 returs None on failure"""
3030 from pkg_resources import get_distribution , DistributionNotFound
31+
3132 try :
3233 dist = get_distribution (name )
3334 except DistributionNotFound :
@@ -41,35 +42,37 @@ def initpkg(pkgname, exportdefs, attr=None, eager=False):
4142 attr = attr or {}
4243 oldmod = sys .modules .get (pkgname )
4344 d = {}
44- f = getattr (oldmod , ' __file__' , None )
45+ f = getattr (oldmod , " __file__" , None )
4546 if f :
4647 f = _py_abspath (f )
47- d ['__file__' ] = f
48- if hasattr (oldmod , '__version__' ):
49- d ['__version__' ] = oldmod .__version__
50- if hasattr (oldmod , '__loader__' ):
51- d ['__loader__' ] = oldmod .__loader__
52- if hasattr (oldmod , '__path__' ):
53- d ['__path__' ] = [_py_abspath (p ) for p in oldmod .__path__ ]
54- if hasattr (oldmod , '__package__' ):
55- d ['__package__' ] = oldmod .__package__
56- if '__doc__' not in exportdefs and getattr (oldmod , '__doc__' , None ):
57- d ['__doc__' ] = oldmod .__doc__
48+ d ["__file__" ] = f
49+ if hasattr (oldmod , "__version__" ):
50+ d ["__version__" ] = oldmod .__version__
51+ if hasattr (oldmod , "__loader__" ):
52+ d ["__loader__" ] = oldmod .__loader__
53+ if hasattr (oldmod , "__path__" ):
54+ d ["__path__" ] = [_py_abspath (p ) for p in oldmod .__path__ ]
55+ if hasattr (oldmod , "__package__" ):
56+ d ["__package__" ] = oldmod .__package__
57+ if "__doc__" not in exportdefs and getattr (oldmod , "__doc__" , None ):
58+ d ["__doc__" ] = oldmod .__doc__
59+ d ["__spec__" ] = getattr (oldmod , "__spec__" , None )
5860 d .update (attr )
5961 if hasattr (oldmod , "__dict__" ):
6062 oldmod .__dict__ .update (d )
6163 mod = ApiModule (pkgname , exportdefs , implprefix = pkgname , attr = d )
6264 sys .modules [pkgname ] = mod
6365 # eagerload in bypthon to avoid their monkeypatching breaking packages
64- if ' bpython' in sys .modules or eager :
66+ if " bpython" in sys .modules or eager :
6567 for module in list (sys .modules .values ()):
6668 if isinstance (module , ApiModule ):
6769 module .__dict__
70+ return mod
6871
6972
7073def importobj (modpath , attrname ):
7174 """imports a module, then resolves the attrname on it"""
72- module = __import__ (modpath , None , None , [' __doc__' ])
75+ module = __import__ (modpath , None , None , [" __doc__" ])
7376 if not attrname :
7477 return module
7578
@@ -82,20 +85,22 @@ def importobj(modpath, attrname):
8285
8386class ApiModule (ModuleType ):
8487 """the magical lazy-loading module standing"""
88+
8589 def __docget (self ):
8690 try :
8791 return self .__doc
8892 except AttributeError :
89- if ' __doc__' in self .__map__ :
90- return self .__makeattr (' __doc__' )
93+ if " __doc__" in self .__map__ :
94+ return self .__makeattr (" __doc__" )
9195
9296 def __docset (self , value ):
9397 self .__doc = value
98+
9499 __doc__ = property (__docget , __docset )
95100
96101 def __init__ (self , name , importspec , implprefix = None , attr = None ):
97102 self .__name__ = name
98- self .__all__ = [x for x in importspec if x != ' __onfirstaccess__' ]
103+ self .__all__ = [x for x in importspec if x != " __onfirstaccess__" ]
99104 self .__map__ = {}
100105 self .__implprefix__ = implprefix or name
101106 if attr :
@@ -104,47 +109,47 @@ def __init__(self, name, importspec, implprefix=None, attr=None):
104109 setattr (self , name , val )
105110 for name , importspec in importspec .items ():
106111 if isinstance (importspec , dict ):
107- subname = '%s.%s' % (self .__name__ , name )
112+ subname = "{}.{}" . format (self .__name__ , name )
108113 apimod = ApiModule (subname , importspec , implprefix )
109114 sys .modules [subname ] = apimod
110115 setattr (self , name , apimod )
111116 else :
112- parts = importspec .split (':' )
117+ parts = importspec .split (":" )
113118 modpath = parts .pop (0 )
114119 attrname = parts and parts [0 ] or ""
115- if modpath [0 ] == '.' :
120+ if modpath [0 ] == "." :
116121 modpath = implprefix + modpath
117122
118123 if not attrname :
119- subname = '%s.%s' % (self .__name__ , name )
124+ subname = "{}.{}" . format (self .__name__ , name )
120125 apimod = AliasModule (subname , modpath )
121126 sys .modules [subname ] = apimod
122- if '.' not in name :
127+ if "." not in name :
123128 setattr (self , name , apimod )
124129 else :
125130 self .__map__ [name ] = (modpath , attrname )
126131
127132 def __repr__ (self ):
128133 repr_list = []
129- if hasattr (self , ' __version__' ):
134+ if hasattr (self , " __version__" ):
130135 repr_list .append ("version=" + repr (self .__version__ ))
131- if hasattr (self , ' __file__' ):
132- repr_list .append (' from ' + repr (self .__file__ ))
136+ if hasattr (self , " __file__" ):
137+ repr_list .append (" from " + repr (self .__file__ ))
133138 if repr_list :
134- return ' <ApiModule %r %s>' % (self .__name__ , " " .join (repr_list ))
135- return ' <ApiModule %r>' % (self .__name__ , )
139+ return " <ApiModule {!r} {}>" . format (self .__name__ , " " .join (repr_list ))
140+ return " <ApiModule {!r}>" . format (self .__name__ )
136141
137142 def __makeattr (self , name ):
138143 """lazily compute value for name or raise AttributeError if unknown."""
139144 # print "makeattr", self.__name__, name
140145 target = None
141- if ' __onfirstaccess__' in self .__map__ :
142- target = self .__map__ .pop (' __onfirstaccess__' )
146+ if " __onfirstaccess__" in self .__map__ :
147+ target = self .__map__ .pop (" __onfirstaccess__" )
143148 importobj (* target )()
144149 try :
145150 modpath , attrname = self .__map__ [name ]
146151 except KeyError :
147- if target is not None and name != ' __onfirstaccess__' :
152+ if target is not None and name != " __onfirstaccess__" :
148153 # retry, onfirstaccess might have set attrs
149154 return getattr (self , name )
150155 raise AttributeError (name )
@@ -163,10 +168,10 @@ def __makeattr(self, name):
163168 def __dict__ (self ):
164169 # force all the content of the module
165170 # to be loaded when __dict__ is read
166- dictdescr = ModuleType .__dict__ [' __dict__' ]
171+ dictdescr = ModuleType .__dict__ [" __dict__" ]
167172 dict = dictdescr .__get__ (self )
168173 if dict is not None :
169- hasattr (self , ' some' )
174+ hasattr (self , " some" )
170175 for name in self .__all__ :
171176 try :
172177 self .__makeattr (name )
@@ -186,19 +191,22 @@ def getmod():
186191 mod .append (x )
187192 return mod [0 ]
188193
189- class AliasModule (ModuleType ):
194+ x = modpath + ("." + attrname if attrname else "" )
195+ repr_result = "<AliasModule {!r} for {!r}>" .format (modname , x )
190196
197+ class AliasModule (ModuleType ):
191198 def __repr__ (self ):
192- x = modpath
193- if attrname :
194- x += "." + attrname
195- return '<AliasModule %r for %r>' % (modname , x )
199+ return repr_result
196200
197201 def __getattribute__ (self , name ):
198202 try :
199203 return getattr (getmod (), name )
200204 except ImportError :
201- return None
205+ if modpath == "pytest" and attrname is None :
206+ # hack for pylibs py.test
207+ return None
208+ else :
209+ raise
202210
203211 def __setattr__ (self , name , value ):
204212 setattr (getmod (), name , value )
0 commit comments