summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/util/langhelpers.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy/util/langhelpers.py')
-rw-r--r--lib/sqlalchemy/util/langhelpers.py43
1 files changed, 29 insertions, 14 deletions
diff --git a/lib/sqlalchemy/util/langhelpers.py b/lib/sqlalchemy/util/langhelpers.py
index 4289db812..ce3a28499 100644
--- a/lib/sqlalchemy/util/langhelpers.py
+++ b/lib/sqlalchemy/util/langhelpers.py
@@ -10,6 +10,7 @@ modules, classes, hierarchies, attributes, functions, and methods.
"""
+import collections
from functools import update_wrapper
import hashlib
import inspect
@@ -83,6 +84,20 @@ class safe_reraise(object):
compat.raise_(value, with_traceback=traceback)
+def walk_subclasses(cls):
+ seen = set()
+
+ stack = [cls]
+ while stack:
+ cls = stack.pop()
+ if cls in seen:
+ continue
+ else:
+ seen.add(cls)
+ stack.extend(cls.__subclasses__())
+ yield cls
+
+
def string_or_unprintable(element):
if isinstance(element, compat.string_types):
return element
@@ -1782,15 +1797,22 @@ def inject_docstring_text(doctext, injecttext, pos):
return "\n".join(lines)
+_param_reg = re.compile(r"(\s+):param (.+?):")
+
+
def inject_param_text(doctext, inject_params):
- doclines = doctext.splitlines()
+ doclines = collections.deque(doctext.splitlines())
lines = []
+ # TODO: this is not working for params like ":param case_sensitive=True:"
+
to_inject = None
while doclines:
- line = doclines.pop(0)
+ line = doclines.popleft()
+
+ m = _param_reg.match(line)
+
if to_inject is None:
- m = re.match(r"(\s+):param (.+?):", line)
if m:
param = m.group(2).lstrip("*")
if param in inject_params:
@@ -1805,23 +1827,16 @@ def inject_param_text(doctext, inject_params):
indent = " " * len(m2.group(1))
to_inject = indent + inject_params[param]
- elif line.lstrip().startswith(":param "):
- lines.append("\n")
- lines.append(to_inject)
- lines.append("\n")
+ elif m:
+ lines.extend(["\n", to_inject, "\n"])
to_inject = None
elif not line.rstrip():
- lines.append(line)
- lines.append(to_inject)
- lines.append("\n")
+ lines.extend([line, to_inject, "\n"])
to_inject = None
elif line.endswith("::"):
# TODO: this still wont cover if the code example itself has blank
# lines in it, need to detect those via indentation.
- lines.append(line)
- lines.append(
- doclines.pop(0)
- ) # the blank line following a code example
+ lines.extend([line, doclines.popleft()])
continue
lines.append(line)