##// END OF EJS Templates
Merge pull request #734 from rkern/fix-windows-quotes...
Jonathan March -
r4697:6ecc466f merge
parent child Browse files
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 args.endswith('.py'):
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