diff --git a/pkgs/clan-cli/clan_cli/inventory/classes.py b/pkgs/clan-cli/clan_cli/inventory/classes.py index bfb9433dc..29a7f239f 100644 --- a/pkgs/clan-cli/clan_cli/inventory/classes.py +++ b/pkgs/clan-cli/clan_cli/inventory/classes.py @@ -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 diff --git a/pkgs/clan-cli/default.nix b/pkgs/clan-cli/default.nix index 3deb86fc9..333c5da85 100644 --- a/pkgs/clan-cli/default.nix +++ b/pkgs/clan-cli/default.nix @@ -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 diff --git a/pkgs/clan-cli/flake-module.nix b/pkgs/clan-cli/flake-module.nix index 4b63e681a..b9d1a4d2c 100644 --- a/pkgs/clan-cli/flake-module.nix +++ b/pkgs/clan-cli/flake-module.nix @@ -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 diff --git a/pkgs/clan-cli/shell.nix b/pkgs/clan-cli/shell.nix index e52bd8a5b..0d4d656e4 100644 --- a/pkgs/clan-cli/shell.nix +++ b/pkgs/clan-cli/shell.nix @@ -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" ''; } diff --git a/pkgs/classgen/main.py b/pkgs/classgen/main.py index 4b9626b7c..b7ef226fc 100644 --- a/pkgs/classgen/main.py +++ b/pkgs/classgen/main.py @@ -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()