From 9f1849a691174bebb1cce100b6efe57ef9f28893 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20=C4=8Cejchan?= Date: Tue, 9 Jun 2026 11:05:42 +0200 Subject: [PATCH 1/3] generate_schema: Fix entity_schema The all_field_names was computed wrong. --- schema/generate_schema_common.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/schema/generate_schema_common.py b/schema/generate_schema_common.py index e2daba7..666573f 100644 --- a/schema/generate_schema_common.py +++ b/schema/generate_schema_common.py @@ -99,11 +99,14 @@ def is_field_excluded(field_name): return False + all_field_names = set() for field in yaml["fields"]: if not field.get(filter_field, True): continue field_name = field["name"] + all_field_names.add(field_name) + if is_field_excluded(field_name): continue @@ -139,7 +142,6 @@ def is_field_excluded(field_name): if include_inherits: result = recursive_merge(result, type_schema(parent, [])) - all_field_names = set(result["properties"].keys()) assert len(fields_blacklist - all_field_names) == 0, f"{yaml['name']}: Nonexistent field blacklisted: {fields_blacklist - all_field_names}" assert (fields_whitelist is None) or len(fields_whitelist - all_field_names) == 0, f"{yaml['name']}: Nonexistent field whitelisted: {fields_whitelist - all_field_names}" From 783edeba3d409b06baf62a5721c039bd94cff9e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20=C4=8Cejchan?= Date: Tue, 9 Jun 2026 11:07:23 +0200 Subject: [PATCH 2/3] schema: Improve MaterialProperties handling Make FFFMaterialProperties and SLAMaterialProperties inherit from MaterialProperties and enforce the evaluation on the higher level through `allOf`. This way, if a required property is missing, we will get a proper error instead of cryptic "unevaluated properties" --- schema/generate_db_schema.py | 33 ++++++++++------- .../fff_material_properties.schema.json | 4 ++- .../opt_db_schema/material.schema.json | 36 ++++++++++++++++++- .../material_properties.schema.json | 11 +----- .../sla_material_properties.schema.json | 4 ++- 5 files changed, 62 insertions(+), 26 deletions(-) diff --git a/schema/generate_db_schema.py b/schema/generate_db_schema.py index 535389c..4dc1c51 100644 --- a/schema/generate_db_schema.py +++ b/schema/generate_db_schema.py @@ -97,28 +97,35 @@ def add_slug_property(schema: dict): register_type_schema("MaterialColor", object_ref_schema("material_color")) register_type_schema("set(MaterialColor)", array_schema(type_schema("MaterialColor", None))) -generate_schema_file("material", add_slug_property(entity_schema(entity_yaml(materials_yaml, "Material")))) +generate_schema_file( + "material", + add_slug_property(entity_schema(entity_yaml(materials_yaml, "Material"))), + { + "allOf": [ + { + "if": {"properties": {"class": {"const": "FFF"}}}, + "then": {"properties": {"properties": {"$ref": "fff_material_properties.schema.json"}}}, + }, + { + "if": {"properties": {"class": {"const": "SLA"}}}, + "then": {"properties": {"properties": {"$ref": "sla_material_properties.schema.json"}}}, + }, + ], + }, +) generate_schema_file("material_type", entity_schema(entity_yaml(materials_yaml, "MaterialType"))) generate_schema_file( "fff_material_properties", - entity_schema(entity_yaml(materials_yaml, "FFFMaterialProperties"), include_inherits=False), + entity_schema(entity_yaml(materials_yaml, "FFFMaterialProperties"), include_inherits=True), ) generate_schema_file( "sla_material_properties", - entity_schema(entity_yaml(materials_yaml, "SLAMaterialProperties"), include_inherits=False), + entity_schema(entity_yaml(materials_yaml, "SLAMaterialProperties"), include_inherits=True), ) -generate_schema_file( - "material_properties", - entity_schema(entity_yaml(materials_yaml, "MaterialProperties")), - { - "anyOf": [ - {"$ref": "fff_material_properties.schema.json"}, - {"$ref": "sla_material_properties.schema.json"}, - ], - }, -) + +generate_schema_file("material_properties", entity_schema(entity_yaml(materials_yaml, "MaterialProperties"), include_inherits=False)) brands_yaml = read_yaml("brands") diff --git a/schema/generated/opt_db_schema/fff_material_properties.schema.json b/schema/generated/opt_db_schema/fff_material_properties.schema.json index 6d444c8..d75533b 100644 --- a/schema/generated/opt_db_schema/fff_material_properties.schema.json +++ b/schema/generated/opt_db_schema/fff_material_properties.schema.json @@ -96,5 +96,7 @@ "max_print_temperature", "min_bed_temperature", "max_bed_temperature" - ] + ], + "unevaluatedProperties": false, + "$ref": "material_properties.schema.json" } diff --git a/schema/generated/opt_db_schema/material.schema.json b/schema/generated/opt_db_schema/material.schema.json index 8fc8139..dd4d1a7 100644 --- a/schema/generated/opt_db_schema/material.schema.json +++ b/schema/generated/opt_db_schema/material.schema.json @@ -266,5 +266,39 @@ "name", "abbreviation" ], - "unevaluatedProperties": false + "unevaluatedProperties": false, + "allOf": [ + { + "if": { + "properties": { + "class": { + "const": "FFF" + } + } + }, + "then": { + "properties": { + "properties": { + "$ref": "fff_material_properties.schema.json" + } + } + } + }, + { + "if": { + "properties": { + "class": { + "const": "SLA" + } + } + }, + "then": { + "properties": { + "properties": { + "$ref": "sla_material_properties.schema.json" + } + } + } + } + ] } diff --git a/schema/generated/opt_db_schema/material_properties.schema.json b/schema/generated/opt_db_schema/material_properties.schema.json index b28d67f..ad10a2b 100644 --- a/schema/generated/opt_db_schema/material_properties.schema.json +++ b/schema/generated/opt_db_schema/material_properties.schema.json @@ -19,14 +19,5 @@ "description": "Hardness of the material on the Shore D scale" } }, - "required": [], - "unevaluatedProperties": false, - "anyOf": [ - { - "$ref": "fff_material_properties.schema.json" - }, - { - "$ref": "sla_material_properties.schema.json" - } - ] + "required": [] } diff --git a/schema/generated/opt_db_schema/sla_material_properties.schema.json b/schema/generated/opt_db_schema/sla_material_properties.schema.json index 8061f63..a19444b 100644 --- a/schema/generated/opt_db_schema/sla_material_properties.schema.json +++ b/schema/generated/opt_db_schema/sla_material_properties.schema.json @@ -36,5 +36,7 @@ "description": "Viscosity of the material at 60 \u00b0C" } }, - "required": [] + "required": [], + "unevaluatedProperties": false, + "$ref": "material_properties.schema.json" } From 0bdbbbcb9fa9b32161beb5b3e430eaf67ab026d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20=C4=8Cejchan?= Date: Tue, 9 Jun 2026 11:10:40 +0200 Subject: [PATCH 3/3] schema: Improve MaterialContainer validation --- schema/generate_db_schema.py | 10 +++---- .../material_container.schema.json | 26 ++++++++++++------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/schema/generate_db_schema.py b/schema/generate_db_schema.py index 4dc1c51..1a63a4e 100644 --- a/schema/generate_db_schema.py +++ b/schema/generate_db_schema.py @@ -171,14 +171,14 @@ def add_slug_property(schema: dict): "properties": { "class": material_class_schema, }, - "oneOf": [ + "allOf": [ { - "properties": {"class": {"const": "FFF"}}, - "$ref": "fff_material_container.schema.json", + "if": {"properties": {"class": {"const": "FFF"}}}, + "then": {"$ref": "fff_material_container.schema.json"}, }, { - "properties": {"class": {"const": "SLA"}}, - "$ref": "sla_material_container.schema.json", + "if": {"properties": {"class": {"const": "SLA"}}}, + "then": {"$ref": "sla_material_container.schema.json"}, }, ], }, diff --git a/schema/generated/opt_db_schema/material_container.schema.json b/schema/generated/opt_db_schema/material_container.schema.json index 846f57d..a4af160 100644 --- a/schema/generated/opt_db_schema/material_container.schema.json +++ b/schema/generated/opt_db_schema/material_container.schema.json @@ -62,22 +62,30 @@ "name" ], "unevaluatedProperties": false, - "oneOf": [ + "allOf": [ { - "properties": { - "class": { - "const": "FFF" + "if": { + "properties": { + "class": { + "const": "FFF" + } } }, - "$ref": "fff_material_container.schema.json" + "then": { + "$ref": "fff_material_container.schema.json" + } }, { - "properties": { - "class": { - "const": "SLA" + "if": { + "properties": { + "class": { + "const": "SLA" + } } }, - "$ref": "sla_material_container.schema.json" + "then": { + "$ref": "sla_material_container.schema.json" + } } ] }