Show More
@@ -30,7 +30,7 b' from IPython.testing.skipdoctest import skip_doctest' | |||||
30 | from IPython.utils import py3compat |
|
30 | from IPython.utils import py3compat | |
31 | from IPython.utils.contexts import preserve_keys |
|
31 | from IPython.utils.contexts import preserve_keys | |
32 | from IPython.utils.path import get_py_filename, unquote_filename |
|
32 | from IPython.utils.path import get_py_filename, unquote_filename | |
33 | from IPython.utils.warn import warn |
|
33 | from IPython.utils.warn import warn, error | |
34 | from IPython.utils.text import get_text_list |
|
34 | from IPython.utils.text import get_text_list | |
35 |
|
35 | |||
36 | #----------------------------------------------------------------------------- |
|
36 | #----------------------------------------------------------------------------- | |
@@ -99,11 +99,9 b' def extract_symbols(code, symbols):' | |||||
99 | (["class A: pass", "def b(): return 42"], ['z']) |
|
99 | (["class A: pass", "def b(): return 42"], ['z']) | |
100 | """ |
|
100 | """ | |
101 | symbols = symbols.split(',') |
|
101 | symbols = symbols.split(',') | |
102 | try: |
|
102 | ||
|
103 | # this will raise SyntaxError if code isn't valid Python | |||
103 |
|
|
104 | py_code = ast.parse(code) | |
104 | except SyntaxError: |
|
|||
105 | # ignores non python code |
|
|||
106 | return [], symbols |
|
|||
107 |
|
105 | |||
108 | marks = [(getattr(s, 'name', None), s.lineno) for s in py_code.body] |
|
106 | marks = [(getattr(s, 'name', None), s.lineno) for s in py_code.body] | |
109 | code = code.split('\n') |
|
107 | code = code.split('\n') | |
@@ -303,7 +301,13 b' class CodeMagics(Magics):' | |||||
303 | contents = self.shell.find_user_code(args) |
|
301 | contents = self.shell.find_user_code(args) | |
304 |
|
302 | |||
305 | if 's' in opts: |
|
303 | if 's' in opts: | |
|
304 | try: | |||
306 | blocks, not_found = extract_symbols(contents, opts['s']) |
|
305 | blocks, not_found = extract_symbols(contents, opts['s']) | |
|
306 | except SyntaxError: | |||
|
307 | # non python code | |||
|
308 | error("Unable to parse the input as valid Python code") | |||
|
309 | return | |||
|
310 | ||||
307 | if len(not_found) == 1: |
|
311 | if len(not_found) == 1: | |
308 | warn('The symbol `%s` was not found' % not_found[0]) |
|
312 | warn('The symbol `%s` was not found' % not_found[0]) | |
309 | elif len(not_found) > 1: |
|
313 | elif len(not_found) > 1: |
@@ -74,12 +74,13 b' def test_extract_symbols():' | |||||
74 | nt.assert_equal(code.extract_symbols(source, symbols), exp) |
|
74 | nt.assert_equal(code.extract_symbols(source, symbols), exp) | |
75 |
|
75 | |||
76 |
|
76 | |||
77 |
def test_extract_symbols_ |
|
77 | def test_extract_symbols_raises_exception_with_non_python_code(): | |
78 | source = ("=begin A Ruby program :)=end\n" |
|
78 | source = ("=begin A Ruby program :)=end\n" | |
79 | "def hello\n" |
|
79 | "def hello\n" | |
80 | "puts 'Hello world'\n" |
|
80 | "puts 'Hello world'\n" | |
81 | "end") |
|
81 | "end") | |
82 | nt.assert_equal(code.extract_symbols(source, "hello"), ([], ['hello'])) |
|
82 | with nt.assert_raises(SyntaxError): | |
|
83 | code.extract_symbols(source, "hello") | |||
83 |
|
84 | |||
84 |
|
85 | |||
85 | def test_rehashx(): |
|
86 | def test_rehashx(): |
General Comments 0
You need to be logged in to leave comments.
Login now