Skip to content

Commit

Permalink
Create the node factory where we need it
Browse files Browse the repository at this point in the history
Instead of creating it at the top and passing it all the way down.

This does mean that we have a lot of NodeFactory instances but they are
light weight so nothing to be worried about.

For #236.
  • Loading branch information
Michael Jones committed Jan 15, 2016
1 parent 21c364d commit 66d5755
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 50 deletions.
36 changes: 2 additions & 34 deletions breathe/directives.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,20 +14,16 @@
from .process import AutoDoxygenProcessHandle
from .exception import BreatheError
from .project import ProjectInfoFactory, ProjectError
from .node_factory import create_node_factory

from docutils.parsers.rst.directives import unchanged_required, unchanged, flag
from sphinx.domains import cpp, c, python
from sphinx.writers.text import TextWriter
from sphinx.builders.text import TextBuilder

import docutils.nodes
import sphinx.addnodes
import sphinx.ext.mathbase

import os
import fnmatch
import re
import collections
import subprocess

# Somewhat outrageously, reach in and fix a Sphinx regex
Expand All @@ -44,10 +40,6 @@ def __init__(self, signatures):
self.signatures = signatures


class NodeNotFoundError(BreatheError):
pass


class FakeDestination(object):

def write(self, output):
Expand Down Expand Up @@ -658,23 +650,6 @@ def get_config_values(self, app):
)


class NodeFactory(object):

def __init__(self, *args):

self.sources = args

def __getattr__(self, node_name):

for source in self.sources:
try:
return getattr(source, node_name)
except AttributeError:
pass

raise NodeNotFoundError(node_name)


class RootDataObject(object):

node_type = "root"
Expand Down Expand Up @@ -857,15 +832,7 @@ def setup(app):
index_parser = parser_factory.create_index_parser()
finder_factory = FinderFactory(index_parser, item_finder_factory_creator)

# Create a math_nodes object with a displaymath member for the displaymath
# node so that we can treat it in the same way as the nodes & addnodes
# modules in the NodeFactory
math_nodes = collections.namedtuple("MathNodes", ["displaymath"])
math_nodes.displaymath = sphinx.ext.mathbase.displaymath
node_factory = NodeFactory(docutils.nodes, sphinx.addnodes, math_nodes)

renderer_factory_creator_constructor = DoxygenToRstRendererFactoryCreatorConstructor(
node_factory,
parser_factory,
DomainDirectiveFactory,
)
Expand All @@ -875,6 +842,7 @@ def setup(app):
# with the breathe_build_directory config variable
build_dir = os.path.dirname(app.doctreedir.rstrip(os.sep))
project_info_factory = ProjectInfoFactory(app.srcdir, build_dir, app.confdir, fnmatch.fnmatch)
node_factory = create_node_factory()
target_handler_factory = TargetHandlerFactory(node_factory)

root_data_object = RootDataObject()
Expand Down
38 changes: 38 additions & 0 deletions breathe/node_factory.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@

import docutils.nodes
import collections
import sphinx.addnodes
import sphinx.ext.mathbase

from .exception import BreatheError


class NodeNotFoundError(BreatheError):
pass


class NodeFactory(object):

def __init__(self, *args):

self.sources = args

def __getattr__(self, node_name):

for source in self.sources:
try:
return getattr(source, node_name)
except AttributeError:
pass

raise NodeNotFoundError(node_name)


def create_node_factory():

# Create a math_nodes object with a displaymath member for the displaymath
# node so that we can treat it in the same way as the nodes & addnodes
# modules in the NodeFactory
math_nodes = collections.namedtuple("MathNodes", ["displaymath"])
math_nodes.displaymath = sphinx.ext.mathbase.displaymath
return NodeFactory(docutils.nodes, sphinx.addnodes, math_nodes)
26 changes: 10 additions & 16 deletions breathe/renderer/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@

import textwrap

from ..node_factory import create_node_factory
from .base import Renderer
from . import index as indexrenderer
from . import compound as compoundrenderer
Expand Down Expand Up @@ -62,7 +63,6 @@ def __init__(
node_type,
renderers,
renderer_factory_creator,
node_factory,
project_info,
state,
document,
Expand All @@ -72,7 +72,6 @@ def __init__(
):

self.node_type = node_type
self.node_factory = node_factory
self.project_info = project_info
self.renderers = renderers
self.renderer_factory_creator = renderer_factory_creator
Expand Down Expand Up @@ -112,11 +111,13 @@ def create_renderer(

Renderer = self.renderers[node_type]

node_factory = create_node_factory()

common_args = [
self.project_info,
context,
child_renderer_factory,
self.node_factory,
node_factory,
self.state,
self.document,
self.target_handler,
Expand All @@ -125,17 +126,17 @@ def create_renderer(

if node_type == "docmarkup":

creator = self.node_factory.inline
creator = node_factory.inline
if data_object.type_ == "emphasis":
creator = self.node_factory.emphasis
creator = node_factory.emphasis
elif data_object.type_ == "computeroutput":
creator = self.node_factory.literal
creator = node_factory.literal
elif data_object.type_ == "bold":
creator = self.node_factory.strong
creator = node_factory.strong
elif data_object.type_ == "superscript":
creator = self.node_factory.superscript
creator = node_factory.superscript
elif data_object.type_ == "subscript":
creator = self.node_factory.subscript
creator = node_factory.subscript
elif data_object.type_ == "center":
print("Warning: does not currently handle 'center' text display")
elif data_object.type_ == "small":
Expand Down Expand Up @@ -225,13 +226,11 @@ class DoxygenToRstRendererFactoryCreator(object):

def __init__(
self,
node_factory,
parser_factory,
domain_directive_factory,
project_info
):

self.node_factory = node_factory
self.parser_factory = parser_factory
self.domain_directive_factory = domain_directive_factory
self.project_info = project_info
Expand Down Expand Up @@ -281,7 +280,6 @@ def create_factory(self, node_stack, state, document, filter_, target_handler):
"root",
renderers,
self,
self.node_factory,
self.project_info,
state,
document,
Expand All @@ -307,7 +305,6 @@ def create_child_factory(self, project_info, data_object, parent_renderer_factor
node_type,
parent_renderer_factory.renderers,
self,
self.node_factory,
parent_renderer_factory.project_info,
parent_renderer_factory.state,
parent_renderer_factory.document,
Expand All @@ -322,19 +319,16 @@ class DoxygenToRstRendererFactoryCreatorConstructor(object):

def __init__(
self,
node_factory,
parser_factory,
domain_directive_factory,
):

self.node_factory = node_factory
self.parser_factory = parser_factory
self.domain_directive_factory = domain_directive_factory

def create_factory_creator(self, project_info, document, target_handler):

return DoxygenToRstRendererFactoryCreator(
self.node_factory,
self.parser_factory,
self.domain_directive_factory,
project_info,
Expand Down

0 comments on commit 66d5755

Please sign in to comment.