Source code for wiz.filesystem

# :coding: utf-8

import os
import errno
import io
import unicodedata
import re
import gzip
import pwd
import getpass

import six

import wiz.exception


[docs]def get_name(): """Fetch user full name from password database entry. :return: User name of None if name cannot be returned. """ try: return pwd.getpwnam(getpass.getuser()).pw_gecos except KeyError: return
[docs]def export(path, content, compressed=False, overwrite=False): """Create file from *content* in *path*. :param path: Target path to save the file. :param content: Content string to write in *path*. :param compressed: Indicate whether exported file should be compressed. Default is False. :param overwrite: Indicate whether any existing path will be overwritten. Default is False. :raise: :exc:`wiz.exception.FileExists` if overwrite is False and *path* already exists. """ # Ensure that "~" is resolved if necessary and that the relative path is # always converted into a absolute path. path = os.path.abspath(os.path.expanduser(path)) if os.path.isfile(path) and not overwrite: raise wiz.exception.FileExists("{!r} already exists.".format(path)) ensure_directory(os.path.dirname(path)) if compressed: with gzip.open(path, "wb") as outfile: outfile.write(content) else: with io.open(path, "w", encoding="utf8") as outfile: outfile.write(six.text_type(content))
[docs]def is_accessible(folder_path): """Indicate whether the folder path is accessible. :param folder_path: Path to the folder to analyze. :return: Boolean value. """ return os.path.isdir(folder_path) and os.access(folder_path, os.R_OK)
[docs]def ensure_directory(path): """Ensure directory exists at *path*. :param path: Path to the folder to create. :raise: :exc:`OSError` is path is a file. """ # Explicitly indicate that path should be a directory as default OSError # raised by 'os.makedirs' just indicates that the file exists, which is a # bit confusing for user. if os.path.isfile(path): raise OSError("'{}' should be a directory".format(path)) try: os.makedirs(path) except OSError as error: if error.errno != errno.EEXIST: raise if not os.path.isdir(path): raise
[docs]def sanitize_value(value, substitution_character="_", case_sensitive=True): """Return *value* suitable for use with filesystem. :param value: String value to sanitize. :param substitution_character: Symbol to replace awkward characters with. Default is underscore. :param case_sensitive: Indicate whether case should be preserved or if value should be converted to lowercase. Default is True. :return: Sanitized value. """ value = unicodedata.normalize("NFKD", six.u(value)) value = value.encode("ascii", "ignore").decode("ascii") value = re.sub(r"[^\w._\-\\/:%]", substitution_character, value) value = value.strip() if not case_sensitive: value = value.lower() return six.text_type(value)