API: remove all python dataclasses for clanModules (services)

This commit is contained in:
Johannes Kirschbauer
2024-09-12 15:54:29 +02:00
parent 46602b508c
commit 39518d302b
5 changed files with 20 additions and 233 deletions

View File

@@ -30,233 +30,9 @@ class Meta:
icon: None | str = field(default = None)
@dataclass
class AdminConfig:
allowedKeys: dict[str, str] = field(default_factory = dict)
@dataclass
class ServiceAdminMachine:
config: AdminConfig = field(default_factory = AdminConfig)
imports: list[str] = field(default_factory = list)
@dataclass
class ServiceMeta:
name: str
description: None | str = field(default = None)
icon: None | str = field(default = None)
@dataclass
class ServiceAdminRoleDefault:
config: AdminConfig = field(default_factory = AdminConfig)
imports: list[str] = field(default_factory = list)
machines: list[str] = field(default_factory = list)
tags: list[str] = field(default_factory = list)
@dataclass
class ServiceAdminRole:
default: ServiceAdminRoleDefault
@dataclass
class ServiceAdmin:
meta: ServiceMeta
roles: ServiceAdminRole
config: AdminConfig = field(default_factory = AdminConfig)
machines: dict[str, ServiceAdminMachine] = field(default_factory = dict)
@dataclass
class BorgbackupConfigDestination:
name: str
repo: str
@dataclass
class BorgbackupConfig:
destinations: dict[str, BorgbackupConfigDestination] = field(default_factory = dict)
exclude: list[str] = field(default_factory = list)
@dataclass
class ServiceBorgbackupMachine:
config: BorgbackupConfig = field(default_factory = BorgbackupConfig)
imports: list[str] = field(default_factory = list)
@dataclass
class ServiceBorgbackupRoleClient:
config: BorgbackupConfig = field(default_factory = BorgbackupConfig)
imports: list[str] = field(default_factory = list)
machines: list[str] = field(default_factory = list)
tags: list[str] = field(default_factory = list)
@dataclass
class ServiceBorgbackupRoleServer:
config: BorgbackupConfig = field(default_factory = BorgbackupConfig)
imports: list[str] = field(default_factory = list)
machines: list[str] = field(default_factory = list)
tags: list[str] = field(default_factory = list)
@dataclass
class ServiceBorgbackupRole:
client: ServiceBorgbackupRoleClient
server: ServiceBorgbackupRoleServer
@dataclass
class ServiceBorgbackup:
meta: ServiceMeta
roles: ServiceBorgbackupRole
config: BorgbackupConfig = field(default_factory = BorgbackupConfig)
machines: dict[str, ServiceBorgbackupMachine] = field(default_factory = dict)
@dataclass
class IwdConfigNetwork:
ssid: str
@dataclass
class IwdConfig:
networks: dict[str, IwdConfigNetwork] = field(default_factory = dict)
@dataclass
class ServiceIwdMachine:
config: IwdConfig = field(default_factory = IwdConfig)
imports: list[str] = field(default_factory = list)
@dataclass
class ServiceIwdRoleDefault:
config: IwdConfig = field(default_factory = IwdConfig)
imports: list[str] = field(default_factory = list)
machines: list[str] = field(default_factory = list)
tags: list[str] = field(default_factory = list)
@dataclass
class ServiceIwdRole:
default: ServiceIwdRoleDefault
@dataclass
class ServiceIwd:
meta: ServiceMeta
roles: ServiceIwdRole
config: IwdConfig = field(default_factory = IwdConfig)
machines: dict[str, ServiceIwdMachine] = field(default_factory = dict)
@dataclass
class PackagesConfig:
packages: list[str] = field(default_factory = list)
@dataclass
class ServicePackageMachine:
config: PackagesConfig = field(default_factory = PackagesConfig)
imports: list[str] = field(default_factory = list)
@dataclass
class ServicePackageRoleDefault:
config: PackagesConfig = field(default_factory = PackagesConfig)
imports: list[str] = field(default_factory = list)
machines: list[str] = field(default_factory = list)
tags: list[str] = field(default_factory = list)
@dataclass
class ServicePackageRole:
default: ServicePackageRoleDefault
@dataclass
class ServicePackage:
meta: ServiceMeta
roles: ServicePackageRole
config: PackagesConfig = field(default_factory = PackagesConfig)
machines: dict[str, ServicePackageMachine] = field(default_factory = dict)
@dataclass
class SingleDiskConfig:
device: None | str = field(default = None)
@dataclass
class ServiceSingleDiskMachine:
config: SingleDiskConfig = field(default_factory = SingleDiskConfig)
imports: list[str] = field(default_factory = list)
@dataclass
class ServiceSingleDiskRoleDefault:
config: SingleDiskConfig = field(default_factory = SingleDiskConfig)
imports: list[str] = field(default_factory = list)
machines: list[str] = field(default_factory = list)
tags: list[str] = field(default_factory = list)
@dataclass
class ServiceSingleDiskRole:
default: ServiceSingleDiskRoleDefault
@dataclass
class ServiceSingleDisk:
meta: ServiceMeta
roles: ServiceSingleDiskRole
config: SingleDiskConfig = field(default_factory = SingleDiskConfig)
machines: dict[str, ServiceSingleDiskMachine] = field(default_factory = dict)
@dataclass
class StateVersionConfig:
pass
@dataclass
class ServiceStateVersionMachine:
config: StateVersionConfig = field(default_factory = StateVersionConfig)
imports: list[str] = field(default_factory = list)
@dataclass
class ServiceStateVersionRoleDefault:
config: StateVersionConfig = field(default_factory = StateVersionConfig)
imports: list[str] = field(default_factory = list)
machines: list[str] = field(default_factory = list)
tags: list[str] = field(default_factory = list)
@dataclass
class ServiceStateVersionRole:
default: ServiceStateVersionRoleDefault
@dataclass
class ServiceStateVersion:
meta: ServiceMeta
roles: ServiceStateVersionRole
config: StateVersionConfig = field(default_factory = StateVersionConfig)
machines: dict[str, ServiceStateVersionMachine] = field(default_factory = dict)
@dataclass
class Service:
admin: dict[str, ServiceAdmin] = field(default_factory = dict)
borgbackup: dict[str, ServiceBorgbackup] = field(default_factory = dict)
iwd: dict[str, ServiceIwd] = field(default_factory = dict)
packages: dict[str, ServicePackage] = field(default_factory = dict)
single_disk: dict[str, ServiceSingleDisk] = field(default_factory = dict, metadata = {"alias": "single-disk"})
state_version: dict[str, ServiceStateVersion] = field(default_factory = dict, metadata = {"alias": "state-version"})
pass
@dataclass

View File

@@ -63,7 +63,7 @@ let
ln -sf ${nixpkgs'} $out/clan_cli/nixpkgs
cp -r ${../../templates} $out/clan_cli/templates
${classgen}/bin/classgen ${inventory-schema}/schema.json $out/clan_cli/inventory/classes.py
${classgen}/bin/classgen ${inventory-schema}/schema.json $out/clan_cli/inventory/classes.py --stop-at "Service"
'';
# Create a custom nixpkgs for use within the project

View File

@@ -73,7 +73,7 @@
];
installPhase = ''
${self'.packages.classgen}/bin/classgen ${self'.packages.inventory-schema}/schema.json ./clan_cli/inventory/classes.py
${self'.packages.classgen}/bin/classgen ${self'.packages.inventory-schema}/schema.json ./clan_cli/inventory/classes.py --stop-at "Service"
python docs.py reference
mkdir -p $out
@@ -93,7 +93,7 @@
];
installPhase = ''
${self'.packages.classgen}/bin/classgen ${self'.packages.inventory-schema}/schema.json ./clan_cli/inventory/classes.py
${self'.packages.classgen}/bin/classgen ${self'.packages.inventory-schema}/schema.json ./clan_cli/inventory/classes.py --stop-at "Service"
mkdir -p $out
python api.py > $out/API.json
${self'.packages.json2ts}/bin/json2ts --input $out/API.json > $out/API.ts
@@ -122,7 +122,7 @@
classFile = "classes.py";
};
installPhase = ''
${self'.packages.classgen}/bin/classgen ${self'.packages.inventory-schema}/schema.json b_classes.py
${self'.packages.classgen}/bin/classgen ${self'.packages.inventory-schema}/schema.json b_classes.py --stop-at "Service"
file1=$classFile
file2=b_classes.py

View File

@@ -45,6 +45,6 @@ mkShell {
# Generate classes.py from inventory schema
# This file is in .gitignore
${self'.packages.classgen}/bin/classgen ${self'.packages.inventory-schema}/schema.json $PKG_ROOT/clan_cli/inventory/classes.py
${self'.packages.classgen}/bin/classgen ${self'.packages.inventory-schema}/schema.json $PKG_ROOT/clan_cli/inventory/classes.py --stop-at "Service"
'';
}

View File

@@ -45,6 +45,7 @@ def map_json_type(
known_classes = set()
root_class = "Inventory"
stop_at = None
def field_def_from_default_type(
@@ -198,6 +199,9 @@ def generate_dataclass(schema: dict[str, Any], class_name: str = root_class) ->
required_fields = []
fields_with_default = []
nested_classes: list[str] = []
if stop_at and class_name == stop_at:
# Skip generating classes below the stop_at property
return f"@dataclass\nclass {class_name}:\n pass\n"
for prop, prop_info in properties.items():
field_name = prop.replace("-", "_")
@@ -272,9 +276,6 @@ def generate_dataclass(schema: dict[str, Any], class_name: str = root_class) ->
field_meta = f"""{{"alias": "{prop}"}}"""
finalize_field = partial(get_field_def, field_name, field_meta)
# if class_name == "DyndnsConfig":
# if class_name == "ServiceDyndnMachine":
# breakpoint()
if "default" in prop_info or field_name not in prop_info.get("required", []):
if "default" in prop_info:
@@ -334,6 +335,10 @@ def generate_dataclass(schema: dict[str, Any], class_name: str = root_class) ->
def run_gen(args: argparse.Namespace) -> None:
print(f"Converting {args.input} to {args.output}")
if args.stop_at:
global stop_at
stop_at = args.stop_at
dataclass_code = ""
with args.input.open() as f:
schema = json.load(f)
@@ -358,6 +363,12 @@ def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("input", help="Input JSON schema file", type=Path)
parser.add_argument("output", help="Output Python file", type=Path)
parser.add_argument(
"--stop-at",
type=str,
help="Property name to stop generating classes for. Other classes below that property will be generated",
default=None,
)
parser.set_defaults(func=run_gen)
args = parser.parse_args()