##// END OF EJS Templates
Merge pull request #6184 from takluyver/rm-py3compat-open...
Merge pull request #6184 from takluyver/rm-py3compat-open Remove py3compat.open

File last commit:

r15904:f136e107
r17304:ecdfa090 merge
Show More
utils.py
137 lines | 4.0 KiB | text/x-python | PythonLexer
Brian E. Granger
Splitting handlers into different files....
r10642 """Notebook related utilities
Authors:
* Brian Granger
"""
#-----------------------------------------------------------------------------
# Copyright (C) 2011 The IPython Development Team
#
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
#-----------------------------------------------------------------------------
Brian E. Granger
Creating and testing IPython.html.utils.is_hidden.
r15097 from __future__ import print_function
MinRK
add path2url and url2path to html.utils
r13054 import os
Brian E. Granger
Creating and testing IPython.html.utils.is_hidden.
r15097 import stat
Thomas Kluyver
Fix imports in IPython.html.utils
r13389 try:
from urllib.parse import quote, unquote
except ImportError:
from urllib import quote, unquote
MinRK
add path2url and url2path to html.utils
r13054
MinRK
urllib.quote/unquote must be str on Python 2
r13131 from IPython.utils import py3compat
Brian E. Granger
Creating and testing IPython.html.utils.is_hidden.
r15097 # UF_HIDDEN is a stat flag not defined in the stat module.
# It is used by BSD to indicate hidden files.
UF_HIDDEN = getattr(stat, 'UF_HIDDEN', 32768)
Brian E. Granger
Splitting handlers into different files....
r10642 #-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
def url_path_join(*pieces):
"""Join components of url into a relative url
Use to prevent double slash when joining subpath. This will leave the
initial and final / in place
"""
initial = pieces[0].startswith('/')
final = pieces[-1].endswith('/')
MinRK
add path2url and url2path to html.utils
r13054 stripped = [s.strip('/') for s in pieces]
result = '/'.join(s for s in stripped if s)
Brian E. Granger
Splitting handlers into different files....
r10642 if initial: result = '/' + result
if final: result = result + '/'
Brian E. Granger
Fixing url join problems.
r10644 if result == '//': result = '/'
Brian E. Granger
Splitting handlers into different files....
r10642 return result
MinRK
add path2url and url2path to html.utils
r13054
def path2url(path):
"""Convert a local file path to a URL"""
MinRK
s/os.path.sep/os.sep/
r13182 pieces = [ quote(p) for p in path.split(os.sep) ]
MinRK
add path2url and url2path to html.utils
r13054 # preserve trailing /
if pieces[-1] == '':
pieces[-1] = '/'
url = url_path_join(*pieces)
return url
def url2path(url):
"""Convert a URL to a local file path"""
pieces = [ unquote(p) for p in url.split('/') ]
path = os.path.join(*pieces)
return path
MinRK
move url_[un]escape to utils from nbm
r13068 def url_escape(path):
"""Escape special characters in a URL path
Turns '/foo bar/' into '/foo%20bar/'
"""
MinRK
urllib.quote/unquote must be str on Python 2
r13131 parts = py3compat.unicode_to_str(path).split('/')
return u'/'.join([quote(p) for p in parts])
MinRK
move url_[un]escape to utils from nbm
r13068
def url_unescape(path):
"""Unescape special characters in a URL path
Turns '/foo%20bar/' into '/foo bar/'
"""
MinRK
urllib.quote/unquote must be str on Python 2
r13131 return u'/'.join([
py3compat.str_to_unicode(unquote(p))
for p in py3compat.unicode_to_str(path).split('/')
])
MinRK
move url_[un]escape to utils from nbm
r13068
Brian E. Granger
Small refactoring of is_hidden to take root as default kwarg.
r15108 def is_hidden(abs_path, abs_root=''):
MinRK
reorganize who knows what about paths...
r15420 """Is a file hidden or contained in a hidden directory?
Brian E. Granger
Creating and testing IPython.html.utils.is_hidden.
r15097
Brian E. Granger
Small refactoring of is_hidden to take root as default kwarg.
r15108 This will start with the rightmost path element and work backwards to the
given root to see if a path is hidden or in a hidden directory. Hidden is
determined by either name starting with '.' or the UF_HIDDEN flag as
reported by stat.
Brian E. Granger
Creating and testing IPython.html.utils.is_hidden.
r15097
Parameters
----------
Brian E. Granger
Small refactoring of is_hidden to take root as default kwarg.
r15108 abs_path : unicode
The absolute path to check for hidden directories.
abs_root : unicode
The absolute path of the root directory in which hidden directories
Brian E. Granger
Fix spelling mistake in is_hidden docstring.
r15109 should be checked for.
Brian E. Granger
Creating and testing IPython.html.utils.is_hidden.
r15097 """
Brian E. Granger
Small refactoring of is_hidden to take root as default kwarg.
r15108 if not abs_root:
abs_root = abs_path.split(os.sep, 1)[0] + os.sep
inside_root = abs_path[len(abs_root):]
Brian E. Granger
Creating and testing IPython.html.utils.is_hidden.
r15097 if any(part.startswith('.') for part in inside_root.split(os.sep)):
return True
MinRK
only check listdir on dirs...
r15904
# check that dirs can be listed
# may fail on Windows junctions or non-user-readable dirs
if os.path.isdir(abs_path):
try:
os.listdir(abs_path)
except OSError:
return True
Brian E. Granger
Creating and testing IPython.html.utils.is_hidden.
r15097
# check UF_HIDDEN on any location up to root
Brian E. Granger
Small refactoring of is_hidden to take root as default kwarg.
r15108 path = abs_path
while path and path.startswith(abs_root) and path != abs_root:
cgohlke
Fix filenbmanager.list_dirs fails for Windows user profile directory
r15810 try:
# may fail on Windows junctions
st = os.stat(path)
MinRK
only check listdir on dirs...
r15904 except OSError:
cgohlke
Fix filenbmanager.list_dirs fails for Windows user profile directory
r15810 return True
Brian E. Granger
Creating and testing IPython.html.utils.is_hidden.
r15097 if getattr(st, 'st_flags', 0) & UF_HIDDEN:
return True
path = os.path.dirname(path)
return False
MinRK
reorganize who knows what about paths...
r15420 def to_os_path(path, root=''):
"""Convert an API path to a filesystem path
If given, root will be prepended to the path.
root must be a filesystem path already.
"""
parts = path.strip('/').split('/')
parts = [p for p in parts if p != ''] # remove duplicate splits
path = os.path.join(root, *parts)
return path