Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix more doctests in meson_editable install #39494

Merged
merged 2 commits into from
Feb 21, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
45 changes: 45 additions & 0 deletions src/sage/features/meson_editable.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
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: MesonEditable()._is_present() # random
FeatureTestResult('meson_editable', True)
"""
import sage
result = type(sage.__loader__).__module__ == '_sagemath_editable_loader'
return FeatureTestResult(self, result)


def all_features():
return [MesonEditable()]
34 changes: 33 additions & 1 deletion 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)
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
Loading