Source code for pyquickhelper.pycode.clean_helper

"""
Various function to clean files.


:githublink:`%|py|5`
"""
from __future__ import print_function
import os
import re


[docs]def clean_exts(folder=".", fLOG=print, exts=None, fclean=None): """ Cleans files in a folder and subfolders with a given extensions. :param folder: folder to clean :param fLOG: logging function :param exts: extensions to clean :param fclean: if not None, ``fclean(name) -> True`` to clean :return: list of removed files If *exts* is None, it will be replaced by ``{".pyd", ".so", ".o", ".def", ".obj"}``. .. versionchanged:: 1.8 Parameter *fclean* was added. :githublink:`%|py|25` """ if exts is None: exts = {".pyd", ".so", ".o", ".def", ".obj"} rem = [] for root, _, files in os.walk(folder): for f in files: ext = os.path.splitext(f)[-1] if (ext in exts and "exe.win" not in root and "site-packages" not in root and "_venv" not in root): # pragma: no cover filename = os.path.join(root, f) if fclean is not None and not fclean(filename): continue fLOG("[clean_exts] removing ", filename) os.remove(filename) rem.append(filename) return rem
[docs]def clean_files(folder=".", posreg='.*[.]((py)|(rst))$', negreg=".*[.]git/.*", op="CR", fLOG=print): """ Cleans ``\\r`` in files a folder and subfolders with a given extensions. Backslashes are replaces by ``/``. The regular expressions applies on the relative path starting from *folder*. :param folder: folder to clean :param posreg: regular expression to select files to process :param negreg: regular expression to skip files to process :param op: kind of cleaning to do, options are CR, CRb, pep8, see below for more details :param fLOG: logging function :return: list of processed files The following cleaning are available: * ``'CR'``: replaces ``'\\r\\n'`` by ``'\\n'`` * ``'CRB'``: replaces end of lines ``'\\n'`` by ``'\\r\\n'`` * ``'pep8'``: applies :epkg:`pep8` convention :githublink:`%|py|63` """ def clean_file_cr(name): with open(name, "rb") as f: content = f.read() new_content = content.replace(b"\r\n", b"\n") if new_content != content: with open(name, "wb") as f: f.write(new_content) return True return False def clean_file_cr_back(name): with open(name, "rb") as f: lines = f.read().split(b'\n') new_lines = [] changes = False for li in lines: if not li.endswith(b'\r'): new_lines.append(li + b'\r') changes = True else: new_lines.append(li) if changes: with open(name, "wb") as f: f.write(b'\n'.join(new_lines)) return changes if op == 'CR': clean_file = clean_file_cr elif op == 'CRB': clean_file = clean_file_cr_back elif op == 'pep8': from .code_helper import remove_extra_spaces_and_pep8 clean_file = remove_extra_spaces_and_pep8 else: raise ValueError("Unknown cleaning '{0}'.".format(op)) if posreg and isinstance(posreg, str): posreg = re.compile(posreg) if negreg and isinstance(negreg, str): negreg = re.compile(negreg) res = [] for root, _, files in os.walk(folder): for f in files: full = os.path.join(root, f) rel = os.path.relpath(full, folder) fn = rel.replace("\\", "/") if posreg is None or posreg.search(fn): if negreg is None or not negreg.search(fn): r = clean_file(full) if r and fLOG: fLOG("[clean_files] processed '{0}'".format(fn)) res.append(rel) return res