##// END OF EJS Templates
Merge pull request #7278 from minrk/nb-file-ext...
Merge pull request #7278 from minrk/nb-file-ext don't enforce .ipynb extension in URLs

File last commit:

r19005:e918ea99
r19820:3c0bbde4 merge
Show More
utils.py
141 lines | 4.1 KiB | text/x-python | PythonLexer
Min RK
handle various permission failures...
r19005 """Notebook related utilities"""
Brian E. Granger
Splitting handlers into different files....
r10642
Min RK
handle various permission failures...
r19005 # Copyright (c) IPython Development Team.
# Distributed under the terms of the Modified BSD License.
Brian E. Granger
Splitting handlers into different files....
r10642
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
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:
MinRK
update contents per further review...
r17537 if not os.path.exists(path):
path = os.path.dirname(path)
continue
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
Min RK
handle various permission failures...
r19005
def to_api_path(os_path, root=''):
"""Convert a filesystem path to an API path
MinRK
reorganize who knows what about paths...
r15420
Min RK
handle various permission failures...
r19005 If given, root will be removed from the path.
root must be a filesystem path already.
"""
if os_path.startswith(root):
os_path = os_path[len(root):]
parts = os_path.strip(os.path.sep).split(os.path.sep)
parts = [p for p in parts if p != ''] # remove duplicate splits
path = '/'.join(parts)
return path