#59 Weaken the runtime dependency on the first party sphinxcontrib packages
Merged 7 months ago by churchyard. Opened 7 months ago by churchyard.
rpms/ churchyard/python-sphinx sphinxcontrib-optional  into  rawhide

file added
+189
@@ -0,0 +1,189 @@ 

+ From a8371a919b4f1552853a879377251ad25c3d988f Mon Sep 17 00:00:00 2001

+ From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro@hroncok.cz>

+ Date: Mon, 6 Nov 2023 13:44:17 +0100

+ Subject: [PATCH] Make the first party extensions optional, add [extensions]

+  extra

+ 

+ ---

+  pyproject.toml               | 33 +++++++++++++++++++++++++++------

+  sphinx/application.py        | 18 ++++++++++++++----

+  sphinx/testing/fixtures.py   |  6 ++++++

+  tests/test_api_translator.py |  2 ++

+  tests/test_build_html.py     |  3 +++

+  5 files changed, 52 insertions(+), 10 deletions(-)

+ 

+ diff --git a/pyproject.toml b/pyproject.toml

+ index a0ada3cd3ae..7cb0112897a 100644

+ --- a/pyproject.toml

+ +++ b/pyproject.toml

+ @@ -55,12 +55,6 @@ classifiers = [

+      "Topic :: Utilities",

+  ]

+  dependencies = [

+ -    "sphinxcontrib-applehelp",

+ -    "sphinxcontrib-devhelp",

+ -    "sphinxcontrib-jsmath",

+ -    "sphinxcontrib-htmlhelp>=2.0.0",

+ -    "sphinxcontrib-serializinghtml>=1.1.9",

+ -    "sphinxcontrib-qthelp",

+      "Jinja2>=3.0",

+      "Pygments>=2.14",

+      "docutils>=0.18.1,<0.21",

+ @@ -76,8 +70,35 @@ dependencies = [

+  dynamic = ["version"]

+  

+  [project.optional-dependencies]

+ +applehelp = [

+ +    "sphinxcontrib-applehelp",

+ +]

+ +devhelp = [

+ +    "sphinxcontrib-devhelp",

+ +]

+ +jsmath = [

+ +    "sphinxcontrib-jsmath",

+ +]

+ +htmlhelp = [

+ +    "sphinxcontrib-htmlhelp>=2.0.0",

+ +]

+ +serializinghtml = [

+ +    "sphinxcontrib-serializinghtml>=1.1.9",

+ +]

+ +qthelp = [

+ +    "sphinxcontrib-qthelp",

+ +]

+ +extensions = [

+ +    "sphinx[applehelp]",

+ +    "sphinx[devhelp]",

+ +    "sphinx[jsmath]",

+ +    "sphinx[htmlhelp]",

+ +    "sphinx[serializinghtml]",

+ +    "sphinx[qthelp]",

+ +]

+  docs = [

+      "sphinxcontrib-websupport",

+ +    "sphinx[extensions]",

+  ]

+  lint = [

+      "flake8>=3.5.0",

+ diff --git a/sphinx/application.py b/sphinx/application.py

+ index d5fbaa9f30a..776bafa1ee3 100644

+ --- a/sphinx/application.py

+ +++ b/sphinx/application.py

+ @@ -24,7 +24,12 @@

+  from sphinx import locale, package_dir

+  from sphinx.config import Config

+  from sphinx.environment import BuildEnvironment

+ -from sphinx.errors import ApplicationError, ConfigError, VersionRequirementError

+ +from sphinx.errors import (

+ +    ApplicationError,

+ +    ConfigError,

+ +    ExtensionError,

+ +    VersionRequirementError,

+ +)

+  from sphinx.events import EventManager

+  from sphinx.highlighting import lexer_classes

+  from sphinx.locale import __

+ @@ -226,7 +231,7 @@ def __init__(self, srcdir: str | os.PathLike[str], confdir: str | os.PathLike[st

+          # load all built-in extension modules, first-party extension modules,

+          # and first-party themes

+          for extension in builtin_extensions:

+ -            self.setup_extension(extension)

+ +            self.setup_extension(extension, optional=extension in _first_party_extensions)

+  

+          # load all user-given extension modules

+          for extension in self.config.extensions:

+ @@ -395,7 +400,7 @@ def build(self, force_all: bool = False, filenames: list[str] | None = None) ->

+  

+      # ---- general extensibility interface -------------------------------------

+  

+ -    def setup_extension(self, extname: str) -> None:

+ +    def setup_extension(self, extname: str, optional: bool = False) -> None:

+          """Import and setup a Sphinx extension module.

+  

+          Load the extension given by the module *name*.  Use this if your

+ @@ -403,7 +408,12 @@ def setup_extension(self, extname: str) -> None:

+          called twice.

+          """

+          logger.debug('[app] setting up extension: %r', extname)

+ -        self.registry.load_extension(self, extname)

+ +        try:

+ +            self.registry.load_extension(self, extname)

+ +        except ExtensionError:

+ +            logger.debug('[app] extension not found: %r', extname)

+ +            if not optional:

+ +                raise

+  

+      @staticmethod

+      def require_sphinx(version: tuple[int, int] | str) -> None:

+ diff --git a/sphinx/testing/fixtures.py b/sphinx/testing/fixtures.py

+ index 0cc4882fe1c..f57f709b415 100644

+ --- a/sphinx/testing/fixtures.py

+ +++ b/sphinx/testing/fixtures.py

+ @@ -22,6 +22,7 @@

+          'sphinx(builder, testroot=None, freshenv=False, confoverrides=None, tags=None,'

+          ' docutilsconf=None, parallel=0): arguments to initialize the sphinx test application.'

+      ),

+ +    'sphinxcontrib(...): required sphinxcontrib.* extensions',

+      'test_params(shared_result=...): test parameters.',

+  ]

+  

+ @@ -67,6 +68,11 @@ def app_params(request: Any, test_params: dict, shared_result: SharedResult,

+      sphinx.application.Sphinx initialization

+      """

+  

+ +    # ##### process pytest.mark.sphinxcontrib

+ +    for info in reversed(list(request.node.iter_markers("sphinxcontrib"))):

+ +        for arg in info.args:

+ +            pytest.importorskip("sphinxcontrib." + arg)

+ +

+      # ##### process pytest.mark.sphinx

+  

+      pargs = {}

+ diff --git a/tests/test_api_translator.py b/tests/test_api_translator.py

+ index 9f2bd448863..81575b71946 100644

+ --- a/tests/test_api_translator.py

+ +++ b/tests/test_api_translator.py

+ @@ -36,6 +36,7 @@ def test_singlehtml_set_translator_for_singlehtml(app, status, warning):

+      assert translator_class.__name__ == 'ConfSingleHTMLTranslator'

+  

+  

+ +@pytest.mark.sphinxcontrib('serializinghtml')

+  @pytest.mark.sphinx('pickle', testroot='api-set-translator')

+  def test_pickle_set_translator_for_pickle(app, status, warning):

+      translator_class = app.builder.get_translator_class()

+ @@ -43,6 +44,7 @@ def test_pickle_set_translator_for_pickle(app, status, warning):

+      assert translator_class.__name__ == 'ConfPickleTranslator'

+  

+  

+ +@pytest.mark.sphinxcontrib('serializinghtml')

+  @pytest.mark.sphinx('json', testroot='api-set-translator')

+  def test_json_set_translator_for_json(app, status, warning):

+      translator_class = app.builder.get_translator_class()

+ diff --git a/tests/test_build_html.py b/tests/test_build_html.py

+ index a89a6fcafaf..8bd44111853 100644

+ --- a/tests/test_build_html.py

+ +++ b/tests/test_build_html.py

+ @@ -1547,6 +1547,7 @@ def test_html_math_renderer_is_imgmath(app, status, warning):

+      assert app.builder.math_renderer_name == 'imgmath'

+  

+  

+ +@pytest.mark.sphinxcontrib('serializinghtml', 'jsmath')

+  @pytest.mark.sphinx('html', testroot='basic',

+                      confoverrides={'extensions': ['sphinxcontrib.jsmath',

+                                                    'sphinx.ext.imgmath']})

+ @@ -1567,6 +1568,7 @@ def test_html_math_renderer_is_duplicated2(app, status, warning):

+      assert app.builder.math_renderer_name == 'imgmath'  # The another one is chosen

+  

+  

+ +@pytest.mark.sphinxcontrib('jsmath')

+  @pytest.mark.sphinx('html', testroot='basic',

+                      confoverrides={'extensions': ['sphinxcontrib.jsmath',

+                                                    'sphinx.ext.imgmath'],

+ @@ -1575,6 +1577,7 @@ def test_html_math_renderer_is_chosen(app, status, warning):

+      assert app.builder.math_renderer_name == 'imgmath'

+  

+  

+ +@pytest.mark.sphinxcontrib('jsmath')

+  @pytest.mark.sphinx('html', testroot='basic',

+                      confoverrides={'extensions': ['sphinxcontrib.jsmath',

+                                                    'sphinx.ext.mathjax'],

file modified
+37 -1
@@ -25,7 +25,7 @@ 

  #global     prerel ...

  %global     upstream_version %{general_version}%{?prerel}

  Version:    %{general_version}%{?prerel:~%{prerel}}

- Release:    1%{?dist}

+ Release:    2%{?dist}

  Epoch:      1

  Summary:    Python documentation generator

  
@@ -40,6 +40,21 @@ 

  # which causes that test to fail.

  Patch:      sphinx-test_theming.diff

  

+ # Make the first party extensions optional

+ # This removes the runtime dependencies on:

+ #  - sphinxcontrib.applehelp

+ #  - sphinxcontrib.devhelp

+ #  - sphinxcontrib.jsmath

+ #  - sphinxcontrib.htmlhelp

+ #  - sphinxcontrib.serializinghtml

+ #  - sphinxcontrib.qthelp

+ # The majority of Fedora RPM packages does not need any of those.

+ # By removing the dependencies, we minimize the stuff that's pulled into

+ # the buildroots of 700+ of packages.

+ #

+ # The change is proposed upstream.

+ Patch:      https://github.com/sphinx-doc/sphinx/pull/11747.patch

+ 

  BuildArch:     noarch

  

  BuildRequires: make
@@ -132,6 +147,17 @@ 

  Recommends:    graphviz

  Recommends:    ImageMagick

  

+ # Upstream Requires those, but we have a patch to remove the dependency.

+ # We keep them Recommended to preserve the default user experience.

+ # (We don't desire them in RHEL.)

+ %if %{undefined rhel}

+ Recommends:    python%{python3_pkgversion}-sphinxcontrib-applehelp

+ Recommends:    python%{python3_pkgversion}-sphinxcontrib-devhelp

+ Recommends:    python%{python3_pkgversion}-sphinxcontrib-jsmath

+ Recommends:    python%{python3_pkgversion}-sphinxcontrib-htmlhelp

+ Recommends:    python%{python3_pkgversion}-sphinxcontrib-serializinghtml

+ Recommends:    python%{python3_pkgversion}-sphinxcontrib-qthelp

+ %endif

  

  %description -n python%{python3_pkgversion}-sphinx

  Sphinx is a tool that makes it easy to create intelligent and
@@ -369,6 +395,16 @@ 

  

  

  %changelog

+ * Wed Nov 08 2023 Miro Hrončok <mhroncok@redhat.com> - 1:7.2.6-2

+ - Weaken the runtime dependency on:

+   - python3-sphinxcontrib-applehelp

+   - python3-sphinxcontrib-devhelp

+   - python3-sphinxcontrib-jsmath

+   - python3-sphinxcontrib-htmlhelp

+   - python3-sphinxcontrib-serializinghtml

+   - python3-sphinxcontrib-qthelp

+ - Packages that want to use them during build need to BuildRequire them explicitly

+ 

  * Thu Oct 26 2023 Karolina Surma <ksurma@redhat.com> - 1:7.2.6-1

  - Update to 7.2.6

  - Fixes rhbz#2232469

Build succeeded.
https://fedora.softwarefactory-project.io/zuul/buildset/24e927f091c94d20b476d7c3bb1561b5

rebased onto 3ae8dff

7 months ago

Rebased to sync with the upstream PR.

There is no rush, we can probably wait for some upstream feedback.

Build succeeded.
https://fedora.softwarefactory-project.io/zuul/buildset/68f34ff4022c45779f70ea74225b41d4

Looking at the impact, it seems we could possibly orphan two of the sphinx-contrib packages: "sphinxcontrib-applehelp" and "sphinxcontrib-jsmath", that's a nice improvement on top of the RHEL's issue.
This has been tested, it builds both for ELN and Fedora Rawhide, the patch has been proposed upstream. All looks good.
I agree to let it wait for a bit for potential upstream or community feedback.

  • [x] PR solves the issue it claims to address - relaxes the dependency
  • [x] Resulting RPM package is installable on the destination Fedora release
  • [x] No dependent RPM packages will stop being installable when the PR is merged and built
  • [x] PR is tested sufficiently and the test results are OK (green CI, impact check issues addressed)
  • [x] PR is open against all relevant Fedora releases
  • [-] (If PR is open against more Fedora releases) branches don't diverge unnecessarily
  • [-] (If PR is open against older Fedora releases) PR doesn't contain backwards incompatible changes
  • [x] Each commit's scope is sane (there are no irrelevant changes combined together)
  • [x] Each commit message is relevant
  • [-] (If it's linked), the right (problem, product) BZ ticket is referenced
  • [-] (If it's linked), BZ ticket reference is in the correct format in %changelog and/or commit message
  • [x] (If needed) Release is bumped
  • [x] (When adding patches) Patch purpose is documented in the specfile
  • [x] (When backporting patches) Patch origin and/or authorship is traceable
  • [-] (When creating patches from scratch) The patch is proposed upstream or justified as downstream-only

I've talked with @ksurma.

We agreed to wait a week for upstream or somebody else to say we shouldn't do this. After a week (assuming no negative response), we'll ship this in rawhide, ready to revert od adjust if needed.

I see no opposing voices on the side of the Fedora community and no movement upstream regarding the proposal. Then, I'd say let's ship it and correct it if/once there's actionable feedback.

Pull-Request has been merged by churchyard

7 months ago
Metadata