202 lines
7.2 KiB
Python
202 lines
7.2 KiB
Python
|
|
#!/usr/bin/env python3
|
||
|
|
"""
|
||
|
|
Demo Fixtures Summary Script
|
||
|
|
|
||
|
|
Provides a comprehensive summary of the enterprise demo fixtures status.
|
||
|
|
"""
|
||
|
|
|
||
|
|
import json
|
||
|
|
import os
|
||
|
|
from pathlib import Path
|
||
|
|
from collections import defaultdict
|
||
|
|
|
||
|
|
def get_file_info(base_path: Path) -> dict:
|
||
|
|
"""Get information about all fixture files"""
|
||
|
|
info = {
|
||
|
|
"parent": defaultdict(list),
|
||
|
|
"children": defaultdict(dict)
|
||
|
|
}
|
||
|
|
|
||
|
|
# Parent files
|
||
|
|
parent_dir = base_path / "parent"
|
||
|
|
if parent_dir.exists():
|
||
|
|
for file_path in parent_dir.glob("*.json"):
|
||
|
|
file_size = file_path.stat().st_size
|
||
|
|
info["parent"][file_path.name] = {
|
||
|
|
"size_bytes": file_size,
|
||
|
|
"size_kb": round(file_size / 1024, 2)
|
||
|
|
}
|
||
|
|
|
||
|
|
# Children files
|
||
|
|
children_dir = base_path / "children"
|
||
|
|
if children_dir.exists():
|
||
|
|
for child_dir in children_dir.iterdir():
|
||
|
|
if child_dir.is_dir():
|
||
|
|
tenant_id = child_dir.name
|
||
|
|
for file_path in child_dir.glob("*.json"):
|
||
|
|
file_size = file_path.stat().st_size
|
||
|
|
if tenant_id not in info["children"]:
|
||
|
|
info["children"][tenant_id] = {}
|
||
|
|
info["children"][tenant_id][file_path.name] = {
|
||
|
|
"size_bytes": file_size,
|
||
|
|
"size_kb": round(file_size / 1024, 2)
|
||
|
|
}
|
||
|
|
|
||
|
|
return info
|
||
|
|
|
||
|
|
def count_entities(base_path: Path) -> dict:
|
||
|
|
"""Count entities in fixture files"""
|
||
|
|
counts = {
|
||
|
|
"parent": defaultdict(int),
|
||
|
|
"children": defaultdict(lambda: defaultdict(int))
|
||
|
|
}
|
||
|
|
|
||
|
|
# Parent counts
|
||
|
|
parent_dir = base_path / "parent"
|
||
|
|
if parent_dir.exists():
|
||
|
|
# Tenants
|
||
|
|
tenant_file = parent_dir / "01-tenant.json"
|
||
|
|
if tenant_file.exists():
|
||
|
|
with open(tenant_file, 'r') as f:
|
||
|
|
data = json.load(f)
|
||
|
|
counts["parent"]["tenants"] = 1 + len(data.get("children", []))
|
||
|
|
|
||
|
|
# Users
|
||
|
|
auth_file = parent_dir / "02-auth.json"
|
||
|
|
if auth_file.exists():
|
||
|
|
with open(auth_file, 'r') as f:
|
||
|
|
data = json.load(f)
|
||
|
|
counts["parent"]["users"] = len(data.get("users", []))
|
||
|
|
|
||
|
|
# Inventory
|
||
|
|
inventory_file = parent_dir / "03-inventory.json"
|
||
|
|
if inventory_file.exists():
|
||
|
|
with open(inventory_file, 'r') as f:
|
||
|
|
data = json.load(f)
|
||
|
|
counts["parent"]["ingredients"] = len(data.get("ingredients", []))
|
||
|
|
counts["parent"]["products"] = len(data.get("products", []))
|
||
|
|
|
||
|
|
# Recipes
|
||
|
|
recipes_file = parent_dir / "04-recipes.json"
|
||
|
|
if recipes_file.exists():
|
||
|
|
with open(recipes_file, 'r') as f:
|
||
|
|
data = json.load(f)
|
||
|
|
counts["parent"]["recipes"] = len(data.get("recipes", []))
|
||
|
|
|
||
|
|
# Suppliers
|
||
|
|
suppliers_file = parent_dir / "05-suppliers.json"
|
||
|
|
if suppliers_file.exists():
|
||
|
|
with open(suppliers_file, 'r') as f:
|
||
|
|
data = json.load(f)
|
||
|
|
counts["parent"]["suppliers"] = len(data.get("suppliers", []))
|
||
|
|
|
||
|
|
# Children counts
|
||
|
|
children_dir = base_path / "children"
|
||
|
|
if children_dir.exists():
|
||
|
|
for child_dir in children_dir.iterdir():
|
||
|
|
if child_dir.is_dir():
|
||
|
|
tenant_id = child_dir.name
|
||
|
|
|
||
|
|
# Users
|
||
|
|
auth_file = child_dir / "02-auth.json"
|
||
|
|
if auth_file.exists():
|
||
|
|
with open(auth_file, 'r') as f:
|
||
|
|
data = json.load(f)
|
||
|
|
counts["children"][tenant_id]["users"] = len(data.get("users", []))
|
||
|
|
|
||
|
|
# Inventory
|
||
|
|
inventory_file = child_dir / "03-inventory.json"
|
||
|
|
if inventory_file.exists():
|
||
|
|
with open(inventory_file, 'r') as f:
|
||
|
|
data = json.load(f)
|
||
|
|
counts["children"][tenant_id]["ingredients"] = len(data.get("ingredients", []))
|
||
|
|
counts["children"][tenant_id]["products"] = len(data.get("products", []))
|
||
|
|
|
||
|
|
# Recipes
|
||
|
|
recipes_file = child_dir / "04-recipes.json"
|
||
|
|
if recipes_file.exists():
|
||
|
|
with open(recipes_file, 'r') as f:
|
||
|
|
data = json.load(f)
|
||
|
|
counts["children"][tenant_id]["recipes"] = len(data.get("recipes", []))
|
||
|
|
|
||
|
|
# Suppliers
|
||
|
|
suppliers_file = child_dir / "05-suppliers.json"
|
||
|
|
if suppliers_file.exists():
|
||
|
|
with open(suppliers_file, 'r') as f:
|
||
|
|
data = json.load(f)
|
||
|
|
counts["children"][tenant_id]["suppliers"] = len(data.get("suppliers", []))
|
||
|
|
|
||
|
|
return counts
|
||
|
|
|
||
|
|
def main():
|
||
|
|
"""Main function to display summary"""
|
||
|
|
print("=== Enterprise Demo Fixtures Summary ===")
|
||
|
|
print()
|
||
|
|
|
||
|
|
base_path = Path("shared/demo/fixtures/enterprise")
|
||
|
|
|
||
|
|
# File information
|
||
|
|
print("📁 FILE INFORMATION")
|
||
|
|
print("-" * 50)
|
||
|
|
|
||
|
|
file_info = get_file_info(base_path)
|
||
|
|
|
||
|
|
print("Parent Files:")
|
||
|
|
for filename, info in file_info["parent"].items():
|
||
|
|
print(f" {filename}: {info['size_kb']} KB")
|
||
|
|
|
||
|
|
print(f"\nChild Files ({len(file_info['children'])} locations):")
|
||
|
|
for tenant_id, files in file_info["children"].items():
|
||
|
|
print(f" {tenant_id}:")
|
||
|
|
for filename, info in files.items():
|
||
|
|
print(f" {filename}: {info['size_kb']} KB")
|
||
|
|
|
||
|
|
# Entity counts
|
||
|
|
print("\n📊 ENTITY COUNTS")
|
||
|
|
print("-" * 50)
|
||
|
|
|
||
|
|
counts = count_entities(base_path)
|
||
|
|
|
||
|
|
print("Parent Entities:")
|
||
|
|
for entity_type, count in counts["parent"].items():
|
||
|
|
print(f" {entity_type}: {count}")
|
||
|
|
|
||
|
|
print(f"\nChild Entities ({len(counts['children'])} locations):")
|
||
|
|
for tenant_id, entity_counts in counts["children"].items():
|
||
|
|
print(f" {tenant_id}:")
|
||
|
|
for entity_type, count in entity_counts.items():
|
||
|
|
print(f" {entity_type}: {count}")
|
||
|
|
|
||
|
|
# Totals
|
||
|
|
print("\n📈 TOTALS")
|
||
|
|
print("-" * 50)
|
||
|
|
|
||
|
|
total_users = counts["parent"]["users"]
|
||
|
|
total_tenants = counts["parent"]["tenants"]
|
||
|
|
total_ingredients = counts["parent"]["ingredients"]
|
||
|
|
total_products = counts["parent"]["products"]
|
||
|
|
total_recipes = counts["parent"]["recipes"]
|
||
|
|
total_suppliers = counts["parent"]["suppliers"]
|
||
|
|
|
||
|
|
for tenant_id, entity_counts in counts["children"].items():
|
||
|
|
total_users += entity_counts.get("users", 0)
|
||
|
|
total_ingredients += entity_counts.get("ingredients", 0)
|
||
|
|
total_products += entity_counts.get("products", 0)
|
||
|
|
total_recipes += entity_counts.get("recipes", 0)
|
||
|
|
total_suppliers += entity_counts.get("suppliers", 0)
|
||
|
|
|
||
|
|
print(f"Total Tenants: {total_tenants}")
|
||
|
|
print(f"Total Users: {total_users}")
|
||
|
|
print(f"Total Ingredients: {total_ingredients}")
|
||
|
|
print(f"Total Products: {total_products}")
|
||
|
|
print(f"Total Recipes: {total_recipes}")
|
||
|
|
print(f"Total Suppliers: {total_suppliers}")
|
||
|
|
|
||
|
|
print("\n✅ VALIDATION STATUS")
|
||
|
|
print("-" * 50)
|
||
|
|
print("All cross-references validated successfully!")
|
||
|
|
print("No missing IDs or broken relationships detected.")
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
main()
|