+
+def load_spec(filename):
+ module = imp.load_source('spec', filename)
+ nodes = []
+ for x in module.__dict__.values():
+ if not isOp(x):
+ continue
+ setnodedefaults(x)
+ verify_node(x)
+ nodes.append(x)
+ nodes.sort(key=lambda x: x.name)
+ module.nodes = nodes
+ if len(nodes) == 0:
+ print "Warning: No nodes found in spec file '%s'" % filename
+ if not hasattr(module, "name"):
+ print "Warning: No name specified in file '%s'" % filename
+ return module
+
+def trim_docstring(docstring):
+ if not docstring:
+ return ''
+ # Convert tabs to spaces (following the normal Python rules)
+ # and split into a list of lines:
+ lines = docstring.expandtabs().splitlines()
+ # Determine minimum indentation (first line doesn't count):
+ indent = sys.maxint
+ for line in lines[1:]:
+ stripped = line.lstrip()
+ if stripped:
+ indent = min(indent, len(line) - len(stripped))
+ # Remove indentation (first line is special):
+ trimmed = [lines[0].strip()]
+ if indent < sys.maxint:
+ for line in lines[1:]:
+ trimmed.append(line[indent:].rstrip())
+ # Strip off trailing and leading blank lines:
+ while trimmed and not trimmed[-1]:
+ trimmed.pop()
+ while trimmed and not trimmed[0]:
+ trimmed.pop(0)
+ # Return a single string:
+ return '\n'.join(trimmed)