Thread: [Epydoc-commits] SF.net SVN: epydoc: [1182] trunk/epydoc/src/epydoc/docbuilder.py
Brought to you by:
edloper
From: <ed...@us...> - 2006-04-07 01:04:46
|
Revision: 1182 Author: edloper Date: 2006-04-06 18:04:42 -0700 (Thu, 06 Apr 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1182&view=rev Log Message: ----------- - Minor change to logging message Modified Paths: -------------- trunk/epydoc/src/epydoc/docbuilder.py Modified: trunk/epydoc/src/epydoc/docbuilder.py =================================================================== --- trunk/epydoc/src/epydoc/docbuilder.py 2006-04-07 01:04:16 UTC (rev 1181) +++ trunk/epydoc/src/epydoc/docbuilder.py 2006-04-07 01:04:42 UTC (rev 1182) @@ -736,7 +736,7 @@ # If they are incompatible, then check the precedence. elif introspect_doc.posargs != parse_doc.posargs: - log.info("Warning: Not merging the parsed & introspected arg " + log.info("Not merging the parsed & introspected arg " "lists for %s, since they don't match (%s vs %s)" % (path, introspect_doc.posargs, parse_doc.posargs)) if (MERGE_PRECEDENCE.get('posargs', DEFAULT_MERGE_PRECEDENCE) == @@ -831,7 +831,7 @@ # If the lengths don't match up, then give up. This is most # often caused by __metaclass__. if len(baselist1) != len(baselist2): - log.info("Warning: Not merging the introspected & parsed base lists " + log.info("Not merging the introspected & parsed base lists " "for %s, since their lengths don't match (%s vs %s)" % (path, len(baselist1), len(baselist2))) if precedence == 'introspect': return baselist1 @@ -842,7 +842,7 @@ if ((base1.canonical_name not in (None, UNKNOWN) and base2.canonical_name not in (None, UNKNOWN)) and base1.canonical_name != base2.canonical_name): - log.info("Warning: Not merging the parsed & introspected base " + log.info("Not merging the parsed & introspected base " "lists for %s, since the bases' names don't match " "(%s vs %s)" % (path, base1.canonical_name, base2.canonical_name)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-04-07 23:32:41
|
Revision: 1187 Author: edloper Date: 2006-04-07 16:32:37 -0700 (Fri, 07 Apr 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1187&view=rev Log Message: ----------- - Changed docbuilder to recursively add the contents of packages that are specified by name. Modified Paths: -------------- trunk/epydoc/src/epydoc/docbuilder.py Modified: trunk/epydoc/src/epydoc/docbuilder.py =================================================================== --- trunk/epydoc/src/epydoc/docbuilder.py 2006-04-07 01:07:11 UTC (rev 1186) +++ trunk/epydoc/src/epydoc/docbuilder.py 2006-04-07 23:32:37 UTC (rev 1187) @@ -239,13 +239,9 @@ doc_pairs.append(_get_docs_from_module_file( item, introspect, parse, progress_estimator)) elif is_package_dir(item): - if add_submodules: - doc_pairs += _get_docs_from_package_dir( - item, introspect, parse, progress_estimator) - else: - item = os.path.join(item, '__init__') - doc_pairs.append(_get_docs_from_module_file( - item, introspect, parse, progress_estimator)) + pkgfile = os.path.join(item, '__init__') + doc_pairs.append(_get_docs_from_module_file( + pkgfile, introspect, parse, progress_estimator)) elif os.path.isfile(item): doc_pairs.append(_get_docs_from_pyscript( item, introspect, parse, progress_estimator)) @@ -266,7 +262,15 @@ else: doc_pairs.append(_get_docs_from_pyobject( item, introspect, parse, progress_estimator)) - + + # This will only have an effect if doc_pairs[-1] contains a + # package's docs. The 'not is_module_file(item)' prevents + # us from adding subdirectories if they explicitly specify + # a package's __init__.py file. + if add_submodules and not is_module_file(item): + doc_pairs += _get_docs_from_submodules( + item, doc_pairs[-1], introspect, parse, progress_estimator) + log.end_progress() return doc_pairs @@ -407,20 +411,17 @@ # Return the docs we found. return (introspect_doc, parse_doc) -def _get_docs_from_package_dir(package_dir, introspect, parse, - progress_estimator, parent_docs=(None,None)): - pkg_dir = os.path.normpath(os.path.abspath(package_dir)) - pkg_file = os.path.join(pkg_dir, '__init__') - pkg_docs = _get_docs_from_module_file( - pkg_file, introspect, parse, progress_estimator, parent_docs) - +def _get_docs_from_submodules(item, pkg_docs, introspect, parse, + progress_estimator): # Extract the package's __path__. - if pkg_docs == (None, None): - return [] - elif pkg_docs[0] is not None: + if isinstance(pkg_docs[0], ModuleDoc) and pkg_docs[0].is_package: pkg_path = pkg_docs[0].path + package_dir = os.path.split(pkg_docs[0].filename)[0] + elif isinstance(pkg_docs[1], ModuleDoc) and pkg_docs[1].is_package: + pkg_path = pkg_docs[1].path + package_dir = os.path.split(pkg_docs[1].filename)[0] else: - pkg_path = pkg_docs[1].path + return [] module_filenames = {} subpackage_dirs = set() @@ -438,9 +439,8 @@ subpackage_dirs.add(filename) # Update our estimate of the number of modules in this package. - progress_estimator.revise_estimate(package_dir, - module_filenames.items(), - subpackage_dirs) + progress_estimator.revise_estimate(item, module_filenames.items(), + subpackage_dirs) docs = [pkg_docs] for module_filename in module_filenames.values(): @@ -448,8 +448,11 @@ module_filename, introspect, parse, progress_estimator, pkg_docs) docs.append(d) for subpackage_dir in subpackage_dirs: - docs += _get_docs_from_package_dir( - subpackage_dir, introspect, parse, progress_estimator, pkg_docs) + subpackage_file = os.path.join(subpackage_dir, '__init__') + docs.append(_get_docs_from_module_file( + subpackage_file, introspect, parse, progress_estimator, pkg_docs)) + docs += _get_docs_from_submodules( + subpackage_dir, docs[-1], introspect, parse, progress_estimator) return docs def _report_errors(name, introspect_doc, parse_doc, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-04-10 13:22:55
|
Revision: 1208 Author: edloper Date: 2006-04-10 06:22:49 -0700 (Mon, 10 Apr 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1208&view=rev Log Message: ----------- - Minor change in error reporting Modified Paths: -------------- trunk/epydoc/src/epydoc/docbuilder.py Modified: trunk/epydoc/src/epydoc/docbuilder.py =================================================================== --- trunk/epydoc/src/epydoc/docbuilder.py 2006-04-09 23:28:28 UTC (rev 1207) +++ trunk/epydoc/src/epydoc/docbuilder.py 2006-04-10 13:22:49 UTC (rev 1208) @@ -457,8 +457,7 @@ def _report_errors(name, introspect_doc, parse_doc, introspect_error, parse_error): - if len(name) < 30: hdr = 'In %s: ' % name - else: hdr = 'In %s:\n' % name + hdr = 'In %s:\n' % name if introspect_doc == parse_doc == None: log.start_block('%sNo documentation available!' % hdr) if introspect_error: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-08-23 00:21:45
|
Revision: 1298 Author: edloper Date: 2006-08-22 17:21:43 -0700 (Tue, 22 Aug 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1298&view=rev Log Message: ----------- - Changed _unreachable_names to be a dictionary from name to integer id, which serves a minor optimization if a large number of unreachable names are used. Based on a patch provided by Daniel von Dincklage. Modified Paths: -------------- trunk/epydoc/src/epydoc/docbuilder.py Modified: trunk/epydoc/src/epydoc/docbuilder.py =================================================================== --- trunk/epydoc/src/epydoc/docbuilder.py 2006-08-22 21:46:27 UTC (rev 1297) +++ trunk/epydoc/src/epydoc/docbuilder.py 2006-08-23 00:21:43 UTC (rev 1298) @@ -952,9 +952,13 @@ L{assign_canonical_names()} finds a canonical name with a better score, then it will replace the old name.""" -_unreachable_names = set(DottedName(DottedName.UNREACHABLE)) +_unreachable_names = {DottedName(DottedName.UNREACHABLE):2} """The set of names that have been used for unreachable objects. This -is used to ensure there are no duplicate cannonical names assigned.""" +is used to ensure there are no duplicate cannonical names assigned. +C{_unreachable_names} is a dictionary mapping from dotted names to +integer ids, where the next unused unreachable name derived from +dotted name C{n} is +C{DottedName('%s-%s' % (n, str(_unreachable_names[n]))}""" def assign_canonical_names(val_doc, name, docindex, score=0): """ @@ -1070,11 +1074,10 @@ # Uniquify the name. if name in _unreachable_names: - n = 2 - while DottedName('%s-%s' % (name,n)) in _unreachable_names: - n += 1 - name = DottedName('%s-%s' % (name,n)) - _unreachable_names.add(name) + name = DottedName('%s-%s' % (name, _unreachable_names[name])) + _unreachable_names[name] += 1 + else: + _unreachable_names[name] = 2 return name, -10000 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-09-07 15:55:19
|
Revision: 1367 http://svn.sourceforge.net/epydoc/?rev=1367&view=rev Author: edloper Date: 2006-09-07 08:55:15 -0700 (Thu, 07 Sep 2006) Log Message: ----------- - Docstring fixes Modified Paths: -------------- trunk/epydoc/src/epydoc/docbuilder.py Modified: trunk/epydoc/src/epydoc/docbuilder.py =================================================================== --- trunk/epydoc/src/epydoc/docbuilder.py 2006-09-07 15:54:59 UTC (rev 1366) +++ trunk/epydoc/src/epydoc/docbuilder.py 2006-09-07 15:55:15 UTC (rev 1367) @@ -369,11 +369,13 @@ Construct and return the API documentation for the python module with the given filename. - @param parent_doc: The C{ModuleDoc} of the containing package. - If C{parent_doc} is not provided, then this method will + @param parent_docs: The C{ModuleDoc} of the containing package. + If C{parent_docs} is not provided, then this method will check if the given filename is contained in a package; and if so, it will construct a stub C{ModuleDoc} for the - containing package(s). + containing package(s). C{parent_docs} is a tuple, where + the first element is the parent from introspection, and + the second element is the parent from parsing. """ # Record our progress. modulename = os.path.splitext(os.path.split(filename)[1])[0] @@ -589,7 +591,7 @@ @param attrib: The name of the attribute whose values are merged by C{mergefunc}. - @param mergefun: The merge function, whose sinature is: + @param mergefunc: The merge function, whose sinature is: >>> def mergefunc(introspect_val, parse_val, precedence, cyclecheck, path): ... return calculate_merged_value(introspect_val, parse_val) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2007-09-26 19:03:02
|
Revision: 1656 http://epydoc.svn.sourceforge.net/epydoc/?rev=1656&view=rev Author: edloper Date: 2007-09-26 12:03:00 -0700 (Wed, 26 Sep 2007) Log Message: ----------- - If the parser & introspector disagree about submodules, then issue a warning, and merge the two lists. It's still not clear *why* this might happen, but I suspect it might be the cause of a bug I'm investigating. Modified Paths: -------------- trunk/epydoc/src/epydoc/docbuilder.py Modified: trunk/epydoc/src/epydoc/docbuilder.py =================================================================== --- trunk/epydoc/src/epydoc/docbuilder.py 2007-09-26 18:44:11 UTC (rev 1655) +++ trunk/epydoc/src/epydoc/docbuilder.py 2007-09-26 19:03:00 UTC (rev 1656) @@ -1010,6 +1010,16 @@ def merge_docs_extracted_by(v1, v2, precedence, cyclecheck, path): return 'both' +def merge_submodules(v1, v2, precedence, cyclecheck, path): + n1 = sorted([m.canonical_name for m in v1]) + n2 = sorted([m.canonical_name for m in v2]) + if (n1 != n2) and (n2 != []): + log.warning('Introspector & parser disagree about submodules ' + 'for %s: %s vs %s' % (path, n1, n2)) + return v1 + [m for m in v2 if m.canonical_name not in n1] + + return v1 + register_attribute_mergefunc('variables', merge_variables) register_attribute_mergefunc('value', merge_value) register_attribute_mergefunc('overrides', merge_overrides) @@ -1021,6 +1031,7 @@ register_attribute_mergefunc('posarg_defaults', merge_posarg_defaults) register_attribute_mergefunc('docstring', merge_docstring) register_attribute_mergefunc('docs_extracted_by', merge_docs_extracted_by) +register_attribute_mergefunc('submodules', merge_submodules) ###################################################################### ## Import Linking This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2008-01-29 17:28:04
|
Revision: 1679 http://epydoc.svn.sourceforge.net/epydoc/?rev=1679&view=rev Author: edloper Date: 2008-01-29 09:28:03 -0800 (Tue, 29 Jan 2008) Log Message: ----------- - Fixed bug: valdocs was used before it was defined Modified Paths: -------------- trunk/epydoc/src/epydoc/docbuilder.py Modified: trunk/epydoc/src/epydoc/docbuilder.py =================================================================== --- trunk/epydoc/src/epydoc/docbuilder.py 2008-01-29 17:21:29 UTC (rev 1678) +++ trunk/epydoc/src/epydoc/docbuilder.py 2008-01-29 17:28:03 UTC (rev 1679) @@ -254,6 +254,8 @@ # Set overrides pointers log.start_progress('Checking for overridden methods') + valdocs = sorted(docindex.reachable_valdocs( + imports=False, submodules=False, packages=False, subclasses=False)) for i, val_doc in enumerate(valdocs): if isinstance(val_doc, ClassDoc): percent = float(i)/len(valdocs) @@ -263,8 +265,6 @@ # Parse the docstrings for each object. log.start_progress('Parsing docstrings') - valdocs = sorted(docindex.reachable_valdocs( - imports=False, submodules=False, packages=False, subclasses=False)) suppress_warnings = set(valdocs).difference( docindex.reachable_valdocs( imports=False, submodules=False, packages=False, subclasses=False, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-04-12 19:50:52
|
Revision: 1223 Author: edloper Date: 2006-04-12 12:50:43 -0700 (Wed, 12 Apr 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1223&view=rev Log Message: ----------- - Fixed bug in _get_docs_from_items Modified Paths: -------------- trunk/epydoc/src/epydoc/docbuilder.py Modified: trunk/epydoc/src/epydoc/docbuilder.py =================================================================== --- trunk/epydoc/src/epydoc/docbuilder.py 2006-04-12 19:50:15 UTC (rev 1222) +++ trunk/epydoc/src/epydoc/docbuilder.py 2006-04-12 19:50:43 UTC (rev 1223) @@ -254,11 +254,14 @@ item, introspect, parse, progress_estimator)) elif os.path.isdir(item): log.error("Directory %r is not a package" % item) + continue elif os.path.isfile(item): log.error("File %s is not a Python module" % item) + continue else: log.error("Could not find a file or object named %s" % item) + continue else: doc_pairs.append(_get_docs_from_pyobject( item, introspect, parse, progress_estimator)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-08-21 10:14:22
|
Revision: 1263 Author: edloper Date: 2006-08-21 03:14:18 -0700 (Mon, 21 Aug 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1263&view=rev Log Message: ----------- - Use absolute paths for packages (so we have access to parents) Modified Paths: -------------- trunk/epydoc/src/epydoc/docbuilder.py Modified: trunk/epydoc/src/epydoc/docbuilder.py =================================================================== --- trunk/epydoc/src/epydoc/docbuilder.py 2006-08-21 10:13:34 UTC (rev 1262) +++ trunk/epydoc/src/epydoc/docbuilder.py 2006-08-21 10:14:18 UTC (rev 1263) @@ -239,7 +239,7 @@ doc_pairs.append(_get_docs_from_module_file( item, introspect, parse, progress_estimator)) elif is_package_dir(item): - pkgfile = os.path.join(item, '__init__') + pkgfile = os.path.abspath(os.path.join(item, '__init__')) doc_pairs.append(_get_docs_from_module_file( pkgfile, introspect, parse, progress_estimator)) elif os.path.isfile(item): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-08-23 02:04:57
|
Revision: 1299 Author: edloper Date: 2006-08-22 19:04:55 -0700 (Tue, 22 Aug 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1299&view=rev Log Message: ----------- - Fixed bug in unreachable name handling introduced by previous commit (1298). Modified Paths: -------------- trunk/epydoc/src/epydoc/docbuilder.py Modified: trunk/epydoc/src/epydoc/docbuilder.py =================================================================== --- trunk/epydoc/src/epydoc/docbuilder.py 2006-08-23 00:21:43 UTC (rev 1298) +++ trunk/epydoc/src/epydoc/docbuilder.py 2006-08-23 02:04:55 UTC (rev 1299) @@ -952,13 +952,13 @@ L{assign_canonical_names()} finds a canonical name with a better score, then it will replace the old name.""" -_unreachable_names = {DottedName(DottedName.UNREACHABLE):2} +_unreachable_names = {DottedName(DottedName.UNREACHABLE):1} """The set of names that have been used for unreachable objects. This is used to ensure there are no duplicate cannonical names assigned. C{_unreachable_names} is a dictionary mapping from dotted names to integer ids, where the next unused unreachable name derived from dotted name C{n} is -C{DottedName('%s-%s' % (n, str(_unreachable_names[n]))}""" +C{DottedName('%s-%s' % (n, str(_unreachable_names[n]+1))}""" def assign_canonical_names(val_doc, name, docindex, score=0): """ @@ -1074,10 +1074,10 @@ # Uniquify the name. if name in _unreachable_names: - name = DottedName('%s-%s' % (name, _unreachable_names[name])) _unreachable_names[name] += 1 + name = DottedName('%s-%s' % (name, _unreachable_names[name]-1)) else: - _unreachable_names[name] = 2 + _unreachable_names[name] = 1 return name, -10000 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-08-23 16:18:19
|
Revision: 1311 Author: edloper Date: 2006-08-23 09:18:04 -0700 (Wed, 23 Aug 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1311&view=rev Log Message: ----------- - fixed bug in build_doc() - when building docs for a python object, make sure that we give it *some* canonical name. Modified Paths: -------------- trunk/epydoc/src/epydoc/docbuilder.py Modified: trunk/epydoc/src/epydoc/docbuilder.py =================================================================== --- trunk/epydoc/src/epydoc/docbuilder.py 2006-08-23 16:17:18 UTC (rev 1310) +++ trunk/epydoc/src/epydoc/docbuilder.py 2006-08-23 16:18:04 UTC (rev 1311) @@ -101,7 +101,7 @@ @param parse: If true, then use parsing to examine the specified items. Otherwise, just use introspection. """ - docindex = build_doc_index(item, introspect, parse, add_submodules) + docindex = build_doc_index([item], introspect, parse, add_submodules) return docindex.root[0] def build_doc_index(items, introspect=True, parse=True, @@ -297,6 +297,14 @@ _, parse_docs = _get_docs_from_pyname( str(introspect_doc.canonical_name), False, True, progress_estimator, supress_warnings=True) + # We need a name: + if introspect_doc.canonical_name in (None, UNKNOWN): + if hasattr(obj, '__name__'): + introspect_doc.canonical_name = DottedName( + DottedName.UNREACHABLE, obj.__name__) + else: + introspect_doc.canonical_name = DottedName( + DottedName.UNREACHABLE) return (introspect_doc, parse_doc) def _get_docs_from_pyname(name, introspect, parse, progress_estimator, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-09-02 00:51:40
|
Revision: 1339 http://svn.sourceforge.net/epydoc/?rev=1339&view=rev Author: edloper Date: 2006-09-01 17:51:36 -0700 (Fri, 01 Sep 2006) Log Message: ----------- - Fixed typo in comment Modified Paths: -------------- trunk/epydoc/src/epydoc/docbuilder.py Modified: trunk/epydoc/src/epydoc/docbuilder.py =================================================================== --- trunk/epydoc/src/epydoc/docbuilder.py 2006-09-02 00:50:32 UTC (rev 1338) +++ trunk/epydoc/src/epydoc/docbuilder.py 2006-09-02 00:51:36 UTC (rev 1339) @@ -992,7 +992,7 @@ # Update val_doc's canonical name, if appropriate. if (val_doc not in _name_scores and val_doc.canonical_name is not UNKNOWN): - # If this is the fist time we've seen val_doc, and it + # If this is the first time we've seen val_doc, and it # already has a name, then don't change that name. _name_scores[val_doc] = sys.maxint name = val_doc.canonical_name This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dva...@us...> - 2006-09-08 20:39:15
|
Revision: 1375 http://svn.sourceforge.net/epydoc/?rev=1375&view=rev Author: dvarrazzo Date: 2006-09-08 13:39:09 -0700 (Fri, 08 Sep 2006) Log Message: ----------- - Dropped use of sort_by_name keyword in DocIndex.reachable_valdoc() Modified Paths: -------------- trunk/epydoc/src/epydoc/docbuilder.py Modified: trunk/epydoc/src/epydoc/docbuilder.py =================================================================== --- trunk/epydoc/src/epydoc/docbuilder.py 2006-09-08 15:40:13 UTC (rev 1374) +++ trunk/epydoc/src/epydoc/docbuilder.py 2006-09-08 20:39:09 UTC (rev 1375) @@ -162,9 +162,8 @@ # their targets. if parse: log.start_progress('Linking imported variables') - valdocs = docindex.reachable_valdocs(sort_by_name=True, imports=False, - submodules=False, packages=False, - subclasses=False) + valdocs = sorted(docindex.reachable_valdocs( + imports=False, submodules=False, packages=False, subclasses=False)) for i, val_doc in enumerate(valdocs): _report_valdoc_progress(i, val_doc, valdocs) link_imports(val_doc, docindex) @@ -179,9 +178,8 @@ # Parse the docstrings for each object. log.start_progress('Parsing docstrings') - valdocs = docindex.reachable_valdocs(sort_by_name=True, imports=False, - submodules=False, packages=False, - subclasses=False) + valdocs = sorted(docindex.reachable_valdocs( + imports=False, submodules=False, packages=False, subclasses=False)) for i, val_doc in enumerate(valdocs): _report_valdoc_progress(i, val_doc, valdocs) # the value's docstring This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dva...@us...> - 2007-02-05 02:37:17
|
Revision: 1437 http://svn.sourceforge.net/epydoc/?rev=1437&view=rev Author: dvarrazzo Date: 2007-02-04 18:37:15 -0800 (Sun, 04 Feb 2007) Log Message: ----------- - Added a guard against malformed pattern in regular expressions. Modified Paths: -------------- trunk/epydoc/src/epydoc/docbuilder.py Modified: trunk/epydoc/src/epydoc/docbuilder.py =================================================================== --- trunk/epydoc/src/epydoc/docbuilder.py 2007-02-05 02:22:16 UTC (rev 1436) +++ trunk/epydoc/src/epydoc/docbuilder.py 2007-02-05 02:37:15 UTC (rev 1437) @@ -93,6 +93,16 @@ self.exclude_parse = exclude_parse self.add_submodules = add_submodules + # Test for pattern syntax and compile them into pattern objects. + try: + self._introspect_regexp = (exclude_introspect + and re.compile(exclude_introspect)) + self._parse_regexp = (exclude_parse + and re.compile(exclude_parse)) + except Exception, exc: + log.error('Error in regular expression pattern: %s' % exc) + raise + def must_introspect(self, name): """ Return C{True} if a module is to be introsepcted with the current @@ -102,7 +112,7 @@ @type name: L{DottedName} or C{str} """ return self.introspect \ - and not self._matches_filter(name, self.exclude_introspect) + and not self._matches_filter(name, self._introspect_regexp) def must_parse(self, name): """ @@ -112,27 +122,27 @@ @type name: L{DottedName} or C{str} """ return self.parse \ - and not self._matches_filter(name, self.exclude_parse) + and not self._matches_filter(name, self._parse_regexp) - def _matches_filter(self, name, pattern): + def _matches_filter(self, name, regexp): """ Test if a module name matches a pattern. @param name: The name of the module to test @type name: L{DottedName} or C{str} - @param pattern: The pattern to match C{name} againts. + @param regexp: The pattern object to match C{name} against. If C{None}, return C{False} - @type pattern: C{str} - @return: C{True} if C{name} in dotted format matches C{pattern}, + @type regexp: C{pattern} + @return: C{True} if C{name} in dotted format matches C{regexp}, else C{False} @rtype: C{bool} """ - if not pattern: return False + if regexp is None: return False if isinstance(name, DottedName): name = str(name) - return bool(re.search(pattern, name)) + return bool(regexp.search(name)) def build_doc(item, introspect=True, parse=True, add_submodules=True, @@ -184,9 +194,12 @@ @param parse: If true, then use parsing to examine the specified items. Otherwise, just use introspection. """ - options = BuildOptions(parse=parse, introspect=introspect, - exclude_introspect=exclude_introspect, exclude_parse=exclude_parse, - add_submodules=add_submodules) + try: + options = BuildOptions(parse=parse, introspect=introspect, + exclude_introspect=exclude_introspect, exclude_parse=exclude_parse, + add_submodules=add_submodules) + except Exception: + return None # Get the basic docs for each item. doc_pairs = _get_docs_from_items(items, options) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2007-02-13 22:23:52
|
Revision: 1482 http://svn.sourceforge.net/epydoc/?rev=1482&view=rev Author: edloper Date: 2007-02-13 14:23:50 -0800 (Tue, 13 Feb 2007) Log Message: ----------- - Fixed bug introduced by previous checkin that made epydoc fail if no --exclude options were given Modified Paths: -------------- trunk/epydoc/src/epydoc/docbuilder.py Modified: trunk/epydoc/src/epydoc/docbuilder.py =================================================================== --- trunk/epydoc/src/epydoc/docbuilder.py 2007-02-13 22:12:14 UTC (rev 1481) +++ trunk/epydoc/src/epydoc/docbuilder.py 2007-02-13 22:23:50 UTC (rev 1482) @@ -96,9 +96,9 @@ # Test for pattern syntax and compile them into pattern objects. try: self._introspect_regexp = (exclude_introspect - and re.compile(exclude_introspect)) + and re.compile(exclude_introspect) or None) self._parse_regexp = (exclude_parse - and re.compile(exclude_parse)) + and re.compile(exclude_parse) or None) except Exception, exc: log.error('Error in regular expression pattern: %s' % exc) raise This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2007-02-14 00:29:43
|
Revision: 1486 http://svn.sourceforge.net/epydoc/?rev=1486&view=rev Author: edloper Date: 2007-02-13 16:29:40 -0800 (Tue, 13 Feb 2007) Log Message: ----------- - If we introspect a file or module, and don't have a canonical name for it when we're done, then assign it one. Modified Paths: -------------- trunk/epydoc/src/epydoc/docbuilder.py Modified: trunk/epydoc/src/epydoc/docbuilder.py =================================================================== --- trunk/epydoc/src/epydoc/docbuilder.py 2007-02-14 00:27:58 UTC (rev 1485) +++ trunk/epydoc/src/epydoc/docbuilder.py 2007-02-14 00:29:40 UTC (rev 1486) @@ -396,7 +396,8 @@ def _get_docs_from_pyname(name, options, progress_estimator, supress_warnings=False): progress_estimator.complete += 1 - log.progress(progress_estimator.progress(), name) + if options.must_introspect(name) or options.must_parse(name): + log.progress(progress_estimator.progress(), name) introspect_doc = parse_doc = None introspect_error = parse_error = None @@ -432,6 +433,8 @@ if options.introspect: try: introspect_doc = introspect_docs(filename=filename, is_script=True) + if introspect_doc.canonical_name is UNKNOWN: + introspect_doc.canonical_name = munge_script_name(filename) except ImportError, e: introspect_error = str(e) if options.parse: @@ -471,8 +474,9 @@ modulename = DottedName(parent_docs[0].canonical_name, modulename) elif parent_docs[1]: modulename = DottedName(parent_docs[1].canonical_name, modulename) - log.progress(progress_estimator.progress(), - '%s (%s)' % (modulename, filename)) + if options.must_introspect(modulename) or options.must_parse(modulename): + log.progress(progress_estimator.progress(), + '%s (%s)' % (modulename, filename)) progress_estimator.complete += 1 # Normalize the filename. @@ -492,6 +496,8 @@ try: introspect_doc = introspect_docs( filename=filename, context=parent_docs[0]) + if introspect_doc.canonical_name is UNKNOWN: + introspect_doc.canonical_name = modulename except ImportError, e: introspect_error = str(e) if src_file_available and options.must_parse(modulename): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2007-02-14 03:47:08
|
Revision: 1493 http://svn.sourceforge.net/epydoc/?rev=1493&view=rev Author: edloper Date: 2007-02-13 19:47:07 -0800 (Tue, 13 Feb 2007) Log Message: ----------- - Changed MERGE_PRECEDENCE['is_imported'] to introspect -- fixes SF bug [#1653486]. Modified Paths: -------------- trunk/epydoc/src/epydoc/docbuilder.py Modified: trunk/epydoc/src/epydoc/docbuilder.py =================================================================== --- trunk/epydoc/src/epydoc/docbuilder.py 2007-02-14 02:19:00 UTC (rev 1492) +++ trunk/epydoc/src/epydoc/docbuilder.py 2007-02-14 03:47:07 UTC (rev 1493) @@ -636,9 +636,11 @@ # Why? 'canonical_name': 'introspect', - # The parser can tell if a variable is imported or not; the - # introspector must guess. - 'is_imported': 'parse', + # Only fall-back on the parser for is_imported if the introspecter + # isn't sure. Otherwise, we can end up thinking that vars + # containing modules are not imported, which can cause external + # modules to show up in the docs (sf bug #1653486) + 'is_imported': 'introspect', # The parser can tell if an assignment creates an alias or not. 'is_alias': 'parse', This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2007-02-20 19:34:06
|
Revision: 1545 http://svn.sourceforge.net/epydoc/?rev=1545&view=rev Author: edloper Date: 2007-02-20 11:34:01 -0800 (Tue, 20 Feb 2007) Log Message: ----------- - Check that duplicate item names are not given to build_doc_index; if they are, then issue a warning and discard dups. - Check that we don't generate 2 doc items with the same canonical name from different items. This can happen, e.g., if you run "epydoc a/x.py b/x.py" where neither a nor b are package directories, so both modules will have canonical name "x". In this case, issue an error message, and discard the docs from the second item. (Otherwise, there would be 2 problems: first, we'd try to merge the docs of these two modules; and second, we wouldn't have unique names for them, so we'd end up overwriting the doc files of one with the doc files of the other.) Modified Paths: -------------- trunk/epydoc/src/epydoc/docbuilder.py Modified: trunk/epydoc/src/epydoc/docbuilder.py =================================================================== --- trunk/epydoc/src/epydoc/docbuilder.py 2007-02-20 09:54:15 UTC (rev 1544) +++ trunk/epydoc/src/epydoc/docbuilder.py 2007-02-20 19:34:01 UTC (rev 1545) @@ -311,6 +311,20 @@ log.start_progress('Building documentation') progress_estimator = _ProgressEstimator(items) + # Check for duplicate item names. + item_set = set() + for item in items[:]: + if item in item_set: + log.warning("Name %r given multiple times" % item) + items.remove(item) + item_set.add(item) + + # Keep track of what top-level canonical names we've assigned, to + # make sure there are no naming conflicts. This dict maps + # canonical names to the item names they came from (so we can print + # useful error messages). + canonical_names = {} + # Collect (introspectdoc, parsedoc) pairs for each item. doc_pairs = [] for item in items: @@ -346,6 +360,20 @@ doc_pairs.append(_get_docs_from_pyobject( item, options, progress_estimator)) + # Make sure there are no naming conflicts. + name = (getattr(doc_pairs[-1][0], 'canonical_name', None) or + getattr(doc_pairs[-1][1], 'canonical_name', None)) + if name in canonical_names: + log.error( + 'Two of the specified items, %r and %r, have the same ' + 'canonical name ("%s"). This may mean that you specified ' + 'two different files that both use the same module name. ' + 'Ignoring the second item (%r)' % + (canonical_names[name], item, name, canonical_names[name])) + doc_pairs.pop() + else: + canonical_names[name] = item + # This will only have an effect if doc_pairs[-1] contains a # package's docs. The 'not is_module_file(item)' prevents # us from adding subdirectories if they explicitly specify This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dva...@us...> - 2007-07-10 23:35:54
|
Revision: 1594 http://svn.sourceforge.net/epydoc/?rev=1594&view=rev Author: dvarrazzo Date: 2007-07-10 16:35:46 -0700 (Tue, 10 Jul 2007) Log Message: ----------- - Suspended `GenericValueDoc` merge: if the parser can't detect the proper value (because it is dynamically replaced at import time) but its pyval is not UNKNOWN, the introspected value replaces the parsed values not only in the specific case, but anywhere else, because all the merged values share the same dictionary (the Borg!) The bug is described in SF bug #1678046. Modified Paths: -------------- trunk/epydoc/src/epydoc/docbuilder.py Modified: trunk/epydoc/src/epydoc/docbuilder.py =================================================================== --- trunk/epydoc/src/epydoc/docbuilder.py 2007-07-10 23:24:01 UTC (rev 1593) +++ trunk/epydoc/src/epydoc/docbuilder.py 2007-07-10 23:35:46 UTC (rev 1594) @@ -800,13 +800,19 @@ # If both values are GenericValueDoc, then we don't want to merge # them. E.g., we don't want to merge 2+2 with 4. So just copy # the inspect_doc's pyval to the parse_doc, and return the parse_doc. - if type(introspect_doc) == type(parse_doc) == GenericValueDoc: - if introspect_doc.pyval is not UNKNOWN: - parse_doc.pyval = introspect_doc.pyval - if introspect_doc.parse_repr is not UNKNOWN: - parse_doc.parse_repr = introspect_doc.parse_repr - parse_doc.docs_extracted_by = 'both' - return parse_doc.merge_and_overwrite(introspect_doc) + # + # This operation has been suspended for the reason explained in + # SF bug 1678046: the values can be totally uncorrelated if the + # introspected value has been changed as collateral effect by a function + # executed at runtime. + # + #if type(introspect_doc) == type(parse_doc) == GenericValueDoc: + #if introspect_doc.pyval is not UNKNOWN: + #parse_doc.pyval = introspect_doc.pyval + #if introspect_doc.parse_repr is not UNKNOWN: + #parse_doc.parse_repr = introspect_doc.parse_repr + #parse_doc.docs_extracted_by = 'both' + #return parse_doc.merge_and_overwrite(introspect_doc) # Perform several sanity checks here -- if we accidentally # merge values that shouldn't get merged, then bad things can This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dva...@us...> - 2007-07-11 00:23:37
|
Revision: 1595 http://svn.sourceforge.net/epydoc/?rev=1595&view=rev Author: dvarrazzo Date: 2007-07-10 17:23:30 -0700 (Tue, 10 Jul 2007) Log Message: ----------- - Inheriting parameters from overridden method docstring (fixes SF bug 1707314). Modified Paths: -------------- trunk/epydoc/src/epydoc/docbuilder.py Modified: trunk/epydoc/src/epydoc/docbuilder.py =================================================================== --- trunk/epydoc/src/epydoc/docbuilder.py 2007-07-10 23:35:46 UTC (rev 1594) +++ trunk/epydoc/src/epydoc/docbuilder.py 2007-07-11 00:23:30 UTC (rev 1595) @@ -1310,5 +1310,5 @@ elif (src_val is not None and hasattr(val_doc, attrib) and hasattr(src_val, attrib) and getattr(src_val, attrib) not in (None, UNKNOWN) and - getattr(val_doc, attrib) in (None, UNKNOWN)): + getattr(val_doc, attrib) in (None, UNKNOWN, [])): setattr(val_doc, attrib, getattr(src_val, attrib)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2007-09-24 17:44:50
|
Revision: 1635 http://epydoc.svn.sourceforge.net/epydoc/?rev=1635&view=rev Author: edloper Date: 2007-09-24 10:44:39 -0700 (Mon, 24 Sep 2007) Log Message: ----------- - the 'is_imported' field now has a custom merge func -- fixes sf bug 1685385. Modified Paths: -------------- trunk/epydoc/src/epydoc/docbuilder.py Modified: trunk/epydoc/src/epydoc/docbuilder.py =================================================================== --- trunk/epydoc/src/epydoc/docbuilder.py 2007-09-24 15:58:38 UTC (rev 1634) +++ trunk/epydoc/src/epydoc/docbuilder.py 2007-09-24 17:44:39 UTC (rev 1635) @@ -661,19 +661,15 @@ MERGE_PRECEDENCE = { 'repr': 'parse', - # Why? + # The names we get from introspection match the names that users + # can actually use -- i.e., they take magic into account. 'canonical_name': 'introspect', - # Only fall-back on the parser for is_imported if the introspecter - # isn't sure. Otherwise, we can end up thinking that vars - # containing modules are not imported, which can cause external - # modules to show up in the docs (sf bug #1653486) - 'is_imported': 'introspect', - # The parser can tell if an assignment creates an alias or not. 'is_alias': 'parse', - # Why? + # The parser is better able to determine what text file something + # came from; e.g., it can't be fooled by 'covert' imports. 'docformat': 'parse', # The parse should be able to tell definitively whether a module @@ -941,17 +937,6 @@ assert value1 is not None and value2 is not None return merge_docs(value1, value2, cyclecheck, path) -# [xx] are these really necessary or useful?? -def merge_package(v1, v2, precedence, cyclecheck, path): - if v1 is None or v2 is None: - if precedence == 'introspect': return v1 - else: return v2 - return merge_value(v1, v2, precedence, cyclecheck, path+'.<package>') -def merge_container(v1, v2, precedence, cyclecheck, path): - if v1 is None or v2 is None: - if precedence == 'introspect': return v1 - else: return v2 - return merge_value(v1, v2, precedence, cyclecheck, path+'.<container>') def merge_overrides(v1, v2, precedence, cyclecheck, path): return merge_value(v1, v2, precedence, cyclecheck, path+'.<overrides>') def merge_fget(v1, v2, precedence, cyclecheck, path): @@ -961,6 +946,19 @@ def merge_fdel(v1, v2, precedence, cyclecheck, path): return merge_value(v1, v2, precedence, cyclecheck, path+'.fdel') +def merge_is_imported(v1, v2, precedence, cyclecheck, path): + # Always assume that modules are imported. Other than that, + # give precedence to the parser over the introspector. + # This lets us avoid (sf bug #1653486), where external modules + # end up in our docs; and (sf bug #1685385), where decorated + # functions have the wrong module. + if isinstance(v1, ModuleDoc) or isinstance(v2, ModuleDoc): + return True + elif v2 in (None, UNKNOWN): + return v1 + else: + return v2 + def merge_proxy_for(v1, v2, precedence, cyclecheck, path): # Anything we got from introspection shouldn't have a proxy_for # attribute -- it should be the actual object's documentation. @@ -1027,9 +1025,6 @@ register_attribute_mergefunc('variables', merge_variables) register_attribute_mergefunc('value', merge_value) -# [xx] are these useful/necessary? -#register_attribute_mergefunc('package', merge_package) -#register_attribute_mergefunc('container', merge_container) register_attribute_mergefunc('overrides', merge_overrides) register_attribute_mergefunc('fget', merge_fget) register_attribute_mergefunc('fset', merge_fset) @@ -1039,6 +1034,7 @@ register_attribute_mergefunc('posarg_defaults', merge_posarg_defaults) register_attribute_mergefunc('docstring', merge_docstring) register_attribute_mergefunc('docs_extracted_by', merge_docs_extracted_by) +register_attribute_mergefunc('is_imported', merge_is_imported) ###################################################################### ## Import Linking This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2007-09-24 18:42:25
|
Revision: 1637 http://epydoc.svn.sourceforge.net/epydoc/?rev=1637&view=rev Author: edloper Date: 2007-09-24 11:42:16 -0700 (Mon, 24 Sep 2007) Log Message: ----------- backed out commit 1635 -- it didnt work as intended Modified Paths: -------------- trunk/epydoc/src/epydoc/docbuilder.py Modified: trunk/epydoc/src/epydoc/docbuilder.py =================================================================== --- trunk/epydoc/src/epydoc/docbuilder.py 2007-09-24 17:53:47 UTC (rev 1636) +++ trunk/epydoc/src/epydoc/docbuilder.py 2007-09-24 18:42:16 UTC (rev 1637) @@ -665,6 +665,12 @@ # can actually use -- i.e., they take magic into account. 'canonical_name': 'introspect', + # Only fall-back on the parser for is_imported if the introspecter + # isn't sure. Otherwise, we can end up thinking that vars + # containing modules are not imported, which can cause external + # modules to show up in the docs (sf bug #1653486) + 'is_imported': 'introspect', + # The parser can tell if an assignment creates an alias or not. 'is_alias': 'parse', @@ -946,19 +952,6 @@ def merge_fdel(v1, v2, precedence, cyclecheck, path): return merge_value(v1, v2, precedence, cyclecheck, path+'.fdel') -def merge_is_imported(v1, v2, precedence, cyclecheck, path): - # Always assume that modules are imported. Other than that, - # give precedence to the parser over the introspector. - # This lets us avoid (sf bug #1653486), where external modules - # end up in our docs; and (sf bug #1685385), where decorated - # functions have the wrong module. - if isinstance(v1, ModuleDoc) or isinstance(v2, ModuleDoc): - return True - elif v2 in (None, UNKNOWN): - return v1 - else: - return v2 - def merge_proxy_for(v1, v2, precedence, cyclecheck, path): # Anything we got from introspection shouldn't have a proxy_for # attribute -- it should be the actual object's documentation. @@ -1034,7 +1027,6 @@ register_attribute_mergefunc('posarg_defaults', merge_posarg_defaults) register_attribute_mergefunc('docstring', merge_docstring) register_attribute_mergefunc('docs_extracted_by', merge_docs_extracted_by) -register_attribute_mergefunc('is_imported', merge_is_imported) ###################################################################### ## Import Linking This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2007-09-24 18:45:57
|
Revision: 1638 http://epydoc.svn.sourceforge.net/epydoc/?rev=1638&view=rev Author: edloper Date: 2007-09-24 11:45:54 -0700 (Mon, 24 Sep 2007) Log Message: ----------- - Fixed sf bug 1678046 -- see bug for details. (had to do with merging generic valuedocs) Modified Paths: -------------- trunk/epydoc/src/epydoc/docbuilder.py Modified: trunk/epydoc/src/epydoc/docbuilder.py =================================================================== --- trunk/epydoc/src/epydoc/docbuilder.py 2007-09-24 18:42:16 UTC (rev 1637) +++ trunk/epydoc/src/epydoc/docbuilder.py 2007-09-24 18:45:54 UTC (rev 1638) @@ -801,20 +801,13 @@ # If both values are GenericValueDoc, then we don't want to merge # them. E.g., we don't want to merge 2+2 with 4. So just copy - # the inspect_doc's pyval to the parse_doc, and return the parse_doc. - # - # This operation has been suspended for the reason explained in - # SF bug 1678046: the values can be totally uncorrelated if the - # introspected value has been changed as collateral effect by a function - # executed at runtime. - # - #if type(introspect_doc) == type(parse_doc) == GenericValueDoc: - #if introspect_doc.pyval is not UNKNOWN: - #parse_doc.pyval = introspect_doc.pyval - #if introspect_doc.parse_repr is not UNKNOWN: - #parse_doc.parse_repr = introspect_doc.parse_repr - #parse_doc.docs_extracted_by = 'both' - #return parse_doc.merge_and_overwrite(introspect_doc) + # the parse_doc's parse_repr to introspect_doc, & return it. + # (In particular, do *not* call merge_and_overwrite.) + if type(introspect_doc) == type(parse_doc) == GenericValueDoc: + if parse_doc.parse_repr is not UNKNOWN: + introspect_doc.parse_repr = parse_doc.parse_repr + introspect_doc.docs_extracted_by = 'both' + return introspect_doc # Perform several sanity checks here -- if we accidentally # merge values that shouldn't get merged, then bad things can This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2007-09-25 22:08:03
|
Revision: 1648 http://epydoc.svn.sourceforge.net/epydoc/?rev=1648&view=rev Author: edloper Date: 2007-09-25 15:08:01 -0700 (Tue, 25 Sep 2007) Log Message: ----------- - Fixed potential bug, related to sf bug 1682525, which could cause some apidocs to never recieve any canonical name, under certain conditions that involved vars shadowing modules. Modified Paths: -------------- trunk/epydoc/src/epydoc/docbuilder.py Modified: trunk/epydoc/src/epydoc/docbuilder.py =================================================================== --- trunk/epydoc/src/epydoc/docbuilder.py 2007-09-25 22:06:15 UTC (rev 1647) +++ trunk/epydoc/src/epydoc/docbuilder.py 2007-09-25 22:08:01 UTC (rev 1648) @@ -1131,8 +1131,10 @@ or isinstance(var_doc.value, GenericValueDoc)): continue - # This check is for cases like curses.wrapper, where an - # imported variable shadows its value's "real" location. + # [XX] After svn commit 1644-1647, I'm not sure if this + # ever gets used: This check is for cases like + # curses.wrapper, where an imported variable shadows its + # value's "real" location. if _var_shadows_self(var_doc, varname): _fix_self_shadowing_var(var_doc, varname, docindex) @@ -1169,10 +1171,10 @@ var_doc.value = val_doc return - # If we couldn't find the actual value, then at least - # invalidate the canonical name. - log.warning('%s shadows itself' % varname) - del var_doc.value.canonical_name + # If we couldn't find the actual value, use an unreachable name. + name = _unreachable_name_for(var_doc.value, docindex) + log.warning('%s shadows itself -- using %s instead' % (varname, name)) + var_doc.value.canonical_name = name def _unreachable_name_for(val_doc, docindex): assert isinstance(val_doc, ValueDoc) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2008-01-29 00:14:42
|
Revision: 1665 http://epydoc.svn.sourceforge.net/epydoc/?rev=1665&view=rev Author: edloper Date: 2008-01-28 16:14:37 -0800 (Mon, 28 Jan 2008) Log Message: ----------- Fixed SF bug #1856056: now c extension methods will inherit the signature from their base class method, if they don't specify their own signature. This only applies if both the inherited & overridden method satisfy inspect.isbuiltin(). Modified Paths: -------------- trunk/epydoc/src/epydoc/docbuilder.py Modified: trunk/epydoc/src/epydoc/docbuilder.py =================================================================== --- trunk/epydoc/src/epydoc/docbuilder.py 2008-01-28 23:40:29 UTC (rev 1664) +++ trunk/epydoc/src/epydoc/docbuilder.py 2008-01-29 00:14:37 UTC (rev 1665) @@ -67,7 +67,7 @@ ## Imports ###################################################################### -import sys, os, os.path, __builtin__, imp, re +import sys, os, os.path, __builtin__, imp, re, inspect from epydoc.apidoc import * from epydoc.docintrospecter import introspect_docs from epydoc.docparser import parse_docs, ParseError @@ -1275,15 +1275,29 @@ Copy any relevant documentation information from the variable that C{var_doc} overrides into C{var_doc} itself. """ + src_var = var_doc.overrides + src_val = var_doc.overrides.value + val_doc = var_doc.value + # If the new variable has a docstring, then don't inherit # anything, even if the docstring is blank. if var_doc.docstring not in (None, UNKNOWN): - return + inerited_attribs = set() + else: + inherited_attribs = set(_INHERITED_ATTRIBS) - src_var = var_doc.overrides - src_val = var_doc.overrides.value - val_doc = var_doc.value - + # Special case: if the source value and target values are both c + # extension methods, and the target value's signature is not + # specified, then inherit the source value's signature. + if (isinstance(val_doc, RoutineDoc) and + isinstance(src_val, RoutineDoc) and + inspect.isbuiltin(val_doc.pyval) and + inspect.isbuiltin(src_val.pyval) and + val_doc.all_args() in (['...'], UNKNOWN) and + src_val.all_args() not in (['...'], UNKNOWN)): + inherited_attribs.update(['posargs', 'posarg_defaults', 'vararg', + 'kwarg', 'return_type']) + # [xx] Do I want a check like this:? # # If it's a method and the signature doesn't match well enough, # # then give up. @@ -1298,7 +1312,7 @@ # return # Inherit attributes! - for attrib in _INHERITED_ATTRIBS: + for attrib in inherited_attribs: if (hasattr(var_doc, attrib) and hasattr(src_var, attrib) and getattr(src_var, attrib) not in (None, UNKNOWN)): setattr(var_doc, attrib, getattr(src_var, attrib)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |