def _directive_include(self, attrs): """Handle an include directive.""" if attrs.has_key('file'): fname = attrs['file'] del attrs['file'] elif attrs.has_key('expr'): if self.m_mode == self.PARSE: fname = self._parse_expression(attrs['expr']) elif self.m_mode == self.COLLECT_CODE: self._emit(dedent(attrs['expr']) + '\n') fname = None else: fname = None del attrs['expr'] else: self._parse_error('Include directive does not specify source.') kwargs = {} for key,value in attrs.items(): if self.m_mode == self.PARSE: kwargs[key] = self._parse_expression(value) elif self.m_mode == self.COLLECT_CODE: self._emit(dedent(value) + '\n') if fname is not None: result = self.include(fname, **kwargs) self._emit(result)
def feed(self, data, eof=False): """Feed `data' to the parser.""" if isinstance(data, str): validator = self.re_valid elif isinstance(data, unicode): validator = self.re_valid_unicode else: m = 'Expecting string or unicode object (got %s).' raise TypeError, m % type(data) if not validator.match(data): raise ParseError, 'Illegal string/unicode input.' buffer = self.m_frames[-1].buffer buffer += data p0 = 0 while True: p1 = buffer.find('<%', p0) if p1 == -1: if buffer.endswith('<'): p1 = len(buffer) - 1 else: p1 = len(buffer) if self.m_mode in (self.PARSE, self.COLLECT_TEXT): self._emit(buffer[p0:p1]) p0 = p1 break if self.m_mode in (self.PARSE, self.COLLECT_TEXT): self._emit(buffer[p0:p1]) self.m_frames[-1].lineno += buffer[p0:p1].count('\n') p0 = p1 p1 = buffer.find('%>', p0+2) if p1 < 0: if not eof: break self._parse_error('Premature EOF (unmatched <% tag)') if buffer[p0+2] == '@': self._parse_directive(buffer[p0+3:p1]) elif buffer[p0+2] in '=+': if self.m_mode == self.PARSE: res = self._parse_expression(buffer[p0+3:p1]) if type(res) not in (str, unicode): res = str(res) if buffer[p0+2] == '+': res = res.encode('html') self._emit(res) elif self.m_mode == self.COLLECT_CODE: self._emit(dedent(buffer[p0+3:p1]) + '\n') else: if self.m_mode == self.PARSE: res = self._parse_code(buffer[p0+2:p1]) self._emit(res) elif self.m_mode == self.COLLECT_CODE: self._emit(dedent(buffer[p0+2:p1]) + '\n') self.m_frames[-1].lineno += buffer[p0:p1+2].count('\n') p0 = p1+2 self.m_frames[-1].buffer = buffer[p0:]
def config_file(self, text, fname=None): if fname is None: fname = tempfile.mktemp() fout = file(fname, 'w') fout.write(dedent(text)) fout.close() if fname not in self.files: self.files.append(fname) return fname
def eval(self, expr, globals=None, locals=None, filename=None, lineno=None): """Evaluate the expression `expr'.""" if globals is None: globals = {} if locals is None: locals = {} if filename is None: filename = '<string>' if lineno is None: lineno = 1 expr = dedent(expr, trim=0) code = self._compile(expr, filename, lineno, 'eval') self._add_builtins(globals) self._add_defaults(code, globals, locals) result = eval(code, globals, locals) return result
def run(self, code, globals=None, locals=None, filename=None, lineno=None): """Execute the code block `code' in the environment.""" if globals is None: globals = {} if locals is None: locals = {} if filename is None: filename = '<string>' if lineno is None: lineno = 1 sys.stdout.start_capture() sys.stderr.start_capture() try: code = dedent(code, trim=0) code = self._compile(code, filename, lineno, 'exec') self._add_builtins(globals) self._add_defaults(code, globals, locals) eval(code, globals, locals) finally: stdout = sys.stdout.stop_capture() stderr = sys.stderr.stop_capture() return (stdout, stderr)
def test_whitespace_lines(self): s = ' \n \n' assert dedent(s) == ''
def test_whitespace(self): s = ' ' assert dedent(s) == ''
def test_empty_lines(self): s = '\n\n\n\n' assert dedent(s) == ''
def test_multi_line_without_trim(self): s = '\n\n\nline1\nline2\n\n\n' assert dedent(s, trim=0) == '\n\n\nline1\nline2\n\n'
def test_multi_line_with_trim_and_indent(self): s = '\n\n\n line1\n line2\n\n\n' assert dedent(s) == 'line1\nline2'
def test_multi_line_with_decreasing_indent(self): s = 'line1\n line2\n line3\n line4\n' assert dedent(s) == 'line1\n line2\n line3\nline4'
def test_multi_line_without_final_newline(self): s = 'line1\n line2' assert dedent(s) == 'line1\nline2'
def test_multi_line_without_first_line(self): s = '\n line2\n line3\n' assert dedent(s) == 'line2\nline3'
def test_one_line(self): s = 'line1\n' assert dedent(s) == 'line1' s = ' line1\n' assert dedent(s) == 'line1'
def test_zero_line(self): s = 'test line' assert dedent(s) == 'test line' s = ' test line' assert dedent(s) == 'test line'
def test_null(self): s = '' assert dedent(s) == ''