Thread: [Epydoc-commits] SF.net SVN: epydoc: [1218] trunk/epydoc/src/epydoc/docparser.py
Brought to you by:
edloper
From: <ed...@us...> - 2006-04-12 18:35:16
|
Revision: 1218 Author: edloper Date: 2006-04-12 11:35:03 -0700 (Wed, 12 Apr 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1218&view=rev Log Message: ----------- - If there's an internal error during parsing, report what line number generated it. Modified Paths: -------------- trunk/epydoc/src/epydoc/docparser.py Modified: trunk/epydoc/src/epydoc/docparser.py =================================================================== --- trunk/epydoc/src/epydoc/docparser.py 2006-04-12 18:02:59 UTC (rev 1217) +++ trunk/epydoc/src/epydoc/docparser.py 2006-04-12 18:35:03 UTC (rev 1218) @@ -650,6 +650,11 @@ raise ParseError('Error during parsing: invalid ' 'syntax (%s, line %d) -- %s' % (module_doc.filename, lineno, e)) + except KeyboardError, e: raise + except Exception, e: + log.error('Internal error during parsing (%s, line ' + '%s):\n%s' % (module_doc.filename, lineno, e)) + raise # grouping... if groups[-1] and prev_line_doc not in (None, 'skip_block'): 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:46:31
|
Revision: 1219 Author: edloper Date: 2006-04-12 12:46:21 -0700 (Wed, 12 Apr 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1219&view=rev Log Message: ----------- - Set BASE_HANDLING to 'parse' (and fixed the code this uses) - Fixed bug in _find (not using path correctly) - Removed debug printf - Changed find_base to always return a proxy base, even if it can't figure out where it came from Modified Paths: -------------- trunk/epydoc/src/epydoc/docparser.py Modified: trunk/epydoc/src/epydoc/docparser.py =================================================================== --- trunk/epydoc/src/epydoc/docparser.py 2006-04-12 18:35:03 UTC (rev 1218) +++ trunk/epydoc/src/epydoc/docparser.py 2006-04-12 19:46:21 UTC (rev 1219) @@ -29,7 +29,7 @@ # Finding modules: import imp # File services: -import os, os.path +import os, os.path, sys # Unicode: import codecs # API documentation encoding: @@ -162,7 +162,7 @@ knowledge about what value the decorator returns. """ -BASE_HANDLING = 'link' +BASE_HANDLING = 'parse'#'link' """What should C{docparser} do when it encounters a base class that was imported from another module? - C{'link'}: Create a valuedoc with a C{proxy_for} pointer to the @@ -381,13 +381,10 @@ # If we're inside a package, then find the package's path. if package_doc is None: path = None + elif package_doc.path is not UNKNOWN: + path = package_doc.path else: - try: - # [XXX] - path_ast = module_doc.variables['__path__'].value.ast - path = extract_string_list(path_ast) - except: - path = [os.path.split(package_doc.filename)[0]] + path = [os.path.split(package_doc.filename)[0]] # The leftmost identifier in `name` should be a module or # package on the given path; find it and parse it. @@ -552,8 +549,6 @@ tok_iter = tokenize.generate_tokens(module_file.readline) for toktype, toktext, (srow,scol), (erow,ecol), line_str in tok_iter: # BOM encoding marker: ignore. - if toktype == token.ERRORTOKEN: - log.debug(type(toktext), `toktext`) if (toktype == token.ERRORTOKEN and (toktext == u'\ufeff' or toktext.encode(encoding) == '\xef\xbb\xbf')): @@ -650,7 +645,7 @@ raise ParseError('Error during parsing: invalid ' 'syntax (%s, line %d) -- %s' % (module_doc.filename, lineno, e)) - except KeyboardError, e: raise + except KeyboardInterrupt, e: raise except Exception, e: log.error('Internal error during parsing (%s, line ' '%s):\n%s' % (module_doc.filename, lineno, e)) @@ -1521,21 +1516,32 @@ return class_doc +def _proxy_base(**attribs): + return ClassDoc(variables={}, sort_spec=[], bases=[], subclasses=[], + docs_extracted_by='parser', **attribs) + def find_base(name, parent_docs): assert isinstance(name, DottedName) # Find the variable containing the base. base_var = lookup_variable(name, parent_docs) if base_var is None: - # If it looks like it's in an external module, then try - # "importing" it. - if (lookup_name(name[0], parent_docs).imported_from not in - (None, UNKNOWN)): - _import_var(name, parent_docs) - base_var = lookup_variable(name, parent_docs) - # If we still don't have a var containing the base, give up. + # If we didn't find it, then it must have been imported. + # First, check if it looks like it's contained in any + # known imported variable: + if len(name) > 1: + src = lookup_name(name[0], parent_docs) + if (src is not None and + src.imported_from not in (None, UNKNOWN)): + _import_var(name, parent_docs) + base_var = lookup_variable(name, parent_docs) + # Otherwise, it must have come from an "import *" statement + # (or from magic, such as direct manipulation of the module's + # dictionary), so we don't know where it came from. So + # there's nothing left but to use an empty proxy. if base_var is None: - raise ParseError("Could not find %s" % name) + return _proxy_base(parse_repr=str(name)) + #raise ParseError("Could not find %s" % name) # If the variable has a value, return that value. if base_var.value != UNKNOWN: @@ -1546,20 +1552,24 @@ # just make a proxy object. if base_var.imported_from not in (None, UNKNOWN): if BASE_HANDLING == 'parse': + old_sys_path = sys.path try: - return parse_docs(name=base_var.imported_from) - except ParseError: - pass + dirname = os.path.split(parent_docs[0].filename)[0] + sys.path = [dirname] + sys.path + try: + return parse_docs(name=str(base_var.imported_from)) + except ParseError: + log.info('Unable to parse base', base_var.imported_from) + except ImportError: + log.info('Unable to find base', base_var.imported_from) + finally: + sys.path = old_sys_path + # Either BASE_HANDLING='link' or parsing the base class failed; # return a proxy value for the base class. - return ClassDoc(variables={}, sort_spec=[], bases=[], - subclasses=[], proxy_for=base_var.imported_from, - docs_extracted_by='parser') + return _proxy_base(proxy_for=base_var.imported_from) else: - raise ParseError() # no value available for var. - - - + return _proxy_base(parse_repr=str(name)) #///////////////////////////////////////////////////////////////// #{ Parsing This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-08-21 07:20:22
|
Revision: 1251 Author: edloper Date: 2006-08-21 00:02:32 -0700 (Mon, 21 Aug 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1251&view=rev Log Message: ----------- - Fixed sf bug #1501876 -- Decorators stay in effect past correct scope Modified Paths: -------------- trunk/epydoc/src/epydoc/docparser.py Modified: trunk/epydoc/src/epydoc/docparser.py =================================================================== --- trunk/epydoc/src/epydoc/docparser.py 2006-08-21 06:44:58 UTC (rev 1250) +++ trunk/epydoc/src/epydoc/docparser.py 2006-08-21 07:02:32 UTC (rev 1251) @@ -669,6 +669,7 @@ line_toks = [] lineno = None comments = [] + decorators = [] def add_to_group(container, api_doc, group_name): if container.group_specs == UNKNOWN: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-08-21 09:48:21
|
Revision: 1261 Author: edloper Date: 2006-08-21 02:48:17 -0700 (Mon, 21 Aug 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1261&view=rev Log Message: ----------- Fixed sf bug "[ 1504812 ] AttributeError: 'GenericValueDoc' object has no attribute ..." (There was a bug in the code that handled shadowing of modules by variables in docparser) Modified Paths: -------------- trunk/epydoc/src/epydoc/docparser.py Modified: trunk/epydoc/src/epydoc/docparser.py =================================================================== --- trunk/epydoc/src/epydoc/docparser.py 2006-08-21 09:40:18 UTC (rev 1260) +++ trunk/epydoc/src/epydoc/docparser.py 2006-08-21 09:48:17 UTC (rev 1261) @@ -1971,9 +1971,9 @@ # If so, then add a "'" to the end of its canonical name, to # distinguish it from the variable. if package_doc is not None and name in package_doc.variables: - valdoc = package_doc.variables[name].value - if (valdoc not in (None, UNKNOWN) and - valdoc.imported_from != dotted_name): + vardoc = package_doc.variables[name] + if (vardoc.value not in (None, UNKNOWN) and + vardoc.imported_from != dotted_name): log.warning("Module %s might be shadowed by a variable with " "the same name." % dotted_name) dotted_name = DottedName(str(dotted_name)+"'") This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-08-21 11:01:49
|
Revision: 1267 Author: edloper Date: 2006-08-21 04:01:45 -0700 (Mon, 21 Aug 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1267&view=rev Log Message: ----------- - Changed default decorator behavior to TRANSPARENT; and added code to keep track of which decorators have been applied. Modified Paths: -------------- trunk/epydoc/src/epydoc/docparser.py Modified: trunk/epydoc/src/epydoc/docparser.py =================================================================== --- trunk/epydoc/src/epydoc/docparser.py 2006-08-21 11:00:15 UTC (rev 1266) +++ trunk/epydoc/src/epydoc/docparser.py 2006-08-21 11:01:45 UTC (rev 1267) @@ -153,7 +153,7 @@ be parsed, e.g., if it's a builtin.) """ -DEFAULT_DECORATOR_BEHAVIOR = 'opaque' +DEFAULT_DECORATOR_BEHAVIOR = 'transparent' """When C{DocParse} encounters an unknown decorator, what should it do to the documentation of the decorated function? - C{'transparent'}: leave the function's documentation as-is. @@ -1370,6 +1370,7 @@ add_docstring_from_comments(func_doc, comments) # Apply any decorators. + func_doc.decorators = [pp_toktree(deco[1:]) for deco in decorators] decorators.reverse() for decorator in decorators: try: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-08-21 14:03:32
|
Revision: 1278 Author: edloper Date: 2006-08-21 07:03:29 -0700 (Mon, 21 Aug 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1278&view=rev Log Message: ----------- - Made some fixes to pp_toktree(). (Previously, it was printing eg "[x for x in xs]" as "[xforxinxs]") Modified Paths: -------------- trunk/epydoc/src/epydoc/docparser.py Modified: trunk/epydoc/src/epydoc/docparser.py =================================================================== --- trunk/epydoc/src/epydoc/docparser.py 2006-08-21 13:25:16 UTC (rev 1277) +++ trunk/epydoc/src/epydoc/docparser.py 2006-08-21 14:03:29 UTC (rev 1278) @@ -1889,42 +1889,68 @@ #{ Tree tokens #///////////////////////////////////////////////////////////////// +def _join_toktree(s1, s2): + # Join them. s1 = left side; s2 = right side. + if (s2=='' or s1=='' or + s1 in ('-','`') or s2 in ('}',']',')','`',':') or + s2[0] in ('.',',') or s1[-1] in ('(','[','{','.','\n',' ') or + (s2[0] == '(' and s1[-1] not in (',','='))): + return '%s%s' % (s1,s2) + elif (spacing=='tight' and + s1[-1] in '+-*/=,' or s2[0] in '+-*/=,'): + return '%s%s' % (s1, s2) + else: + return '%s %s' % (s1, s2) + +def _pp_toktree_add_piece(spacing, pieces, piece): + s1 = pieces[-1] + s2 = piece + + if (s2=='' or s1=='' or + s1 in ('-','`') or s2 in ('}',']',')','`',':') or + s2[0] in ('.',',') or s1[-1] in ('(','[','{','.','\n',' ') or + (s2[0] == '(' and s1[-1] not in (',','='))): + pass + elif (spacing=='tight' and + s1[-1] in '+-*/=,' or s2[0] in '+-*/=,'): + pass + else: + pieces.append(' ') + + pieces.append(piece) + def pp_toktree(elts, spacing='normal', indent=0): - s = u'' + pieces = [''] + _pp_toktree(elts, spacing, indent, pieces) + log.debug(''.join(pieces)) + return ''.join(pieces) + +def _pp_toktree(elts, spacing, indent, pieces): + add_piece = _pp_toktree_add_piece + for elt in elts: # Put a blank line before class & def statements. if elt == (token.NAME, 'class') or elt == (token.NAME, 'def'): - s += '\n%s' % (' '*indent) + add_piece(spacing, pieces, '\n%s' % (' '*indent)) if isinstance(elt, tuple): if elt[0] == token.NEWLINE: - s += ' '+elt[1] - s += '\n%s' % (' '*indent) + add_piece(spacing, pieces, ' '+elt[1]) + add_piece(spacing, pieces, '\n%s' % (' '*indent)) elif elt[0] == token.INDENT: - s += ' ' + add_piece(spacing, pieces, ' ') indent += 1 elif elt[0] == token.DEDENT: - assert s[-4:] == ' ' - s = s[:-4] + assert pieces[-1] == ' ' + pieces.pop() indent -= 1 elif elt[0] == tokenize.COMMENT: - s += elt[1].rstrip() + '\n' + ' '*indent + add_piece(spacing, pieces, elt[1].rstrip() + '\n') + add_piece(' '*indent) else: - s += elt[1] + add_piece(spacing, pieces, elt[1]) else: - elt_s = pp_toktree(elt, spacing, indent) - # Join them. s = left side; elt_s = right side. - if (elt_s=='' or s=='' or - s in ('-','`') or elt_s in ('}',']',')','`',':') or - elt_s[0] in ('.',',') or s[-1] in ('(','[','{','.','\n',' ') or - (elt_s[0] == '(' and s[-1] not in (',','='))): - s = '%s%s' % (s, elt_s) - elif (spacing=='tight' and - s[-1] in '+-*/=,' or elt_s[0] in '+-*/=,'): - s = '%s%s' % (s, elt_s) - else: - s = '%s %s' % (s, elt_s) - return s + _pp_toktree(elt, spacing, indent, pieces) #///////////////////////////////////////////////////////////////// #{ Helper Functions This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-08-21 14:05:08
|
Revision: 1279 Author: edloper Date: 2006-08-21 07:05:00 -0700 (Mon, 21 Aug 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1279&view=rev Log Message: ----------- - Removed debug printf Modified Paths: -------------- trunk/epydoc/src/epydoc/docparser.py Modified: trunk/epydoc/src/epydoc/docparser.py =================================================================== --- trunk/epydoc/src/epydoc/docparser.py 2006-08-21 14:03:29 UTC (rev 1278) +++ trunk/epydoc/src/epydoc/docparser.py 2006-08-21 14:05:00 UTC (rev 1279) @@ -1922,7 +1922,6 @@ def pp_toktree(elts, spacing='normal', indent=0): pieces = [''] _pp_toktree(elts, spacing, indent, pieces) - log.debug(''.join(pieces)) return ''.join(pieces) def _pp_toktree(elts, spacing, indent, pieces): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-08-22 16:44:29
|
Revision: 1294 Author: edloper Date: 2006-08-22 09:44:27 -0700 (Tue, 22 Aug 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1294&view=rev Log Message: ----------- - Use 'tight' parse repr for default values. Modified Paths: -------------- trunk/epydoc/src/epydoc/docparser.py Modified: trunk/epydoc/src/epydoc/docparser.py =================================================================== --- trunk/epydoc/src/epydoc/docparser.py 2006-08-22 16:43:07 UTC (rev 1293) +++ trunk/epydoc/src/epydoc/docparser.py 2006-08-22 16:44:27 UTC (rev 1294) @@ -1449,7 +1449,8 @@ elif arg[1] != (token.OP, '=') or len(arg) == 2: raise ParseError("Bad argument list") else: - default_val = GenericValueDoc(parse_repr=pp_toktree(arg[2:]), + default_repr = pp_toktree(arg[2:], 'tight') + default_val = GenericValueDoc(parse_repr=default_repr, docs_extracted_by='parser') func_doc.posarg_defaults.append(default_val) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-08-29 21:05:13
|
Revision: 1329 Author: edloper Date: 2006-08-29 14:05:10 -0700 (Tue, 29 Aug 2006) ViewCVS: http://svn.sourceforge.net/epydoc/?rev=1329&view=rev Log Message: ----------- If a docstring can't be decoded using the encoding given in the coding directive at the top of the file, then decode it using epydoc.util.decode_with_backslashreplace() instead. Modified Paths: -------------- trunk/epydoc/src/epydoc/docparser.py Modified: trunk/epydoc/src/epydoc/docparser.py =================================================================== --- trunk/epydoc/src/epydoc/docparser.py 2006-08-29 21:01:43 UTC (rev 1328) +++ trunk/epydoc/src/epydoc/docparser.py 2006-08-29 21:05:10 UTC (rev 1329) @@ -1306,7 +1306,16 @@ # right thing to do; but it will almost always be what the # module's author intended. if isinstance(docstring, str): - docstring = docstring.decode(encoding) + try: + docstring = docstring.decode(encoding) + except UnicodeDecodeError: + # If decoding failed, then fall back on using + # decode_with_backslashreplace, which will map e.g. + # "\xe9" -> u"\\xe9". + docstring = decode_with_backslashreplace(docstring) + log.warning("While parsing %s: docstring is not a unicode " + "string, but it contains non-ascii data." % + prev_line_doc.canonical_name) # If the modified APIDoc is an instance variable, and it has # not yet been added to its class's C{variables} list, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-09-06 15:50:59
|
Revision: 1352 http://svn.sourceforge.net/epydoc/?rev=1352&view=rev Author: edloper Date: 2006-09-06 08:50:54 -0700 (Wed, 06 Sep 2006) Log Message: ----------- - Fixed bug in rhs_to_valuedoc() that was preventing it from building a ValueDoc for some RHS's. Modified Paths: -------------- trunk/epydoc/src/epydoc/docparser.py Modified: trunk/epydoc/src/epydoc/docparser.py =================================================================== --- trunk/epydoc/src/epydoc/docparser.py 2006-09-06 15:49:48 UTC (rev 1351) +++ trunk/epydoc/src/epydoc/docparser.py 2006-09-06 15:50:54 UTC (rev 1352) @@ -1172,7 +1172,7 @@ try: rhs_name = parse_dotted_name(rhs) rhs_val = lookup_value(rhs_name, parent_docs) - if rhs_val is not None: + if rhs_val is not None and rhs_val is not UNKNOWN: return rhs_val, True except ParseError: pass This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dva...@us...> - 2006-09-10 16:24:00
|
Revision: 1379 http://svn.sourceforge.net/epydoc/?rev=1379&view=rev Author: dvarrazzo Date: 2006-09-10 09:23:49 -0700 (Sun, 10 Sep 2006) Log Message: ----------- - Don't strip empty lines from documentation comment blocks. Without the patch, a block such:: #: frobnication factor #: #: :type: ``int`` is transformed in the string:: frobnication factor :type: ``int`` that is a docstring error (the field is not recognized). Modified Paths: -------------- trunk/epydoc/src/epydoc/docparser.py Modified: trunk/epydoc/src/epydoc/docparser.py =================================================================== --- trunk/epydoc/src/epydoc/docparser.py 2006-09-10 15:16:41 UTC (rev 1378) +++ trunk/epydoc/src/epydoc/docparser.py 2006-09-10 16:23:49 UTC (rev 1379) @@ -157,7 +157,7 @@ """ #{ Configuration Constants: Comment docstrings -COMMENT_DOCSTRING_MARKER = '#: ' +COMMENT_DOCSTRING_MARKER = '#:' """The prefix used to mark comments that contain attribute docstrings for variables.""" @@ -577,6 +577,8 @@ elif toktype == tokenize.COMMENT: if toktext.startswith(COMMENT_DOCSTRING_MARKER): comment_line = toktext[len(COMMENT_DOCSTRING_MARKER):].rstrip() + if comment_line.startswith(" "): + comment_line = comment_line[1:] comments.append( [comment_line, srow]) elif toktext.startswith(START_GROUP_MARKER): start_group = toktext[len(START_GROUP_MARKER):].strip() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2006-10-07 01:24:38
|
Revision: 1407 http://svn.sourceforge.net/epydoc/?rev=1407&view=rev Author: edloper Date: 2006-10-06 18:24:33 -0700 (Fri, 06 Oct 2006) Log Message: ----------- - Fixed bug where an indentation error in the source could cause the epydoc parser to crash. - Fixed a bug where using grouping comments ("#{","#}") for instance variables could cause the epydoc parser to crash. - Fixed a bug where using grouping comments ("#{","#}") for functions with decorators could cause the epydoc parser to crash. Modified Paths: -------------- trunk/epydoc/src/epydoc/docparser.py Modified: trunk/epydoc/src/epydoc/docparser.py =================================================================== --- trunk/epydoc/src/epydoc/docparser.py 2006-09-27 23:42:45 UTC (rev 1406) +++ trunk/epydoc/src/epydoc/docparser.py 2006-10-07 01:24:33 UTC (rev 1407) @@ -281,6 +281,9 @@ raise ParseError('Error during parsing: %s ' '(%s, line %d, char %d)' % (msg, module_doc.filename, srow, scol)) + except IndentationError, e: + raise ParseError('Error during parsing: %s (%s)' % + (e, module_doc.filename)) # Handle any special variables (__path__, __docformat__, etc.) handle_special_module_vars(module_doc) @@ -639,11 +642,18 @@ # grouping... if groups[-1] and prev_line_doc not in (None, 'skip_block'): if isinstance(prev_line_doc, VariableDoc): - # This special case is needed for inst vars, where - # parent_docs[-1] is the __init__ function, not the - # containing class: - add_to_group(prev_line_doc.container, - prev_line_doc, groups[-1]) + # prev_line_doc's container will only be + # UNKNOWN if it's an instance variable that + # didn't have a doc-comment, but might still + # be followed by a docstring. Since we + # tokenize in order, we can't do lookahead to + # see if the variable will have a comment; but + # it should only be added to the container if + # it does. So we defer the grouping of that + # to be handled by process_docstring instead. + if prev_line_doc.container is not UNKNOWN: + add_to_group(prev_line_doc.container, + prev_line_doc, groups[-1]) elif isinstance(parent_docs[-1], NamespaceDoc): add_to_group(parent_docs[-1], prev_line_doc, groups[-1]) @@ -663,6 +673,7 @@ if isinstance(api_doc, VariableDoc): var_name = api_doc.name else: + if api_doc.canonical_name is UNKNOWN: log.debug('ouch', `api_doc`) var_name = api_doc.canonical_name[-1] for (name, group_vars) in container.group_specs: @@ -1326,12 +1337,14 @@ # we only want to add instance variables if they have an # associated docstring. (For more info, see the comment above # the set_variable() call in process_assignment().) + added_instvar = False if (isinstance(prev_line_doc, VariableDoc) and - prev_line_doc.is_instvar and - prev_line_doc.docstring in (None, UNKNOWN)): + prev_line_doc.is_instvar and + prev_line_doc.docstring in (None, UNKNOWN)): for i in range(len(parent_docs)-1, -1, -1): if isinstance(parent_docs[i], ClassDoc): set_variable(parent_docs[i], prev_line_doc, True) + added_instvar = True break if prev_line_doc.docstring not in (None, UNKNOWN): @@ -1342,6 +1355,12 @@ prev_line_doc.docstring = docstring prev_line_doc.docstring_lineno = lineno + # If the modified APIDoc is an instance variable, and we added it + # to the class's variables list here, then it still needs to be + # grouped too; so return it for use as the new "prev_line_doc." + if added_instvar: + return prev_line_doc + #///////////////////////////////////////////////////////////////// # Line handler: function declarations @@ -1400,8 +1419,12 @@ else: deco_repr = UNKNOWN func_doc = apply_decorator(deco_name, func_doc) - func_doc.canonical_name = UNKNOWN func_doc.parse_repr = deco_repr + # [XX] Is there a reson the following should be done? It + # causes the grouping code to break. Presumably the canonical + # name should remain valid if we're just applying a standard + # decorator. + #func_doc.canonical_name = UNKNOWN # Add a variable to the containing namespace. var_doc = VariableDoc(name=func_name, value=func_doc, 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:02:09
|
Revision: 1435 http://svn.sourceforge.net/epydoc/?rev=1435&view=rev Author: dvarrazzo Date: 2007-02-04 18:02:05 -0800 (Sun, 04 Feb 2007) Log Message: ----------- - Fixed duplicated items in subclasses list. - Fixed SF bug #1646408 using Ed's patch. Modified Paths: -------------- trunk/epydoc/src/epydoc/docparser.py Modified: trunk/epydoc/src/epydoc/docparser.py =================================================================== --- trunk/epydoc/src/epydoc/docparser.py 2007-02-04 15:46:13 UTC (rev 1434) +++ trunk/epydoc/src/epydoc/docparser.py 2007-02-05 02:02:05 UTC (rev 1435) @@ -1544,7 +1544,17 @@ if class_doc.bases is not UNKNOWN: for basedoc in class_doc.bases: if isinstance(basedoc, ClassDoc): - basedoc.subclasses.append(class_doc) + # This test avoids that a subclass gets listed twice when + # both introspection and parsing. + # [XXX] This check only works because currently parsing is + # always performed just after introspection of the same + # class. A more complete fix shuld be independent from + # calling order; probably the subclasses list should be + # replaced by a ClassDoc set or a {name: ClassDoc} mapping. + if (basedoc.subclasses + and basedoc.subclasses[-1].canonical_name + != class_doc.canonical_name): + basedoc.subclasses.append(class_doc) # If the preceeding comment includes a docstring, then add it. add_docstring_from_comments(class_doc, comments) @@ -1571,8 +1581,10 @@ src = lookup_name(name[0], parent_docs) if (src is not None and src.imported_from not in (None, UNKNOWN)): - _import_var(name, parent_docs) - base_var = lookup_variable(name, parent_docs) + base_src = DottedName(src.imported_from, name[1:]) + base_var = VariableDoc(name=name[-1], is_imported=True, + is_alias=False, imported_from=base_src, + docs_extracted_by='parser') # Otherwise, it must have come from an "import *" statement # (or from magic, such as direct manipulation of the module's # dictionary), so we don't know where it came from. So This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dva...@us...> - 2007-02-16 02:08:53
|
Revision: 1511 http://svn.sourceforge.net/epydoc/?rev=1511&view=rev Author: dvarrazzo Date: 2007-02-15 18:08:51 -0800 (Thu, 15 Feb 2007) Log Message: ----------- - The parser detects te trick:: if __name__ == "__main__": and skips the block (or else testing stuff gets parsed). Modified Paths: -------------- trunk/epydoc/src/epydoc/docparser.py Modified: trunk/epydoc/src/epydoc/docparser.py =================================================================== --- trunk/epydoc/src/epydoc/docparser.py 2007-02-16 01:28:57 UTC (rev 1510) +++ trunk/epydoc/src/epydoc/docparser.py 2007-02-16 02:08:51 UTC (rev 1511) @@ -683,6 +683,15 @@ else: container.group_specs.append( (group_name, [var_name]) ) +def script_guard(line): + """Detect the idiomatic trick C{if __name__ == "__main__":}""" + return (len(line) == 5 + and line[1][1] == '__name__' # this is the most selective + and line[0][1] == 'if' + and line[2][1] == '==' + and line[4][1] == ':' + and line[3][1][1:-1] == '__main__') + #///////////////////////////////////////////////////////////////// #{ Shallow parser #///////////////////////////////////////////////////////////////// @@ -787,7 +796,7 @@ docs_extracted_by='parser') set_variable(parent, var_doc) - if ((keyword == 'if' and PARSE_IF_BLOCKS) or + if ((keyword == 'if' and PARSE_IF_BLOCKS and not script_guard(line)) or (keyword == 'elif' and PARSE_ELSE_BLOCKS) or (keyword == 'else' and PARSE_ELSE_BLOCKS) or (keyword == 'while' and PARSE_WHILE_BLOCKS) or This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dva...@us...> - 2007-03-10 16:01:54
|
Revision: 1580 http://svn.sourceforge.net/epydoc/?rev=1580&view=rev Author: dvarrazzo Date: 2007-03-10 08:01:52 -0800 (Sat, 10 Mar 2007) Log Message: ----------- - Added parsing of relative import according to rules defined in :PEP:`328`. Allowed relative import forms are:: from .foo import bar from ..foo import bar ... from . import foo from .. import foo ... Other relative forms are not allowed by the PEP:: import . # nope import .. # never from .. import * # not a chance... Modified Paths: -------------- trunk/epydoc/src/epydoc/docparser.py Modified: trunk/epydoc/src/epydoc/docparser.py =================================================================== --- trunk/epydoc/src/epydoc/docparser.py 2007-03-10 02:32:35 UTC (rev 1579) +++ trunk/epydoc/src/epydoc/docparser.py 2007-03-10 16:01:52 UTC (rev 1580) @@ -865,7 +865,9 @@ # >>> from os.path import join, split else: - src_name = parse_dotted_name(lhs) + # Allow relative imports in this case, as per PEP 328 + src_name = parse_dotted_name(lhs, + parent_name=parent_docs[-1].canonical_name) parts = split_on(rhs, (token.OP, ',')) for part in parts: # from m import x @@ -1668,8 +1670,11 @@ raise ParseError("Bad name") return elt[1] -def parse_dotted_name(elt_list, strip_parens=True): +def parse_dotted_name(elt_list, strip_parens=True, parent_name=None): """ + @param parent_name: canonical name of referring module, to resolve + relative imports. + @type parent_name: L{DottedName} @bug: does not handle 'x.(y).z' """ if len(elt_list) == 0: raise ParseError("Bad dotted name") @@ -1683,8 +1688,25 @@ elt_list[0][-1] == (token.OP, ')')): elt_list[:1] = elt_list[0][1:-1] + # Convert a relative import into an absolute name. + prefix_name = None + if parent_name is not None and elt_list[0][-1] == '.': + items = 1 + while len(elt_list) > items and elt_list[items][-1] == '.': + items += 1 + + elt_list = elt_list[items:] + prefix_name = parent_name[:-items] + + # >>> from . import foo + if not elt_list: + return prefix_name + if len(elt_list) % 2 != 1: raise ParseError("Bad dotted name") name = DottedName(parse_name(elt_list[0], True)) + if prefix_name is not None: + name = prefix_name + name + for i in range(2, len(elt_list), 2): dot, identifier = elt_list[i-1], elt_list[i] if dot != (token.OP, '.'): 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:16:32
|
Revision: 1592 http://svn.sourceforge.net/epydoc/?rev=1592&view=rev Author: dvarrazzo Date: 2007-07-10 16:16:30 -0700 (Tue, 10 Jul 2007) Log Message: ----------- - Checking that the `NamespaceDoc.sort_spec` is populated. This is not the case when assigning an attribute to a namespace which has never been parsed. See SF bug #1693253. Modified Paths: -------------- trunk/epydoc/src/epydoc/docparser.py Modified: trunk/epydoc/src/epydoc/docparser.py =================================================================== --- trunk/epydoc/src/epydoc/docparser.py 2007-07-10 22:01:12 UTC (rev 1591) +++ trunk/epydoc/src/epydoc/docparser.py 2007-07-10 23:16:30 UTC (rev 1592) @@ -1839,6 +1839,12 @@ # Choose which dictionary we'll be storing the variable in. if not isinstance(namespace, NamespaceDoc): return + + # This happens when the class definition has not been parsed, e.g. in + # sf bug #1693253 on ``Exception.x = y`` + if namespace.sort_spec is UNKNOWN: + namespace.sort_spec = namespace.variables.keys() + # If we already have a variable with this name, then remove the # old VariableDoc from the sort_spec list; and if we gave its # value a canonical name, then delete it. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2008-01-29 01:30:07
|
Revision: 1666 http://epydoc.svn.sourceforge.net/epydoc/?rev=1666&view=rev Author: edloper Date: 2008-01-28 17:29:53 -0800 (Mon, 28 Jan 2008) Log Message: ----------- When parsing relative imports, check to make sure it's not done in a non-package, or beyond the toplevel package. Modified Paths: -------------- trunk/epydoc/src/epydoc/docparser.py Modified: trunk/epydoc/src/epydoc/docparser.py =================================================================== --- trunk/epydoc/src/epydoc/docparser.py 2008-01-29 00:14:37 UTC (rev 1665) +++ trunk/epydoc/src/epydoc/docparser.py 2008-01-29 01:29:53 UTC (rev 1666) @@ -1700,6 +1700,9 @@ # >>> from . import foo if not elt_list: + if prefix_name == []: + raise ParseError("Attempted relative import in non-package, " + "or beyond toplevel package") return prefix_name if len(elt_list) % 2 != 1: raise ParseError("Bad dotted name") This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2008-01-29 05:43:00
|
Revision: 1673 http://epydoc.svn.sourceforge.net/epydoc/?rev=1673&view=rev Author: edloper Date: 2008-01-28 21:42:58 -0800 (Mon, 28 Jan 2008) Log Message: ----------- - Applied sourceforge patch #1723597 -- convert imported names to global names before adding them to ModuleDoc.imports. Modified Paths: -------------- trunk/epydoc/src/epydoc/docparser.py Modified: trunk/epydoc/src/epydoc/docparser.py =================================================================== --- trunk/epydoc/src/epydoc/docparser.py 2008-01-29 03:53:51 UTC (rev 1672) +++ trunk/epydoc/src/epydoc/docparser.py 2008-01-29 05:42:58 UTC (rev 1673) @@ -902,14 +902,15 @@ list of exports is found by importing and introspecting C{M{<src>}}. """ - # Record the import - parent_docs[0].imports.append(src) # mark that it's .*?? - + # This is redundant: already checked by caller. if not isinstance(parent_docs[-1], NamespaceDoc): return # If src is package-local, then convert it to a global name. src = _global_name(src, parent_docs) + # Record the import + parent_docs[0].imports.append(src) # mark that it's .*?? + # [xx] add check for if we already have the source docs in our # cache?? @@ -956,15 +957,16 @@ we need to create a variable C{'a'} in parentdoc containing a proxy module; and a variable C{'b'} in the proxy module. """ - # Record the import - parent_docs[0].imports.append(name) - + # This is redundant: already checked by caller. if not isinstance(parent_docs[-1], NamespaceDoc): return # If name is package-local, then convert it to a global name. src = _global_name(name, parent_docs) src_prefix = src[:len(src)-len(name)] + # Record the import + parent_docs[0].imports.append(name) + # [xx] add check for if we already have the source docs in our # cache?? @@ -1012,14 +1014,15 @@ Otherwise, create a variables with its C{imported_from} attribute pointing to the imported object. """ - # Record the import - parent_docs[0].imports.append(src) - + # This is redundant: already checked by caller. if not isinstance(parent_docs[-1], NamespaceDoc): return # If src is package-local, then convert it to a global name. src = _global_name(src, parent_docs) + # Record the import + parent_docs[0].imports.append(src) + if IMPORT_HANDLING == 'parse': # Parse the value and create a variable for it. try: val_doc = _find(src) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2008-01-31 06:20:53
|
Revision: 1700 http://epydoc.svn.sourceforge.net/epydoc/?rev=1700&view=rev Author: edloper Date: 2008-01-30 22:20:50 -0800 (Wed, 30 Jan 2008) Log Message: ----------- - Added parsing support for: >>> __all__.append('name') >>> __all__ += ['name'] - Added line numbers to parser warning messages Modified Paths: -------------- trunk/epydoc/src/epydoc/docparser.py Modified: trunk/epydoc/src/epydoc/docparser.py =================================================================== --- trunk/epydoc/src/epydoc/docparser.py 2008-01-31 01:18:16 UTC (rev 1699) +++ trunk/epydoc/src/epydoc/docparser.py 2008-01-31 06:20:50 UTC (rev 1700) @@ -767,6 +767,8 @@ elif (line[0][0] == token.NAME and line[0][1] in CONTROL_FLOW_KEYWORDS): return process_control_flow_line(*args) + elif line[0] == (token.NAME, '__all__') and is_append_to_all(line): + return process_append_to_all(*args) else: return None # [xx] do something with control structures like for/if? @@ -1340,9 +1342,10 @@ # decode_with_backslashreplace, which will map e.g. # "\xe9" -> u"\\xe9". docstring = decode_with_backslashreplace(docstring) - log.warning("While parsing %s: docstring is not a unicode " - "string, but it contains non-ascii data." % - prev_line_doc.canonical_name) + log.warning("Parsing %s (line %s): %s docstring is not a " + "unicode string, but it contains non-ascii data." % + (parent_docs[0].filename, lineno, + prev_line_doc.canonical_name)) # If the modified APIDoc is an instance variable, and it has # not yet been added to its class's C{variables} list, @@ -1362,9 +1365,12 @@ break if prev_line_doc.docstring not in (None, UNKNOWN): - log.warning("%s has both a comment-docstring and a normal " - "(string) docstring; ignoring the comment-" - "docstring." % prev_line_doc.canonical_name) + name = prev_line_doc.canonical_name + if name is UNKNOWN and isinstance(prev_line_doc, VariableDoc): + name = prev_line_doc.name + log.warning("Parsing %s (line %s): %s has both a comment-docstring " + "and a normal (string) docstring; ignoring the comment-" + "docstring." % (parent_docs[0].filename, lineno, name)) prev_line_doc.docstring = docstring prev_line_doc.docstring_lineno = lineno @@ -1548,8 +1554,9 @@ for base_name in parse_classdef_bases(line[2]): class_doc.bases.append(find_base(base_name, parent_docs)) except ParseError, e: - log.warning("Unable to extract the base list for %s: %s" % - (canonical_name, e)) + log.warning("Parsing %s (line %s): Unable to extract " + "the base list for class '%s'." % + (parent_docs[0].filename, lineno, canonical_name)) class_doc.bases = UNKNOWN else: class_doc.bases = [] @@ -1636,6 +1643,67 @@ return _proxy_base(parse_repr=str(name)) #///////////////////////////////////////////////////////////////// +# Line handler: append to all +#///////////////////////////////////////////////////////////////// + +def process_append_to_all(line, parent_docs, prev_line_doc, lineno, + comments, decorators, encoding): + """ + The line handler for __all__.append() lines; either of: + + >>> __all__.append('name') + >>> __all__ += ['name'] + + This handler looks up the value of the variable C{__all__} in + parent_docs; and if it is found, and has a list-of-strings value, + the handler appends the new name. + """ + # Extract the string to be appended + assert line[-1][1][0] == token.STRING + name = line[-1][1][1] + + all_var = lookup_name('__all__', parent_docs) + error = None + if all_var is None or all_var.value in (None, UNKNOWN): + error = "variable __all__ not found." + else: + try: + # Make sure we can parse the __all__ value. + parse_string_list(all_var.value.toktree, True) + + # Add the new name to __all__. + if len(all_var.value.toktree[0]) > 2: + all_var.value.toktree[0].insert(-1, (token.OP, ',')) + all_var.value.toktree[0].insert(-1, (token.STRING, name)) + all_var.value.parse_repr = pp_toktree(all_var.value.toktree) + except ParseError: + error = "unable to parse the contents of __all__" + + if error: + log.warning("Parsing %s (line %s): while processing " + "an __all__.append() statement: %s" % + (parent_docs[0].filename, lineno, error)) + +def is_append_to_all(line): + """ + Check if a line is an __all__.append line() + @see: L{process_append_to_all} + """ + # __all__.append(string) + if (len(line) == 4 and line[0] == (token.NAME, '__all__') and + line[1] == (token.OP, '.') and line[2] == (token.NAME, 'append') and + isinstance(line[3], list) and len(line[3]) == 3 and + line[3][0] == (token.OP, '(') and line[3][1][0] == token.STRING): + return True + + # __all__ += [string] + if (len(line) == 3 and line[0] == (token.NAME, '__all__') and + line[1] == (token.OP, '+=') and isinstance(line[2], list) and + len(line[2]) == 3 and line[2][0][1] in '[(' and + line[2][1][0] == token.STRING): + return True + +#///////////////////////////////////////////////////////////////// #{ Parsing #///////////////////////////////////////////////////////////////// @@ -1820,10 +1888,12 @@ raise ParseError("Expected a string") # ['1', 'b', 'c'] -def parse_string_list(elt_list): - if (len(elt_list) == 1 and isinstance(elt_list, list) and +def parse_string_list(elt_list, require_sequence=False): + if (len(elt_list) == 1 and isinstance(elt_list[0], list) and elt_list[0][0][1] in ('(', '[')): elt_list = elt_list[0][1:-1] + elif require_sequence: + raise ParseError("Expected a sequence") string_list = [] for string_elt in split_on(elt_list, (token.OP, ',')): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2008-01-31 06:52:35
|
Revision: 1703 http://epydoc.svn.sourceforge.net/epydoc/?rev=1703&view=rev Author: edloper Date: 2008-01-30 22:52:33 -0800 (Wed, 30 Jan 2008) Log Message: ----------- - Added support for @public decorator, which is assumed to append a function's name to __all__. This can be turned off with the configuration constant PUBLIC_DECORATOR_APPENDS_TO_ALL. Modified Paths: -------------- trunk/epydoc/src/epydoc/docparser.py Modified: trunk/epydoc/src/epydoc/docparser.py =================================================================== --- trunk/epydoc/src/epydoc/docparser.py 2008-01-31 06:50:04 UTC (rev 1702) +++ trunk/epydoc/src/epydoc/docparser.py 2008-01-31 06:52:33 UTC (rev 1703) @@ -145,6 +145,10 @@ knowledge about what value the decorator returns. """ +PUBLIC_DECORATOR_APPENDS_TO_ALL = True +"""If true, then the @public decorator will append the function's +name to the module's __all__ variable.""" + BASE_HANDLING = 'parse'#'link' """What should C{docparser} do when it encounters a base class that was imported from another module? @@ -1105,7 +1109,7 @@ # Evaluate the right hand side. if not is_instvar: - rhs_val, is_alias = rhs_to_valuedoc(rhs, parent_docs) + rhs_val, is_alias = rhs_to_valuedoc(rhs, parent_docs, lineno) else: rhs_val, is_alias = UNKNOWN, False @@ -1196,7 +1200,7 @@ return False return False -def rhs_to_valuedoc(rhs, parent_docs): +def rhs_to_valuedoc(rhs, parent_docs, lineno): # Dotted variable: try: rhs_name = parse_dotted_name(rhs) @@ -1209,9 +1213,10 @@ # Decorators: if (len(rhs)==2 and rhs[0][0] == token.NAME and isinstance(rhs[1], list)): - arg_val, _ = rhs_to_valuedoc(rhs[1][1:-1], parent_docs) + arg_val, _ = rhs_to_valuedoc(rhs[1][1:-1], parent_docs, lineno) if isinstance(arg_val, RoutineDoc): - doc = apply_decorator(DottedName(rhs[0][1]), arg_val) + doc = apply_decorator(DottedName(rhs[0][1]), arg_val, + parent_docs, lineno) doc.canonical_name = UNKNOWN doc.parse_repr = pp_toktree(rhs) return doc, False @@ -1438,7 +1443,7 @@ func_doc.parse_repr) else: deco_repr = UNKNOWN - func_doc = apply_decorator(deco_name, func_doc) + func_doc = apply_decorator(deco_name, func_doc, parent_docs, lineno) func_doc.parse_repr = deco_repr # [XX] Is there a reson the following should be done? It # causes the grouping code to break. Presumably the canonical @@ -1455,12 +1460,18 @@ # Return the new ValueDoc. return func_doc -def apply_decorator(decorator_name, func_doc): +def apply_decorator(decorator_name, func_doc, parent_docs, lineno): # [xx] what if func_doc is not a RoutineDoc? if decorator_name == DottedName('staticmethod'): return StaticMethodDoc(**func_doc.__dict__) elif decorator_name == DottedName('classmethod'): return ClassMethodDoc(**func_doc.__dict__) + elif (decorator_name == DottedName('public') and + PUBLIC_DECORATOR_APPENDS_TO_ALL): + if '"' not in func_doc.canonical_name[-1]: # for security + quoted_func_name = '"%s"' % func_doc.canonical_name[-1] + append_to_all(quoted_func_name, parent_docs, lineno) + return func_doc.__class__(**func_doc.__dict__) # make a copy. elif DEFAULT_DECORATOR_BEHAVIOR == 'transparent': return func_doc.__class__(**func_doc.__dict__) # make a copy. elif DEFAULT_DECORATOR_BEHAVIOR == 'opaque': @@ -1660,9 +1671,11 @@ """ # Extract the string to be appended assert line[-1][1][0] == token.STRING - name = line[-1][1][1] + append_to_all(line[-1][1][1], parent_docs, lineno) +def append_to_all(name, parent_docs, lineno): all_var = lookup_name('__all__', parent_docs) + error = None if all_var is None or all_var.value in (None, UNKNOWN): error = "variable __all__ not found." @@ -1678,10 +1691,11 @@ all_var.value.parse_repr = pp_toktree(all_var.value.toktree) except ParseError: error = "unable to parse the contents of __all__" + log.warning('now', all_var.value.parse_repr) if error: - log.warning("Parsing %s (line %s): while processing " - "an __all__.append() statement: %s" % + log.warning("Parsing %s (line %s): while processing an __all__" + ".append() statement or @public decorator: %s" % (parent_docs[0].filename, lineno, error)) def is_append_to_all(line): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2008-02-01 19:32:36
|
Revision: 1708 http://epydoc.svn.sourceforge.net/epydoc/?rev=1708&view=rev Author: edloper Date: 2008-02-01 11:32:30 -0800 (Fri, 01 Feb 2008) Log Message: ----------- - Removed debug-printf statement that was accidentally left in from svn 1703. Modified Paths: -------------- trunk/epydoc/src/epydoc/docparser.py Modified: trunk/epydoc/src/epydoc/docparser.py =================================================================== --- trunk/epydoc/src/epydoc/docparser.py 2008-02-01 19:28:01 UTC (rev 1707) +++ trunk/epydoc/src/epydoc/docparser.py 2008-02-01 19:32:30 UTC (rev 1708) @@ -1691,7 +1691,6 @@ all_var.value.parse_repr = pp_toktree(all_var.value.toktree) except ParseError: error = "unable to parse the contents of __all__" - log.warning('now', all_var.value.parse_repr) if error: log.warning("Parsing %s (line %s): while processing an __all__" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2008-02-14 22:25:16
|
Revision: 1718 http://epydoc.svn.sourceforge.net/epydoc/?rev=1718&view=rev Author: edloper Date: 2008-02-14 14:25:14 -0800 (Thu, 14 Feb 2008) Log Message: ----------- - If the source file is not encoded correctly, then issue an error (rather than crashing) and give up on parsing. Modified Paths: -------------- trunk/epydoc/src/epydoc/docparser.py Modified: trunk/epydoc/src/epydoc/docparser.py =================================================================== --- trunk/epydoc/src/epydoc/docparser.py 2008-02-14 22:21:41 UTC (rev 1717) +++ trunk/epydoc/src/epydoc/docparser.py 2008-02-14 22:25:14 UTC (rev 1718) @@ -285,7 +285,7 @@ raise ParseError('Error during parsing: %s ' '(%s, line %d, char %d)' % (msg, module_doc.filename, srow, scol)) - except IndentationError, e: + except (IndentationError, UnicodeDecodeError), e: raise ParseError('Error during parsing: %s (%s)' % (e, module_doc.filename)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ed...@us...> - 2008-02-24 06:40:25
|
Revision: 1776 http://epydoc.svn.sourceforge.net/epydoc/?rev=1776&view=rev Author: edloper Date: 2008-02-23 22:40:17 -0800 (Sat, 23 Feb 2008) Log Message: ----------- - Removed obsolete guard against adding a class to the subclass list twice (from introspect & parsing) -- the current implementation just chooses the introspect's version of the subclass list over the parse version. Modified Paths: -------------- trunk/epydoc/src/epydoc/docparser.py Modified: trunk/epydoc/src/epydoc/docparser.py =================================================================== --- trunk/epydoc/src/epydoc/docparser.py 2008-02-24 06:09:50 UTC (rev 1775) +++ trunk/epydoc/src/epydoc/docparser.py 2008-02-24 06:40:17 UTC (rev 1776) @@ -1582,17 +1582,7 @@ if class_doc.bases is not UNKNOWN: for basedoc in class_doc.bases: if isinstance(basedoc, ClassDoc): - # This test avoids that a subclass gets listed twice when - # both introspection and parsing. - # [XXX] This check only works because currently parsing is - # always performed just after introspection of the same - # class. A more complete fix shuld be independent from - # calling order; probably the subclasses list should be - # replaced by a ClassDoc set or a {name: ClassDoc} mapping. - if (basedoc.subclasses - and basedoc.subclasses[-1].canonical_name - != class_doc.canonical_name): - basedoc.subclasses.append(class_doc) + basedoc.subclasses.append(class_doc) # If the preceeding comment includes a docstring, then add it. add_docstring_from_comments(class_doc, comments) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |