mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2025-07-18 14:34:24 +02:00
50 lines
1.6 KiB
Python
50 lines
1.6 KiB
Python
import os
|
|
import yaml
|
|
|
|
def load_categories_tree(categories_file):
|
|
with open(categories_file, 'r', encoding='utf-8') as f:
|
|
categories = yaml.safe_load(f)['roles']
|
|
return categories
|
|
|
|
def flatten_categories(tree, prefix=''):
|
|
"""Flattens nested category tree to all possible category paths."""
|
|
result = []
|
|
for k, v in tree.items():
|
|
current = f"{prefix}-{k}" if prefix else k
|
|
result.append(current)
|
|
if isinstance(v, dict):
|
|
for sk, sv in v.items():
|
|
if isinstance(sv, dict):
|
|
result.extend(flatten_categories({sk: sv}, current))
|
|
return result
|
|
|
|
def get_entity_name(role_name):
|
|
"""
|
|
Get the entity name from a role name by removing the
|
|
longest matching category path from categories.yml.
|
|
"""
|
|
possible_locations = [
|
|
os.path.join(os.getcwd(), 'roles', 'categories.yml'),
|
|
os.path.join(os.path.dirname(__file__), '..', 'roles', 'categories.yml'),
|
|
'roles/categories.yml',
|
|
]
|
|
categories_file = None
|
|
for loc in possible_locations:
|
|
if os.path.exists(loc):
|
|
categories_file = loc
|
|
break
|
|
if not categories_file:
|
|
return role_name
|
|
|
|
categories_tree = load_categories_tree(categories_file)
|
|
all_category_paths = flatten_categories(categories_tree)
|
|
|
|
role_name_lc = role_name.lower()
|
|
all_category_paths = [cat.lower() for cat in all_category_paths]
|
|
for cat in sorted(all_category_paths, key=len, reverse=True):
|
|
if role_name_lc.startswith(cat + "-"):
|
|
return role_name[len(cat) + 1:]
|
|
if role_name_lc == cat:
|
|
return ""
|
|
return role_name
|