[Python-checkins] r62188 - in doctools/trunk: CHANGES doc/conf.py doc/config.rst doc/ext.py doc/extensions.rst sphinx/application.py sphinx/config.py sphinx/environment.py

georg.brandl python-checkins at python.org
Sun Apr 6 19:38:55 CEST 2008


Author: georg.brandl
Date: Sun Apr  6 19:38:55 2008
New Revision: 62188

Removed:
   doctools/trunk/doc/ext.py
Modified:
   doctools/trunk/CHANGES
   doctools/trunk/doc/conf.py
   doctools/trunk/doc/config.rst
   doctools/trunk/doc/extensions.rst
   doctools/trunk/sphinx/application.py
   doctools/trunk/sphinx/config.py
   doctools/trunk/sphinx/environment.py
Log:
Allow the config to act as an extension.


Modified: doctools/trunk/CHANGES
==============================================================================
--- doctools/trunk/CHANGES	(original)
+++ doctools/trunk/CHANGES	Sun Apr  6 19:38:55 2008
@@ -13,6 +13,9 @@
 * sphinx.builder, sphinx.environment: Gracefully handle some exception
   cases.
 
+* sphinx.config: The config file itself can be an extension (if it
+  provides a setup() function).
+
 
 Release 0.1.61950 (Mar 26, 2008)
 ================================

Modified: doctools/trunk/doc/conf.py
==============================================================================
--- doctools/trunk/doc/conf.py	(original)
+++ doctools/trunk/doc/conf.py	Sun Apr  6 19:38:55 2008
@@ -11,17 +11,17 @@
 # All configuration values have a default value; values that are commented out
 # serve to show the default value.
 
-import sys, os
+import sys, os, re
 
 # If your extensions are in another directory, add it here.
-sys.path.append(os.path.dirname(__file__))
+#sys.path.append(os.path.dirname(__file__))
 
 # General configuration
 # ---------------------
 
 # Add any Sphinx extension module names here, as strings. They can be extensions
 # coming with Sphinx (named 'sphinx.addons.*') or your custom ones.
-extensions = ['ext', 'sphinx.ext.autodoc', 'sphinx.ext.doctest']
+extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest']
 
 # Add any paths that contain templates here, relative to this directory.
 templates_path = ['_templates']
@@ -125,3 +125,37 @@
 #latex_appendices = []
 
 automodule_skip_lines = 4
+
+
+# Extension interface
+# -------------------
+
+from sphinx import addnodes
+
+dir_sig_re = re.compile(r'\.\. ([^:]+)::(.*)$')
+
+def parse_directive(env, sig, signode):
+    if not sig.startswith('.'):
+        dec_sig = '.. %s::' % sig
+        signode += addnodes.desc_name(dec_sig, dec_sig)
+        return sig
+    m = dir_sig_re.match(sig)
+    if not m:
+        signode += addnodes.desc_name(sig, sig)
+        return sig
+    name, args = m.groups()
+    dec_name = '.. %s::' % name
+    signode += addnodes.desc_name(dec_name, dec_name)
+    signode += addnodes.desc_classname(args, args)
+    return name
+
+
+def parse_role(env, sig, signode):
+    signode += addnodes.desc_name(':%s:' % sig, ':%s:' % sig)
+    return sig
+
+
+def setup(app):
+    app.add_description_unit('directive', 'dir', 'pair: %s; directive', parse_directive)
+    app.add_description_unit('role', 'role', 'pair: %s; role', parse_role)
+    app.add_description_unit('confval', 'confval', 'pair: %s; configuration value')

Modified: doctools/trunk/doc/config.rst
==============================================================================
--- doctools/trunk/doc/config.rst	(original)
+++ doctools/trunk/doc/config.rst	Sun Apr  6 19:38:55 2008
@@ -50,6 +50,9 @@
    That way, you can load an extension called ``extname`` from the documentation
    root's subdirectory ``sphinxext``.
 
+   The configuration file itself can be an extension; for that, you only need to
+   provide a :func:`setup` function in it.
+
 .. confval:: templates_path
 
    A list of paths that contain extra templates (or templates that overwrite

Deleted: /doctools/trunk/doc/ext.py
==============================================================================
--- /doctools/trunk/doc/ext.py	Sun Apr  6 19:38:55 2008
+++ (empty file)
@@ -1,40 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    ext.py -- Sphinx extension for the Sphinx documentation
-    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-    :copyright: 2008 by Georg Brandl.
-    :license: BSD.
-"""
-
-import re
-
-from sphinx import addnodes
-
-dir_sig_re = re.compile(r'\.\. ([^:]+)::(.*)$')
-
-def parse_directive(env, sig, signode):
-    if not sig.startswith('.'):
-        dec_sig = '.. %s::' % sig
-        signode += addnodes.desc_name(dec_sig, dec_sig)
-        return sig
-    m = dir_sig_re.match(sig)
-    if not m:
-        signode += addnodes.desc_name(sig, sig)
-        return sig
-    name, args = m.groups()
-    dec_name = '.. %s::' % name
-    signode += addnodes.desc_name(dec_name, dec_name)
-    signode += addnodes.desc_classname(args, args)
-    return name
-
-
-def parse_role(env, sig, signode):
-    signode += addnodes.desc_name(':%s:' % sig, ':%s:' % sig)
-    return sig
-
-
-def setup(app):
-    app.add_description_unit('directive', 'dir', 'pair: %s; directive', parse_directive)
-    app.add_description_unit('role', 'role', 'pair: %s; role', parse_role)
-    app.add_description_unit('confval', 'confval', 'pair: %s; configuration value')

Modified: doctools/trunk/doc/extensions.rst
==============================================================================
--- doctools/trunk/doc/extensions.rst	(original)
+++ doctools/trunk/doc/extensions.rst	Sun Apr  6 19:38:55 2008
@@ -15,6 +15,9 @@
 are so-called "hook points" at strategic places throughout the build process,
 where an extension can register a hook and run specialized code.
 
+The configuration file itself can be an extension, see the :confval:`extensions`
+configuration value docs.
+
 .. toctree::
 
    ext/appapi

Modified: doctools/trunk/sphinx/application.py
==============================================================================
--- doctools/trunk/sphinx/application.py	(original)
+++ doctools/trunk/sphinx/application.py	Sun Apr  6 19:38:55 2008
@@ -79,6 +79,9 @@
         # load all extension modules
         for extension in getattr(self.config, 'extensions', ()):
             self.setup_extension(extension)
+        # the config file itself can be an extension
+        if hasattr(self.config, 'setup'):
+            self.config.setup(self)
 
         # this must happen after loading extension modules, since they
         # can add custom config values

Modified: doctools/trunk/sphinx/config.py
==============================================================================
--- doctools/trunk/sphinx/config.py	(original)
+++ doctools/trunk/sphinx/config.py	Sun Apr  6 19:38:55 2008
@@ -10,7 +10,6 @@
 """
 
 import os
-import types
 from os import path
 
 
@@ -77,10 +76,6 @@
             execfile(config['__file__'], config)
         finally:
             os.chdir(olddir)
-        # remove potentially pickling-problematic values
-        for key, val in config.items():
-            if key.startswith('_') or isinstance(val, types.ModuleType):
-                del config[key]
         self.__dict__.update(config)
 
     def init_defaults(self):
@@ -91,5 +86,11 @@
     def __getitem__(self, name):
         return getattr(self, name)
 
+    def __setitem__(self, name, value):
+        setattr(self, name, value)
+
+    def __delitem__(self, name):
+        delattr(self, name)
+
     def __contains__(self, name):
         return hasattr(self, name)

Modified: doctools/trunk/sphinx/environment.py
==============================================================================
--- doctools/trunk/sphinx/environment.py	(original)
+++ doctools/trunk/sphinx/environment.py	Sun Apr  6 19:38:55 2008
@@ -13,6 +13,7 @@
 import os
 import time
 import heapq
+import types
 import difflib
 import itertools
 import cPickle as pickle
@@ -179,6 +180,12 @@
         warnfunc = self._warnfunc
         self.set_warnfunc(None)
         picklefile = open(filename, 'wb')
+        # remove potentially pickling-problematic values from config
+        for key, val in vars(self.config).items():
+            if key.startswith('_') or \
+                   isinstance(val, types.ModuleType) or \
+                   isinstance(val, types.FunctionType):
+                del self.config[key]
         try:
             pickle.dump(self, picklefile, pickle.HIGHEST_PROTOCOL)
         finally:


More information about the Python-checkins mailing list