##// END OF EJS Templates
remove the function unicode_to_str as in python3 it has become redundant
Srinivas Reddy Thatiparthy -
Show More

The requested changes are too big and content was truncated. Show full diff

1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
@@ -1,57 +1,57 b''
1 1 """Support for interactive macros in IPython"""
2 2
3 3 #*****************************************************************************
4 4 # Copyright (C) 2001-2005 Fernando Perez <fperez@colorado.edu>
5 5 #
6 6 # Distributed under the terms of the BSD License. The full license is in
7 7 # the file COPYING, distributed as part of this software.
8 8 #*****************************************************************************
9 9
10 10 import re
11 11
12 12 from IPython.utils import py3compat
13 13 from IPython.utils.encoding import DEFAULT_ENCODING
14 14
15 15 coding_declaration = re.compile(r"#\s*coding[:=]\s*([-\w.]+)")
16 16
17 17 class Macro(object):
18 18 """Simple class to store the value of macros as strings.
19 19
20 20 Macro is just a callable that executes a string of IPython
21 21 input when called.
22 22 """
23 23
24 24 def __init__(self,code):
25 25 """store the macro value, as a single string which can be executed"""
26 26 lines = []
27 27 enc = None
28 28 for line in code.splitlines():
29 29 coding_match = coding_declaration.match(line)
30 30 if coding_match:
31 31 enc = coding_match.group(1)
32 32 else:
33 33 lines.append(line)
34 34 code = "\n".join(lines)
35 35 if isinstance(code, bytes):
36 36 code = code.decode(enc or DEFAULT_ENCODING)
37 37 self.value = code + '\n'
38 38
39 39 def __str__(self):
40 return py3compat.unicode_to_str(self.value)
40 return self.value
41 41
42 42 def __unicode__(self):
43 43 return self.value
44 44
45 45 def __repr__(self):
46 46 return 'IPython.macro.Macro(%s)' % repr(self.value)
47 47
48 48 def __getstate__(self):
49 49 """ needed for safe pickling via %store """
50 50 return {'value': self.value}
51 51
52 52 def __add__(self, other):
53 53 if isinstance(other, Macro):
54 54 return Macro(self.value + other.value)
55 55 elif isinstance(other, str):
56 56 return Macro(self.value + other)
57 57 raise TypeError
@@ -1,74 +1,74 b''
1 1 # coding: utf-8
2 2 """Tests for IPython.core.application"""
3 3
4 4 import os
5 5 import tempfile
6 6
7 7 import nose.tools as nt
8 8
9 9 from traitlets import Unicode
10 10
11 11 from IPython.core.application import BaseIPythonApplication
12 12 from IPython.testing import decorators as dec
13 13 from IPython.utils import py3compat
14 14 from IPython.utils.tempdir import TemporaryDirectory
15 15
16 16
17 17 @dec.onlyif_unicode_paths
18 18 def test_unicode_cwd():
19 19 """Check that IPython starts with non-ascii characters in the path."""
20 20 wd = tempfile.mkdtemp(suffix=u"€")
21 21
22 22 old_wd = py3compat.getcwd()
23 23 os.chdir(wd)
24 24 #raise Exception(repr(py3compat.getcwd()))
25 25 try:
26 26 app = BaseIPythonApplication()
27 27 # The lines below are copied from Application.initialize()
28 28 app.init_profile_dir()
29 29 app.init_config_files()
30 30 app.load_config_file(suppress_errors=False)
31 31 finally:
32 32 os.chdir(old_wd)
33 33
34 34 @dec.onlyif_unicode_paths
35 35 def test_unicode_ipdir():
36 36 """Check that IPython starts with non-ascii characters in the IP dir."""
37 37 ipdir = tempfile.mkdtemp(suffix=u"€")
38 38
39 39 # Create the config file, so it tries to load it.
40 40 with open(os.path.join(ipdir, 'ipython_config.py'), "w") as f:
41 41 pass
42 42
43 43 old_ipdir1 = os.environ.pop("IPYTHONDIR", None)
44 44 old_ipdir2 = os.environ.pop("IPYTHON_DIR", None)
45 os.environ["IPYTHONDIR"] = py3compat.unicode_to_str(ipdir, "utf-8")
45 os.environ["IPYTHONDIR"] = ipdir
46 46 try:
47 47 app = BaseIPythonApplication()
48 48 # The lines below are copied from Application.initialize()
49 49 app.init_profile_dir()
50 50 app.init_config_files()
51 51 app.load_config_file(suppress_errors=False)
52 52 finally:
53 53 if old_ipdir1:
54 54 os.environ["IPYTHONDIR"] = old_ipdir1
55 55 if old_ipdir2:
56 56 os.environ["IPYTHONDIR"] = old_ipdir2
57 57
58 58 def test_cli_priority():
59 59 with TemporaryDirectory() as td:
60 60
61 61 class TestApp(BaseIPythonApplication):
62 62 test = Unicode().tag(config=True)
63 63
64 64 # Create the config file, so it tries to load it.
65 65 with open(os.path.join(td, 'ipython_config.py'), "w") as f:
66 66 f.write("c.TestApp.test = 'config file'")
67 67
68 68 app = TestApp()
69 69 app.initialize(['--profile-dir', td])
70 70 nt.assert_equal(app.test, 'config file')
71 71 app = TestApp()
72 72 app.initialize(['--profile-dir', td, '--TestApp.test=cli'])
73 73 nt.assert_equal(app.test, 'cli')
74 74
@@ -1,447 +1,447 b''
1 1 # encoding: utf-8
2 2 """
3 3 Utilities for path handling.
4 4 """
5 5
6 6 # Copyright (c) IPython Development Team.
7 7 # Distributed under the terms of the Modified BSD License.
8 8
9 9 import os
10 10 import sys
11 11 import errno
12 12 import shutil
13 13 import random
14 14 import glob
15 15 from warnings import warn
16 16 from hashlib import md5
17 17
18 18 from IPython.utils.process import system
19 19 from IPython.utils import py3compat
20 20 from IPython.utils.decorators import undoc
21 21
22 22 #-----------------------------------------------------------------------------
23 23 # Code
24 24 #-----------------------------------------------------------------------------
25 25
26 26 fs_encoding = sys.getfilesystemencoding()
27 27
28 28 def _writable_dir(path):
29 29 """Whether `path` is a directory, to which the user has write access."""
30 30 return os.path.isdir(path) and os.access(path, os.W_OK)
31 31
32 32 if sys.platform == 'win32':
33 33 def _get_long_path_name(path):
34 34 """Get a long path name (expand ~) on Windows using ctypes.
35 35
36 36 Examples
37 37 --------
38 38
39 39 >>> get_long_path_name('c:\\docume~1')
40 40 u'c:\\\\Documents and Settings'
41 41
42 42 """
43 43 try:
44 44 import ctypes
45 45 except ImportError:
46 46 raise ImportError('you need to have ctypes installed for this to work')
47 47 _GetLongPathName = ctypes.windll.kernel32.GetLongPathNameW
48 48 _GetLongPathName.argtypes = [ctypes.c_wchar_p, ctypes.c_wchar_p,
49 49 ctypes.c_uint ]
50 50
51 51 buf = ctypes.create_unicode_buffer(260)
52 52 rv = _GetLongPathName(path, buf, 260)
53 53 if rv == 0 or rv > 260:
54 54 return path
55 55 else:
56 56 return buf.value
57 57 else:
58 58 def _get_long_path_name(path):
59 59 """Dummy no-op."""
60 60 return path
61 61
62 62
63 63
64 64 def get_long_path_name(path):
65 65 """Expand a path into its long form.
66 66
67 67 On Windows this expands any ~ in the paths. On other platforms, it is
68 68 a null operation.
69 69 """
70 70 return _get_long_path_name(path)
71 71
72 72
73 73 def unquote_filename(name, win32=(sys.platform=='win32')):
74 74 """ On Windows, remove leading and trailing quotes from filenames.
75 75
76 76 This function has been deprecated and should not be used any more:
77 77 unquoting is now taken care of by :func:`IPython.utils.process.arg_split`.
78 78 """
79 79 warn("'unquote_filename' is deprecated since IPython 5.0 and should not "
80 80 "be used anymore", DeprecationWarning, stacklevel=2)
81 81 if win32:
82 82 if name.startswith(("'", '"')) and name.endswith(("'", '"')):
83 83 name = name[1:-1]
84 84 return name
85 85
86 86
87 87 def compress_user(path):
88 88 """Reverse of :func:`os.path.expanduser`
89 89 """
90 path = py3compat.unicode_to_str(path, sys.getfilesystemencoding())
90 path = str(path)
91 91 home = os.path.expanduser('~')
92 92 if path.startswith(home):
93 93 path = "~" + path[len(home):]
94 94 return path
95 95
96 96 def get_py_filename(name, force_win32=None):
97 97 """Return a valid python filename in the current directory.
98 98
99 99 If the given name is not a file, it adds '.py' and searches again.
100 100 Raises IOError with an informative message if the file isn't found.
101 101 """
102 102
103 103 name = os.path.expanduser(name)
104 104 if force_win32 is not None:
105 105 warn("The 'force_win32' argument to 'get_py_filename' is deprecated "
106 106 "since IPython 5.0 and should not be used anymore",
107 107 DeprecationWarning, stacklevel=2)
108 108 if not os.path.isfile(name) and not name.endswith('.py'):
109 109 name += '.py'
110 110 if os.path.isfile(name):
111 111 return name
112 112 else:
113 113 raise IOError('File `%r` not found.' % name)
114 114
115 115
116 116 def filefind(filename, path_dirs=None):
117 117 """Find a file by looking through a sequence of paths.
118 118
119 119 This iterates through a sequence of paths looking for a file and returns
120 120 the full, absolute path of the first occurence of the file. If no set of
121 121 path dirs is given, the filename is tested as is, after running through
122 122 :func:`expandvars` and :func:`expanduser`. Thus a simple call::
123 123
124 124 filefind('myfile.txt')
125 125
126 126 will find the file in the current working dir, but::
127 127
128 128 filefind('~/myfile.txt')
129 129
130 130 Will find the file in the users home directory. This function does not
131 131 automatically try any paths, such as the cwd or the user's home directory.
132 132
133 133 Parameters
134 134 ----------
135 135 filename : str
136 136 The filename to look for.
137 137 path_dirs : str, None or sequence of str
138 138 The sequence of paths to look for the file in. If None, the filename
139 139 need to be absolute or be in the cwd. If a string, the string is
140 140 put into a sequence and the searched. If a sequence, walk through
141 141 each element and join with ``filename``, calling :func:`expandvars`
142 142 and :func:`expanduser` before testing for existence.
143 143
144 144 Returns
145 145 -------
146 146 Raises :exc:`IOError` or returns absolute path to file.
147 147 """
148 148
149 149 # If paths are quoted, abspath gets confused, strip them...
150 150 filename = filename.strip('"').strip("'")
151 151 # If the input is an absolute path, just check it exists
152 152 if os.path.isabs(filename) and os.path.isfile(filename):
153 153 return filename
154 154
155 155 if path_dirs is None:
156 156 path_dirs = ("",)
157 157 elif isinstance(path_dirs, str):
158 158 path_dirs = (path_dirs,)
159 159
160 160 for path in path_dirs:
161 161 if path == '.': path = py3compat.getcwd()
162 162 testname = expand_path(os.path.join(path, filename))
163 163 if os.path.isfile(testname):
164 164 return os.path.abspath(testname)
165 165
166 166 raise IOError("File %r does not exist in any of the search paths: %r" %
167 167 (filename, path_dirs) )
168 168
169 169
170 170 class HomeDirError(Exception):
171 171 pass
172 172
173 173
174 174 def get_home_dir(require_writable=False):
175 175 """Return the 'home' directory, as a unicode string.
176 176
177 177 Uses os.path.expanduser('~'), and checks for writability.
178 178
179 179 See stdlib docs for how this is determined.
180 180 $HOME is first priority on *ALL* platforms.
181 181
182 182 Parameters
183 183 ----------
184 184
185 185 require_writable : bool [default: False]
186 186 if True:
187 187 guarantees the return value is a writable directory, otherwise
188 188 raises HomeDirError
189 189 if False:
190 190 The path is resolved, but it is not guaranteed to exist or be writable.
191 191 """
192 192
193 193 homedir = os.path.expanduser('~')
194 194 # Next line will make things work even when /home/ is a symlink to
195 195 # /usr/home as it is on FreeBSD, for example
196 196 homedir = os.path.realpath(homedir)
197 197
198 198 if not _writable_dir(homedir) and os.name == 'nt':
199 199 # expanduser failed, use the registry to get the 'My Documents' folder.
200 200 try:
201 201 try:
202 202 import winreg as wreg # Py 3
203 203 except ImportError:
204 204 import _winreg as wreg # Py 2
205 205 key = wreg.OpenKey(
206 206 wreg.HKEY_CURRENT_USER,
207 207 "Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
208 208 )
209 209 homedir = wreg.QueryValueEx(key,'Personal')[0]
210 210 key.Close()
211 211 except:
212 212 pass
213 213
214 214 if (not require_writable) or _writable_dir(homedir):
215 215 return py3compat.cast_unicode(homedir, fs_encoding)
216 216 else:
217 217 raise HomeDirError('%s is not a writable dir, '
218 218 'set $HOME environment variable to override' % homedir)
219 219
220 220 def get_xdg_dir():
221 221 """Return the XDG_CONFIG_HOME, if it is defined and exists, else None.
222 222
223 223 This is only for non-OS X posix (Linux,Unix,etc.) systems.
224 224 """
225 225
226 226 env = os.environ
227 227
228 228 if os.name == 'posix' and sys.platform != 'darwin':
229 229 # Linux, Unix, AIX, etc.
230 230 # use ~/.config if empty OR not set
231 231 xdg = env.get("XDG_CONFIG_HOME", None) or os.path.join(get_home_dir(), '.config')
232 232 if xdg and _writable_dir(xdg):
233 233 return py3compat.cast_unicode(xdg, fs_encoding)
234 234
235 235 return None
236 236
237 237
238 238 def get_xdg_cache_dir():
239 239 """Return the XDG_CACHE_HOME, if it is defined and exists, else None.
240 240
241 241 This is only for non-OS X posix (Linux,Unix,etc.) systems.
242 242 """
243 243
244 244 env = os.environ
245 245
246 246 if os.name == 'posix' and sys.platform != 'darwin':
247 247 # Linux, Unix, AIX, etc.
248 248 # use ~/.cache if empty OR not set
249 249 xdg = env.get("XDG_CACHE_HOME", None) or os.path.join(get_home_dir(), '.cache')
250 250 if xdg and _writable_dir(xdg):
251 251 return py3compat.cast_unicode(xdg, fs_encoding)
252 252
253 253 return None
254 254
255 255
256 256 @undoc
257 257 def get_ipython_dir():
258 258 warn("get_ipython_dir has moved to the IPython.paths module since IPython 4.0.", stacklevel=2)
259 259 from IPython.paths import get_ipython_dir
260 260 return get_ipython_dir()
261 261
262 262 @undoc
263 263 def get_ipython_cache_dir():
264 264 warn("get_ipython_cache_dir has moved to the IPython.paths module since IPython 4.0.", stacklevel=2)
265 265 from IPython.paths import get_ipython_cache_dir
266 266 return get_ipython_cache_dir()
267 267
268 268 @undoc
269 269 def get_ipython_package_dir():
270 270 warn("get_ipython_package_dir has moved to the IPython.paths module since IPython 4.0.", stacklevel=2)
271 271 from IPython.paths import get_ipython_package_dir
272 272 return get_ipython_package_dir()
273 273
274 274 @undoc
275 275 def get_ipython_module_path(module_str):
276 276 warn("get_ipython_module_path has moved to the IPython.paths module since IPython 4.0.", stacklevel=2)
277 277 from IPython.paths import get_ipython_module_path
278 278 return get_ipython_module_path(module_str)
279 279
280 280 @undoc
281 281 def locate_profile(profile='default'):
282 282 warn("locate_profile has moved to the IPython.paths module since IPython 4.0.", stacklevel=2)
283 283 from IPython.paths import locate_profile
284 284 return locate_profile(profile=profile)
285 285
286 286 def expand_path(s):
287 287 """Expand $VARS and ~names in a string, like a shell
288 288
289 289 :Examples:
290 290
291 291 In [2]: os.environ['FOO']='test'
292 292
293 293 In [3]: expand_path('variable FOO is $FOO')
294 294 Out[3]: 'variable FOO is test'
295 295 """
296 296 # This is a pretty subtle hack. When expand user is given a UNC path
297 297 # on Windows (\\server\share$\%username%), os.path.expandvars, removes
298 298 # the $ to get (\\server\share\%username%). I think it considered $
299 299 # alone an empty var. But, we need the $ to remains there (it indicates
300 300 # a hidden share).
301 301 if os.name=='nt':
302 302 s = s.replace('$\\', 'IPYTHON_TEMP')
303 303 s = os.path.expandvars(os.path.expanduser(s))
304 304 if os.name=='nt':
305 305 s = s.replace('IPYTHON_TEMP', '$\\')
306 306 return s
307 307
308 308
309 309 def unescape_glob(string):
310 310 """Unescape glob pattern in `string`."""
311 311 def unescape(s):
312 312 for pattern in '*[]!?':
313 313 s = s.replace(r'\{0}'.format(pattern), pattern)
314 314 return s
315 315 return '\\'.join(map(unescape, string.split('\\\\')))
316 316
317 317
318 318 def shellglob(args):
319 319 """
320 320 Do glob expansion for each element in `args` and return a flattened list.
321 321
322 322 Unmatched glob pattern will remain as-is in the returned list.
323 323
324 324 """
325 325 expanded = []
326 326 # Do not unescape backslash in Windows as it is interpreted as
327 327 # path separator:
328 328 unescape = unescape_glob if sys.platform != 'win32' else lambda x: x
329 329 for a in args:
330 330 expanded.extend(glob.glob(a) or [unescape(a)])
331 331 return expanded
332 332
333 333
334 334 def target_outdated(target,deps):
335 335 """Determine whether a target is out of date.
336 336
337 337 target_outdated(target,deps) -> 1/0
338 338
339 339 deps: list of filenames which MUST exist.
340 340 target: single filename which may or may not exist.
341 341
342 342 If target doesn't exist or is older than any file listed in deps, return
343 343 true, otherwise return false.
344 344 """
345 345 try:
346 346 target_time = os.path.getmtime(target)
347 347 except os.error:
348 348 return 1
349 349 for dep in deps:
350 350 dep_time = os.path.getmtime(dep)
351 351 if dep_time > target_time:
352 352 #print "For target",target,"Dep failed:",dep # dbg
353 353 #print "times (dep,tar):",dep_time,target_time # dbg
354 354 return 1
355 355 return 0
356 356
357 357
358 358 def target_update(target,deps,cmd):
359 359 """Update a target with a given command given a list of dependencies.
360 360
361 361 target_update(target,deps,cmd) -> runs cmd if target is outdated.
362 362
363 363 This is just a wrapper around target_outdated() which calls the given
364 364 command if target is outdated."""
365 365
366 366 if target_outdated(target,deps):
367 367 system(cmd)
368 368
369 369 @undoc
370 370 def filehash(path):
371 371 """Make an MD5 hash of a file, ignoring any differences in line
372 372 ending characters."""
373 373 warn("filehash() is deprecated since IPython 4.0", DeprecationWarning, stacklevel=2)
374 374 with open(path, "rU") as f:
375 375 return md5(py3compat.str_to_bytes(f.read())).hexdigest()
376 376
377 377 ENOLINK = 1998
378 378
379 379 def link(src, dst):
380 380 """Hard links ``src`` to ``dst``, returning 0 or errno.
381 381
382 382 Note that the special errno ``ENOLINK`` will be returned if ``os.link`` isn't
383 383 supported by the operating system.
384 384 """
385 385
386 386 if not hasattr(os, "link"):
387 387 return ENOLINK
388 388 link_errno = 0
389 389 try:
390 390 os.link(src, dst)
391 391 except OSError as e:
392 392 link_errno = e.errno
393 393 return link_errno
394 394
395 395
396 396 def link_or_copy(src, dst):
397 397 """Attempts to hardlink ``src`` to ``dst``, copying if the link fails.
398 398
399 399 Attempts to maintain the semantics of ``shutil.copy``.
400 400
401 401 Because ``os.link`` does not overwrite files, a unique temporary file
402 402 will be used if the target already exists, then that file will be moved
403 403 into place.
404 404 """
405 405
406 406 if os.path.isdir(dst):
407 407 dst = os.path.join(dst, os.path.basename(src))
408 408
409 409 link_errno = link(src, dst)
410 410 if link_errno == errno.EEXIST:
411 411 if os.stat(src).st_ino == os.stat(dst).st_ino:
412 412 # dst is already a hard link to the correct file, so we don't need
413 413 # to do anything else. If we try to link and rename the file
414 414 # anyway, we get duplicate files - see http://bugs.python.org/issue21876
415 415 return
416 416
417 417 new_dst = dst + "-temp-%04X" %(random.randint(1, 16**4), )
418 418 try:
419 419 link_or_copy(src, new_dst)
420 420 except:
421 421 try:
422 422 os.remove(new_dst)
423 423 except OSError:
424 424 pass
425 425 raise
426 426 os.rename(new_dst, dst)
427 427 elif link_errno != 0:
428 428 # Either link isn't supported, or the filesystem doesn't support
429 429 # linking, or 'src' and 'dst' are on different filesystems.
430 430 shutil.copy(src, dst)
431 431
432 432 def ensure_dir_exists(path, mode=0o755):
433 433 """ensure that a directory exists
434 434
435 435 If it doesn't exist, try to create it and protect against a race condition
436 436 if another process is doing the same.
437 437
438 438 The default permissions are 755, which differ from os.makedirs default of 777.
439 439 """
440 440 if not os.path.exists(path):
441 441 try:
442 442 os.makedirs(path, mode=mode)
443 443 except OSError as e:
444 444 if e.errno != errno.EEXIST:
445 445 raise
446 446 elif not os.path.isdir(path):
447 447 raise IOError("%r exists but is not a directory" % path)
General Comments 0
You need to be logged in to leave comments. Login now