|
import re |
|
import hashlib |
|
|
|
from typing import Dict, Callable, NamedTuple |
|
from pathlib import Path |
|
|
|
|
|
class Info(NamedTuple): |
|
path: Path |
|
output_ext: str |
|
|
|
|
|
def hash(i: Info, algo='sha1') -> str: |
|
try: |
|
hash = hashlib.new(algo) |
|
except ImportError: |
|
raise ValueError(f"'{algo}' is invalid hash algorithm") |
|
|
|
|
|
with open(i.path, 'rb') as file: |
|
hash.update(file.read()) |
|
|
|
return hash.hexdigest() |
|
|
|
|
|
pattern = re.compile(r'\[([\w:]+)\]') |
|
|
|
|
|
|
|
available_formats: Dict[str, Callable] = { |
|
'name': lambda i: i.path.stem, |
|
'extension': lambda i: i.path.suffix[1:], |
|
'hash': hash, |
|
|
|
'output_extension': lambda i: i.output_ext |
|
} |
|
|
|
|
|
def format(match: re.Match, info: Info) -> str: |
|
matches = match[1].split(':') |
|
name, args = matches[0], matches[1:] |
|
|
|
if name not in available_formats: |
|
return match[0] |
|
|
|
return available_formats[name](info, *args) |
|
|