9
9
import sys
10
10
from types import ModuleType
11
11
12
- from .version import version as __version__
12
+ from .version import version as __version__ # NOQA:F401
13
13
14
14
15
15
def _py_abspath (path ):
16
16
"""
17
17
special version of abspath
18
18
that will leave paths from jython jars alone
19
19
"""
20
- if path .startswith (' __pyclasspath__' ):
20
+ if path .startswith (" __pyclasspath__" ):
21
21
22
22
return path
23
23
else :
@@ -28,6 +28,7 @@ def distribution_version(name):
28
28
"""try to get the version of the named distribution,
29
29
returs None on failure"""
30
30
from pkg_resources import get_distribution , DistributionNotFound
31
+
31
32
try :
32
33
dist = get_distribution (name )
33
34
except DistributionNotFound :
@@ -41,35 +42,37 @@ def initpkg(pkgname, exportdefs, attr=None, eager=False):
41
42
attr = attr or {}
42
43
oldmod = sys .modules .get (pkgname )
43
44
d = {}
44
- f = getattr (oldmod , ' __file__' , None )
45
+ f = getattr (oldmod , " __file__" , None )
45
46
if f :
46
47
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 )
58
60
d .update (attr )
59
61
if hasattr (oldmod , "__dict__" ):
60
62
oldmod .__dict__ .update (d )
61
63
mod = ApiModule (pkgname , exportdefs , implprefix = pkgname , attr = d )
62
64
sys .modules [pkgname ] = mod
63
65
# 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 :
65
67
for module in list (sys .modules .values ()):
66
68
if isinstance (module , ApiModule ):
67
69
module .__dict__
70
+ return mod
68
71
69
72
70
73
def importobj (modpath , attrname ):
71
74
"""imports a module, then resolves the attrname on it"""
72
- module = __import__ (modpath , None , None , [' __doc__' ])
75
+ module = __import__ (modpath , None , None , [" __doc__" ])
73
76
if not attrname :
74
77
return module
75
78
@@ -82,20 +85,22 @@ def importobj(modpath, attrname):
82
85
83
86
class ApiModule (ModuleType ):
84
87
"""the magical lazy-loading module standing"""
88
+
85
89
def __docget (self ):
86
90
try :
87
91
return self .__doc
88
92
except AttributeError :
89
- if ' __doc__' in self .__map__ :
90
- return self .__makeattr (' __doc__' )
93
+ if " __doc__" in self .__map__ :
94
+ return self .__makeattr (" __doc__" )
91
95
92
96
def __docset (self , value ):
93
97
self .__doc = value
98
+
94
99
__doc__ = property (__docget , __docset )
95
100
96
101
def __init__ (self , name , importspec , implprefix = None , attr = None ):
97
102
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__" ]
99
104
self .__map__ = {}
100
105
self .__implprefix__ = implprefix or name
101
106
if attr :
@@ -104,47 +109,47 @@ def __init__(self, name, importspec, implprefix=None, attr=None):
104
109
setattr (self , name , val )
105
110
for name , importspec in importspec .items ():
106
111
if isinstance (importspec , dict ):
107
- subname = '%s.%s' % (self .__name__ , name )
112
+ subname = "{}.{}" . format (self .__name__ , name )
108
113
apimod = ApiModule (subname , importspec , implprefix )
109
114
sys .modules [subname ] = apimod
110
115
setattr (self , name , apimod )
111
116
else :
112
- parts = importspec .split (':' )
117
+ parts = importspec .split (":" )
113
118
modpath = parts .pop (0 )
114
119
attrname = parts and parts [0 ] or ""
115
- if modpath [0 ] == '.' :
120
+ if modpath [0 ] == "." :
116
121
modpath = implprefix + modpath
117
122
118
123
if not attrname :
119
- subname = '%s.%s' % (self .__name__ , name )
124
+ subname = "{}.{}" . format (self .__name__ , name )
120
125
apimod = AliasModule (subname , modpath )
121
126
sys .modules [subname ] = apimod
122
- if '.' not in name :
127
+ if "." not in name :
123
128
setattr (self , name , apimod )
124
129
else :
125
130
self .__map__ [name ] = (modpath , attrname )
126
131
127
132
def __repr__ (self ):
128
133
repr_list = []
129
- if hasattr (self , ' __version__' ):
134
+ if hasattr (self , " __version__" ):
130
135
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__ ))
133
138
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__ )
136
141
137
142
def __makeattr (self , name ):
138
143
"""lazily compute value for name or raise AttributeError if unknown."""
139
144
# print "makeattr", self.__name__, name
140
145
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__" )
143
148
importobj (* target )()
144
149
try :
145
150
modpath , attrname = self .__map__ [name ]
146
151
except KeyError :
147
- if target is not None and name != ' __onfirstaccess__' :
152
+ if target is not None and name != " __onfirstaccess__" :
148
153
# retry, onfirstaccess might have set attrs
149
154
return getattr (self , name )
150
155
raise AttributeError (name )
@@ -163,10 +168,10 @@ def __makeattr(self, name):
163
168
def __dict__ (self ):
164
169
# force all the content of the module
165
170
# to be loaded when __dict__ is read
166
- dictdescr = ModuleType .__dict__ [' __dict__' ]
171
+ dictdescr = ModuleType .__dict__ [" __dict__" ]
167
172
dict = dictdescr .__get__ (self )
168
173
if dict is not None :
169
- hasattr (self , ' some' )
174
+ hasattr (self , " some" )
170
175
for name in self .__all__ :
171
176
try :
172
177
self .__makeattr (name )
@@ -186,19 +191,22 @@ def getmod():
186
191
mod .append (x )
187
192
return mod [0 ]
188
193
189
- class AliasModule (ModuleType ):
194
+ x = modpath + ("." + attrname if attrname else "" )
195
+ repr_result = "<AliasModule {!r} for {!r}>" .format (modname , x )
190
196
197
+ class AliasModule (ModuleType ):
191
198
def __repr__ (self ):
192
- x = modpath
193
- if attrname :
194
- x += "." + attrname
195
- return '<AliasModule %r for %r>' % (modname , x )
199
+ return repr_result
196
200
197
201
def __getattribute__ (self , name ):
198
202
try :
199
203
return getattr (getmod (), name )
200
204
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
202
210
203
211
def __setattr__ (self , name , value ):
204
212
setattr (getmod (), name , value )
0 commit comments