diff options
author | milde <milde@929543f6-e4f2-0310-98a6-ba3bd3dd1d04> | 2012-01-09 15:01:15 +0000 |
---|---|---|
committer | milde <milde@929543f6-e4f2-0310-98a6-ba3bd3dd1d04> | 2012-01-09 15:01:15 +0000 |
commit | a90d43de9fb59d1329e0d66b790a5b2f7882a273 (patch) | |
tree | 914f0c579032d29af9c58f5b9907a617d9410d48 | |
parent | a0e1abe2066ece9ade05938258bc4aafce78ac20 (diff) | |
download | docutils-a90d43de9fb59d1329e0d66b790a5b2f7882a273.tar.gz |
Clean up system message (source, line) reporting.
Do the abs_line_number -> (src, srcline) conversion in the reporter
whenever possible.
git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@7310 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-rw-r--r-- | docutils/parsers/rst/__init__.py | 6 | ||||
-rw-r--r-- | docutils/parsers/rst/directives/html.py | 6 | ||||
-rw-r--r-- | docutils/parsers/rst/directives/misc.py | 2 | ||||
-rw-r--r-- | docutils/parsers/rst/roles.py | 3 | ||||
-rw-r--r-- | docutils/parsers/rst/states.py | 112 | ||||
-rw-r--r-- | docutils/statemachine.py | 4 |
6 files changed, 57 insertions, 76 deletions
diff --git a/docutils/parsers/rst/__init__.py b/docutils/parsers/rst/__init__.py index 68c3d8d71..0e064677d 100644 --- a/docutils/parsers/rst/__init__.py +++ b/docutils/parsers/rst/__init__.py @@ -305,7 +305,6 @@ class Directive(object): self.block_text = block_text self.state = state self.state_machine = state_machine - self.src, self.srcline = state_machine.get_source_and_line(lineno) def run(self): raise NotImplementedError('Must override run() is subclass.') @@ -321,8 +320,9 @@ class Directive(object): at level `level`, which automatically gets the directive block and the line number added. - You'd often use self.error(message) instead, which will - generate an ERROR-level directive error. + Preferably use the `debug`, `info`, `warning`, `error`, or `severe` + wrapper methods, e.g. ``self.error(message)`` to generate an + ERROR-level directive error. """ return DirectiveError(level, message) diff --git a/docutils/parsers/rst/directives/html.py b/docutils/parsers/rst/directives/html.py index e7ad54baa..3aca72fdb 100644 --- a/docutils/parsers/rst/directives/html.py +++ b/docutils/parsers/rst/directives/html.py @@ -41,8 +41,7 @@ class MetaBody(states.SpecializedBody): line = self.state_machine.line msg = self.reporter.info( 'No content for meta tag "%s".' % name, - nodes.literal_block(line, line), - line=self.state_machine.abs_line_number()) + nodes.literal_block(line, line)) return msg, blank_finish tokens = name.split() try: @@ -58,8 +57,7 @@ class MetaBody(states.SpecializedBody): line = self.state_machine.line msg = self.reporter.error( 'Error parsing meta tag attribute "%s": %s.' - % (token, detail), nodes.literal_block(line, line), - line=self.state_machine.abs_line_number()) + % (token, detail), nodes.literal_block(line, line)) return msg, blank_finish self.document.note_pending(pending) return pending, blank_finish diff --git a/docutils/parsers/rst/directives/misc.py b/docutils/parsers/rst/directives/misc.py index 3c89ce8bb..cc5a81f6c 100644 --- a/docutils/parsers/rst/directives/misc.py +++ b/docutils/parsers/rst/directives/misc.py @@ -240,6 +240,8 @@ class Raw(Directive): # This will always fail because there is no content. self.assert_has_content() raw_node = nodes.raw('', text, **attributes) + (raw_node.source, + raw_node.line) = self.state_machine.get_source_and_line(self.lineno) return [raw_node] diff --git a/docutils/parsers/rst/roles.py b/docutils/parsers/rst/roles.py index a90080109..73ec479e6 100644 --- a/docutils/parsers/rst/roles.py +++ b/docutils/parsers/rst/roles.py @@ -309,8 +309,7 @@ def raw_role(role, rawtext, text, lineno, inliner, options={}, content=[]): return [prb], [msg] set_classes(options) node = nodes.raw(rawtext, utils.unescape(text, 1), **options) - node.source, node.line = inliner.reporter.get_source_and_line() - node.line -= 1 + node.source, node.line = inliner.reporter.get_source_and_line(lineno) return [node], [] raw_role.options = {'format': directives.unchanged} diff --git a/docutils/parsers/rst/states.py b/docutils/parsers/rst/states.py index 0c1bdbbe7..4d822a3e1 100644 --- a/docutils/parsers/rst/states.py +++ b/docutils/parsers/rst/states.py @@ -247,13 +247,11 @@ class RSTState(StateWS): This code should never be run. """ - src, srcline = self.state_machine.get_source_and_line() self.reporter.severe( 'Internal error: no transition pattern match. State: "%s"; ' 'transitions: %s; context: %s; current line: %r.' % (self.__class__.__name__, transitions, context, - self.state_machine.line), - source=src, line=srcline) + self.state_machine.line)) return context, None, [] def bof(self, context): @@ -374,10 +372,9 @@ class RSTState(StateWS): return None def title_inconsistent(self, sourcetext, lineno): - src, srcline = self.state_machine.get_source_and_line(lineno) error = self.reporter.severe( 'Title level inconsistent:', nodes.literal_block('', sourcetext), - source=src, line=srcline) + line=lineno) return error def new_subsection(self, title, lineno, messages): @@ -435,10 +432,10 @@ class RSTState(StateWS): def unindent_warning(self, node_name): # the actual problem is one line below the current line - src, srcline = self.state_machine.get_source_and_line() + lineno = self.state_machine.abs_line_number()+1 return self.reporter.warning('%s ends without a blank line; ' 'unexpected unindent.' % node_name, - source=src, line=srcline+1) + line=lineno) def build_regexp(definition, compile=1): @@ -1206,10 +1203,7 @@ class Body(RSTState): lineno = self.state_machine.abs_line_number() + line_offset textnodes, messages = self.inline_text(text, lineno) node = nodes.attribution(text, '', *textnodes) - node.line = lineno - # report with source and source-line results in - # ``IndexError: list index out of range`` - # node.source, node.line = self.state_machine.get_source_and_line(lineno) + node.source, node.line = self.state_machine.get_source_and_line(lineno) return node, messages def bullet(self, match, context, next_state): @@ -1258,10 +1252,9 @@ class Body(RSTState): enumlist['suffix'] = self.enum.formatinfo[format].suffix if ordinal != 1: enumlist['start'] = ordinal - src, srcline = self.state_machine.get_source_and_line() msg = self.reporter.info( 'Enumerated list start value not ordinal-1: "%s" (ordinal %s)' - % (text, ordinal), source=src, line=srcline) + % (text, ordinal)) self.parent += msg listitem, blank_finish = self.list_item(match.end()) enumlist += listitem @@ -1450,9 +1443,8 @@ class Body(RSTState): listitem, blank_finish = self.option_list_item(match) except MarkupError, error: # This shouldn't happen; pattern won't match. - src, srcline = self.state_machine.get_source_and_line() msg = self.reporter.error(u'Invalid option list marker: %s' % - error, source=src, line=srcline) + error) self.parent += msg indented, indent, line_offset, blank_finish = \ self.state_machine.get_first_known_indented(match.end()) @@ -1554,10 +1546,9 @@ class Body(RSTState): blank_finish=0) self.goto_line(new_line_offset) if not blank_finish: - src, srcline = self.state_machine.get_source_and_line() self.parent += self.reporter.warning( 'Line block ends without a blank line.', - source=src, line=srcline+1) + line=lineno+1) if len(block): if block[0].indent is None: block[0].indent = 0 @@ -1619,10 +1610,9 @@ class Body(RSTState): nodelist, blank_finish = self.table(isolate_function, parser_class) self.parent += nodelist if not blank_finish: - src, srcline = self.state_machine.get_source_and_line() msg = self.reporter.warning( 'Blank line required after table.', - source=src, line=srcline+1) + line=self.state_machine.abs_line_number()+1) self.parent += msg return [], next_state, [] @@ -1649,8 +1639,8 @@ class Body(RSTState): blank_finish = 1 try: block = self.state_machine.get_text_block(flush_left=1) - except statemachine.UnexpectedIndentationError, instance: - block, src, srcline = instance.args + except statemachine.UnexpectedIndentationError, err: + block, src, srcline = err.args messages.append(self.reporter.error('Unexpected indentation.', source=src, line=srcline)) blank_finish = 0 @@ -1730,11 +1720,10 @@ class Body(RSTState): data = '\n'.join(block) message = 'Malformed table.' startline = self.state_machine.abs_line_number() - len(block) + 1 - src, srcline = self.state_machine.get_source_and_line(startline) if detail: message += '\n' + detail error = self.reporter.error(message, nodes.literal_block(data, data), - source=src, line=srcline) + line=startline) return [error] def build_table(self, tabledata, tableline, stub_columns=0): @@ -1877,7 +1866,6 @@ class Body(RSTState): def hyperlink_target(self, match): pattern = self.explicit.patterns.target lineno = self.state_machine.abs_line_number() - src, srcline = self.state_machine.get_source_and_line() block, indent, offset, blank_finish = \ self.state_machine.get_first_known_indented( match.end(), until_blank=1, strip_indent=0) @@ -2071,7 +2059,6 @@ class Body(RSTState): from docutils.parsers.rst import convert_directive_function directive = convert_directive_function(directive) lineno = self.state_machine.abs_line_number() - src, srcline = self.state_machine.get_source_and_line() initial_line_offset = self.state_machine.line_offset indented, indent, line_offset, blank_finish \ = self.state_machine.get_first_known_indented(match.end(), @@ -2086,8 +2073,7 @@ class Body(RSTState): error = self.reporter.error( 'Error in "%s" directive:\n%s.' % (type_name, ' '.join(detail.args)), - nodes.literal_block(block_text, block_text), - source=src, line=srcline) + nodes.literal_block(block_text, block_text), line=lineno) return [error], blank_finish directive_instance = directive( type_name, arguments, options, content, lineno, @@ -2096,7 +2082,7 @@ class Body(RSTState): result = directive_instance.run() except docutils.parsers.rst.DirectiveError, error: msg_node = self.reporter.system_message(error.level, error.msg, - source=src, line=srcline) + line=lineno) msg_node += nodes.literal_block(block_text, block_text) result = [msg_node] assert isinstance(result, list), \ @@ -2223,13 +2209,13 @@ class Body(RSTState): return 0, 'option data incompletely parsed' def unknown_directive(self, type_name): - src, srcline = self.state_machine.get_source_and_line() + lineno = self.state_machine.abs_line_number() indented, indent, offset, blank_finish = \ self.state_machine.get_first_known_indented(0, strip_indent=0) text = '\n'.join(indented) error = self.reporter.error( 'Unknown directive type "%s".' % type_name, - nodes.literal_block(text, text), source=src, line=srcline) + nodes.literal_block(text, text), line=lineno) return [error], blank_finish def comment(self, match): @@ -2302,11 +2288,10 @@ class Body(RSTState): if expmatch: try: return method(self, expmatch) - except MarkupError, error: # never reached? + except MarkupError, error: + lineno = self.state_machine.abs_line_number() message = ' '.join(error.args) - src, srcline = self.state_machine.get_source_and_line() - errors.append(self.reporter.warning( - message, source=src, line=srcline)) + errors.append(self.reporter.warning(message, line=lineno)) break nodelist, blank_finish = self.comment(match) return nodelist + errors, blank_finish @@ -2683,7 +2668,6 @@ class Text(RSTState): def underline(self, match, context, next_state): """Section title.""" lineno = self.state_machine.abs_line_number() - src, srcline = self.state_machine.get_source_and_line() title = context[0].rstrip() underline = match.string.rstrip() source = title + '\n' + underline @@ -2694,20 +2678,23 @@ class Text(RSTState): msg = self.reporter.info( 'Possible title underline, too short for the title.\n' "Treating it as ordinary text because it's so short.", - source=src, line=srcline) + line=lineno) self.parent += msg raise statemachine.TransitionCorrection('text') else: blocktext = context[0] + '\n' + self.state_machine.line - msg = self.reporter.warning( - 'Title underline too short.', - nodes.literal_block(blocktext, blocktext), - source=src, line=srcline) + msg = self.reporter.warning('Title underline too short.', + nodes.literal_block(blocktext, blocktext), line=lineno) messages.append(msg) if not self.state_machine.match_titles: blocktext = context[0] + '\n' + self.state_machine.line - msg = self.reporter.severe( - 'Unexpected section title.', + # We need get_source_and_line() here to report correctly + src, srcline = self.state_machine.get_source_and_line() + # TODO: why is abs_line_number() == srcline+1 + # if the error is in a table (try with test_tables.py)? + # print "get_source_and_line", srcline + # print "abs_line_number", self.state_machine.abs_line_number() + msg = self.reporter.severe('Unexpected section title.', nodes.literal_block(blocktext, blocktext), source=src, line=srcline) self.parent += messages @@ -2724,8 +2711,8 @@ class Text(RSTState): msg = None try: block = self.state_machine.get_text_block(flush_left=1) - except statemachine.UnexpectedIndentationError, instance: - block, src, srcline = instance.args + except statemachine.UnexpectedIndentationError, err: + block, src, srcline = err.args msg = self.reporter.error('Unexpected indentation.', source=src, line=srcline) lines = context + list(block) @@ -2771,23 +2758,22 @@ class Text(RSTState): def definition_list_item(self, termline): indented, indent, line_offset, blank_finish = \ self.state_machine.get_indented() - definitionlistitem = nodes.definition_list_item( + itemnode = nodes.definition_list_item( '\n'.join(termline + list(indented))) lineno = self.state_machine.abs_line_number() - 1 - src, srcline = self.state_machine.get_source_and_line() - definitionlistitem.source = src - definitionlistitem.line = srcline - 1 + (itemnode.source, + itemnode.line) = self.state_machine.get_source_and_line(lineno) termlist, messages = self.term(termline, lineno) - definitionlistitem += termlist + itemnode += termlist definition = nodes.definition('', *messages) - definitionlistitem += definition + itemnode += definition if termline[0][-2:] == '::': definition += self.reporter.info( 'Blank line missing before literal block (after the "::")? ' 'Interpreted as a definition list item.', - source=src, line=srcline) + line=lineno+1) self.nested_parse(indented, input_offset=line_offset, node=definition) - return definitionlistitem, blank_finish + return itemnode, blank_finish classifier_delimiter = re.compile(' +: +') @@ -2848,8 +2834,8 @@ class Definition(SpecializedText): def indent(self, match, context, next_state): """Definition list item.""" - definitionlistitem, blank_finish = self.definition_list_item(context) - self.parent += definitionlistitem + itemnode, blank_finish = self.definition_list_item(context) + self.parent += itemnode self.blank_finish = blank_finish return [], 'DefinitionList', [] @@ -2893,7 +2879,6 @@ class Line(SpecializedText): def text(self, match, context, next_state): """Potential over- & underlined title.""" lineno = self.state_machine.abs_line_number() - 1 - src, srcline = self.state_machine.get_source_and_line() overline = context[0] title = match.string underline = '' @@ -2907,7 +2892,7 @@ class Line(SpecializedText): msg = self.reporter.severe( 'Incomplete section title.', nodes.literal_block(blocktext, blocktext), - source=src, line=srcline-1) + line=lineno) self.parent += msg return [], 'Body', [] source = '%s\n%s\n%s' % (overline, title, underline) @@ -2921,7 +2906,7 @@ class Line(SpecializedText): msg = self.reporter.severe( 'Missing matching underline for section title overline.', nodes.literal_block(source, source), - source=src, line=srcline-1) + line=lineno) self.parent += msg return [], 'Body', [] elif overline != underline: @@ -2932,7 +2917,7 @@ class Line(SpecializedText): msg = self.reporter.severe( 'Title overline & underline mismatch.', nodes.literal_block(source, source), - source=src, line=srcline-1) + line=lineno) self.parent += msg return [], 'Body', [] title = title.rstrip() @@ -2945,7 +2930,7 @@ class Line(SpecializedText): msg = self.reporter.warning( 'Title overline too short.', nodes.literal_block(source, source), - source=src, line=srcline-1) + line=lineno) messages.append(msg) style = (overline[0], underline[0]) self.eofcheck = 0 # @@@ not sure this is correct @@ -2959,22 +2944,20 @@ class Line(SpecializedText): overline = context[0] blocktext = overline + '\n' + self.state_machine.line lineno = self.state_machine.abs_line_number() - 1 - src, srcline = self.state_machine.get_source_and_line() if len(overline.rstrip()) < 4: self.short_overline(context, blocktext, lineno, 1) msg = self.reporter.error( 'Invalid section title or transition marker.', nodes.literal_block(blocktext, blocktext), - source=src, line=srcline-1) + line=lineno) self.parent += msg return [], 'Body', [] def short_overline(self, context, blocktext, lineno, lines=1): - src, srcline = self.state_machine.get_source_and_line(lineno) msg = self.reporter.info( 'Possible incomplete section title.\nTreating the overline as ' "ordinary text because it's so short.", - source=src, line=srcline) + line=lineno) self.parent += msg self.state_correction(context, lines) @@ -3052,10 +3035,9 @@ class QuotedLiteralBlock(RSTState): def text(self, match, context, next_state): if context: - src, srcline = self.state_machine.get_source_and_line() self.messages.append( self.reporter.error('Inconsistent literal block quoting.', - source=src, line=srcline)) + line=self.state_machine.abs_line_number())) self.state_machine.previous_line() raise EOFError diff --git a/docutils/statemachine.py b/docutils/statemachine.py index b5cfa3213..4c33102ea 100644 --- a/docutils/statemachine.py +++ b/docutils/statemachine.py @@ -416,8 +416,8 @@ class StateMachine: flush_left) self.next_line(len(block) - 1) return block - except UnexpectedIndentationError, error: - block, source, lineno = error.args + except UnexpectedIndentationError, err: + block = err.args[0] self.next_line(len(block) - 1) # advance to last line of block raise |