Skip to content

Commit

Permalink
Fix more doctests in meson_editable install
Browse files Browse the repository at this point in the history
  • Loading branch information
user202729 committed Feb 11, 2025
1 parent 766c7a0 commit 40c0b19
Show file tree
Hide file tree
Showing 5 changed files with 98 additions and 2 deletions.
4 changes: 4 additions & 0 deletions src/sage/doctest/external.py
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,10 @@ def external_features():
r"""
Generate the features that are only to be tested if ``--optional=external`` is used.
.. SEEALSO::
:func:`sage.features.all.all_features`
EXAMPLES::
sage: from sage.doctest.external import external_features
Expand Down
10 changes: 10 additions & 0 deletions src/sage/doctest/sources.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,18 @@ def get_basename(path):
sage: import os
sage: get_basename(sage.doctest.sources.__file__)
'sage.doctest.sources'
::
sage: # optional - !meson_editable
sage: get_basename(os.path.join(sage.structure.__path__[0], 'element.pxd'))
'sage.structure.element.pxd'
TESTS::
sage: # optional - meson_editable
sage: get_basename(os.path.join(os.path.dirname(sage.structure.__file__), 'element.pxd'))
'sage.structure.element.pxd'
"""
if path is None:
return None
Expand Down
4 changes: 4 additions & 0 deletions src/sage/env.py
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,10 @@ def sage_include_directories(use_sources=False):
sage: dirs = sage.env.sage_include_directories(use_sources=True)
sage: any(os.path.isfile(os.path.join(d, file)) for d in dirs)
True
::
sage: # optional - !meson_editable (no need, see :issue:`39275`)
sage: dirs = sage.env.sage_include_directories(use_sources=False)
sage: any(os.path.isfile(os.path.join(d, file)) for d in dirs)
True
Expand Down
46 changes: 46 additions & 0 deletions src/sage/features/meson_editable.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
r"""
Feature for testing if Meson editable install is used.
"""

import sys
from . import Feature, FeatureTestResult


class MesonEditable(Feature):
r"""
A :class:`~sage.features.Feature` describing if Meson editable install is used.
EXAMPLES::
sage: from sage.features.meson_editable import MesonEditable
sage: MesonEditable()
Feature('meson_editable')
"""
def __init__(self):
r"""
TESTS::
sage: from sage.features.meson_editable import MesonEditable
sage: MesonEditable() is MesonEditable()
True
"""
Feature.__init__(self, 'meson_editable')

def _is_present(self):
r"""
Test whether Meson editable install is used.
EXAMPLES::
sage: from sage.features.meson_editable import MesonEditable
sage: Internet()._is_present() # random

Check failure on line 36 in src/sage/features/meson_editable.py

View workflow job for this annotation

GitHub Actions / test-new

Failed example:

Failed example:: Exception raised: Traceback (most recent call last): File "/sage/src/sage/doctest/forker.py", line 728, in _run self.compile_and_execute(example, compiler, test.globs) File "/sage/src/sage/doctest/forker.py", line 1152, in compile_and_execute exec(compiled, globs) File "<doctest sage.features.meson_editable.MesonEditable._is_present[1]>", line 1, in <module> Internet()._is_present() # random NameError: name 'Internet' is not defined
FeatureTestResult('meson_editable', True)
"""
import sage
import sys

Check failure on line 40 in src/sage/features/meson_editable.py

View workflow job for this annotation

GitHub Actions / Lint

Ruff (F811)

sage/features/meson_editable.py:40:16: F811 Redefinition of unused `sys` from line 5
result = type(sage.__loader__).__module__ == '_sagemath_editable_loader'
return FeatureTestResult(self, result)


def all_features():
return [MesonEditable()]
36 changes: 34 additions & 2 deletions src/sage/misc/package_dir.py
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,7 @@ def is_package_or_sage_namespace_package_dir(path, *, distribution_filter=None):
:mod:`sage.cpython` is an ordinary package::
sage: # optional - !meson_editable
sage: from sage.misc.package_dir import is_package_or_sage_namespace_package_dir
sage: directory = sage.cpython.__path__[0]; directory
'.../sage/cpython'
Expand All @@ -270,24 +271,48 @@ def is_package_or_sage_namespace_package_dir(path, *, distribution_filter=None):
:mod:`sage.libs.mpfr` only has an ``__init__.pxd`` file, but we consider
it a package directory for consistency with Cython::
sage: # optional - !meson_editable
sage: directory = os.path.join(sage.libs.__path__[0], 'mpfr'); directory
'.../sage/libs/mpfr'
sage: is_package_or_sage_namespace_package_dir(directory) # known bug (seen in build.yml)
sage: is_package_or_sage_namespace_package_dir(directory)

Check failure on line 277 in src/sage/misc/package_dir.py

View workflow job for this annotation

GitHub Actions / test-new

Failed example:

Failed example:: Got: False
True
:mod:`sage` is designated to become an implicit namespace package::
sage: # optional - !meson_editable
sage: directory = sage.__path__[0]; directory
'.../sage'
sage: is_package_or_sage_namespace_package_dir(directory) # known bug (seen in build.yml)
sage: is_package_or_sage_namespace_package_dir(directory)
True
Not a package::
sage: # optional - !meson_editable
sage: directory = os.path.join(sage.symbolic.__path__[0], 'ginac'); directory # needs sage.symbolic
'.../sage/symbolic/ginac'
sage: is_package_or_sage_namespace_package_dir(directory) # needs sage.symbolic
False
TESTS::
sage: # optional - meson_editable
sage: from sage.misc.package_dir import is_package_or_sage_namespace_package_dir
sage: directory = os.path.dirname(sage.cpython.__file__); directory
'.../sage/cpython'
sage: is_package_or_sage_namespace_package_dir(directory)
True
sage: # optional - meson_editable
sage: directory = os.path.join(os.path.dirname(sage.libs.__file__), 'mpfr'); directory
'.../sage/libs/mpfr'
sage: is_package_or_sage_namespace_package_dir(directory)
True
sage: # optional - meson_editable, sage.symbolic
sage: directory = os.path.join(os.path.dirname(sage.symbolic.__file__), 'ginac'); directory
'.../sage/symbolic/ginac'
sage: is_package_or_sage_namespace_package_dir(directory)
False
"""
if os.path.exists(os.path.join(path, '__init__.py')): # ordinary package
return True
Expand Down Expand Up @@ -345,8 +370,15 @@ def walk_packages(path=None, prefix='', onerror=None):
EXAMPLES::
sage: # optional - !meson_editable
sage: sorted(sage.misc.package_dir.walk_packages(sage.misc.__path__)) # a namespace package
[..., ModuleInfo(module_finder=FileFinder('.../sage/misc'), name='package_dir', ispkg=False), ...]
TESTS::
sage: # optional - meson_editable
sage: sorted(sage.misc.package_dir.walk_packages(sage.misc.__path__))
[..., ModuleInfo(module_finder=<...MesonpyPathFinder object...>, name='package_dir', ispkg=False), ...]
"""
# Adapted from https://github.com/python/cpython/blob/3.11/Lib/pkgutil.py

Expand Down

0 comments on commit 40c0b19

Please sign in to comment.