From 01fb5c840124f4ffa13257900226106151823f8c Mon Sep 17 00:00:00 2001 From: David Fischer Date: Thu, 28 May 2020 17:14:19 -0700 Subject: [PATCH] Add feature flag to use the stock Sphinx builders --- readthedocs/doc_builder/backends/sphinx.py | 6 ++ readthedocs/projects/models.py | 5 ++ .../rtd_tests/tests/test_doc_builder.py | 59 ++++++++++++++++++- 3 files changed, 69 insertions(+), 1 deletion(-) diff --git a/readthedocs/doc_builder/backends/sphinx.py b/readthedocs/doc_builder/backends/sphinx.py index 20d43a076d5..4f49e5dd84e 100644 --- a/readthedocs/doc_builder/backends/sphinx.py +++ b/readthedocs/doc_builder/backends/sphinx.py @@ -316,6 +316,8 @@ class HtmlBuilder(BaseSphinx): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.sphinx_builder = 'readthedocs' + if self.project.has_feature(Feature.USE_SPHINX_BUILDERS): + self.sphinx_builder = 'html' def move(self, **__): super().move() @@ -346,6 +348,8 @@ class HtmlDirBuilder(HtmlBuilder): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.sphinx_builder = 'readthedocsdirhtml' + if self.project.has_feature(Feature.USE_SPHINX_BUILDERS): + self.sphinx_builder = 'dirhtml' class SingleHtmlBuilder(HtmlBuilder): @@ -354,6 +358,8 @@ class SingleHtmlBuilder(HtmlBuilder): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.sphinx_builder = 'readthedocssinglehtml' + if self.project.has_feature(Feature.USE_SPHINX_BUILDERS): + self.sphinx_builder = 'singlehtml' class LocalMediaBuilder(BaseSphinx): diff --git a/readthedocs/projects/models.py b/readthedocs/projects/models.py index 1bc6c38c93d..886cb6cf3dc 100644 --- a/readthedocs/projects/models.py +++ b/readthedocs/projects/models.py @@ -1595,6 +1595,7 @@ def add_features(sender, **kwargs): VCS_REMOTE_LISTING = 'vcs_remote_listing' STORE_PAGEVIEWS = 'store_pageviews' SPHINX_PARALLEL = 'sphinx_parallel' + USE_SPHINX_BUILDERS = 'use_sphinx_builders' FEATURES = ( (USE_SPHINX_LATEST, _('Use latest version of Sphinx')), @@ -1692,6 +1693,10 @@ def add_features(sender, **kwargs): SPHINX_PARALLEL, _('Use "-j auto" when calling sphinx-build'), ), + ( + USE_SPHINX_BUILDERS, + _('Use regular sphinx builders instead of custom RTD builders'), + ) ) projects = models.ManyToManyField( diff --git a/readthedocs/rtd_tests/tests/test_doc_builder.py b/readthedocs/rtd_tests/tests/test_doc_builder.py index 05da75898bc..106a48fb037 100644 --- a/readthedocs/rtd_tests/tests/test_doc_builder.py +++ b/readthedocs/rtd_tests/tests/test_doc_builder.py @@ -13,12 +13,14 @@ from readthedocs.builds.models import Version from readthedocs.doc_builder.backends.mkdocs import MkdocsHTML, yaml_load_safely -from readthedocs.doc_builder.backends.sphinx import BaseSphinx +from readthedocs.doc_builder.backends.sphinx import BaseSphinx, HtmlBuilder, HtmlDirBuilder, SingleHtmlBuilder +from readthedocs.doc_builder.config import load_yaml_config from readthedocs.doc_builder.exceptions import MkDocsYAMLParseError from readthedocs.doc_builder.python_environments import Virtualenv from readthedocs.projects.constants import PRIVATE, PROTECTED, PUBLIC from readthedocs.projects.exceptions import ProjectConfigurationError from readthedocs.projects.models import Feature, Project +from readthedocs.rtd_tests.tests.test_config_integration import create_load class SphinxBuilderTest(TestCase): @@ -216,6 +218,61 @@ def test_multiple_conf_py( with pytest.raises(ProjectConfigurationError): base_sphinx.append_conf() + @mock.patch('readthedocs.doc_builder.config.load_config') + def test_use_sphinx_builders(self, load_config): + feature = get( + Feature, + feature_id=Feature.USE_SPHINX_BUILDERS, + ) + + config_data = {'version': 2, 'sphinx': {'configuration': 'docs/conf.py'}} + load_config.side_effect = create_load(config_data) + config = load_yaml_config(self.version) + + python_env = Virtualenv( + version=self.version, + build_env=self.build_env, + config=config, + ) + builder = HtmlBuilder( + build_env=self.build_env, + python_env=python_env, + ) + self.assertEqual(builder.sphinx_builder, 'readthedocs') + + builder = HtmlDirBuilder( + build_env=self.build_env, + python_env=python_env, + ) + self.assertEqual(builder.sphinx_builder, 'readthedocsdirhtml') + + builder = SingleHtmlBuilder( + build_env=self.build_env, + python_env=python_env, + ) + self.assertEqual(builder.sphinx_builder, 'readthedocssinglehtml') + + # Add the feature to use the regular builders + feature.projects.add(self.project) + + builder = HtmlBuilder( + build_env=self.build_env, + python_env=python_env, + ) + self.assertEqual(builder.sphinx_builder, 'html') + + builder = HtmlDirBuilder( + build_env=self.build_env, + python_env=python_env, + ) + self.assertEqual(builder.sphinx_builder, 'dirhtml') + + builder = SingleHtmlBuilder( + build_env=self.build_env, + python_env=python_env, + ) + self.assertEqual(builder.sphinx_builder, 'singlehtml') + @override_settings(PRODUCTION_DOMAIN='readthedocs.org') class MkdocsBuilderTest(TestCase):