os3/fs/directory.py

Summary

Maintainability
A
0 mins
Test Coverage
# -*- coding: utf-8 -*-
import os
import shutil

import six
from colorama import Fore, Style

from os3.core.list import init_tree, Os3List
from os3.fs.entry import Entry
from os3.utils.nodes import deep_scandir


def name_id_parent_fn(item):
    parent = item.parent()
    parent = parent.path if parent is not None else None
    return item.name, item.path, parent


def init_dir_tree(directory, *args):
    directory = directory.clone()
    directory.root = directory.path
    directories = list(sorted(directory, key=lambda x: x.depth()))
    return init_tree([directory] + directories, name_id_parent_fn)


if six.PY3:
    LS_EXCEPTIONS = (PermissionError, OSError)
else:
    LS_EXCEPTIONS = (OSError,)


class Dir(Entry):
    _type = 'directory'
    mimetype = 'inode/directory'

    @classmethod
    def get_dir_list_class(cls):
        return DirList

    def copy(self, dst, symlinks=False, ignore=None):
        shutil.copytree(self.path, os.path.expanduser(dst), symlinks, ignore)

    def ls(self, depth=None, fail=False, **kwargs):
        return self.get_dir_list_class()(self.path, depth, fail, **kwargs)

    def mkdir(self, name, exist_ok=True):
        subdirectory = self.sub(name)
        if not subdirectory.lexists() or not exist_ok:
            os.mkdir(subdirectory.path)
        return subdirectory

    def remove(self):
        return shutil.rmtree(self.path)

    def print_format(self):
        return '{Fore.BLUE}{name}{Style.RESET_ALL}'.format(name=self.name, Fore=Fore, Style=Style)


class DirList(Dir, Os3List):
    _pre_filters = None
    __interfaces__ = ['name']
    __clone_params__ = ['path', 'depth']
    _ls = None

    def __init__(self, path=None, depth=None, fail=False, **kwargs):
        # TODO: renombrar depth a depth
        path = path or os.getcwd()
        super(DirList, self).__init__(path)
        self.depth = depth
        self.fail = fail
        self.root = kwargs.pop('root', None)
        self.default_format = kwargs.pop('default_format', self.default_format)
        self._pre_filters = kwargs

    def _get_iter(self):
        return deep_scandir(self.path, self.depth, cls=self.get_entry_class(), filter=self._filter,
                            traverse_filter=self._traverse_filter, exceptions=self._get_catched_exceptions())
        # return iter(os.listdir(self.path))

    def _get_catched_exceptions(self):
        return LS_EXCEPTIONS if not self.fail else ()

    def _prepare_next(self, elem):
        return self.get_entry_class().get_node(elem.path)
        # return Node.get_node(os.path.join(self.path, elem))

    def _filter(self, elem):
        return elem.check_filters(**self._pre_filters or {}) and elem.check_filters(**self._dict_filters or {})

    def _traverse_filter(self, elem):
        return elem.check_filters(**self._pre_filters or {})

    def tree_format(self, roots=None, fn_tree=None, roots_filter_fn=None):
        return super(DirList, self).tree_format([self], init_dir_tree)

    def print_format(self):
        return Os3List.print_format(self)

    def remove(self):
        for item in self:
            item.remove()