Show More
@@ -53,7 +53,7 b' from IPython.core.prefilter import ESC_MAGIC' | |||||
53 | from IPython.lib.pylabtools import mpl_runner |
|
53 | from IPython.lib.pylabtools import mpl_runner | |
54 | from IPython.testing.skipdoctest import skip_doctest |
|
54 | from IPython.testing.skipdoctest import skip_doctest | |
55 | from IPython.utils.io import file_read, nlprint |
|
55 | from IPython.utils.io import file_read, nlprint | |
56 | from IPython.utils.path import get_py_filename |
|
56 | from IPython.utils.path import get_py_filename, unquote_filename | |
57 | from IPython.utils.process import arg_split, abbrev_cwd |
|
57 | from IPython.utils.process import arg_split, abbrev_cwd | |
58 | from IPython.utils.terminal import set_term_title |
|
58 | from IPython.utils.terminal import set_term_title | |
59 | from IPython.utils.text import LSString, SList, format_screen |
|
59 | from IPython.utils.text import LSString, SList, format_screen | |
@@ -1426,10 +1426,12 b' Currently the magic system has the following functions:\\n"""' | |||||
1426 | dump_file = opts.D[0] |
|
1426 | dump_file = opts.D[0] | |
1427 | text_file = opts.T[0] |
|
1427 | text_file = opts.T[0] | |
1428 | if dump_file: |
|
1428 | if dump_file: | |
|
1429 | dump_file = unquote_filename(dump_file) | |||
1429 | prof.dump_stats(dump_file) |
|
1430 | prof.dump_stats(dump_file) | |
1430 | print '\n*** Profile stats marshalled to file',\ |
|
1431 | print '\n*** Profile stats marshalled to file',\ | |
1431 | `dump_file`+'.',sys_exit |
|
1432 | `dump_file`+'.',sys_exit | |
1432 | if text_file: |
|
1433 | if text_file: | |
|
1434 | text_file = unquote_filename(text_file) | |||
1433 | pfile = file(text_file,'w') |
|
1435 | pfile = file(text_file,'w') | |
1434 | pfile.write(output) |
|
1436 | pfile.write(output) | |
1435 | pfile.close() |
|
1437 | pfile.close() | |
@@ -2071,7 +2073,7 b' Currently the magic system has the following functions:\\n"""' | |||||
2071 | it asks for confirmation before overwriting existing files.""" |
|
2073 | it asks for confirmation before overwriting existing files.""" | |
2072 |
|
2074 | |||
2073 | opts,args = self.parse_options(parameter_s,'r',mode='list') |
|
2075 | opts,args = self.parse_options(parameter_s,'r',mode='list') | |
2074 | fname, codefrom = args[0], " ".join(args[1:]) |
|
2076 | fname, codefrom = unquote_filename(args[0]), " ".join(args[1:]) | |
2075 | if not fname.endswith('.py'): |
|
2077 | if not fname.endswith('.py'): | |
2076 | fname += '.py' |
|
2078 | fname += '.py' | |
2077 | if os.path.isfile(fname): |
|
2079 | if os.path.isfile(fname): | |
@@ -2111,6 +2113,7 b' Currently the magic system has the following functions:\\n"""' | |||||
2111 | %loadpy myscript.py |
|
2113 | %loadpy myscript.py | |
2112 | %loadpy http://www.example.com/myscript.py |
|
2114 | %loadpy http://www.example.com/myscript.py | |
2113 | """ |
|
2115 | """ | |
|
2116 | arg_s = unquote_filename(arg_s) | |||
2114 | if not arg_s.endswith('.py'): |
|
2117 | if not arg_s.endswith('.py'): | |
2115 | raise ValueError('%%load only works with .py files: %s' % arg_s) |
|
2118 | raise ValueError('%%load only works with .py files: %s' % arg_s) | |
2116 | if arg_s.startswith('http'): |
|
2119 | if arg_s.startswith('http'): | |
@@ -2127,12 +2130,13 b' Currently the magic system has the following functions:\\n"""' | |||||
2127 |
|
2130 | |||
2128 | def make_filename(arg): |
|
2131 | def make_filename(arg): | |
2129 | "Make a filename from the given args" |
|
2132 | "Make a filename from the given args" | |
|
2133 | arg = unquote_filename(arg) | |||
2130 | try: |
|
2134 | try: | |
2131 | filename = get_py_filename(arg) |
|
2135 | filename = get_py_filename(arg) | |
2132 | except IOError: |
|
2136 | except IOError: | |
2133 | # If it ends with .py but doesn't already exist, assume we want |
|
2137 | # If it ends with .py but doesn't already exist, assume we want | |
2134 | # a new file. |
|
2138 | # a new file. | |
2135 |
if arg |
|
2139 | if arg.endswith('.py'): | |
2136 | filename = arg |
|
2140 | filename = arg | |
2137 | else: |
|
2141 | else: | |
2138 | filename = None |
|
2142 | filename = None | |
@@ -2826,8 +2830,7 b' Defaulting color scheme to \'NoColor\'"""' | |||||
2826 | "Use '%%bookmark -l' to see your bookmarks." % ps) |
|
2830 | "Use '%%bookmark -l' to see your bookmarks." % ps) | |
2827 |
|
2831 | |||
2828 | # strip extra quotes on Windows, because os.chdir doesn't like them |
|
2832 | # strip extra quotes on Windows, because os.chdir doesn't like them | |
2829 | if sys.platform == 'win32': |
|
2833 | ps = unquote_filename(ps) | |
2830 | ps = ps.strip('\'"') |
|
|||
2831 | # at this point ps should point to the target dir |
|
2834 | # at this point ps should point to the target dir | |
2832 | if ps: |
|
2835 | if ps: | |
2833 | try: |
|
2836 | try: | |
@@ -2870,7 +2873,7 b' Defaulting color scheme to \'NoColor\'"""' | |||||
2870 | """ |
|
2873 | """ | |
2871 |
|
2874 | |||
2872 | dir_s = self.shell.dir_stack |
|
2875 | dir_s = self.shell.dir_stack | |
2873 | tgt = os.path.expanduser(parameter_s) |
|
2876 | tgt = os.path.expanduser(unquote_filename(parameter_s)) | |
2874 | cwd = os.getcwdu().replace(self.home_dir,'~') |
|
2877 | cwd = os.getcwdu().replace(self.home_dir,'~') | |
2875 | if tgt: |
|
2878 | if tgt: | |
2876 | self.magic_cd(parameter_s) |
|
2879 | self.magic_cd(parameter_s) | |
@@ -3531,6 +3534,7 b' Defaulting color scheme to \'NoColor\'"""' | |||||
3531 | args = magic_arguments.parse_argstring(self.magic_notebook, s) |
|
3534 | args = magic_arguments.parse_argstring(self.magic_notebook, s) | |
3532 |
|
3535 | |||
3533 | from IPython.nbformat import current |
|
3536 | from IPython.nbformat import current | |
|
3537 | args.filename = unquote_filename(args.filename) | |||
3534 | if args.export: |
|
3538 | if args.export: | |
3535 | fname, name, format = current.parse_filename(args.filename) |
|
3539 | fname, name, format = current.parse_filename(args.filename) | |
3536 | cells = [] |
|
3540 | cells = [] |
@@ -63,14 +63,14 b' class py_file_finder(object):' | |||||
63 | def __init__(self,test_filename): |
|
63 | def __init__(self,test_filename): | |
64 | self.test_filename = test_filename |
|
64 | self.test_filename = test_filename | |
65 |
|
65 | |||
66 | def __call__(self,name): |
|
66 | def __call__(self,name,win32=False): | |
67 | from IPython.utils.path import get_py_filename |
|
67 | from IPython.utils.path import get_py_filename | |
68 | try: |
|
68 | try: | |
69 | return get_py_filename(name) |
|
69 | return get_py_filename(name,win32=win32) | |
70 | except IOError: |
|
70 | except IOError: | |
71 | test_dir = os.path.dirname(self.test_filename) |
|
71 | test_dir = os.path.dirname(self.test_filename) | |
72 | new_path = os.path.join(test_dir,name) |
|
72 | new_path = os.path.join(test_dir,name) | |
73 | return get_py_filename(new_path) |
|
73 | return get_py_filename(new_path,win32=win32) | |
74 |
|
74 | |||
75 |
|
75 | |||
76 | def _run_ns_sync(self,arg_s,runner=None): |
|
76 | def _run_ns_sync(self,arg_s,runner=None): |
@@ -331,3 +331,15 b' def mute_warn():' | |||||
331 | yield |
|
331 | yield | |
332 | finally: |
|
332 | finally: | |
333 | warn.warn = save_warn |
|
333 | warn.warn = save_warn | |
|
334 | ||||
|
335 | @contextmanager | |||
|
336 | def make_tempfile(name): | |||
|
337 | """ Create an empty, named, temporary file for the duration of the context. | |||
|
338 | """ | |||
|
339 | f = open(name, 'w') | |||
|
340 | f.close() | |||
|
341 | try: | |||
|
342 | yield | |||
|
343 | finally: | |||
|
344 | os.unlink(name) | |||
|
345 |
@@ -82,13 +82,32 b' def get_long_path_name(path):' | |||||
82 | return _get_long_path_name(path) |
|
82 | return _get_long_path_name(path) | |
83 |
|
83 | |||
84 |
|
84 | |||
85 | def get_py_filename(name): |
|
85 | def unquote_filename(name, win32=(sys.platform=='win32')): | |
|
86 | """ On Windows, remove leading and trailing quotes from filenames. | |||
|
87 | """ | |||
|
88 | if win32: | |||
|
89 | if name.startswith(("'", '"')) and name.endswith(("'", '"')): | |||
|
90 | name = name[1:-1] | |||
|
91 | return name | |||
|
92 | ||||
|
93 | ||||
|
94 | def get_py_filename(name, force_win32=None): | |||
86 | """Return a valid python filename in the current directory. |
|
95 | """Return a valid python filename in the current directory. | |
87 |
|
96 | |||
88 | If the given name is not a file, it adds '.py' and searches again. |
|
97 | If the given name is not a file, it adds '.py' and searches again. | |
89 |
Raises IOError with an informative message if the file isn't found. |
|
98 | Raises IOError with an informative message if the file isn't found. | |
|
99 | ||||
|
100 | On Windows, apply Windows semantics to the filename. In particular, remove | |||
|
101 | any quoting that has been applied to it. This option can be forced for | |||
|
102 | testing purposes. | |||
|
103 | """ | |||
90 |
|
104 | |||
91 | name = os.path.expanduser(name) |
|
105 | name = os.path.expanduser(name) | |
|
106 | if force_win32 is None: | |||
|
107 | win32 = (sys.platform == 'win32') | |||
|
108 | else: | |||
|
109 | win32 = force_win32 | |||
|
110 | name = unquote_filename(name, win32=win32) | |||
92 | if not os.path.isfile(name) and not name.endswith('.py'): |
|
111 | if not os.path.isfile(name) and not name.endswith('.py'): | |
93 | name += '.py' |
|
112 | name += '.py' | |
94 | if os.path.isfile(name): |
|
113 | if os.path.isfile(name): |
@@ -12,6 +12,8 b'' | |||||
12 | # Imports |
|
12 | # Imports | |
13 | #----------------------------------------------------------------------------- |
|
13 | #----------------------------------------------------------------------------- | |
14 |
|
14 | |||
|
15 | from __future__ import with_statement | |||
|
16 | ||||
15 | import os |
|
17 | import os | |
16 | import shutil |
|
18 | import shutil | |
17 | import sys |
|
19 | import sys | |
@@ -27,6 +29,7 b' from nose import with_setup' | |||||
27 | import IPython |
|
29 | import IPython | |
28 | from IPython.testing import decorators as dec |
|
30 | from IPython.testing import decorators as dec | |
29 | from IPython.testing.decorators import skip_if_not_win32, skip_win32 |
|
31 | from IPython.testing.decorators import skip_if_not_win32, skip_win32 | |
|
32 | from IPython.testing.tools import make_tempfile | |||
30 | from IPython.utils import path, io |
|
33 | from IPython.utils import path, io | |
31 |
|
34 | |||
32 | # Platform-dependent imports |
|
35 | # Platform-dependent imports | |
@@ -83,7 +86,7 b' def setup_environment():' | |||||
83 | each testfunction needs a pristine environment. |
|
86 | each testfunction needs a pristine environment. | |
84 | """ |
|
87 | """ | |
85 | global oldstuff, platformstuff |
|
88 | global oldstuff, platformstuff | |
86 | oldstuff = (env.copy(), os.name, path.get_home_dir, IPython.__file__) |
|
89 | oldstuff = (env.copy(), os.name, path.get_home_dir, IPython.__file__, os.getcwd()) | |
87 |
|
90 | |||
88 | if os.name == 'nt': |
|
91 | if os.name == 'nt': | |
89 | platformstuff = (wreg.OpenKey, wreg.QueryValueEx,) |
|
92 | platformstuff = (wreg.OpenKey, wreg.QueryValueEx,) | |
@@ -92,7 +95,8 b' def setup_environment():' | |||||
92 | def teardown_environment(): |
|
95 | def teardown_environment(): | |
93 | """Restore things that were remebered by the setup_environment function |
|
96 | """Restore things that were remebered by the setup_environment function | |
94 | """ |
|
97 | """ | |
95 | (oldenv, os.name, path.get_home_dir, IPython.__file__,) = oldstuff |
|
98 | (oldenv, os.name, path.get_home_dir, IPython.__file__, old_wd) = oldstuff | |
|
99 | os.chdir(old_wd) | |||
96 | reload(path) |
|
100 | reload(path) | |
97 |
|
101 | |||
98 | for key in env.keys(): |
|
102 | for key in env.keys(): | |
@@ -402,3 +406,38 b' def test_not_writable_ipdir():' | |||||
402 | nt.assert_true('WARNING' in pipe.getvalue()) |
|
406 | nt.assert_true('WARNING' in pipe.getvalue()) | |
403 | env.pop('IPYTHON_DIR', None) |
|
407 | env.pop('IPYTHON_DIR', None) | |
404 |
|
408 | |||
|
409 | def test_unquote_filename(): | |||
|
410 | for win32 in (True, False): | |||
|
411 | nt.assert_equals(path.unquote_filename('foo.py', win32=win32), 'foo.py') | |||
|
412 | nt.assert_equals(path.unquote_filename('foo bar.py', win32=win32), 'foo bar.py') | |||
|
413 | nt.assert_equals(path.unquote_filename('"foo.py"', win32=True), 'foo.py') | |||
|
414 | nt.assert_equals(path.unquote_filename('"foo bar.py"', win32=True), 'foo bar.py') | |||
|
415 | nt.assert_equals(path.unquote_filename("'foo.py'", win32=True), 'foo.py') | |||
|
416 | nt.assert_equals(path.unquote_filename("'foo bar.py'", win32=True), 'foo bar.py') | |||
|
417 | nt.assert_equals(path.unquote_filename('"foo.py"', win32=False), '"foo.py"') | |||
|
418 | nt.assert_equals(path.unquote_filename('"foo bar.py"', win32=False), '"foo bar.py"') | |||
|
419 | nt.assert_equals(path.unquote_filename("'foo.py'", win32=False), "'foo.py'") | |||
|
420 | nt.assert_equals(path.unquote_filename("'foo bar.py'", win32=False), "'foo bar.py'") | |||
|
421 | ||||
|
422 | @with_environment | |||
|
423 | def test_get_py_filename(): | |||
|
424 | os.chdir(TMP_TEST_DIR) | |||
|
425 | for win32 in (True, False): | |||
|
426 | with make_tempfile('foo.py'): | |||
|
427 | nt.assert_equals(path.get_py_filename('foo.py', force_win32=win32), 'foo.py') | |||
|
428 | nt.assert_equals(path.get_py_filename('foo', force_win32=win32), 'foo.py') | |||
|
429 | with make_tempfile('foo'): | |||
|
430 | nt.assert_equals(path.get_py_filename('foo', force_win32=win32), 'foo') | |||
|
431 | nt.assert_raises(IOError, path.get_py_filename, 'foo.py', force_win32=win32) | |||
|
432 | nt.assert_raises(IOError, path.get_py_filename, 'foo', force_win32=win32) | |||
|
433 | nt.assert_raises(IOError, path.get_py_filename, 'foo.py', force_win32=win32) | |||
|
434 | true_fn = 'foo with spaces.py' | |||
|
435 | with make_tempfile(true_fn): | |||
|
436 | nt.assert_equals(path.get_py_filename('foo with spaces', force_win32=win32), true_fn) | |||
|
437 | nt.assert_equals(path.get_py_filename('foo with spaces.py', force_win32=win32), true_fn) | |||
|
438 | if win32: | |||
|
439 | nt.assert_equals(path.get_py_filename('"foo with spaces.py"', force_win32=True), true_fn) | |||
|
440 | nt.assert_equals(path.get_py_filename("'foo with spaces.py'", force_win32=True), true_fn) | |||
|
441 | else: | |||
|
442 | nt.assert_raises(IOError, path.get_py_filename, '"foo with spaces.py"', force_win32=False) | |||
|
443 | nt.assert_raises(IOError, path.get_py_filename, "'foo with spaces.py'", force_win32=False) |
General Comments 0
You need to be logged in to leave comments.
Login now