##// END OF EJS Templates
Make traitlets notify check more robust against classes redefining equality and bool...
Make traitlets notify check more robust against classes redefining equality and bool Before this change, numpy arrays caused problems since comparing two numpy arrays returns an array of truth values, rather than a single truth value. This change guards against redefining the semantics of comparison by notifying on a trait change if the equality comparison returns anything other than an explicit True value.

File last commit:

r15420:f97d9dd3
r15462:e1b4ab8c
Show More
utils.py
125 lines | 3.7 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
# 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:
Brian E. Granger
Creating and testing IPython.html.utils.is_hidden.
r15097 st = os.stat(path)
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