From 4d2903e63089f20c997b166225da396babd9bcab Mon Sep 17 00:00:00 2001 From: kpnr Date: Mon, 9 Dec 2019 15:59:05 +0300 Subject: [PATCH] Non-ASCII & non utf-8 charset corruption fix Prefer native loader against fileIO --- sphinx/util/__init__.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/sphinx/util/__init__.py b/sphinx/util/__init__.py index 19ffec633..62f36cc0b 100644 --- a/sphinx/util/__init__.py +++ b/sphinx/util/__init__.py @@ -277,18 +277,17 @@ def get_module_source(modname: str) -> Tuple[str, str]: raise PycodeError('error importing %r' % modname, err) filename = getattr(mod, '__file__', None) loader = getattr(mod, '__loader__', None) + try: # prefer Native loader, as it respects #coding directive + filename = loader.get_source(modname) + if filename: + return 'string', filename + except Exception as err: + pass # Try other "source-mining" method if loader and getattr(loader, 'get_filename', None): try: filename = loader.get_filename(modname) except Exception as err: raise PycodeError('error getting filename for %r' % filename, err) - if filename is None and loader: - try: - filename = loader.get_source(modname) - if filename: - return 'string', filename - except Exception as err: - raise PycodeError('error getting source for %r' % modname, err) if filename is None: raise PycodeError('no source found for module %r' % modname) filename = path.normpath(path.abspath(filename))