Skip to content

Commit

Permalink
add validation of directory tree
Browse files Browse the repository at this point in the history
  • Loading branch information
mscheltienne committed Apr 26, 2024
1 parent 4347429 commit 8c91896
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 15 deletions.
16 changes: 13 additions & 3 deletions itvalidator/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,18 @@
_USERCODE_LENGTH: int = 3

ERRORS_CODES: dict[int, str] = {
# file violations
1: "File code does not match folder code.",
2: "Forbidden character in file name stem ('-', '.', ...).",
3: f"User code length is not {_USERCODE_LENGTH} characters.",
4: "User code must be uppercase.",
2: "File name stem contains invalid characters (space, '-', '.', ...).",
3: "File date format is invalid, expected 'YYMMDD'.",
4: "File date is in the future.",
5: f"File user code length is not {_USERCODE_LENGTH} characters.",
6: "File user code must be uppercase.",
# folder violations
100: "Folder code does not match parent folder code.",
101: "Folder code must end with a lowercase letter.",
102: "Folder code last letters are not consecutive lowercase letters.",
103: "Folder name stem contains invalid characters (space, '-', '.', ...).",
# parser failures
200: "File name could not be parsed.",
}
64 changes: 52 additions & 12 deletions itvalidator/validator.py
Original file line number Diff line number Diff line change
@@ -1,26 +1,57 @@
from __future__ import annotations

import string
from datetime import datetime
from typing import TYPE_CHECKING

from .config import _FORBIDDEN_STEM_CHARACTERS, _USERCODE_LENGTH
from .utils._checks import check_type, ensure_path

if TYPE_CHECKING:
from pathlib import Path


def validate_folder(folder: str | Path, include_old: bool):
"""Validate the folder and its subfolders.
def _validate_folder(folder: Path):
"""Validate a folder and its content.
This function recursively calls itself on subfolders.
Parameters
----------
folder : Path
Full path to the folder to validate.
"""
folders = [] # list folders to validate last code letter consecutiveness
for elt in folder.iterdir():
if elt.is_dir() and elt != "__old":
folders.append(elt)
_validate_folder_name(elt)
_validate_folder(folder)
if elt.is_file():
_validate_fname(elt)
folder_letters = sorted([_parse_folder_name(elt.name)[0][-1] for elt in folders])
if "".join(folder_letters) != string.ascii_lowercase[: len(folder_letters)]:
return 103


def _validate_folder_name(folder: Path) -> int:
"""Validate a folder name.
Parameters
----------
folder : str | Path
Folder to validate. The folder and its subfolder will be checked.
include_old : bool
If True, the archive '__old' folder will be included in the validation.
folder : Path
Full path to the folder name to validate.
context : list of Path
List of all folders in the same context (parent folder).
"""
folder = ensure_path(folder, must_exist=True)
check_type(include_old, (bool,), "include_old")
folder_parent_code, _ = _parse_folder_name(folder.parent.name)
code, name = _parse_folder_name(folder.name)
if folder_parent_code != code[:-1]:
return 100
code_letter = code[-1]
if code_letter not in string.ascii_lowercase:
return 101
if any(elt in name for elt in _FORBIDDEN_STEM_CHARACTERS):
return 102


def _validate_fname(fname: Path) -> int:
Expand All @@ -38,15 +69,24 @@ def _validate_fname(fname: Path) -> int:
is found.
"""
folder_code, _ = _parse_folder_name(fname.parent.name)
fname_code, name, usercode = _parse_file_stem(fname.stem)
try:
fname_code, date, name, usercode = _parse_file_stem(fname.stem)
except Exception:
return 200
if folder_code != fname_code:
return 1
if any(elt in name for elt in _FORBIDDEN_STEM_CHARACTERS):
return 2
if len(usercode) != _USERCODE_LENGTH:
try:
date = datetime.strptime(date, "%y%m%d")
except ValueError:
return 3
if any(elt.islower() for elt in usercode):
if datetime.now() < date:
return 4
if len(usercode) != _USERCODE_LENGTH:
return 5
if any(elt.islower() for elt in usercode):
return 6
return 0


Expand Down

0 comments on commit 8c91896

Please sign in to comment.