normalisename/normalisename.py

64 lines
1.8 KiB
Python
Raw Normal View History

from os.path import basename, dirname
from os.path import join as joinpath
from re import sub
from collections.abc import Iterable
from unidecode import unidecode
2016-12-08 17:15:56 +00:00
class Normalisename:
def __init__(self, operation, separator, whitelist):
self._operation, self.operation = None, operation
self._separator = separator
self._whitelist = set(whitelist)
@property
def operation(self):
return self._operation
@operation.setter
def operation(self, value):
if not callable(value):
raise ValueError('Operation must be callable!')
self._operation = value
@property
def separator(self):
return self._separator
@property
def whitelist(self):
return self._whitelist.union({self.separator})
def __call__(self, path_or_paths):
if isinstance(path_or_paths, str):
self.normalise(path_or_paths)
elif isinstance(path_or_paths, Iterable):
self.normalise_all(path_or_paths)
else:
raise ValueError('Argument must be str Iterable[str]!')
def normalise_all(self, paths):
for path in paths:
self.normalise(path)
def normalise(self, path):
directory = dirname(path)
filename = basename(path)
normalpath = joinpath(directory, self.normalname(filename))
if path != normalpath:
self.operation(path, normalpath) # pylint: disable=not-callable
def check_normal(self, path):
filename = basename(path)
return filename == self.normalname(filename)
def normalname(self, filename):
return unidecode(
''.join(
ch for ch in sub(r'\s+', self.separator, filename)
if ch.isalnum()
or ch in self.whitelist
)
)