from os import listdir from os.path import isdir, isfile, join from json import dump,dumps, loads import argparse def create_addons_json(sha): ADDONS = {"addons":{}} addon_root = './CSS/addons' addon_folders = [name for name in listdir(addon_root) if isdir(join(addon_root, name))] for app in addon_folders: app_addons = [addon for addon in listdir(f"{addon_root}/{app}")] ADDONS["addons"].update({ app: { addon: {} for addon in app_addons } }) for addon in app_addons: files = [file for file in listdir( f"{addon_root}/{app}/{addon}") if isfile(join(f"{addon_root}/{app}/{addon}", file))] ADDONS["addons"].update({ app: { addon: { "css": [f"https://{DOMAIN}/CSS/addons/{app}/{addon}/{file}?sha={sha}" for file in files if file.split(".")[1] == "css"] } } }) extra_dirs = [dir for dir in listdir( f"{addon_root}/{app}/{addon}") if isdir(join(f"{addon_root}/{app}/{addon}", dir))] if extra_dirs: for dir in extra_dirs: extra_dir_files = [file for file in listdir( f"{addon_root}/{app}/{addon}/{dir}") if isfile(join(f"{addon_root}/{app}/{addon}/{dir}", file))] ADDONS["addons"][app].update({ addon: { dir: { "css": [f"https://{DOMAIN}/CSS/addons/{app}/{addon}/{dir}/{extra_file}?sha={sha}" for extra_file in extra_dir_files if extra_file.split(".")[1] == "css"] } for dir in extra_dirs } }) return dumps(ADDONS) def create_json(sha,app_folders:list=None,themes:list=None,no_sub_folders=False): if no_sub_folders: THEMES = {} for theme in themes: THEMES.update({ "themes": { theme.split(".")[0].capitalize(): { "url": f"https://{DOMAIN}/CSS/variables/{theme}?sha={sha}" }for theme in themes } }) return dumps(THEMES) else: ADDONS = loads(create_addons_json(sha)) APPS = {"applications":{}} for app in app_folders: APPS.update({ "applications":{ app: { "base_css": f"https://{DOMAIN}/CSS/themes/{app}/{app}-base.css?sha={sha}", "addons": ADDONS["addons"][app] if app in ADDONS["addons"] else {} } for app in app_folders } } ) THEMES = loads(create_json(sha,themes=themes,no_sub_folders=True)) APPS.update(ADDONS) APPS.update(THEMES) return dumps(APPS) if __name__== "__main__": parser = argparse.ArgumentParser("Creates a JSON file with some information on all applications and themes") parser.add_argument("--sha", required=True, help="This is the commit SHA we use for 'versioning' on CSS files") args = parser.parse_args() sha = args.sha app_folders = [name for name in listdir('./CSS/themes') if isdir(join('./CSS/themes', name))] themes = [name for name in listdir('./CSS/variables') if isfile(join('./CSS/variables', name))] DOMAIN = open("CNAME","rt",closefd=True).readline() apps = loads(create_json(sha,app_folders,themes)) with open("themes.json", "w") as outfile: dump(apps, outfile,indent=2)