API: remove all python dataclasses for clanModules (services)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
'';
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user