123456789101112131415161718192021222324252627282930313233343536373839404142 |
- """
- Checks that SymPy does not contain indirect imports.
- An indirect import is importing a symbol from a module that itself imported the
- symbol from elsewhere. Such a constellation makes it harder to diagnose
- inter-module dependencies and import order problems, and is therefore strongly
- discouraged.
- (Indirect imports from end-user code is fine and in fact a best practice.)
- Implementation note: Forcing Python into actually unloading already-imported
- submodules is a tricky and partly undocumented process. To avoid these issues,
- the actual diagnostic code is in bin/diagnose_imports, which is run as a
- separate, pristine Python process.
- """
- import subprocess
- import sys
- from os.path import abspath, dirname, join, normpath
- import inspect
- from sympy.testing.pytest import XFAIL
- @XFAIL
- def test_module_imports_are_direct():
- my_filename = abspath(inspect.getfile(inspect.currentframe()))
- my_dirname = dirname(my_filename)
- diagnose_imports_filename = join(my_dirname, 'diagnose_imports.py')
- diagnose_imports_filename = normpath(diagnose_imports_filename)
- process = subprocess.Popen(
- [
- sys.executable,
- normpath(diagnose_imports_filename),
- '--problems',
- '--by-importer'
- ],
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT,
- bufsize=-1)
- output, _ = process.communicate()
- assert output == '', "There are import problems:\n" + output.decode()
|