| 1 |
|
|---|
| 2 |
|
|---|
| 3 |
|
|---|
| 4 |
|
|---|
| 5 |
|
|---|
| 6 |
""" |
|---|
| 7 |
This module contain fixed functions from epydoc classes that have to replace original. |
|---|
| 8 |
""" |
|---|
| 9 |
from epydoc.uid import UID, Link, make_uid, findUID |
|---|
| 10 |
from epydoc.objdoc import ObjDoc, _find_base_order, _lookup_class_field, Var |
|---|
| 11 |
from epydoc.uid import _ZopeType, _ZopeMethodType, _ZopeCMethodType |
|---|
| 12 |
from epydoc.cli import _internal_error |
|---|
| 13 |
import epydoc.markup as markup |
|---|
| 14 |
import sys, os.path, re, getopt, types |
|---|
| 15 |
from epydoc.cli import _Progress |
|---|
| 16 |
import epydoc.cli |
|---|
| 17 |
import epydoc.html |
|---|
| 18 |
import epydoc.objdoc |
|---|
| 19 |
|
|---|
| 20 |
def epydoc_html_write_breadcrumbs(self, public, private, where=None): |
|---|
| 21 |
""" |
|---|
| 22 |
Write the HTML code for the breadcrumbs line to the given |
|---|
| 23 |
streams. The breadcrumbs line is an invisible table with a |
|---|
| 24 |
list of pointers to the current object's ancestors on the |
|---|
| 25 |
left; and the show/hide private selector and the |
|---|
| 26 |
frames/noframes selector on the right. |
|---|
| 27 |
|
|---|
| 28 |
@param where: An identifier indicating what page we're |
|---|
| 29 |
creating a navigation bar for. This is either a UID |
|---|
| 30 |
(for an object documentation page); or a string. If |
|---|
| 31 |
it is a UID, then a list of pointers to its ancestors |
|---|
| 32 |
is displayed. |
|---|
| 33 |
@param public: The output stream for the public version of the page. |
|---|
| 34 |
@param private: The output stream for the private version of the page. |
|---|
| 35 |
""" |
|---|
| 36 |
|
|---|
| 37 |
str = '<table width="100%" cellpadding="0" cellspacing="0">\n' |
|---|
| 38 |
str += ' <tr valign="top">\n <td width="100%">\n' |
|---|
| 39 |
if isinstance(where, UID): str += self._breadcrumbs(where) |
|---|
| 40 |
str += ' </td>\n <td>' |
|---|
| 41 |
str += '<table cellpadding="0" cellspacing="0">\n' |
|---|
| 42 |
public.write(str); private.write(str) |
|---|
| 43 |
|
|---|
| 44 |
|
|---|
| 45 |
if self._create_private_docs: |
|---|
| 46 |
link = self._public_private_link(where, from_private=0) |
|---|
| 47 |
public.write(' <tr><td align="right">%s</td></tr>\n' % link) |
|---|
| 48 |
link = self._public_private_link(where, from_private=1) |
|---|
| 49 |
private.write(' <tr><td align="right">%s</td></tr>\n' % link) |
|---|
| 50 |
|
|---|
| 51 |
|
|---|
| 52 |
frames_link = "" |
|---|
| 53 |
if self._frames_index: |
|---|
| 54 |
frames_link = self._frames_link(where) |
|---|
| 55 |
str = (' <tr><td align="right">%s</td></tr>\n' % frames_link) |
|---|
| 56 |
str += ' </table></td>\n' |
|---|
| 57 |
str += '</tr></table>\n' |
|---|
| 58 |
public.write(str); private.write(str) |
|---|
| 59 |
|
|---|
| 60 |
def epydoc_object__init__(self, uid, verbosity=0): |
|---|
| 61 |
cls = uid.value() |
|---|
| 62 |
|
|---|
| 63 |
self._tmp_ivar = {} |
|---|
| 64 |
self._tmp_cvar = {} |
|---|
| 65 |
self._tmp_type = {} |
|---|
| 66 |
self._property_type = {} |
|---|
| 67 |
|
|---|
| 68 |
ObjDoc.__init__(self, uid, verbosity) |
|---|
| 69 |
|
|---|
| 70 |
|
|---|
| 71 |
self._methods = [] |
|---|
| 72 |
self._cvariables = [] |
|---|
| 73 |
self._ivariables = [] |
|---|
| 74 |
self._staticmethods = [] |
|---|
| 75 |
self._classmethods = [] |
|---|
| 76 |
self._properties = [] |
|---|
| 77 |
|
|---|
| 78 |
|
|---|
| 79 |
base_order = _find_base_order(cls) |
|---|
| 80 |
self._base_order = [make_uid(b) for b in base_order] |
|---|
| 81 |
|
|---|
| 82 |
try: fields = dir(cls) |
|---|
| 83 |
except: fields = [] |
|---|
| 84 |
for field in fields: |
|---|
| 85 |
|
|---|
| 86 |
|
|---|
| 87 |
docstring = '' |
|---|
| 88 |
try: |
|---|
| 89 |
docstring = getattr(cls, field).__doc__ |
|---|
| 90 |
except: |
|---|
| 91 |
pass |
|---|
| 92 |
if field in ('__doc__', '__module__', '__dict__', |
|---|
| 93 |
'__weakref__', '__basicnew__', '__reduce__','__repr__')\ |
|---|
| 94 |
or (not field.startswith('__') and docstring in ( "PermissionRole", |
|---|
| 95 |
"Default Accessor.", |
|---|
| 96 |
"Default Mutator.", |
|---|
| 97 |
"Default Edit Accessor." |
|---|
| 98 |
)): |
|---|
| 99 |
continue |
|---|
| 100 |
|
|---|
| 101 |
|
|---|
| 102 |
|
|---|
| 103 |
|
|---|
| 104 |
(val, container) = _lookup_class_field(cls, field, base_order) |
|---|
| 105 |
|
|---|
| 106 |
linkname = field |
|---|
| 107 |
private_prefix = '_%s__' % container.shortname() |
|---|
| 108 |
if field.startswith(private_prefix): |
|---|
| 109 |
if container == self._uid: |
|---|
| 110 |
|
|---|
| 111 |
|
|---|
| 112 |
linkname = linkname[len(private_prefix)-2:] |
|---|
| 113 |
else: |
|---|
| 114 |
|
|---|
| 115 |
|
|---|
| 116 |
continue |
|---|
| 117 |
|
|---|
| 118 |
|
|---|
| 119 |
try: |
|---|
| 120 |
|
|---|
| 121 |
try: rawval = container.value().__dict__.get(field) |
|---|
| 122 |
except: pass |
|---|
| 123 |
|
|---|
| 124 |
if isinstance(rawval, staticmethod): |
|---|
| 125 |
vuid = make_uid(rawval, container, linkname) |
|---|
| 126 |
vlink = Link(linkname, vuid) |
|---|
| 127 |
self._staticmethods.append(vlink) |
|---|
| 128 |
continue |
|---|
| 129 |
elif isinstance(rawval, classmethod): |
|---|
| 130 |
vuid = make_uid(rawval, container, linkname) |
|---|
| 131 |
vlink = Link(linkname, vuid) |
|---|
| 132 |
self._classmethods.append(vlink) |
|---|
| 133 |
continue |
|---|
| 134 |
elif isinstance(rawval, property): |
|---|
| 135 |
vuid = make_uid(rawval, container, linkname) |
|---|
| 136 |
vlink = Link(linkname, vuid) |
|---|
| 137 |
self._properties.append(vlink) |
|---|
| 138 |
continue |
|---|
| 139 |
except NameError: pass |
|---|
| 140 |
|
|---|
| 141 |
|
|---|
| 142 |
vuid = make_uid(val, container, linkname) |
|---|
| 143 |
vlink = Link(linkname, vuid) |
|---|
| 144 |
|
|---|
| 145 |
|
|---|
| 146 |
if vuid is None: continue |
|---|
| 147 |
|
|---|
| 148 |
if vuid.is_module(): continue |
|---|
| 149 |
|
|---|
| 150 |
|
|---|
| 151 |
if vuid.is_routine(): |
|---|
| 152 |
self._methods.append(vlink) |
|---|
| 153 |
|
|---|
| 154 |
elif container == self._uid: |
|---|
| 155 |
|
|---|
| 156 |
if self._tmp_ivar.has_key(field): |
|---|
| 157 |
descr = self._tmp_ivar[field] |
|---|
| 158 |
del self._tmp_ivar[field] |
|---|
| 159 |
typ = self._tmp_type.get(field) |
|---|
| 160 |
if typ is not None: del self._tmp_type[field] |
|---|
| 161 |
else: typ = markup.parse_type_of(val) |
|---|
| 162 |
self._ivariables.append(Var(field, vuid, descr, typ, 1)) |
|---|
| 163 |
|
|---|
| 164 |
|
|---|
| 165 |
else: |
|---|
| 166 |
autogen = 1 |
|---|
| 167 |
descr = self._tmp_cvar.get(field) |
|---|
| 168 |
if descr is not None: |
|---|
| 169 |
del self._tmp_cvar[field] |
|---|
| 170 |
autogen = 0 |
|---|
| 171 |
typ = self._tmp_type.get(field) |
|---|
| 172 |
if typ is not None: |
|---|
| 173 |
del self._tmp_type[field] |
|---|
| 174 |
autogen = 0 |
|---|
| 175 |
else: typ = markup.parse_type_of(val) |
|---|
| 176 |
self._cvariables.append(Var(field, vuid, descr, |
|---|
| 177 |
typ, 1, autogen)) |
|---|
| 178 |
|
|---|
| 179 |
|
|---|
| 180 |
for prop in self._properties: |
|---|
| 181 |
name = prop.name() |
|---|
| 182 |
typ = self._tmp_type.get(name) |
|---|
| 183 |
if typ is not None: |
|---|
| 184 |
if prop.target().cls() != self._uid: |
|---|
| 185 |
estr = "@type can't be used on an inherited properties" |
|---|
| 186 |
self._field_warnings.append(estr) |
|---|
| 187 |
self._property_type[prop.target()] = typ |
|---|
| 188 |
del self._tmp_type[name] |
|---|
| 189 |
|
|---|
| 190 |
|
|---|
| 191 |
for (name, descr) in self._tmp_cvar.items(): |
|---|
| 192 |
typ = self._tmp_type.get(name) |
|---|
| 193 |
if typ is not None: del self._tmp_type[name] |
|---|
| 194 |
vuid = make_uid(None, self._uid, name) |
|---|
| 195 |
self._cvariables.append(Var(name, vuid, descr, typ, 0)) |
|---|
| 196 |
|
|---|
| 197 |
|
|---|
| 198 |
for (name, descr) in self._tmp_ivar.items(): |
|---|
| 199 |
typ = self._tmp_type.get(name) |
|---|
| 200 |
if typ is not None: del self._tmp_type[name] |
|---|
| 201 |
vuid = make_uid(None, self._uid, name) |
|---|
| 202 |
self._ivariables.append(Var(name, vuid, descr, typ, 0)) |
|---|
| 203 |
|
|---|
| 204 |
|
|---|
| 205 |
if self._tmp_type: |
|---|
| 206 |
for key in self._tmp_type.keys(): |
|---|
| 207 |
estr = '@type for unknown variable %s' % key |
|---|
| 208 |
self._field_warnings.append(estr) |
|---|
| 209 |
del self._tmp_ivar |
|---|
| 210 |
del self._tmp_cvar |
|---|
| 211 |
del self._tmp_type |
|---|
| 212 |
|
|---|
| 213 |
|
|---|
| 214 |
try: bases = cls.__bases__ |
|---|
| 215 |
except AttributeError: bases = [] |
|---|
| 216 |
self._bases = [Link(base.__name__, make_uid(base)) for base in bases |
|---|
| 217 |
if (type(base) in (types.ClassType, _ZopeType) or |
|---|
| 218 |
(isinstance(base, types.TypeType)))] |
|---|
| 219 |
|
|---|
| 220 |
|
|---|
| 221 |
|
|---|
| 222 |
self._subclasses = [] |
|---|
| 223 |
|
|---|
| 224 |
|
|---|
| 225 |
try: self._is_exception = issubclass(cls, Exception) |
|---|
| 226 |
except TypeError: self._is_exception = 0 |
|---|
| 227 |
|
|---|
| 228 |
|
|---|
| 229 |
self._inh_cvariables = [] |
|---|
| 230 |
self._inh_ivariables = [] |
|---|
| 231 |
|
|---|
| 232 |
|
|---|
| 233 |
self._allmethods = (self._methods) |
|---|
| 234 |
|
|---|
| 235 |
|
|---|
| 236 |
|
|---|
| 237 |
self._methods = self._sort(self._methods) |
|---|
| 238 |
self._classmethods = self._sort(self._classmethods) |
|---|
| 239 |
self._staticmethods = self._sort(self._staticmethods) |
|---|
| 240 |
self._properties = self._sort(self._properties) |
|---|
| 241 |
self._cvariables = self._sort(self._cvariables) |
|---|
| 242 |
self._ivariables = self._sort(self._ivariables) |
|---|
| 243 |
self._bases = self._sort(self._bases) |
|---|
| 244 |
self._subclasses = self._sort(self._subclasses) |
|---|
| 245 |
self._allmethods = self._sort(self._allmethods) |
|---|
| 246 |
|
|---|
| 247 |
|
|---|
| 248 |
self._print_errors() |
|---|
| 249 |
|
|---|
| 250 |
def epydoc_cli_make_docmap(modules, options): |
|---|
| 251 |
""" |
|---|
| 252 |
Construct the documentation map for the given modules. |
|---|
| 253 |
|
|---|
| 254 |
@param modules: The modules that should be documented. |
|---|
| 255 |
@type modules: C{list} of C{Module} |
|---|
| 256 |
@param options: Options from the command-line arguments. |
|---|
| 257 |
@type options: C{dict} |
|---|
| 258 |
""" |
|---|
| 259 |
from epydoc.objdoc import DocMap, report_param_mismatches |
|---|
| 260 |
|
|---|
| 261 |
verbosity = options['verbosity'] |
|---|
| 262 |
document_bases = 0 |
|---|
| 263 |
document_autogen_vars =1 |
|---|
| 264 |
inheritance_groups = (options['inheritance'] == 'grouped') |
|---|
| 265 |
inherit_groups = (options['inheritance'] != 'grouped') |
|---|
| 266 |
d = DocMap(verbosity, document_bases, document_autogen_vars, |
|---|
| 267 |
inheritance_groups, inherit_groups) |
|---|
| 268 |
if options['verbosity'] > 0: |
|---|
| 269 |
print >>sys.stderr, ('Building API documentation for %d modules.' |
|---|
| 270 |
% len(modules)) |
|---|
| 271 |
progress = _Progress('Building docs for', verbosity, len(modules)) |
|---|
| 272 |
|
|---|
| 273 |
for module in modules: |
|---|
| 274 |
progress.report(module.__name__) |
|---|
| 275 |
|
|---|
| 276 |
try: d.add(module) |
|---|
| 277 |
except Exception, e: |
|---|
| 278 |
if options['debug']: raise |
|---|
| 279 |
else: _internal_error(e) |
|---|
| 280 |
except: |
|---|
| 281 |
if options['debug']: raise |
|---|
| 282 |
else: _internal_error() |
|---|
| 283 |
|
|---|
| 284 |
if not options['ignore_param_mismatch']: |
|---|
| 285 |
if not report_param_mismatches(d): |
|---|
| 286 |
estr = ' (To supress these warnings, ' |
|---|
| 287 |
estr += 'use --ignore-param-mismatch)' |
|---|
| 288 |
print >>sys.stderr, estr |
|---|
| 289 |
|
|---|
| 290 |
return d |
|---|
| 291 |
|
|---|
| 292 |
epydoc.cli._make_docmap = epydoc_cli_make_docmap |
|---|
| 293 |
epydoc.html.HTMLFormatter._write_breadcrumbs = epydoc_html_write_breadcrumbs |
|---|
| 294 |
epydoc.objdoc.ClassDoc.__init__ = epydoc_object__init__ |
|---|