##// END OF EJS Templates
Merge pull request #6443 from minrk/multiline-input-transform...
Thomas Kluyver -
r17816:7fdd2280 merge
parent child Browse files
Show More
@@ -12,31 +12,15 b' The code to actually do these transformations is in :mod:`IPython.core.inputtran'
12 and stores the results.
12 and stores the results.
13
13
14 For more details, see the class docstrings below.
14 For more details, see the class docstrings below.
15
16 Authors
17 -------
18
19 * Fernando Perez
20 * Brian Granger
21 * Thomas Kluyver
22 """
15 """
23 #-----------------------------------------------------------------------------
24 # Copyright (C) 2010 The IPython Development Team
25 #
26 # Distributed under the terms of the BSD License. The full license is in
27 # the file COPYING, distributed as part of this software.
28 #-----------------------------------------------------------------------------
29
16
30 #-----------------------------------------------------------------------------
17 # Copyright (c) IPython Development Team.
31 # Imports
18 # Distributed under the terms of the Modified BSD License.
32 #-----------------------------------------------------------------------------
33 # stdlib
34 import ast
19 import ast
35 import codeop
20 import codeop
36 import re
21 import re
37 import sys
22 import sys
38
23
39 # IPython modules
40 from IPython.utils.py3compat import cast_unicode
24 from IPython.utils.py3compat import cast_unicode
41 from IPython.core.inputtransformer import (leading_indent,
25 from IPython.core.inputtransformer import (leading_indent,
42 classic_prompt,
26 classic_prompt,
@@ -511,19 +495,35 b' class IPythonInputSplitter(InputSplitter):'
511 pass
495 pass
512
496
513 def flush_transformers(self):
497 def flush_transformers(self):
514 def _flush(transform, out):
498 def _flush(transform, outs):
515 if out is not None:
499 """yield transformed lines
516 tmp = transform.push(out)
500
517 return tmp or transform.reset() or None
501 always strings, never None
518 else:
502
519 return transform.reset() or None
503 transform: the current transform
504 outs: an iterable of previously transformed inputs.
505 Each may be multiline, which will be passed
506 one line at a time to transform.
507 """
508 for out in outs:
509 for line in out.splitlines():
510 # push one line at a time
511 tmp = transform.push(line)
512 if tmp is not None:
513 yield tmp
514
515 # reset the transform
516 tmp = transform.reset()
517 if tmp is not None:
518 yield tmp
520
519
521 out = None
520 out = []
522 for t in self.transforms_in_use:
521 for t in self.transforms_in_use:
523 out = _flush(t, out)
522 out = _flush(t, out)
524
523
525 if out is not None:
524 out = list(out)
526 self._store(out)
525 if out:
526 self._store('\n'.join(out))
527
527
528 def raw_reset(self):
528 def raw_reset(self):
529 """Return raw input only and perform a full reset.
529 """Return raw input only and perform a full reset.
@@ -1,31 +1,18 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Tests for the inputsplitter module.
2 """Tests for the inputsplitter module."""
3
3
4 Authors
5 -------
6 * Fernando Perez
7 * Robert Kern
8 """
9 from __future__ import print_function
4 from __future__ import print_function
10 #-----------------------------------------------------------------------------
11 # Copyright (C) 2010-2011 The IPython Development Team
12 #
13 # Distributed under the terms of the BSD License. The full license is in
14 # the file COPYING, distributed as part of this software.
15 #-----------------------------------------------------------------------------
16
5
17 #-----------------------------------------------------------------------------
6 # Copyright (c) IPython Development Team.
18 # Imports
7 # Distributed under the terms of the Modified BSD License.
19 #-----------------------------------------------------------------------------
8
20 # stdlib
21 import unittest
9 import unittest
22 import sys
10 import sys
23
11
24 # Third party
25 import nose.tools as nt
12 import nose.tools as nt
26
13
27 # Our own
28 from IPython.core import inputsplitter as isp
14 from IPython.core import inputsplitter as isp
15 from IPython.core.inputtransformer import InputTransformer
29 from IPython.core.tests.test_inputtransformer import syntax, syntax_ml
16 from IPython.core.tests.test_inputtransformer import syntax, syntax_ml
30 from IPython.testing import tools as tt
17 from IPython.testing import tools as tt
31 from IPython.utils import py3compat
18 from IPython.utils import py3compat
@@ -466,8 +453,33 b' class IPythonInputTestCase(InputSplitterTestCase):'
466 )
453 )
467 out = isp.transform_cell(raw)
454 out = isp.transform_cell(raw)
468 self.assertEqual(out.rstrip(), expected.rstrip())
455 self.assertEqual(out.rstrip(), expected.rstrip())
456
457 def test_multiline_passthrough(self):
458 isp = self.isp
459 class CommentTransformer(InputTransformer):
460 def __init__(self):
461 self._lines = []
462
463 def push(self, line):
464 self._lines.append(line + '#')
465
466 def reset(self):
467 text = '\n'.join(self._lines)
468 self._lines = []
469 return text
469
470
471 isp.physical_line_transforms.insert(0, CommentTransformer())
470
472
473 for raw, expected in [
474 ("a=5", "a=5#"),
475 ("%ls foo", "get_ipython().magic(%r)" % u'ls foo#'),
476 ("!ls foo\n%ls bar", "get_ipython().system(%r)\nget_ipython().magic(%r)" % (
477 u'ls foo#', u'ls bar#'
478 )),
479 ("1\n2\n3\n%ls foo\n4\n5", "1#\n2#\n3#\nget_ipython().magic(%r)\n4#\n5#" % u'ls foo#'),
480 ]:
481 out = isp.transform_cell(raw)
482 self.assertEqual(out.rstrip(), expected.rstrip())
471
483
472 #-----------------------------------------------------------------------------
484 #-----------------------------------------------------------------------------
473 # Main - use as a script, mostly for developer experiments
485 # Main - use as a script, mostly for developer experiments
General Comments 0
You need to be logged in to leave comments. Login now