Source code for dob.helpers.path

# This file exists within 'dob':
#
#   https://github.com/hotoffthehamster/dob
#
# Copyright © 2018-2020 Landon Bouma. All rights reserved.
#
# 'dob' is free software: you can redistribute it and/or modify it under the terms
# of the GNU General Public License  as  published by the Free Software Foundation,
# either version 3  of the License,  or  (at your option)  any   later    version.
#
# 'dob' is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
# without even the implied warranty of MERCHANTABILITY  or  FITNESS FOR A PARTICULAR
# PURPOSE.  See  the  GNU General Public License  for  more details.
#
# You can find the GNU General Public License reprinted in the file titled 'LICENSE',
# or visit <http://www.gnu.org/licenses/>.

from gettext import gettext as _

from dob_bright.termio import dob_in_user_warning

__all__ = (
    'compile_and_eval_source',
)


[docs]def compile_and_eval_source(py_path): """""" def _compile_and_eval_source(py_path): with open(py_path, 'r') as py_text: eval_globals = compile_and_eval_module(py_text, py_path) return eval_globals def compile_and_eval_module(py_text, py_path): code = source_compile(py_text, py_path) if code is None: return {} eval_globals = globals() if eval_source_code(code, eval_globals, py_path): return eval_globals return {} def source_compile(py_text, py_path): try: code = compile(py_text.read(), py_path, 'exec') except Exception as err: code = None msg = _( 'ERROR: Could not compile source file at "{}": {}' ).format(py_path, str(err)) dob_in_user_warning(msg) return code def eval_source_code(code, eval_globals, py_path): # Pass py_path to code being eval'd, so it can orientate. # (lb): I tried passing `locals()` for second argument, but # then plugins complain `name 'ConfigRoot' is not defined`. eval_globals['__file__'] = py_path try: eval(code, eval_globals, eval_globals) except Exception as err: msg = _( 'ERROR: Could not eval compiled source at "{}": {}' ).format(py_path, str(err)) dob_in_user_warning(msg) return False else: return True return _compile_and_eval_source(py_path)