blob: 7eac12069f7034a49a2f0f4b8b2d9092eba5a028 [file] [log] [blame]
Tor Norbye3a2425a2013-11-04 10:16:08 -08001# epydoc -- API Documentation Classes
2#
3# Copyright (C) 2005 Edward Loper
4# Author: Edward Loper <edloper@loper.org>
5# URL: <http://epydoc.sf.net>
6#
7# $Id: apidoc.py 1675 2008-01-29 17:12:56Z edloper $
8
9"""
10Classes for encoding API documentation about Python programs.
11These classes are used as a common representation for combining
12information derived from introspection and from parsing.
13
14The API documentation for a Python program is encoded using a graph of
15L{APIDoc} objects, each of which encodes information about a single
16Python variable or value. C{APIDoc} has two direct subclasses:
17L{VariableDoc}, for documenting variables; and L{ValueDoc}, for
18documenting values. The C{ValueDoc} class is subclassed further, to
19define the different pieces of information that should be recorded
20about each value type:
21
22G{classtree: APIDoc}
23
24The distinction between variables and values is intentionally made
25explicit. This allows us to distinguish information about a variable
26itself (such as whether it should be considered 'public' in its
27containing namespace) from information about the value it contains
28(such as what type the value has). This distinction is also important
29because several variables can contain the same value: each variable
30should be described by a separate C{VariableDoc}; but we only need one
31C{ValueDoc}, since they share a single value.
32
33@todo: Add a cache to canonical name lookup?
34"""
35__docformat__ = 'epytext en'
36
37######################################################################
38## Imports
39######################################################################
40
41import types, re, os.path, pickle
42from epydoc import log
43import epydoc
44import __builtin__
45from epydoc.compat import * # Backwards compatibility
46from epydoc.util import decode_with_backslashreplace, py_src_filename
47import epydoc.markup.pyval_repr
48
49######################################################################
50# Dotted Names
51######################################################################
52
53class DottedName:
54 """
55 A sequence of identifiers, separated by periods, used to name a
56 Python variable, value, or argument. The identifiers that make up
57 a dotted name can be accessed using the indexing operator:
58
59 >>> name = DottedName('epydoc', 'api_doc', 'DottedName')
60 >>> print name
61 epydoc.apidoc.DottedName
62 >>> name[1]
63 'api_doc'
64 """
65 UNREACHABLE = "??"
66 _IDENTIFIER_RE = re.compile("""(?x)
67 (%s | # UNREACHABLE marker, or..
68 (script-)? # Prefix: script (not a module)
69 \w+ # Identifier (yes, identifiers starting with a
70 # digit are allowed. See SF bug #1649347)
71 '?) # Suffix: submodule that is shadowed by a var
72 (-\d+)? # Suffix: unreachable vals with the same name
73 $"""
74 % re.escape(UNREACHABLE))
75
76 class InvalidDottedName(ValueError):
77 """
78 An exception raised by the DottedName constructor when one of
79 its arguments is not a valid dotted name.
80 """
81
82 _ok_identifiers = set()
83 """A cache of identifier strings that have been checked against
84 _IDENTIFIER_RE and found to be acceptable."""
85
86 def __init__(self, *pieces, **options):
87 """
88 Construct a new dotted name from the given sequence of pieces,
89 each of which can be either a C{string} or a C{DottedName}.
90 Each piece is divided into a sequence of identifiers, and
91 these sequences are combined together (in order) to form the
92 identifier sequence for the new C{DottedName}. If a piece
93 contains a string, then it is divided into substrings by
94 splitting on periods, and each substring is checked to see if
95 it is a valid identifier.
96
97 As an optimization, C{pieces} may also contain a single tuple
98 of values. In that case, that tuple will be used as the
99 C{DottedName}'s identifiers; it will I{not} be checked to
100 see if it's valid.
101
102 @kwparam strict: if true, then raise an L{InvalidDottedName}
103 if the given name is invalid.
104 """
105 if len(pieces) == 1 and isinstance(pieces[0], tuple):
106 self._identifiers = pieces[0] # Optimization
107 return
108 if len(pieces) == 0:
109 raise DottedName.InvalidDottedName('Empty DottedName')
110 self._identifiers = []
111 for piece in pieces:
112 if isinstance(piece, DottedName):
113 self._identifiers += piece._identifiers
114 elif isinstance(piece, basestring):
115 for subpiece in piece.split('.'):
116 if piece not in self._ok_identifiers:
117 if not self._IDENTIFIER_RE.match(subpiece):
118 if options.get('strict'):
119 raise DottedName.InvalidDottedName(
120 'Bad identifier %r' % (piece,))
121 else:
122 log.warning("Identifier %r looks suspicious; "
123 "using it anyway." % piece)
124 self._ok_identifiers.add(piece)
125 self._identifiers.append(subpiece)
126 else:
127 raise TypeError('Bad identifier %r: expected '
128 'DottedName or str' % (piece,))
129 self._identifiers = tuple(self._identifiers)
130
131 def __repr__(self):
132 idents = [`ident` for ident in self._identifiers]
133 return 'DottedName(' + ', '.join(idents) + ')'
134
135 def __str__(self):
136 """
137 Return the dotted name as a string formed by joining its
138 identifiers with periods:
139
140 >>> print DottedName('epydoc', 'api_doc', DottedName')
141 epydoc.apidoc.DottedName
142 """
143 return '.'.join(self._identifiers)
144
145 def __add__(self, other):
146 """
147 Return a new C{DottedName} whose identifier sequence is formed
148 by adding C{other}'s identifier sequence to C{self}'s.
149 """
150 if isinstance(other, (basestring, DottedName)):
151 return DottedName(self, other)
152 else:
153 return DottedName(self, *other)
154
155 def __radd__(self, other):
156 """
157 Return a new C{DottedName} whose identifier sequence is formed
158 by adding C{self}'s identifier sequence to C{other}'s.
159 """
160 if isinstance(other, (basestring, DottedName)):
161 return DottedName(other, self)
162 else:
163 return DottedName(*(list(other)+[self]))
164
165 def __getitem__(self, i):
166 """
167 Return the C{i}th identifier in this C{DottedName}. If C{i} is
168 a non-empty slice, then return a C{DottedName} built from the
169 identifiers selected by the slice. If C{i} is an empty slice,
170 return an empty list (since empty C{DottedName}s are not valid).
171 """
172 if isinstance(i, types.SliceType):
173 pieces = self._identifiers[i.start:i.stop]
174 if pieces: return DottedName(pieces)
175 else: return []
176 else:
177 return self._identifiers[i]
178
179 def __hash__(self):
180 return hash(self._identifiers)
181
182 def __cmp__(self, other):
183 """
184 Compare this dotted name to C{other}. Two dotted names are
185 considered equal if their identifier subsequences are equal.
186 Ordering between dotted names is lexicographic, in order of
187 identifier from left to right.
188 """
189 if not isinstance(other, DottedName):
190 return -1
191 return cmp(self._identifiers, other._identifiers)
192
193 def __len__(self):
194 """
195 Return the number of identifiers in this dotted name.
196 """
197 return len(self._identifiers)
198
199 def container(self):
200 """
201 Return the DottedName formed by removing the last identifier
202 from this dotted name's identifier sequence. If this dotted
203 name only has one name in its identifier sequence, return
204 C{None} instead.
205 """
206 if len(self._identifiers) == 1:
207 return None
208 else:
209 return DottedName(*self._identifiers[:-1])
210
211 def dominates(self, name, strict=False):
212 """
213 Return true if this dotted name is equal to a prefix of
214 C{name}. If C{strict} is true, then also require that
215 C{self!=name}.
216
217 >>> DottedName('a.b').dominates(DottedName('a.b.c.d'))
218 True
219 """
220 len_self = len(self._identifiers)
221 len_name = len(name._identifiers)
222
223 if (len_self > len_name) or (strict and len_self == len_name):
224 return False
225 # The following is redundant (the first clause is implied by
226 # the second), but is done as an optimization.
227 return ((self._identifiers[0] == name._identifiers[0]) and
228 self._identifiers == name._identifiers[:len_self])
229
230 def contextualize(self, context):
231 """
232 If C{self} and C{context} share a common ancestor, then return
233 a name for C{self}, relative to that ancestor. If they do not
234 share a common ancestor (or if C{context} is C{UNKNOWN}), then
235 simply return C{self}.
236
237 This is used to generate shorter versions of dotted names in
238 cases where users can infer the intended target from the
239 context.
240
241 @type context: L{DottedName}
242 @rtype: L{DottedName}
243 """
244 if context is UNKNOWN or not context or len(self) <= 1:
245 return self
246 if self[0] == context[0]:
247 return self[1:].contextualize(context[1:])
248 else:
249 return self
250
251 # Find the first index where self & context differ.
252 for i in range(min(len(context), len(self))):
253 if self._identifiers[i] != context._identifiers[i]:
254 first_difference = i
255 break
256 else:
257 first_difference = i+1
258
259 # Strip off anything before that index.
260 if first_difference == 0:
261 return self
262 elif first_difference == len(self):
263 return self[-1:]
264 else:
265 return self[first_difference:]
266
267######################################################################
268# UNKNOWN Value
269######################################################################
270
271class _Sentinel:
272 """
273 A unique value that won't compare equal to any other value. This
274 class is used to create L{UNKNOWN}.
275 """
276 def __init__(self, name):
277 self.name = name
278 def __repr__(self):
279 return '<%s>' % self.name
280 def __nonzero__(self):
281 raise ValueError('Sentinel value <%s> can not be used as a boolean' %
282 self.name)
283
284UNKNOWN = _Sentinel('UNKNOWN')
285"""A special value used to indicate that a given piece of
286information about an object is unknown. This is used as the
287default value for all instance variables."""
288
289######################################################################
290# API Documentation Objects: Abstract Base Classes
291######################################################################
292
293class APIDoc(object):
294 """
295 API documentation information for a single element of a Python
296 program. C{APIDoc} itself is an abstract base class; subclasses
297 are used to specify what information should be recorded about each
298 type of program element. In particular, C{APIDoc} has two direct
299 subclasses, C{VariableDoc} for documenting variables and
300 C{ValueDoc} for documenting values; and the C{ValueDoc} class is
301 subclassed further for different value types.
302
303 Each C{APIDoc} subclass specifies the set of attributes that
304 should be used to record information about the corresponding
305 program element type. The default value for each attribute is
306 stored in the class; these default values can then be overridden
307 with instance variables. Most attributes use the special value
308 L{UNKNOWN} as their default value, to indicate that the correct
309 value for that attribute has not yet been determined. This makes
310 it easier to merge two C{APIDoc} objects that are documenting the
311 same element (in particular, to merge information about an element
312 that was derived from parsing with information that was derived
313 from introspection).
314
315 For all attributes with boolean values, use only the constants
316 C{True} and C{False} to designate true and false. In particular,
317 do I{not} use other values that evaluate as true or false, such as
318 C{2} or C{()}. This restriction makes it easier to handle
319 C{UNKNOWN} values. For example, to test if a boolean attribute is
320 C{True} or C{UNKNOWN}, use 'C{attrib in (True, UNKNOWN)}' or
321 'C{attrib is not False}'.
322
323 Two C{APIDoc} objects describing the same object can be X{merged},
324 using the method L{merge_and_overwrite(other)}. After two
325 C{APIDoc}s are merged, any changes to one will be reflected in the
326 other. This is accomplished by setting the two C{APIDoc} objects
327 to use a shared instance dictionary. See the documentation for
328 L{merge_and_overwrite} for more information, and some important
329 caveats about hashing.
330 """
331 #{ Docstrings
332 docstring = UNKNOWN
333 """@ivar: The documented item's docstring.
334 @type: C{string} or C{None}"""
335
336 docstring_lineno = UNKNOWN
337 """@ivar: The line number on which the documented item's docstring
338 begins.
339 @type: C{int}"""
340 #} end of "docstrings" group
341
342 #{ Information Extracted from Docstrings
343 descr = UNKNOWN
344 """@ivar: A description of the documented item, extracted from its
345 docstring.
346 @type: L{ParsedDocstring<epydoc.markup.ParsedDocstring>}"""
347
348 summary = UNKNOWN
349 """@ivar: A summary description of the documented item, extracted from
350 its docstring.
351 @type: L{ParsedDocstring<epydoc.markup.ParsedDocstring>}"""
352
353 other_docs = UNKNOWN
354 """@ivar: A flag indicating if the entire L{docstring} body (except tags
355 if any) is entirely included in the L{summary}.
356 @type: C{bool}"""
357
358 metadata = UNKNOWN
359 """@ivar: Metadata about the documented item, extracted from fields in
360 its docstring. I{Currently} this is encoded as a list of tuples
361 C{(field, arg, descr)}. But that may change.
362 @type: C{(str, str, L{ParsedDocstring<markup.ParsedDocstring>})}"""
363
364 extra_docstring_fields = UNKNOWN
365 """@ivar: A list of new docstring fields tags that are defined by the
366 documented item's docstring. These new field tags can be used by
367 this item or by any item it contains.
368 @type: L{DocstringField <epydoc.docstringparser.DocstringField>}"""
369 #} end of "information extracted from docstrings" group
370
371 #{ Source Information
372 docs_extracted_by = UNKNOWN # 'parser' or 'introspecter' or 'both'
373 """@ivar: Information about where the information contained by this
374 C{APIDoc} came from. Can be one of C{'parser'},
375 C{'introspector'}, or C{'both'}.
376 @type: C{str}"""
377 #} end of "source information" group
378
379 def __init__(self, **kwargs):
380 """
381 Construct a new C{APIDoc} object. Keyword arguments may be
382 used to initialize the new C{APIDoc}'s attributes.
383
384 @raise TypeError: If a keyword argument is specified that does
385 not correspond to a valid attribute for this (sub)class of
386 C{APIDoc}.
387 """
388 if epydoc.DEBUG:
389 for key in kwargs:
390 if key[0] != '_' and not hasattr(self.__class__, key):
391 raise TypeError('%s got unexpected arg %r' %
392 (self.__class__.__name__, key))
393 self.__dict__.update(kwargs)
394
395 def _debug_setattr(self, attr, val):
396 """
397 Modify an C{APIDoc}'s attribute. This is used when
398 L{epydoc.DEBUG} is true, to make sure we don't accidentally
399 set any inappropriate attributes on C{APIDoc} objects.
400
401 @raise AttributeError: If C{attr} is not a valid attribute for
402 this (sub)class of C{APIDoc}. (C{attr} is considered a
403 valid attribute iff C{self.__class__} defines an attribute
404 with that name.)
405 """
406 # Don't intercept special assignments like __class__, or
407 # assignments to private variables.
408 if attr.startswith('_'):
409 return object.__setattr__(self, attr, val)
410 if not hasattr(self, attr):
411 raise AttributeError('%s does not define attribute %r' %
412 (self.__class__.__name__, attr))
413 self.__dict__[attr] = val
414
415 if epydoc.DEBUG:
416 __setattr__ = _debug_setattr
417
418 def __repr__(self):
419 return '<%s>' % self.__class__.__name__
420
421 def pp(self, doublespace=0, depth=5, exclude=(), include=()):
422 """
423 Return a pretty-printed string representation for the
424 information contained in this C{APIDoc}.
425 """
426 return pp_apidoc(self, doublespace, depth, exclude, include)
427 __str__ = pp
428
429 def specialize_to(self, cls):
430 """
431 Change C{self}'s class to C{cls}. C{cls} must be a subclass
432 of C{self}'s current class. For example, if a generic
433 C{ValueDoc} was created for a value, and it is determined that
434 the value is a routine, you can update its class with:
435
436 >>> valdoc.specialize_to(RoutineDoc)
437 """
438 if not issubclass(cls, self.__class__):
439 raise ValueError('Can not specialize to %r' % cls)
440 # Update the class.
441 self.__class__ = cls
442 # Update the class of any other apidoc's in the mergeset.
443 if self.__mergeset is not None:
444 for apidoc in self.__mergeset:
445 apidoc.__class__ = cls
446 # Re-initialize self, in case the subclass constructor does
447 # any special processing on its arguments.
448 self.__init__(**self.__dict__)
449
450 __has_been_hashed = False
451 """True iff L{self.__hash__()} has ever been called."""
452
453 def __hash__(self):
454 self.__has_been_hashed = True
455 return id(self.__dict__)
456
457 def __cmp__(self, other):
458 if not isinstance(other, APIDoc): return -1
459 if self.__dict__ is other.__dict__: return 0
460 name_cmp = cmp(self.canonical_name, other.canonical_name)
461 if name_cmp == 0: return -1
462 else: return name_cmp
463
464 def is_detailed(self):
465 """
466 Does this object deserve a box with extra details?
467
468 @return: True if the object needs extra details, else False.
469 @rtype: C{bool}
470 """
471 if self.other_docs is True:
472 return True
473
474 if self.metadata is not UNKNOWN:
475 return bool(self.metadata)
476
477 __mergeset = None
478 """The set of all C{APIDoc} objects that have been merged with
479 this C{APIDoc} (using L{merge_and_overwrite()}). Each C{APIDoc}
480 in this set shares a common instance dictionary (C{__dict__})."""
481
482 def merge_and_overwrite(self, other, ignore_hash_conflict=False):
483 """
484 Combine C{self} and C{other} into a X{merged object}, such
485 that any changes made to one will affect the other. Any
486 attributes that C{other} had before merging will be discarded.
487 This is accomplished by copying C{self.__dict__} over
488 C{other.__dict__} and C{self.__class__} over C{other.__class__}.
489
490 Care must be taken with this method, since it modifies the
491 hash value of C{other}. To help avoid the problems that this
492 can cause, C{merge_and_overwrite} will raise an exception if
493 C{other} has ever been hashed, unless C{ignore_hash_conflict}
494 is True. Note that adding C{other} to a dictionary, set, or
495 similar data structure will implicitly cause it to be hashed.
496 If you do set C{ignore_hash_conflict} to True, then any
497 existing data structures that rely on C{other}'s hash staying
498 constant may become corrupted.
499
500 @return: C{self}
501 @raise ValueError: If C{other} has ever been hashed.
502 """
503 # If we're already merged, then there's nothing to do.
504 if (self.__dict__ is other.__dict__ and
505 self.__class__ is other.__class__): return self
506
507 if other.__has_been_hashed and not ignore_hash_conflict:
508 raise ValueError("%r has already been hashed! Merging it "
509 "would cause its has value to change." % other)
510
511 # If other was itself already merged with anything,
512 # then we need to merge those too.
513 a,b = (self.__mergeset, other.__mergeset)
514 mergeset = (self.__mergeset or [self]) + (other.__mergeset or [other])
515 other.__dict__.clear()
516 for apidoc in mergeset:
517 #if apidoc is self: pass
518 apidoc.__class__ = self.__class__
519 apidoc.__dict__ = self.__dict__
520 self.__mergeset = mergeset
521 # Sanity chacks.
522 assert self in mergeset and other in mergeset
523 for apidoc in mergeset:
524 assert apidoc.__dict__ is self.__dict__
525 # Return self.
526 return self
527
528 def apidoc_links(self, **filters):
529 """
530 Return a list of all C{APIDoc}s that are directly linked from
531 this C{APIDoc} (i.e., are contained or pointed to by one or
532 more of this C{APIDoc}'s attributes.)
533
534 Keyword argument C{filters} can be used to selectively exclude
535 certain categories of attribute value. For example, using
536 C{includes=False} will exclude variables that were imported
537 from other modules; and C{subclasses=False} will exclude
538 subclasses. The filter categories currently supported by
539 epydoc are:
540 - C{imports}: Imported variables.
541 - C{packages}: Containing packages for modules.
542 - C{submodules}: Contained submodules for packages.
543 - C{bases}: Bases for classes.
544 - C{subclasses}: Subclasses for classes.
545 - C{variables}: All variables.
546 - C{private}: Private variables.
547 - C{overrides}: Points from class variables to the variables
548 they override. This filter is False by default.
549 """
550 return []
551
552def reachable_valdocs(root, **filters):
553 """
554 Return a list of all C{ValueDoc}s that can be reached, directly or
555 indirectly from the given root list of C{ValueDoc}s.
556
557 @param filters: A set of filters that can be used to prevent
558 C{reachable_valdocs} from following specific link types when
559 looking for C{ValueDoc}s that can be reached from the root
560 set. See C{APIDoc.apidoc_links} for a more complete
561 description.
562 """
563 apidoc_queue = list(root)
564 val_set = set()
565 var_set = set()
566 while apidoc_queue:
567 api_doc = apidoc_queue.pop()
568 if isinstance(api_doc, ValueDoc):
569 val_set.add(api_doc)
570 else:
571 var_set.add(api_doc)
572 apidoc_queue.extend([v for v in api_doc.apidoc_links(**filters)
573 if v not in val_set and v not in var_set])
574 return val_set
575
576######################################################################
577# Variable Documentation Objects
578######################################################################
579
580class VariableDoc(APIDoc):
581 """
582 API documentation information about a single Python variable.
583
584 @note: The only time a C{VariableDoc} will have its own docstring
585 is if that variable was created using an assignment statement, and
586 that assignment statement had a docstring-comment or was followed
587 by a pseudo-docstring.
588 """
589 #{ Basic Variable Information
590 name = UNKNOWN
591 """@ivar: The name of this variable in its containing namespace.
592 @type: C{str}"""
593
594 container = UNKNOWN
595 """@ivar: API documentation for the namespace that contains this
596 variable.
597 @type: L{ValueDoc}"""
598
599 canonical_name = UNKNOWN
600 """@ivar: A dotted name that serves as a unique identifier for
601 this C{VariableDoc}. It should be formed by concatenating
602 the C{VariableDoc}'s C{container} with its C{name}.
603 @type: L{DottedName}"""
604
605 value = UNKNOWN
606 """@ivar: The API documentation for this variable's value.
607 @type: L{ValueDoc}"""
608 #}
609
610 #{ Information Extracted from Docstrings
611 type_descr = UNKNOWN
612 """@ivar: A description of the variable's expected type, extracted from
613 its docstring.
614 @type: L{ParsedDocstring<epydoc.markup.ParsedDocstring>}"""
615 #} end of "information extracted from docstrings" group
616
617 #{ Information about Imported Variables
618 imported_from = UNKNOWN
619 """@ivar: The fully qualified dotted name of the variable that this
620 variable's value was imported from. This attribute should only
621 be defined if C{is_instvar} is true.
622 @type: L{DottedName}"""
623
624 is_imported = UNKNOWN
625 """@ivar: Was this variable's value imported from another module?
626 (Exception: variables that are explicitly included in __all__ have
627 C{is_imported} set to C{False}, even if they are in fact
628 imported.)
629 @type: C{bool}"""
630 #} end of "information about imported variables" group
631
632 #{ Information about Variables in Classes
633 is_instvar = UNKNOWN
634 """@ivar: If true, then this variable is an instance variable; if false,
635 then this variable is a class variable. This attribute should
636 only be defined if the containing namespace is a class
637 @type: C{bool}"""
638
639 overrides = UNKNOWN # [XXX] rename -- don't use a verb.
640 """@ivar: The API documentation for the variable that is overridden by
641 this variable. This attribute should only be defined if the
642 containing namespace is a class.
643 @type: L{VariableDoc}"""
644 #} end of "information about variables in classes" group
645
646 #{ Flags
647 is_alias = UNKNOWN
648 """@ivar: Is this variable an alias for another variable with the same
649 value? If so, then this variable will be dispreferred when
650 assigning canonical names.
651 @type: C{bool}"""
652
653 is_public = UNKNOWN
654 """@ivar: Is this variable part of its container's public API?
655 @type: C{bool}"""
656 #} end of "flags" group
657
658 def __init__(self, **kwargs):
659 APIDoc.__init__(self, **kwargs)
660 if self.is_public is UNKNOWN and self.name is not UNKNOWN:
661 self.is_public = (not self.name.startswith('_') or
662 self.name.endswith('_'))
663
664 def __repr__(self):
665 if self.canonical_name is not UNKNOWN:
666 return '<%s %s>' % (self.__class__.__name__, self.canonical_name)
667 if self.name is not UNKNOWN:
668 return '<%s %s>' % (self.__class__.__name__, self.name)
669 else:
670 return '<%s>' % self.__class__.__name__
671
672 def _get_defining_module(self):
673 if self.container is UNKNOWN:
674 return UNKNOWN
675 return self.container.defining_module
676 defining_module = property(_get_defining_module, doc="""
677 A read-only property that can be used to get the variable's
678 defining module. This is defined as the defining module
679 of the variable's container.""")
680
681 def apidoc_links(self, **filters):
682 # nb: overrides filter is *False* by default.
683 if (filters.get('overrides', False) and
684 (self.overrides not in (None, UNKNOWN))):
685 overrides = [self.overrides]
686 else:
687 overrides = []
688 if self.value in (None, UNKNOWN):
689 return []+overrides
690 else:
691 return [self.value]+overrides
692
693 def is_detailed(self):
694 pval = super(VariableDoc, self).is_detailed()
695 if pval or self.value in (None, UNKNOWN):
696 return pval
697
698 if (self.overrides not in (None, UNKNOWN) and
699 isinstance(self.value, RoutineDoc)):
700 return True
701
702 if isinstance(self.value, GenericValueDoc):
703 # [XX] This is a little hackish -- we assume that the
704 # summary lines will have SUMMARY_REPR_LINELEN chars,
705 # that len(name) of those will be taken up by the name,
706 # and that 3 of those will be taken up by " = " between
707 # the name & val. Note that if any docwriter uses a
708 # different formula for maxlen for this, then it will
709 # not get the right value for is_detailed().
710 maxlen = self.value.SUMMARY_REPR_LINELEN-3-len(self.name)
711 return (not self.value.summary_pyval_repr(maxlen).is_complete)
712 else:
713 return self.value.is_detailed()
714
715######################################################################
716# Value Documentation Objects
717######################################################################
718
719class ValueDoc(APIDoc):
720 """
721 API documentation information about a single Python value.
722 """
723 canonical_name = UNKNOWN
724 """@ivar: A dotted name that serves as a unique identifier for
725 this C{ValueDoc}'s value. If the value can be reached using a
726 single sequence of identifiers (given the appropriate imports),
727 then that sequence of identifiers is used as its canonical name.
728 If the value can be reached by multiple sequences of identifiers
729 (i.e., if it has multiple aliases), then one of those sequences of
730 identifiers is used. If the value cannot be reached by any
731 sequence of identifiers (e.g., if it was used as a base class but
732 then its variable was deleted), then its canonical name will start
733 with C{'??'}. If necessary, a dash followed by a number will be
734 appended to the end of a non-reachable identifier to make its
735 canonical name unique.
736
737 When possible, canonical names are chosen when new C{ValueDoc}s
738 are created. However, this is sometimes not possible. If a
739 canonical name can not be chosen when the C{ValueDoc} is created,
740 then one will be assigned by L{assign_canonical_names()
741 <docbuilder.assign_canonical_names>}.
742
743 @type: L{DottedName}"""
744
745 #{ Value Representation
746 pyval = UNKNOWN
747 """@ivar: A pointer to the actual Python object described by this
748 C{ValueDoc}. This is used to display the value (e.g., when
749 describing a variable.) Use L{pyval_repr()} to generate a
750 plaintext string representation of this value.
751 @type: Python object"""
752
753 parse_repr = UNKNOWN
754 """@ivar: A text representation of this value, extracted from
755 parsing its source code. This representation may not accurately
756 reflect the actual value (e.g., if the value was modified after
757 the initial assignment).
758 @type: C{unicode}"""
759
760 REPR_MAXLINES = 5
761 """@cvar: The maximum number of lines of text that should be
762 generated by L{pyval_repr()}. If the string representation does
763 not fit in this number of lines, an ellpsis marker (...) will
764 be placed at the end of the formatted representation."""
765
766 REPR_LINELEN = 75
767 """@cvar: The maximum number of characters for lines of text that
768 should be generated by L{pyval_repr()}. Any lines that exceed
769 this number of characters will be line-wrappped; The S{crarr}
770 symbol will be used to indicate that the line was wrapped."""
771
772 SUMMARY_REPR_LINELEN = 75
773 """@cvar: The maximum number of characters for the single-line
774 text representation generated by L{summary_pyval_repr()}. If
775 the value's representation does not fit in this number of
776 characters, an ellipsis marker (...) will be placed at the end
777 of the formatted representation."""
778
779 REPR_MIN_SCORE = 0
780 """@cvar: The minimum score that a value representation based on
781 L{pyval} should have in order to be used instead of L{parse_repr}
782 as the canonical representation for this C{ValueDoc}'s value.
783 @see: L{epydoc.markup.pyval_repr}"""
784 #} end of "value representation" group
785
786 #{ Context
787 defining_module = UNKNOWN
788 """@ivar: The documentation for the module that defines this
789 value. This is used, e.g., to lookup the appropriate markup
790 language for docstrings. For a C{ModuleDoc},
791 C{defining_module} should be C{self}.
792 @type: L{ModuleDoc}"""
793 #} end of "context group"
794
795 #{ Information about Imported Variables
796 proxy_for = None # [xx] in progress.
797 """@ivar: If C{proxy_for} is not None, then this value was
798 imported from another file. C{proxy_for} is the dotted name of
799 the variable that this value was imported from. If that
800 variable is documented, then its C{value} may contain more
801 complete API documentation about this value. The C{proxy_for}
802 attribute is used by the source code parser to link imported
803 values to their source values (in particular, for base
804 classes). When possible, these proxy C{ValueDoc}s are replaced
805 by the imported value's C{ValueDoc} by
806 L{link_imports()<docbuilder.link_imports>}.
807 @type: L{DottedName}"""
808 #} end of "information about imported variables" group
809
810 #: @ivar:
811 #: This is currently used to extract values from __all__, etc, in
812 #: the docparser module; maybe I should specialize
813 #: process_assignment and extract it there? Although, for __all__,
814 #: it's not clear where I'd put the value, since I just use it to
815 #: set private/public/imported attribs on other vars (that might not
816 #: exist yet at the time.)
817 toktree = UNKNOWN
818
819 def __repr__(self):
820 if self.canonical_name is not UNKNOWN:
821 return '<%s %s>' % (self.__class__.__name__, self.canonical_name)
822 else:
823 return '<%s %s>' % (self.__class__.__name__,
824 self.summary_pyval_repr().to_plaintext(None))
825
826 def __setstate__(self, state):
827 self.__dict__ = state
828
829 def __getstate__(self):
830 """
831 State serializer for the pickle module. This is necessary
832 because sometimes the C{pyval} attribute contains an
833 un-pickleable value.
834 """
835 # Construct our pickled dictionary. Maintain this dictionary
836 # as a private attribute, so we can reuse it later, since
837 # merged objects need to share a single dictionary.
838 if not hasattr(self, '_ValueDoc__pickle_state'):
839 # Make sure __pyval_repr & __summary_pyval_repr are cached:
840 self.pyval_repr(), self.summary_pyval_repr()
841 # Construct the dictionary; leave out 'pyval'.
842 self.__pickle_state = self.__dict__.copy()
843 self.__pickle_state['pyval'] = UNKNOWN
844
845 if not isinstance(self, GenericValueDoc):
846 assert self.__pickle_state != {}
847 # Return the pickle state.
848 return self.__pickle_state
849
850 #{ Value Representation
851 def pyval_repr(self):
852 """
853 Return a formatted representation of the Python object
854 described by this C{ValueDoc}. This representation may
855 include data from introspection or parsing, and is authorative
856 as 'the best way to represent a Python value.' Any lines that
857 go beyond L{REPR_LINELEN} characters will be wrapped; and if
858 the representation as a whole takes more than L{REPR_MAXLINES}
859 lines, then it will be truncated (with an ellipsis marker).
860 This function will never return L{UNKNOWN} or C{None}.
861
862 @rtype: L{ColorizedPyvalRepr}
863 """
864 # Use self.__pyval_repr to cache the result.
865 if not hasattr(self, '_ValueDoc__pyval_repr'):
866 self.__pyval_repr = epydoc.markup.pyval_repr.colorize_pyval(
867 self.pyval, self.parse_repr, self.REPR_MIN_SCORE,
868 self.REPR_LINELEN, self.REPR_MAXLINES, linebreakok=True)
869 return self.__pyval_repr
870
871 def summary_pyval_repr(self, max_len=None):
872 """
873 Return a single-line formatted representation of the Python
874 object described by this C{ValueDoc}. This representation may
875 include data from introspection or parsing, and is authorative
876 as 'the best way to summarize a Python value.' If the
877 representation takes more then L{SUMMARY_REPR_LINELEN}
878 characters, then it will be truncated (with an ellipsis
879 marker). This function will never return L{UNKNOWN} or
880 C{None}.
881
882 @rtype: L{ColorizedPyvalRepr}
883 """
884 # If max_len is specified, then do *not* cache the result.
885 if max_len is not None:
886 return epydoc.markup.pyval_repr.colorize_pyval(
887 self.pyval, self.parse_repr, self.REPR_MIN_SCORE,
888 max_len, maxlines=1, linebreakok=False)
889
890 # Use self.__summary_pyval_repr to cache the result.
891 if not hasattr(self, '_ValueDoc__summary_pyval_repr'):
892 self.__summary_pyval_repr = epydoc.markup.pyval_repr.colorize_pyval(
893 self.pyval, self.parse_repr, self.REPR_MIN_SCORE,
894 self.SUMMARY_REPR_LINELEN, maxlines=1, linebreakok=False)
895 return self.__summary_pyval_repr
896 #} end of "value representation" group
897
898 def apidoc_links(self, **filters):
899 return []
900
901class GenericValueDoc(ValueDoc):
902 """
903 API documentation about a 'generic' value, i.e., one that does not
904 have its own docstring or any information other than its value and
905 parse representation. C{GenericValueDoc}s do not get assigned
906 cannonical names.
907 """
908 canonical_name = None
909
910 def is_detailed(self):
911 return (not self.summary_pyval_repr().is_complete)
912
913class NamespaceDoc(ValueDoc):
914 """
915 API documentation information about a singe Python namespace
916 value. (I.e., a module or a class).
917 """
918 #{ Information about Variables
919 variables = UNKNOWN
920 """@ivar: The contents of the namespace, encoded as a
921 dictionary mapping from identifiers to C{VariableDoc}s. This
922 dictionary contains all names defined by the namespace,
923 including imported variables, aliased variables, and variables
924 inherited from base classes (once L{inherit_docs()
925 <epydoc.docbuilder.inherit_docs>} has added them).
926 @type: C{dict} from C{string} to L{VariableDoc}"""
927 sorted_variables = UNKNOWN
928 """@ivar: A list of all variables defined by this
929 namespace, in sorted order. The elements of this list should
930 exactly match the values of L{variables}. The sort order for
931 this list is defined as follows:
932 - Any variables listed in a C{@sort} docstring field are
933 listed in the order given by that field.
934 - These are followed by any variables that were found while
935 parsing the source code, in the order in which they were
936 defined in the source file.
937 - Finally, any remaining variables are listed in
938 alphabetical order.
939 @type: C{list} of L{VariableDoc}"""
940 sort_spec = UNKNOWN
941 """@ivar: The order in which variables should be listed,
942 encoded as a list of names. Any variables whose names are not
943 included in this list should be listed alphabetically,
944 following the variables that are included.
945 @type: C{list} of C{str}"""
946 group_specs = UNKNOWN
947 """@ivar: The groups that are defined by this namespace's
948 docstrings. C{group_specs} is encoded as an ordered list of
949 tuples C{(group_name, elt_names)}, where C{group_name} is the
950
951 name of a group and C{elt_names} is a list of element names in
952 that group. (An element can be a variable or a submodule.) A
953 '*' in an element name will match any string of characters.
954 @type: C{list} of C{(str,list)}"""
955 variable_groups = UNKNOWN
956 """@ivar: A dictionary specifying what group each
957 variable belongs to. The keys of the dictionary are group
958 names, and the values are lists of C{VariableDoc}s. The order
959 that groups should be listed in should be taken from
960 L{group_specs}.
961 @type: C{dict} from C{str} to C{list} of L{VariableDoc}"""
962 #} end of group "information about variables"
963
964 def __init__(self, **kwargs):
965 kwargs.setdefault('variables', {})
966 APIDoc.__init__(self, **kwargs)
967 assert self.variables is not UNKNOWN
968
969 def is_detailed(self):
970 return True
971
972 def apidoc_links(self, **filters):
973 variables = filters.get('variables', True)
974 imports = filters.get('imports', True)
975 private = filters.get('private', True)
976 if variables and imports and private:
977 return self.variables.values() # list the common case first.
978 elif not variables:
979 return []
980 elif not imports and not private:
981 return [v for v in self.variables.values() if
982 v.is_imported != True and v.is_public != False]
983 elif not private:
984 return [v for v in self.variables.values() if
985 v.is_public != False]
986 elif not imports:
987 return [v for v in self.variables.values() if
988 v.is_imported != True]
989 assert 0, 'this line should be unreachable'
990
991 def init_sorted_variables(self):
992 """
993 Initialize the L{sorted_variables} attribute, based on the
994 L{variables} and L{sort_spec} attributes. This should usually
995 be called after all variables have been added to C{variables}
996 (including any inherited variables for classes).
997 """
998 unsorted = self.variables.copy()
999 self.sorted_variables = []
1000
1001 # Add any variables that are listed in sort_spec
1002 if self.sort_spec is not UNKNOWN:
1003 unused_idents = set(self.sort_spec)
1004 for ident in self.sort_spec:
1005 if ident in unsorted:
1006 self.sorted_variables.append(unsorted.pop(ident))
1007 unused_idents.discard(ident)
1008 elif '*' in ident:
1009 regexp = re.compile('^%s$' % ident.replace('*', '(.*)'))
1010 # sort within matching group?
1011 for name, var_doc in unsorted.items():
1012 if regexp.match(name):
1013 self.sorted_variables.append(unsorted.pop(name))
1014 unused_idents.discard(ident)
1015 for ident in unused_idents:
1016 if ident not in ['__all__', '__docformat__', '__path__']:
1017 log.warning("@sort: %s.%s not found" %
1018 (self.canonical_name, ident))
1019
1020
1021 # Add any remaining variables in alphabetical order.
1022 var_docs = unsorted.items()
1023 var_docs.sort()
1024 for name, var_doc in var_docs:
1025 self.sorted_variables.append(var_doc)
1026
1027 def init_variable_groups(self):
1028 """
1029 Initialize the L{variable_groups} attribute, based on the
1030 L{sorted_variables} and L{group_specs} attributes.
1031 """
1032 if self.sorted_variables is UNKNOWN:
1033 self.init_sorted_variables()
1034 assert len(self.sorted_variables) == len(self.variables)
1035
1036 elts = [(v.name, v) for v in self.sorted_variables]
1037 self._unused_groups = dict([(n,set(i)) for (n,i) in self.group_specs])
1038 self.variable_groups = self._init_grouping(elts)
1039
1040 def group_names(self):
1041 """
1042 Return a list of the group names defined by this namespace, in
1043 the order in which they should be listed, with no duplicates.
1044 """
1045 name_list = ['']
1046 name_set = set()
1047 for name, spec in self.group_specs:
1048 if name not in name_set:
1049 name_set.add(name)
1050 name_list.append(name)
1051 return name_list
1052
1053 def _init_grouping(self, elts):
1054 """
1055 Divide a given a list of APIDoc objects into groups, as
1056 specified by L{self.group_specs}.
1057
1058 @param elts: A list of tuples C{(name, apidoc)}.
1059
1060 @return: A list of tuples C{(groupname, elts)}, where
1061 C{groupname} is the name of a group and C{elts} is a list of
1062 C{APIDoc}s in that group. The first tuple has name C{''}, and
1063 is used for ungrouped elements. The remaining tuples are
1064 listed in the order that they appear in C{self.group_specs}.
1065 Within each tuple, the elements are listed in the order that
1066 they appear in C{api_docs}.
1067 """
1068 # Make the common case fast.
1069 if len(self.group_specs) == 0:
1070 return {'': [elt[1] for elt in elts]}
1071
1072 ungrouped = set([elt_doc for (elt_name, elt_doc) in elts])
1073
1074 ungrouped = dict(elts)
1075 groups = {}
1076 for elt_name, elt_doc in elts:
1077 for (group_name, idents) in self.group_specs:
1078 group = groups.setdefault(group_name, [])
1079 unused_groups = self._unused_groups[group_name]
1080 for ident in idents:
1081 if re.match('^%s$' % ident.replace('*', '(.*)'), elt_name):
1082 unused_groups.discard(ident)
1083 if elt_name in ungrouped:
1084 group.append(ungrouped.pop(elt_name))
1085 else:
1086 log.warning("%s.%s in multiple groups" %
1087 (self.canonical_name, elt_name))
1088
1089 # Convert ungrouped from an unordered set to an ordered list.
1090 groups[''] = [elt_doc for (elt_name, elt_doc) in elts
1091 if elt_name in ungrouped]
1092 return groups
1093
1094 def report_unused_groups(self):
1095 """
1096 Issue a warning for any @group items that were not used by
1097 L{_init_grouping()}.
1098 """
1099 for (group, unused_idents) in self._unused_groups.items():
1100 for ident in unused_idents:
1101 log.warning("@group %s: %s.%s not found" %
1102 (group, self.canonical_name, ident))
1103
1104class ModuleDoc(NamespaceDoc):
1105 """
1106 API documentation information about a single module.
1107 """
1108 #{ Information about the Module
1109 filename = UNKNOWN
1110 """@ivar: The name of the file that defines the module.
1111 @type: C{string}"""
1112 docformat = UNKNOWN
1113 """@ivar: The markup language used by docstrings in this module.
1114 @type: C{string}"""
1115 #{ Information about Submodules
1116 submodules = UNKNOWN
1117 """@ivar: Modules contained by this module (if this module
1118 is a package). (Note: on rare occasions, a module may have a
1119 submodule that is shadowed by a variable with the same name.)
1120 @type: C{list} of L{ModuleDoc}"""
1121 submodule_groups = UNKNOWN
1122 """@ivar: A dictionary specifying what group each
1123 submodule belongs to. The keys of the dictionary are group
1124 names, and the values are lists of C{ModuleDoc}s. The order
1125 that groups should be listed in should be taken from
1126 L{group_specs}.
1127 @type: C{dict} from C{str} to C{list} of L{ModuleDoc}"""
1128 #{ Information about Packages
1129 package = UNKNOWN
1130 """@ivar: API documentation for the module's containing package.
1131 @type: L{ModuleDoc}"""
1132 is_package = UNKNOWN
1133 """@ivar: True if this C{ModuleDoc} describes a package.
1134 @type: C{bool}"""
1135 path = UNKNOWN
1136 """@ivar: If this C{ModuleDoc} describes a package, then C{path}
1137 contains a list of directories that constitute its path (i.e.,
1138 the value of its C{__path__} variable).
1139 @type: C{list} of C{str}"""
1140 #{ Information about Imported Variables
1141 imports = UNKNOWN
1142 """@ivar: A list of the source names of variables imported into
1143 this module. This is used to construct import graphs.
1144 @type: C{list} of L{DottedName}"""
1145 #}
1146
1147 def apidoc_links(self, **filters):
1148 val_docs = NamespaceDoc.apidoc_links(self, **filters)
1149 if (filters.get('packages', True) and
1150 self.package not in (None, UNKNOWN)):
1151 val_docs.append(self.package)
1152 if (filters.get('submodules', True) and
1153 self.submodules not in (None, UNKNOWN)):
1154 val_docs += self.submodules
1155 return val_docs
1156
1157 def init_submodule_groups(self):
1158 """
1159 Initialize the L{submodule_groups} attribute, based on the
1160 L{submodules} and L{group_specs} attributes.
1161 """
1162 if self.submodules in (None, UNKNOWN):
1163 return
1164 self.submodules = sorted(self.submodules,
1165 key=lambda m:m.canonical_name)
1166 elts = [(m.canonical_name[-1], m) for m in self.submodules]
1167 self.submodule_groups = self._init_grouping(elts)
1168
1169 def select_variables(self, group=None, value_type=None, public=None,
1170 imported=None, detailed=None):
1171 """
1172 Return a specified subset of this module's L{sorted_variables}
1173 list. If C{value_type} is given, then only return variables
1174 whose values have the specified type. If C{group} is given,
1175 then only return variables that belong to the specified group.
1176
1177 @require: The L{sorted_variables}, L{variable_groups}, and
1178 L{submodule_groups} attributes must be initialized before
1179 this method can be used. See L{init_sorted_variables()},
1180 L{init_variable_groups()}, and L{init_submodule_groups()}.
1181
1182 @param value_type: A string specifying the value type for
1183 which variables should be returned. Valid values are:
1184 - 'class' - variables whose values are classes or types.
1185 - 'function' - variables whose values are functions.
1186 - 'other' - variables whose values are not classes,
1187 exceptions, types, or functions.
1188 @type value_type: C{string}
1189
1190 @param group: The name of the group for which variables should
1191 be returned. A complete list of the groups defined by
1192 this C{ModuleDoc} is available in the L{group_names}
1193 instance variable. The first element of this list is
1194 always the special group name C{''}, which is used for
1195 variables that do not belong to any group.
1196 @type group: C{string}
1197
1198 @param detailed: If True (False), return only the variables
1199 deserving (not deserving) a detailed informative box.
1200 If C{None}, don't care.
1201 @type detailed: C{bool}
1202 """
1203 if (self.sorted_variables is UNKNOWN or
1204 self.variable_groups is UNKNOWN):
1205 raise ValueError('sorted_variables and variable_groups '
1206 'must be initialized first.')
1207
1208 if group is None: var_list = self.sorted_variables
1209 else:
1210 var_list = self.variable_groups.get(group, self.sorted_variables)
1211
1212 # Public/private filter (Count UNKNOWN as public)
1213 if public is True:
1214 var_list = [v for v in var_list if v.is_public is not False]
1215 elif public is False:
1216 var_list = [v for v in var_list if v.is_public is False]
1217
1218 # Imported filter (Count UNKNOWN as non-imported)
1219 if imported is True:
1220 var_list = [v for v in var_list if v.is_imported is True]
1221 elif imported is False:
1222 var_list = [v for v in var_list if v.is_imported is not True]
1223
1224 # Detailed filter
1225 if detailed is True:
1226 var_list = [v for v in var_list if v.is_detailed() is True]
1227 elif detailed is False:
1228 var_list = [v for v in var_list if v.is_detailed() is not True]
1229
1230 # [xx] Modules are not currently included in any of these
1231 # value types.
1232 if value_type is None:
1233 return var_list
1234 elif value_type == 'class':
1235 return [var_doc for var_doc in var_list
1236 if (isinstance(var_doc.value, ClassDoc))]
1237 elif value_type == 'function':
1238 return [var_doc for var_doc in var_list
1239 if isinstance(var_doc.value, RoutineDoc)]
1240 elif value_type == 'other':
1241 return [var_doc for var_doc in var_list
1242 if not isinstance(var_doc.value,
1243 (ClassDoc, RoutineDoc, ModuleDoc))]
1244 else:
1245 raise ValueError('Bad value type %r' % value_type)
1246
1247class ClassDoc(NamespaceDoc):
1248 """
1249 API documentation information about a single class.
1250 """
1251 #{ Information about Base Classes
1252 bases = UNKNOWN
1253 """@ivar: API documentation for the class's base classes.
1254 @type: C{list} of L{ClassDoc}"""
1255 #{ Information about Subclasses
1256 subclasses = UNKNOWN
1257 """@ivar: API documentation for the class's known subclasses.
1258 @type: C{list} of L{ClassDoc}"""
1259 #}
1260
1261 def apidoc_links(self, **filters):
1262 val_docs = NamespaceDoc.apidoc_links(self, **filters)
1263 if (filters.get('bases', True) and
1264 self.bases not in (None, UNKNOWN)):
1265 val_docs += self.bases
1266 if (filters.get('subclasses', True) and
1267 self.subclasses not in (None, UNKNOWN)):
1268 val_docs += self.subclasses
1269 return val_docs
1270
1271 def is_type(self):
1272 if self.canonical_name == DottedName('type'): return True
1273 if self.bases is UNKNOWN: return False
1274 for base in self.bases:
1275 if isinstance(base, ClassDoc) and base.is_type():
1276 return True
1277 return False
1278
1279 def is_exception(self):
1280 if self.canonical_name == DottedName('Exception'): return True
1281 if self.bases is UNKNOWN: return False
1282 for base in self.bases:
1283 if isinstance(base, ClassDoc) and base.is_exception():
1284 return True
1285 return False
1286
1287 def is_newstyle_class(self):
1288 if self.canonical_name == DottedName('object'): return True
1289 if self.bases is UNKNOWN: return False
1290 for base in self.bases:
1291 if isinstance(base, ClassDoc) and base.is_newstyle_class():
1292 return True
1293 return False
1294
1295 def mro(self, warn_about_bad_bases=False):
1296 if self.is_newstyle_class():
1297 return self._c3_mro(warn_about_bad_bases)
1298 else:
1299 return self._dfs_bases([], set(), warn_about_bad_bases)
1300
1301 def _dfs_bases(self, mro, seen, warn_about_bad_bases):
1302 if self in seen: return mro
1303 mro.append(self)
1304 seen.add(self)
1305 if self.bases is not UNKNOWN:
1306 for base in self.bases:
1307 if isinstance(base, ClassDoc) and base.proxy_for is None:
1308 base._dfs_bases(mro, seen, warn_about_bad_bases)
1309 elif warn_about_bad_bases:
1310 self._report_bad_base(base)
1311 return mro
1312
1313 def _c3_mro(self, warn_about_bad_bases):
1314 """
1315 Compute the class precedence list (mro) according to C3.
1316 @seealso: U{http://www.python.org/2.3/mro.html}
1317 """
1318 bases = [base for base in self.bases if isinstance(base, ClassDoc)]
1319 if len(bases) != len(self.bases) and warn_about_bad_bases:
1320 for base in self.bases:
1321 if (not isinstance(base, ClassDoc) or
1322 base.proxy_for is not None):
1323 self._report_bad_base(base)
1324 w = [warn_about_bad_bases]*len(bases)
1325 return self._c3_merge([[self]] + map(ClassDoc._c3_mro, bases, w) +
1326 [list(bases)])
1327
1328 def _report_bad_base(self, base):
1329 if not isinstance(base, ClassDoc):
1330 if not isinstance(base, GenericValueDoc):
1331 base_name = base.canonical_name
1332 elif base.parse_repr is not UNKNOWN:
1333 base_name = base.parse_repr
1334 else:
1335 base_name = '%r' % base
1336 log.warning("%s's base %s is not a class" %
1337 (self.canonical_name, base_name))
1338 elif base.proxy_for is not None:
1339 log.warning("No information available for %s's base %s" %
1340 (self.canonical_name, base.proxy_for))
1341
1342 def _c3_merge(self, seqs):
1343 """
1344 Helper function for L{_c3_mro}.
1345 """
1346 res = []
1347 while 1:
1348 nonemptyseqs=[seq for seq in seqs if seq]
1349 if not nonemptyseqs: return res
1350 for seq in nonemptyseqs: # find merge candidates among seq heads
1351 cand = seq[0]
1352 nothead=[s for s in nonemptyseqs if cand in s[1:]]
1353 if nothead: cand=None #reject candidate
1354 else: break
1355 if not cand: raise "Inconsistent hierarchy"
1356 res.append(cand)
1357 for seq in nonemptyseqs: # remove cand
1358 if seq[0] == cand: del seq[0]
1359
1360 def select_variables(self, group=None, value_type=None, inherited=None,
1361 public=None, imported=None, detailed=None):
1362 """
1363 Return a specified subset of this class's L{sorted_variables}
1364 list. If C{value_type} is given, then only return variables
1365 whose values have the specified type. If C{group} is given,
1366 then only return variables that belong to the specified group.
1367 If C{inherited} is True, then only return inherited variables;
1368 if C{inherited} is False, then only return local variables.
1369
1370 @require: The L{sorted_variables} and L{variable_groups}
1371 attributes must be initialized before this method can be
1372 used. See L{init_sorted_variables()} and
1373 L{init_variable_groups()}.
1374
1375 @param value_type: A string specifying the value type for
1376 which variables should be returned. Valid values are:
1377 - 'instancemethod' - variables whose values are
1378 instance methods.
1379 - 'classmethod' - variables whose values are class
1380 methods.
1381 - 'staticmethod' - variables whose values are static
1382 methods.
1383 - 'properties' - variables whose values are properties.
1384 - 'class' - variables whose values are nested classes
1385 (including exceptions and types).
1386 - 'instancevariable' - instance variables. This includes
1387 any variables that are explicitly marked as instance
1388 variables with docstring fields; and variables with
1389 docstrings that are initialized in the constructor.
1390 - 'classvariable' - class variables. This includes any
1391 variables that are not included in any of the above
1392 categories.
1393 @type value_type: C{string}
1394
1395 @param group: The name of the group for which variables should
1396 be returned. A complete list of the groups defined by
1397 this C{ClassDoc} is available in the L{group_names}
1398 instance variable. The first element of this list is
1399 always the special group name C{''}, which is used for
1400 variables that do not belong to any group.
1401 @type group: C{string}
1402
1403 @param inherited: If C{None}, then return both inherited and
1404 local variables; if C{True}, then return only inherited
1405 variables; if C{False}, then return only local variables.
1406
1407 @param detailed: If True (False), return only the variables
1408 deserving (not deserving) a detailed informative box.
1409 If C{None}, don't care.
1410 @type detailed: C{bool}
1411 """
1412 if (self.sorted_variables is UNKNOWN or
1413 self.variable_groups is UNKNOWN):
1414 raise ValueError('sorted_variables and variable_groups '
1415 'must be initialized first.')
1416
1417 if group is None: var_list = self.sorted_variables
1418 else: var_list = self.variable_groups[group]
1419
1420 # Public/private filter (Count UNKNOWN as public)
1421 if public is True:
1422 var_list = [v for v in var_list if v.is_public is not False]
1423 elif public is False:
1424 var_list = [v for v in var_list if v.is_public is False]
1425
1426 # Inherited filter (Count UNKNOWN as non-inherited)
1427 if inherited is None: pass
1428 elif inherited:
1429 var_list = [v for v in var_list if v.container != self]
1430 else:
1431 var_list = [v for v in var_list if v.container == self ]
1432
1433 # Imported filter (Count UNKNOWN as non-imported)
1434 if imported is True:
1435 var_list = [v for v in var_list if v.is_imported is True]
1436 elif imported is False:
1437 var_list = [v for v in var_list if v.is_imported is not True]
1438
1439 # Detailed filter
1440 if detailed is True:
1441 var_list = [v for v in var_list if v.is_detailed() is True]
1442 elif detailed is False:
1443 var_list = [v for v in var_list if v.is_detailed() is not True]
1444
1445 if value_type is None:
1446 return var_list
1447 elif value_type == 'method':
1448 return [var_doc for var_doc in var_list
1449 if (isinstance(var_doc.value, RoutineDoc) and
1450 var_doc.is_instvar in (False, UNKNOWN))]
1451 elif value_type == 'instancemethod':
1452 return [var_doc for var_doc in var_list
1453 if (isinstance(var_doc.value, RoutineDoc) and
1454 not isinstance(var_doc.value, ClassMethodDoc) and
1455 not isinstance(var_doc.value, StaticMethodDoc) and
1456 var_doc.is_instvar in (False, UNKNOWN))]
1457 elif value_type == 'classmethod':
1458 return [var_doc for var_doc in var_list
1459 if (isinstance(var_doc.value, ClassMethodDoc) and
1460 var_doc.is_instvar in (False, UNKNOWN))]
1461 elif value_type == 'staticmethod':
1462 return [var_doc for var_doc in var_list
1463 if (isinstance(var_doc.value, StaticMethodDoc) and
1464 var_doc.is_instvar in (False, UNKNOWN))]
1465 elif value_type == 'property':
1466 return [var_doc for var_doc in var_list
1467 if (isinstance(var_doc.value, PropertyDoc) and
1468 var_doc.is_instvar in (False, UNKNOWN))]
1469 elif value_type == 'class':
1470 return [var_doc for var_doc in var_list
1471 if (isinstance(var_doc.value, ClassDoc) and
1472 var_doc.is_instvar in (False, UNKNOWN))]
1473 elif value_type == 'instancevariable':
1474 return [var_doc for var_doc in var_list
1475 if var_doc.is_instvar is True]
1476 elif value_type == 'classvariable':
1477 return [var_doc for var_doc in var_list
1478 if (var_doc.is_instvar in (False, UNKNOWN) and
1479 not isinstance(var_doc.value,
1480 (RoutineDoc, ClassDoc, PropertyDoc)))]
1481 else:
1482 raise ValueError('Bad value type %r' % value_type)
1483
1484class RoutineDoc(ValueDoc):
1485 """
1486 API documentation information about a single routine.
1487 """
1488 #{ Signature
1489 posargs = UNKNOWN
1490 """@ivar: The names of the routine's positional arguments.
1491 If an argument list contains \"unpacking\" arguments, then
1492 their names will be specified using nested lists. E.g., if
1493 a function's argument list is C{((x1,y1), (x2,y2))}, then
1494 posargs will be C{[['x1','y1'], ['x2','y2']]}.
1495 @type: C{list}"""
1496 posarg_defaults = UNKNOWN
1497 """@ivar: API documentation for the positional arguments'
1498 default values. This list has the same length as C{posargs}, and
1499 each element of C{posarg_defaults} describes the corresponding
1500 argument in C{posargs}. For positional arguments with no default,
1501 C{posargs_defaults} will contain None.
1502 @type: C{list} of C{ValueDoc} or C{None}"""
1503 vararg = UNKNOWN
1504 """@ivar: The name of the routine's vararg argument, or C{None} if
1505 it has no vararg argument.
1506 @type: C{string} or C{None}"""
1507 kwarg = UNKNOWN
1508 """@ivar: The name of the routine's keyword argument, or C{None} if
1509 it has no keyword argument.
1510 @type: C{string} or C{None}"""
1511 lineno = UNKNOWN # used to look up profiling info from pstats.
1512 """@ivar: The line number of the first line of the function's
1513 signature. For Python functions, this is equal to
1514 C{func.func_code.co_firstlineno}. The first line of a file
1515 is considered line 1.
1516 @type: C{int}"""
1517 #} end of "signature" group
1518
1519 #{ Decorators
1520 decorators = UNKNOWN
1521 """@ivar: A list of names of decorators that were applied to this
1522 routine, in the order that they are listed in the source code.
1523 (I.e., in the reverse of the order that they were applied in.)
1524 @type: C{list} of C{string}"""
1525 #} end of "decorators" group
1526
1527 #{ Information Extracted from Docstrings
1528 arg_descrs = UNKNOWN
1529 """@ivar: A list of descriptions of the routine's
1530 arguments. Each element of this list is a tuple C{(args,
1531 descr)}, where C{args} is a list of argument names; and
1532 C{descr} is a L{ParsedDocstring
1533 <epydoc.markup.ParsedDocstring>} describing the argument(s)
1534 specified by C{arg}.
1535 @type: C{list}"""
1536 arg_types = UNKNOWN
1537 """@ivar: Descriptions of the expected types for the
1538 routine's arguments, encoded as a dictionary mapping from
1539 argument names to type descriptions.
1540 @type: C{dict} from C{string} to L{ParsedDocstring
1541 <epydoc.markup.ParsedDocstring>}"""
1542 return_descr = UNKNOWN
1543 """@ivar: A description of the value returned by this routine.
1544 @type: L{ParsedDocstring<epydoc.markup.ParsedDocstring>}"""
1545 return_type = UNKNOWN
1546 """@ivar: A description of expected type for the value
1547 returned by this routine.
1548 @type: L{ParsedDocstring<epydoc.markup.ParsedDocstring>}"""
1549 exception_descrs = UNKNOWN
1550 """@ivar: A list of descriptions of exceptions
1551 that the routine might raise. Each element of this list is a
1552 tuple C{(exc, descr)}, where C{exc} is a string contianing the
1553 exception name; and C{descr} is a L{ParsedDocstring
1554 <epydoc.markup.ParsedDocstring>} describing the circumstances
1555 under which the exception specified by C{exc} is raised.
1556 @type: C{list}"""
1557 #} end of "information extracted from docstrings" group
1558 callgraph_uid = None
1559 """@ivar: L{DotGraph}.uid of the call graph for the function.
1560 @type: C{str}"""
1561
1562 def is_detailed(self):
1563 if super(RoutineDoc, self).is_detailed():
1564 return True
1565
1566 if self.arg_descrs not in (None, UNKNOWN) and self.arg_descrs:
1567 return True
1568
1569 if self.arg_types not in (None, UNKNOWN) and self.arg_types:
1570 return True
1571
1572 if self.return_descr not in (None, UNKNOWN):
1573 return True
1574
1575 if self.exception_descrs not in (None, UNKNOWN) and self.exception_descrs:
1576 return True
1577
1578 if (self.decorators not in (None, UNKNOWN)
1579 and [ d for d in self.decorators
1580 if d not in ('classmethod', 'staticmethod') ]):
1581 return True
1582
1583 return False
1584
1585 def all_args(self):
1586 """
1587 @return: A list of the names of all arguments (positional,
1588 vararg, and keyword), in order. If a positional argument
1589 consists of a tuple of names, then that tuple will be
1590 flattened.
1591 """
1592 if self.posargs is UNKNOWN:
1593 return UNKNOWN
1594
1595 all_args = _flatten(self.posargs)
1596 if self.vararg not in (None, UNKNOWN):
1597 all_args.append(self.vararg)
1598 if self.kwarg not in (None, UNKNOWN):
1599 all_args.append(self.kwarg)
1600 return all_args
1601
1602def _flatten(lst, out=None):
1603 """
1604 Return a flattened version of C{lst}.
1605 """
1606 if out is None: out = []
1607 for elt in lst:
1608 if isinstance(elt, (list,tuple)):
1609 _flatten(elt, out)
1610 else:
1611 out.append(elt)
1612 return out
1613
1614class ClassMethodDoc(RoutineDoc): pass
1615class StaticMethodDoc(RoutineDoc): pass
1616
1617class PropertyDoc(ValueDoc):
1618 """
1619 API documentation information about a single property.
1620 """
1621 #{ Property Access Functions
1622 fget = UNKNOWN
1623 """@ivar: API documentation for the property's get function.
1624 @type: L{RoutineDoc}"""
1625 fset = UNKNOWN
1626 """@ivar: API documentation for the property's set function.
1627 @type: L{RoutineDoc}"""
1628 fdel = UNKNOWN
1629 """@ivar: API documentation for the property's delete function.
1630 @type: L{RoutineDoc}"""
1631 #}
1632 #{ Information Extracted from Docstrings
1633 type_descr = UNKNOWN
1634 """@ivar: A description of the property's expected type, extracted
1635 from its docstring.
1636 @type: L{ParsedDocstring<epydoc.markup.ParsedDocstring>}"""
1637 #} end of "information extracted from docstrings" group
1638
1639 def apidoc_links(self, **filters):
1640 val_docs = []
1641 if self.fget not in (None, UNKNOWN): val_docs.append(self.fget)
1642 if self.fset not in (None, UNKNOWN): val_docs.append(self.fset)
1643 if self.fdel not in (None, UNKNOWN): val_docs.append(self.fdel)
1644 return val_docs
1645
1646 def is_detailed(self):
1647 if super(PropertyDoc, self).is_detailed():
1648 return True
1649
1650 if self.fget not in (None, UNKNOWN) and self.fget.pyval is not None:
1651 return True
1652 if self.fset not in (None, UNKNOWN) and self.fset.pyval is not None:
1653 return True
1654 if self.fdel not in (None, UNKNOWN) and self.fdel.pyval is not None:
1655 return True
1656
1657 return False
1658
1659######################################################################
1660## Index
1661######################################################################
1662
1663class DocIndex:
1664 """
1665 [xx] out of date.
1666
1667 An index that .. hmm... it *can't* be used to access some things,
1668 cuz they're not at the root level. Do I want to add them or what?
1669 And if so, then I have a sort of a new top level. hmm.. so
1670 basically the question is what to do with a name that's not in the
1671 root var's name space. 2 types:
1672 - entirely outside (eg os.path)
1673 - inside but not known (eg a submodule that we didn't look at?)
1674 - container of current thing not examined?
1675
1676 An index of all the C{APIDoc} objects that can be reached from a
1677 root set of C{ValueDoc}s.
1678
1679 The members of this index can be accessed by dotted name. In
1680 particular, C{DocIndex} defines two mappings, accessed via the
1681 L{get_vardoc()} and L{get_valdoc()} methods, which can be used to
1682 access C{VariableDoc}s or C{ValueDoc}s respectively by name. (Two
1683 separate mappings are necessary because a single name can be used
1684 to refer to both a variable and to the value contained by that
1685 variable.)
1686
1687 Additionally, the index defines two sets of C{ValueDoc}s:
1688 \"reachable C{ValueDoc}s\" and \"contained C{ValueDoc}s\". The
1689 X{reachable C{ValueDoc}s} are defined as the set of all
1690 C{ValueDoc}s that can be reached from the root set by following
1691 I{any} sequence of pointers to C{ValueDoc}s or C{VariableDoc}s.
1692 The X{contained C{ValueDoc}s} are defined as the set of all
1693 C{ValueDoc}s that can be reached from the root set by following
1694 only the C{ValueDoc} pointers defined by non-imported
1695 C{VariableDoc}s. For example, if the root set contains a module
1696 C{m}, then the contained C{ValueDoc}s includes the C{ValueDoc}s
1697 for any functions, variables, or classes defined in that module,
1698 as well as methods and variables defined in classes defined in the
1699 module. The reachable C{ValueDoc}s includes all of those
1700 C{ValueDoc}s, as well as C{ValueDoc}s for any values imported into
1701 the module, and base classes for classes defined in the module.
1702 """
1703
1704 def __init__(self, root):
1705 """
1706 Create a new documentation index, based on the given root set
1707 of C{ValueDoc}s. If any C{APIDoc}s reachable from the root
1708 set does not have a canonical name, then it will be assigned
1709 one. etc.
1710
1711 @param root: A list of C{ValueDoc}s.
1712 """
1713 for apidoc in root:
1714 if apidoc.canonical_name in (None, UNKNOWN):
1715 raise ValueError("All APIdocs passed to DocIndexer "
1716 "must already have canonical names.")
1717
1718 # Initialize the root items list. We sort them by length in
1719 # ascending order. (This ensures that variables will shadow
1720 # submodules when appropriate.)
1721 # When the elements name is the same, list in alphabetical order:
1722 # this is needed by the check for duplicates below.
1723 self.root = sorted(root,
1724 key=lambda d: (len(d.canonical_name), d.canonical_name))
1725 """The list of C{ValueDoc}s to document.
1726 @type: C{list}"""
1727
1728 # Drop duplicated modules
1729 # [xx] maybe what causes duplicates should be fixed instead.
1730 # If fixed, adjust the sort here above: sorting by names will not
1731 # be required anymore
1732 i = 1
1733 while i < len(self.root):
1734 if self.root[i-1] is self.root[i]:
1735 del self.root[i]
1736 else:
1737 i += 1
1738
1739 self.mlclasses = self._get_module_classes(self.root)
1740 """A mapping from class names to L{ClassDoc}. Contains
1741 classes defined at module level for modules in L{root}
1742 and which can be used as fallback by L{find()} if looking
1743 in containing namespaces fails.
1744 @type: C{dict} from C{str} to L{ClassDoc} or C{list}"""
1745
1746 self.callers = None
1747 """A dictionary mapping from C{RoutineDoc}s in this index
1748 to lists of C{RoutineDoc}s for the routine's callers.
1749 This dictionary is initialized by calling
1750 L{read_profiling_info()}.
1751 @type: C{list} of L{RoutineDoc}"""
1752
1753 self.callees = None
1754 """A dictionary mapping from C{RoutineDoc}s in this index
1755 to lists of C{RoutineDoc}s for the routine's callees.
1756 This dictionary is initialized by calling
1757 L{read_profiling_info()}.
1758 @type: C{list} of L{RoutineDoc}"""
1759
1760 self._funcid_to_doc = {}
1761 """A mapping from C{profile} function ids to corresponding
1762 C{APIDoc} objects. A function id is a tuple of the form
1763 C{(filename, lineno, funcname)}. This is used to update
1764 the L{callers} and L{callees} variables."""
1765
1766 self._container_cache = {}
1767 """A cache for the L{container()} method, to increase speed."""
1768
1769 self._get_cache = {}
1770 """A cache for the L{get_vardoc()} and L{get_valdoc()} methods,
1771 to increase speed."""
1772
1773 #////////////////////////////////////////////////////////////
1774 # Lookup methods
1775 #////////////////////////////////////////////////////////////
1776 # [xx]
1777 # Currently these only work for things reachable from the
1778 # root... :-/ I might want to change this so that imported
1779 # values can be accessed even if they're not contained.
1780 # Also, I might want canonical names to not start with ??
1781 # if the thing is a top-level imported module..?
1782
1783 def get_vardoc(self, name):
1784 """
1785 Return the C{VariableDoc} with the given name, or C{None} if this
1786 index does not contain a C{VariableDoc} with the given name.
1787 """
1788 var, val = self._get(name)
1789 return var
1790
1791 def get_valdoc(self, name):
1792 """
1793 Return the C{ValueDoc} with the given name, or C{None} if this
1794 index does not contain a C{ValueDoc} with the given name.
1795 """
1796 var, val = self._get(name)
1797 return val
1798
1799 def _get(self, name):
1800 """
1801 A helper function that's used to implement L{get_vardoc()}
1802 and L{get_valdoc()}.
1803 """
1804 # Convert name to a DottedName, if necessary.
1805 if not isinstance(name, DottedName):
1806 name = DottedName(name)
1807
1808 # Check if the result is cached.
1809 val = self._get_cache.get(name)
1810 if val is not None: return val
1811
1812 # Look for an element in the root set whose name is a prefix
1813 # of `name`. If we can't find one, then return None.
1814 for root_valdoc in self.root:
1815 if root_valdoc.canonical_name.dominates(name):
1816 # Starting at the root valdoc, walk down the variable/
1817 # submodule chain until we find the requested item.
1818 var_doc = None
1819 val_doc = root_valdoc
1820 for identifier in name[len(root_valdoc.canonical_name):]:
1821 if val_doc is None: break
1822 var_doc, val_doc = self._get_from(val_doc, identifier)
1823 else:
1824 # If we found it, then return.
1825 if var_doc is not None or val_doc is not None:
1826 self._get_cache[name] = (var_doc, val_doc)
1827 return var_doc, val_doc
1828
1829 # We didn't find it.
1830 self._get_cache[name] = (None, None)
1831 return None, None
1832
1833 def _get_from(self, val_doc, identifier):
1834 if isinstance(val_doc, NamespaceDoc):
1835 child_var = val_doc.variables.get(identifier)
1836 if child_var is not None:
1837 child_val = child_var.value
1838 if child_val is UNKNOWN: child_val = None
1839 return child_var, child_val
1840
1841 # If that fails, then see if it's a submodule.
1842 if (isinstance(val_doc, ModuleDoc) and
1843 val_doc.submodules is not UNKNOWN):
1844 for submodule in val_doc.submodules:
1845 if submodule.canonical_name[-1] == identifier:
1846 var_doc = None
1847 val_doc = submodule
1848 if val_doc is UNKNOWN: val_doc = None
1849 return var_doc, val_doc
1850
1851 return None, None
1852
1853 def find(self, name, context):
1854 """
1855 Look for an C{APIDoc} named C{name}, relative to C{context}.
1856 Return the C{APIDoc} if one is found; otherwise, return
1857 C{None}. C{find} looks in the following places, in order:
1858 - Function parameters (if one matches, return C{None})
1859 - All enclosing namespaces, from closest to furthest.
1860 - If C{name} starts with C{'self'}, then strip it off and
1861 look for the remaining part of the name using C{find}
1862 - Builtins
1863 - Parameter attributes
1864 - Classes at module level (if the name is not ambiguous)
1865
1866 @type name: C{str} or L{DottedName}
1867 @type context: L{APIDoc}
1868 """
1869 if isinstance(name, basestring):
1870 name = re.sub(r'\(.*\)$', '', name.strip())
1871 if re.match('^([a-zA-Z_]\w*)(\.[a-zA-Z_]\w*)*$', name):
1872 name = DottedName(name)
1873 else:
1874 return None
1875 elif not isinstance(name, DottedName):
1876 raise TypeError("'name' should be a string or DottedName")
1877
1878 if context is None or context.canonical_name is None:
1879 container_name = []
1880 else:
1881 container_name = context.canonical_name
1882
1883 # Check for the name in all containing namespaces, starting
1884 # with the closest one.
1885 for i in range(len(container_name), -1, -1):
1886 relative_name = container_name[:i]+name
1887 # Is `name` the absolute name of a documented value?
1888 # (excepting GenericValueDoc values.)
1889 val_doc = self.get_valdoc(relative_name)
1890 if (val_doc is not None and
1891 not isinstance(val_doc, GenericValueDoc)):
1892 return val_doc
1893 # Is `name` the absolute name of a documented variable?
1894 var_doc = self.get_vardoc(relative_name)
1895 if var_doc is not None: return var_doc
1896
1897 # If the name begins with 'self', then try stripping that off
1898 # and see if we can find the variable.
1899 if name[0] == 'self':
1900 doc = self.find('.'.join(name[1:]), context)
1901 if doc is not None: return doc
1902
1903 # Is it the name of a builtin?
1904 if len(name)==1 and hasattr(__builtin__, name[0]):
1905 return None
1906
1907 # Is it a parameter's name or an attribute of a parameter?
1908 if isinstance(context, RoutineDoc):
1909 all_args = context.all_args()
1910 if all_args is not UNKNOWN and name[0] in all_args:
1911 return None
1912
1913 # Is this an object directly contained by any module?
1914 doc = self.mlclasses.get(name[-1])
1915 if isinstance(doc, APIDoc):
1916 return doc
1917 elif isinstance(doc, list):
1918 log.warning("%s is an ambiguous name: it may be %s" % (
1919 name[-1],
1920 ", ".join([ "'%s'" % d.canonical_name for d in doc ])))
1921
1922 # Drop this item so that the warning is reported only once.
1923 # fail() will fail anyway.
1924 del self.mlclasses[name[-1]]
1925
1926 def _get_module_classes(self, docs):
1927 """
1928 Gather all the classes defined in a list of modules.
1929
1930 Very often people refers to classes only by class name,
1931 even if they are not imported in the namespace. Linking
1932 to such classes will fail if we look for them only in nested
1933 namespaces. Allow them to retrieve only by name.
1934
1935 @param docs: containers of the objects to collect
1936 @type docs: C{list} of C{APIDoc}
1937 @return: mapping from objects name to the object(s) with that name
1938 @rtype: C{dict} from C{str} to L{ClassDoc} or C{list}
1939 """
1940 classes = {}
1941 for doc in docs:
1942 if not isinstance(doc, ModuleDoc):
1943 continue
1944
1945 for var in doc.variables.values():
1946 if not isinstance(var.value, ClassDoc):
1947 continue
1948
1949 val = var.value
1950 if val in (None, UNKNOWN) or val.defining_module is not doc:
1951 continue
1952 if val.canonical_name in (None, UNKNOWN):
1953 continue
1954
1955 name = val.canonical_name[-1]
1956 vals = classes.get(name)
1957 if vals is None:
1958 classes[name] = val
1959 elif not isinstance(vals, list):
1960 classes[name] = [ vals, val ]
1961 else:
1962 vals.append(val)
1963
1964 return classes
1965
1966 #////////////////////////////////////////////////////////////
1967 # etc
1968 #////////////////////////////////////////////////////////////
1969
1970 def reachable_valdocs(self, **filters):
1971 """
1972 Return a list of all C{ValueDoc}s that can be reached,
1973 directly or indirectly from this C{DocIndex}'s root set.
1974
1975 @param filters: A set of filters that can be used to prevent
1976 C{reachable_valdocs} from following specific link types
1977 when looking for C{ValueDoc}s that can be reached from the
1978 root set. See C{APIDoc.apidoc_links} for a more complete
1979 description.
1980 """
1981 return reachable_valdocs(self.root, **filters)
1982
1983 def container(self, api_doc):
1984 """
1985 Return the C{ValueDoc} that contains the given C{APIDoc}, or
1986 C{None} if its container is not in the index.
1987 """
1988 # Check if the result is cached.
1989 val = self._container_cache.get(api_doc)
1990 if val is not None: return val
1991
1992 if isinstance(api_doc, GenericValueDoc):
1993 self._container_cache[api_doc] = None
1994 return None # [xx] unknown.
1995 if isinstance(api_doc, VariableDoc):
1996 self._container_cache[api_doc] = api_doc.container
1997 return api_doc.container
1998 if len(api_doc.canonical_name) == 1:
1999 self._container_cache[api_doc] = None
2000 return None
2001 elif isinstance(api_doc, ModuleDoc) and api_doc.package is not UNKNOWN:
2002 self._container_cache[api_doc] = api_doc.package
2003 return api_doc.package
2004 else:
2005 parent = self.get_valdoc(api_doc.canonical_name.container())
2006 self._container_cache[api_doc] = parent
2007 return parent
2008
2009 #////////////////////////////////////////////////////////////
2010 # Profiling information
2011 #////////////////////////////////////////////////////////////
2012
2013 def read_profiling_info(self, profile_stats):
2014 """
2015 Initialize the L{callers} and L{callees} variables, given a
2016 C{Stat} object from the C{pstats} module.
2017
2018 @warning: This method uses undocumented data structures inside
2019 of C{profile_stats}.
2020 """
2021 if self.callers is None: self.callers = {}
2022 if self.callees is None: self.callees = {}
2023
2024 # The Stat object encodes functions using `funcid`s, or
2025 # tuples of (filename, lineno, funcname). Create a mapping
2026 # from these `funcid`s to `RoutineDoc`s.
2027 self._update_funcid_to_doc(profile_stats)
2028
2029 for callee, (cc, nc, tt, ct, callers) in profile_stats.stats.items():
2030 callee = self._funcid_to_doc.get(callee)
2031 if callee is None: continue
2032 for caller in callers:
2033 caller = self._funcid_to_doc.get(caller)
2034 if caller is None: continue
2035 self.callers.setdefault(callee, []).append(caller)
2036 self.callees.setdefault(caller, []).append(callee)
2037
2038 def _update_funcid_to_doc(self, profile_stats):
2039 """
2040 Update the dictionary mapping from C{pstat.Stat} funciton ids to
2041 C{RoutineDoc}s. C{pstat.Stat} function ids are tuples of
2042 C{(filename, lineno, funcname)}.
2043 """
2044 # Maps (filename, lineno, funcname) -> RoutineDoc
2045 for val_doc in self.reachable_valdocs():
2046 # We only care about routines.
2047 if not isinstance(val_doc, RoutineDoc): continue
2048 # Get the filename from the defining module.
2049 module = val_doc.defining_module
2050 if module is UNKNOWN or module.filename is UNKNOWN: continue
2051 # Normalize the filename.
2052 filename = os.path.abspath(module.filename)
2053 try: filename = py_src_filename(filename)
2054 except: pass
2055 # Look up the stat_func_id
2056 funcid = (filename, val_doc.lineno, val_doc.canonical_name[-1])
2057 if funcid in profile_stats.stats:
2058 self._funcid_to_doc[funcid] = val_doc
2059
2060######################################################################
2061## Pretty Printing
2062######################################################################
2063
2064def pp_apidoc(api_doc, doublespace=0, depth=5, exclude=(), include=(),
2065 backpointers=None):
2066 """
2067 @return: A multiline pretty-printed string representation for the
2068 given C{APIDoc}.
2069 @param doublespace: If true, then extra lines will be
2070 inserted to make the output more readable.
2071 @param depth: The maximum depth that pp_apidoc will descend
2072 into descendent VarDocs. To put no limit on
2073 depth, use C{depth=-1}.
2074 @param exclude: A list of names of attributes whose values should
2075 not be shown.
2076 @param backpointers: For internal use.
2077 """
2078 pyid = id(api_doc.__dict__)
2079 if backpointers is None: backpointers = {}
2080 if (hasattr(api_doc, 'canonical_name') and
2081 api_doc.canonical_name not in (None, UNKNOWN)):
2082 name = '%s for %s' % (api_doc.__class__.__name__,
2083 api_doc.canonical_name)
2084 elif getattr(api_doc, 'name', None) not in (UNKNOWN, None):
2085 if (getattr(api_doc, 'container', None) not in (UNKNOWN, None) and
2086 getattr(api_doc.container, 'canonical_name', None)
2087 not in (UNKNOWN, None)):
2088 name ='%s for %s' % (api_doc.__class__.__name__,
2089 api_doc.container.canonical_name+
2090 api_doc.name)
2091 else:
2092 name = '%s for %s' % (api_doc.__class__.__name__, api_doc.name)
2093 else:
2094 name = api_doc.__class__.__name__
2095
2096 if pyid in backpointers:
2097 return '%s [%s] (defined above)' % (name, backpointers[pyid])
2098
2099 if depth == 0:
2100 if hasattr(api_doc, 'name') and api_doc.name is not None:
2101 return '%s...' % api_doc.name
2102 else:
2103 return '...'
2104
2105 backpointers[pyid] = len(backpointers)
2106 s = '%s [%s]' % (name, backpointers[pyid])
2107
2108 # Only print non-empty fields:
2109 fields = [field for field in api_doc.__dict__.keys()
2110 if (field in include or
2111 (getattr(api_doc, field) is not UNKNOWN
2112 and field not in exclude))]
2113 if include:
2114 fields = [field for field in dir(api_doc)
2115 if field in include]
2116 else:
2117 fields = [field for field in api_doc.__dict__.keys()
2118 if (getattr(api_doc, field) is not UNKNOWN
2119 and field not in exclude)]
2120 fields.sort()
2121
2122 for field in fields:
2123 fieldval = getattr(api_doc, field)
2124 if doublespace: s += '\n |'
2125 s += '\n +- %s' % field
2126
2127 if (isinstance(fieldval, types.ListType) and
2128 len(fieldval)>0 and
2129 isinstance(fieldval[0], APIDoc)):
2130 s += _pp_list(api_doc, fieldval, doublespace, depth,
2131 exclude, include, backpointers,
2132 (field is fields[-1]))
2133 elif (isinstance(fieldval, types.DictType) and
2134 len(fieldval)>0 and
2135 isinstance(fieldval.values()[0], APIDoc)):
2136 s += _pp_dict(api_doc, fieldval, doublespace,
2137 depth, exclude, include, backpointers,
2138 (field is fields[-1]))
2139 elif isinstance(fieldval, APIDoc):
2140 s += _pp_apidoc(api_doc, fieldval, doublespace, depth,
2141 exclude, include, backpointers,
2142 (field is fields[-1]))
2143 else:
2144 s += ' = ' + _pp_val(api_doc, fieldval, doublespace,
2145 depth, exclude, include, backpointers)
2146
2147 return s
2148
2149def _pp_list(api_doc, items, doublespace, depth, exclude, include,
2150 backpointers, is_last):
2151 line1 = (is_last and ' ') or '|'
2152 s = ''
2153 for item in items:
2154 line2 = ((item is items[-1]) and ' ') or '|'
2155 joiner = '\n %s %s ' % (line1, line2)
2156 if doublespace: s += '\n %s |' % line1
2157 s += '\n %s +- ' % line1
2158 valstr = _pp_val(api_doc, item, doublespace, depth, exclude, include,
2159 backpointers)
2160 s += joiner.join(valstr.split('\n'))
2161 return s
2162
2163def _pp_dict(api_doc, dict, doublespace, depth, exclude, include,
2164 backpointers, is_last):
2165 items = dict.items()
2166 items.sort()
2167 line1 = (is_last and ' ') or '|'
2168 s = ''
2169 for item in items:
2170 line2 = ((item is items[-1]) and ' ') or '|'
2171 joiner = '\n %s %s ' % (line1, line2)
2172 if doublespace: s += '\n %s |' % line1
2173 s += '\n %s +- ' % line1
2174 valstr = _pp_val(api_doc, item[1], doublespace, depth, exclude,
2175 include, backpointers)
2176 s += joiner.join(('%s => %s' % (item[0], valstr)).split('\n'))
2177 return s
2178
2179def _pp_apidoc(api_doc, val, doublespace, depth, exclude, include,
2180 backpointers, is_last):
2181 line1 = (is_last and ' ') or '|'
2182 s = ''
2183 if doublespace: s += '\n %s | ' % line1
2184 s += '\n %s +- ' % line1
2185 joiner = '\n %s ' % line1
2186 childstr = pp_apidoc(val, doublespace, depth-1, exclude,
2187 include, backpointers)
2188 return s + joiner.join(childstr.split('\n'))
2189
2190def _pp_val(api_doc, val, doublespace, depth, exclude, include, backpointers):
2191 from epydoc import markup
2192 if isinstance(val, APIDoc):
2193 return pp_apidoc(val, doublespace, depth-1, exclude,
2194 include, backpointers)
2195 elif isinstance(val, markup.ParsedDocstring):
2196 valrepr = `val.to_plaintext(None)`
2197 if len(valrepr) < 40: return valrepr
2198 else: return valrepr[:37]+'...'
2199 else:
2200 valrepr = repr(val)
2201 if len(valrepr) < 40: return valrepr
2202 else: return valrepr[:37]+'...'
2203