Package epydoc :: Module apidoc

[hide private]
[frames] | no frames]

# Source Code for Module epydoc.apidoc

       1  # 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  """
      10  Classes for encoding API documentation about Python programs.
      11  These classes are used as a common representation for combining
      12  information derived from introspection and from parsing.
      13
      14  The API documentation for a Python program is encoded using a graph of
      15  L{APIDoc} objects, each of which encodes information about a single
      16  Python variable or value.  C{APIDoc} has two direct subclasses:
      17  L{VariableDoc}, for documenting variables; and L{ValueDoc}, for
      18  documenting values.  The C{ValueDoc} class is subclassed further, to
      19  define the different pieces of information that should be recorded
      20  about each value type:
      21
      22  G{classtree: APIDoc}
      23
      24  The distinction between variables and values is intentionally made
      25  explicit.  This allows us to distinguish information about a variable
      26  itself (such as whether it should be considered 'public' in its
      27  containing namespace) from information about the value it contains
      28  (such as what type the value has).  This distinction is also important
      29  because several variables can contain the same value: each variable
      30  should be described by a separate C{VariableDoc}; but we only need one
      31  C{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
      41  import types, re, os.path, pickle
      42  from epydoc import log
      43  import epydoc
      44  import __builtin__
      45  from epydoc.compat import * # Backwards compatibility
      46  from epydoc.util import decode_with_backslashreplace, py_src_filename
      47  import epydoc.markup.pyval_repr
      48
      49  ######################################################################
      50  # Dotted Names
      51  ######################################################################
      52
      53 -class 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
     271 -class _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
     284  UNKNOWN = _Sentinel('UNKNOWN')
     285  """A special value used to indicate that a given piece of
     286  information about an object is unknown.  This is used as the
     287  default value for all instance variables."""
     288
     289  ######################################################################
     290  # API Documentation Objects: Abstract Base Classes
     291  ######################################################################
     292
     293 -class 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
     552 -def 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
     580 -class 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
     719 -class 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
     901 -class 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
     913 -class 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
    1104 -class 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
    1247 -class 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
    1484 -class 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
    1602 -def _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
    1614 -class ClassMethodDoc(RoutineDoc): pass
    1615 -class StaticMethodDoc(RoutineDoc): pass
    1616
    1617 -class 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
    1663 -class 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
    2064 -def 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
    2149 -def _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
    2163 -def _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
    2179 -def _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
    2190 -def _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