Files

122 lines
3.8 KiB
Python

import os
import re
import sys
from collections import Counter
from typing import List, Tuple
ROOT = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
if ROOT not in sys.path:
sys.path.insert(0, ROOT)
from style_library import LOAD_POLICY_STRICT, StyleLibraryError, iter_pack_paths, load_style_library
ID_RE = re.compile(r"^[a-z0-9_]+$")
COMMA_RE = re.compile(r",(?!\s)")
BANNED_GEAR_TERMS = (
"softbox",
"soft box",
"strobe",
"speedlight",
"beauty dish",
"octabox",
"umbrella",
"ring light",
"ringlight",
"on-camera",
"on camera",
"tripod shot",
)
BANNED_GEAR_RES = [(term, re.compile(re.escape(term), re.IGNORECASE)) for term in BANNED_GEAR_TERMS]
def main() -> int:
try:
library = load_style_library(load_policy=LOAD_POLICY_STRICT)
except StyleLibraryError as exc:
print(f"ERROR: {exc}")
return 2
styles = list(library.styles)
ids = [style.id for style in styles]
names = [style.name for style in styles]
categories = [style.category or "Uncategorized" for style in styles]
print(f"styles: {len(styles)}")
print(f"packs: {len(iter_pack_paths())}")
print("categories:")
for category, count in Counter(categories).most_common():
print(f" {count:4d} {category}")
warnings: List[str] = []
bad_ids = [style_id for style_id in ids if style_id and not ID_RE.match(style_id)]
if bad_ids:
warnings.append(f"bad_ids: {len(bad_ids)} (expected snake_case [a-z0-9_])")
empty_prefix = 0
empty_suffix = 0
missing_tags = 0
missing_variant = 0
comma_without_space: List[Tuple[str, str]] = []
banned_gear_hits: List[Tuple[str, str, str]] = []
for style in styles:
prefix = style.prefix or ""
suffix = style.suffix or ""
if not prefix.strip():
empty_prefix += 1
if not suffix.strip():
empty_suffix += 1
for field, text in (("prefix", prefix), ("suffix", suffix)):
if COMMA_RE.search(text):
comma_without_space.append((style.id, field))
variant_prefix, variant_suffix = style.variants.get("flux_2_klein", ("", ""))
if "flux_2_klein" not in style.variants:
missing_variant += 1
for field, text in (("prefix", prefix), ("suffix", suffix), ("flux_2_klein.prefix", variant_prefix), ("flux_2_klein.suffix", variant_suffix)):
if not text:
continue
for term, pattern in BANNED_GEAR_RES:
if pattern.search(text):
banned_gear_hits.append((style.id, field, term))
if not style.tags:
missing_tags += 1
if empty_prefix:
warnings.append(f"empty_prefix: {empty_prefix}")
if empty_suffix:
warnings.append(f"empty_suffix: {empty_suffix}")
if comma_without_space:
warnings.append(f"comma_without_space: {len(comma_without_space)} (node splits on ', ')")
if missing_tags:
warnings.append(f"missing_tags: {missing_tags}")
if missing_variant:
warnings.append(f"missing_models.flux_2_klein: {missing_variant}")
if len(set(ids)) != len(ids):
warnings.append("duplicate_ids: detected")
if len(set(names)) != len(names):
warnings.append("duplicate_names: detected")
if banned_gear_hits:
warnings.append(f"banned_gear_terms: {len({style_id for style_id, _field, _term in banned_gear_hits})} styles")
if warnings:
print("warnings:")
for warning in warnings:
print(f" - {warning}")
if banned_gear_hits:
print("banned gear term examples:")
for style_id, field, term in banned_gear_hits[:20]:
print(f" - {style_id} ({field}): {term}")
else:
print("warnings: none")
return 0
if __name__ == "__main__":
raise SystemExit(main())