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

Have one clear API for calling Sphinx without unintended side-effects (deprecate SphinxTestApp?) #12130

Open
chrisjsewell opened this issue Mar 18, 2024 · 0 comments
Assignees
Labels

Comments

@chrisjsewell
Copy link
Member

chrisjsewell commented Mar 18, 2024

Currenty, there is no clearly documented way to "properly" use Sphinx programatically.
By "properly", I mean in a way that could be called multiple times within the same Python interpretor, without any unexpected polluting of the global state, and thus act exactly the same as if each call had been made in a separate Python interpretor

At present, there are diverging ways to do this, for the main CLI and for test cases:

with patch_docutils(confdir), docutils_namespace():
	app = Sphinx(...)
    app.build(...)
app = SphinxTestApp(...)
app.build(...)
app.cleanup()

Its not really clear from first appearance, but these actually almost achieve the same thing:

  • docutils_namespace, on exit, resets the directives/roles lookups and additional node visitors
  • SphinxTestApp.cleanup resets the directives/roles lookups and additional node visitors

However, there are also clear differences:

  • patch_docutils temporarily patches docutils in a number of ways, that do not appear to be addressed by SphinxTestApp, in essence meaning you are not strictly testing the behaviour of Sphinx in production when using SphinxTestApp
  • SphinxTestApp.cleanup does addition global state cleaning, restoring: sys.path, sphinx.locale.translators, and sphinx.pycode.ModuleAnalyzer.cache

I feel this divergence is unecessary, and ideally there would be one clear way to call sphinx as an API, perhaps something like:

with Sphinx.restore_global_state(confdir):
	app = Sphinx(...)
	app.build(...)

cc @picnixz and @jayaddison for discussion, as it relates to #12093 etc


An additional note (as I just mentioned in #12089 (comment))
is that it is not currently possible to temporarily turn-off colored logging output.
This is annoying for if you want to assert the content of the warning stream

In the CLI it can be turned off, but is then never reset to its previous state: https://github.com/chrisjsewell/sphinx/blob/fa290049515c38e68edda7e8c17be69b8793bb84/sphinx/cmd/build.py#L327

@chrisjsewell chrisjsewell self-assigned this Mar 18, 2024
@chrisjsewell chrisjsewell changed the title Have a clear API for calling Sphinx without side-effects (deprecate SphinxTestApp?) Have one clear API for calling Sphinx without side-effects (deprecate SphinxTestApp?) Mar 18, 2024
@chrisjsewell chrisjsewell changed the title Have one clear API for calling Sphinx without side-effects (deprecate SphinxTestApp?) Have one clear API for calling Sphinx without unintended side-effects (deprecate SphinxTestApp?) Mar 18, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant