Source code for cleanmymac.util

#
# author: Cosmin Basca
#
# Copyright 2015 Cosmin Basca
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#        http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
import os
import shutil
import click
from contextlib import contextmanager
from collections import namedtuple

from cleanmymac.log import error
from cleanmymac.constants import UNIT_KB, UNIT_MB, UNIT_GB


[docs]def yaml_files(path): """ generator of **YAML** files in the give path. :param path: the path to scan for *YAML* files :return: a generator :raise: :class:`ValueError` if path is not a valid directory """ if not os.path.isdir(path): raise ValueError('{0} not a directory'.format(path)) for _file in os.listdir(path): if _file.endswith(".yaml"): yield os.path.splitext(_file)[0], os.path.join(path, _file)
#: a :func:`collections.namedtuple` holding disk usage statistics DiskUsage = namedtuple('DiskUsage', ['total', 'used', 'free'])
[docs]def get_disk_usage(path='/', unit=UNIT_KB): """ retrieve disk usage statistics for a given path this function was inspired by the following *stackoverflow* discussion: http://stackoverflow.com/questions/787776/find-free-disk-space-in-python-on-os-x :param str path: the path (defaults to **/**) :param long unit: the measurement unit :return: the usage statistics :rtype: DiskUsage """ stats = os.statvfs(path) free = stats.f_bavail * stats.f_frsize total = stats.f_blocks * stats.f_frsize used = (stats.f_blocks - stats.f_bfree) * stats.f_frsize return DiskUsage(float(total) / unit, float(used) / unit, float(free) / unit)
#: a list of directories DirList = namedtuple('DirList', ['dirs']) #: a single directory Dir = namedtuple('Dir', ['path'])
[docs]def delete_dir_content(folder): """ delete all the files and directories in path :param Dir folder: a valid directory path """ assert isinstance(folder, Dir) if not os.path.isdir(folder.path): error('{0} not a directory'.format(folder.path)) return for root, dirs, files in os.walk(folder.path): for f in files: os.unlink(os.path.join(root, f)) for d in dirs: shutil.rmtree(os.path.join(root, d))
[docs]def delete_dirs(dir_list): """ delete all directories in list :param DirList dir_list: the list of directories """ assert isinstance(dir_list, DirList) for d in dir_list.dirs: if os.path.isdir(d): shutil.rmtree(d)
@contextmanager
[docs]def progressbar(verbose, iterable, **kwargs): """ wrapper over the :func:`click.progressbar` context manager :param bool verbose: if False use the :func:`click.progressbar`, else return `iterable` :param iterable iterable: the iterable object :param dict kwargs: extra arguments for :func:`click.progressbar` :return: an iterator :rtype: iterable """ if verbose: yield iterable else: #: default template '%(label)s [%(bar)s] %(info)s' kwargs['bar_template'] = '%(label)s [{0}] {1}'.format( click.style('%(bar)s', fg='blue'), click.style('%(info)s', fg='yellow')) with click.progressbar(iterable, **kwargs) as bar: yield bar