Esempio n. 1
0
 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)
Esempio n. 2
0
 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:]
Esempio n. 3
0
 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
Esempio n. 4
0
 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
Esempio n. 5
0
 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)
Esempio n. 6
0
 def test_whitespace_lines(self):
     s = '    \n    \n'
     assert dedent(s) == ''
Esempio n. 7
0
 def test_whitespace(self):
     s = '    '
     assert dedent(s) == ''
Esempio n. 8
0
 def test_empty_lines(self):
     s = '\n\n\n\n'
     assert dedent(s) == ''
Esempio n. 9
0
 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'
Esempio n. 10
0
 def test_multi_line_with_trim_and_indent(self):
     s = '\n\n\n  line1\n  line2\n\n\n'
     assert dedent(s) == 'line1\nline2'
Esempio n. 11
0
 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'
Esempio n. 12
0
 def test_multi_line_without_final_newline(self):
     s = 'line1\n  line2'
     assert dedent(s) == 'line1\nline2'
Esempio n. 13
0
 def test_multi_line_without_first_line(self):
     s = '\n  line2\n  line3\n'
     assert dedent(s) == 'line2\nline3'
Esempio n. 14
0
 def test_one_line(self):
     s = 'line1\n'
     assert dedent(s) == 'line1'
     s = '  line1\n'
     assert dedent(s) == 'line1'
Esempio n. 15
0
 def test_zero_line(self):
     s = 'test line'
     assert dedent(s) == 'test line'
     s = '  test line'
     assert dedent(s) == 'test line'
Esempio n. 16
0
 def test_null(self):
     s = ''
     assert dedent(s) == ''