diff options
Diffstat (limited to 'release/scripts/modules/bpy/path.py')
-rw-r--r-- | release/scripts/modules/bpy/path.py | 86 |
1 files changed, 57 insertions, 29 deletions
diff --git a/release/scripts/modules/bpy/path.py b/release/scripts/modules/bpy/path.py index eb1a5ffc455..a01745fec0a 100644 --- a/release/scripts/modules/bpy/path.py +++ b/release/scripts/modules/bpy/path.py @@ -16,26 +16,44 @@ # # ##### END GPL LICENSE BLOCK ##### -# <pep8 compliant> +# <pep8-80 compliant> """ This module has a similar scope to os.path, containing utility functions for dealing with paths in Blender. """ +__all__ = ( + "abspath", + "basename", + "clean_name", + "display_name", + "display_name_from_filepath", + "ensure_ext", + "is_subdir", + "module_names", + "relpath", + "resolve_ncase", + ) + import bpy as _bpy import os as _os def abspath(path, start=None): """ - Returns the absolute path relative to the current blend file using the "//" prefix. + Returns the absolute path relative to the current blend file + using the "//" prefix. - :arg start: Relative to this path, when not set the current filename is used. + :arg start: Relative to this path, + when not set the current filename is used. :type start: string """ if path.startswith("//"): - return _os.path.join(_os.path.dirname(_bpy.data.filepath) if start is None else start, path[2:]) + return _os.path.join(_os.path.dirname(_bpy.data.filepath) + if start is None else start, + path[2:], + ) return path @@ -44,7 +62,8 @@ def relpath(path, start=None): """ Returns the path relative to the current blend file using the "//" prefix. - :arg start: Relative to this path, when not set the current filename is used. + :arg start: Relative to this path, + when not set the current filename is used. :type start: string """ if not path.startswith("//"): @@ -68,27 +87,28 @@ def is_subdir(path, directory): def clean_name(name, replace="_"): """ - Returns a name with characters replaced that may cause problems under various circumstances, such as writing to a file. + Returns a name with characters replaced that + may cause problems under various circumstances, + such as writing to a file. All characters besides A-Z/a-z, 0-9 are replaced with "_" or the replace argument if defined. """ - unclean_chars = \ - "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\ - \x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\ - \x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\ - \x2e\x2f\x3a\x3b\x3c\x3d\x3e\x3f\x40\x5b\x5c\x5d\x5e\x60\x7b\ - \x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\ - \x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\ - \x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\ - \xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\ - \xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\ - \xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\ - \xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\ - \xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\ - \xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe" - - for ch in unclean_chars: + bad_chars = ("\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e" + "\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d" + "\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c" + "\x2e\x2f\x3a\x3b\x3c\x3d\x3e\x3f\x40\x5b\x5c\x5d\x5e\x60\x7b" + "\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a" + "\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99" + "\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8" + "\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7" + "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6" + "\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5" + "\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4" + "\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3" + "\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe") + + for ch in bad_chars: name = name.replace(ch, replace) return name @@ -96,8 +116,9 @@ def clean_name(name, replace="_"): def display_name(name): """ Creates a display string from name to be used menus and the user interface. - Capitalize the first letter in all lowercase names, mixed case names are kept as is. - Intended for use with filenames and module names. + Capitalize the first letter in all lowercase names, + mixed case names are kept as is. Intended for use with + filenames and module names. """ name_base = _os.path.splitext(name)[0] @@ -115,9 +136,11 @@ def display_name(name): def display_name_from_filepath(name): """ - Returns the path stripped of directort and extension, ensured to be utf8 compatible. + Returns the path stripped of directort and extension, + ensured to be utf8 compatible. """ - return _os.path.splitext(basename(name))[0].encode("utf8", "replace").decode("utf8") + name = _os.path.splitext(basename(name))[0] + return name.encode("utf8", "replace").decode("utf8") def resolve_ncase(path): @@ -132,7 +155,8 @@ def resolve_ncase(path): if not path or os.path.exists(path): return path, True - filename = os.path.basename(path) # filename may be a directory or a file + # filename may be a directory or a file + filename = os.path.basename(path) dirpath = os.path.dirname(path) suffix = path[:0] # "" but ensure byte/str match @@ -190,7 +214,9 @@ def ensure_ext(filepath, ext, case_sensitive=False): import os fn_base, fn_ext = os.path.splitext(filepath) if fn_base and fn_ext: - if (case_sensitive and ext == fn_ext) or (ext.lower() == fn_ext.lower()): + if ((case_sensitive and ext == fn_ext) or + (ext.lower() == fn_ext.lower())): + return filepath else: return fn_base + ext @@ -228,7 +254,9 @@ def module_names(path, recursive=False): modules.append((filename, fullpath)) if recursive: for mod_name, mod_path in module_names(directory, True): - modules.append(("%s.%s" % (filename, mod_name), mod_path)) + modules.append(("%s.%s" % (filename, mod_name), + mod_path, + )) return modules |