refactor(cook): data-driven recipe generation with in-process flatten and lint

Replace the hardcoded TEMPLATES dict and the ksflatten-relative wrapper
with a single data-driven pipeline:

- recipe_templates.yaml becomes the single source of truth with three
  sections: base (always included), choices (exactly-one per category,
  the invariant pykickstart cannot check) and features (additive flags
  or one-of values)
- generate_recipe.py is a pure YAML consumer: it resolves ingredients,
  renders dishes via pykickstart in-process (no ksflatten binary, no
  %include path munging), lints the invariants pykickstart cannot check
  (exactly-one per choice category, known keys, existing fragments,
  unique filenames) and validates every generated dish
- dish names are derived by a generic rule with canonical category order
  from the templates, independent of YAML key order; no committed
  generated files means no name burn-in
- recipes/ and dishes/ become gitignored build products; the 68 tracked
  generated files (already out of sync with the manifest) are removed
- delete dead ingredients (section-data/, validation/, initial-setup/
  desktop/, live/hypervisor.ks, rpmfusion-nonfree.ks), the stale
  all-ingredients.cfg (replaced by 'make inventory') and the
  bin/generate-recipe and bin/ksflatten-relative wrappers
- Makefile: single 'make all' step plus lint, validate, inventory, test
- add 16 pytest tests covering expansion, selection, naming, lint and
  flatten/validate round-trips
This commit is contained in:
Lukas Greve
2026-08-30 12:09:42 +02:00
parent 842f754681
commit ae6eef4045
87 changed files with 686 additions and 6127 deletions
+7 -21
View File
@@ -1,18 +1,18 @@
# Recipe Manifest for Phyllome OS
# Define all recipe variants using generators from recipe_templates.yaml
# Edit this file to add new variants, then run: make generate-recipes
# Define all recipe variants using ingredients from recipe_templates.yaml.
# Edit this file to add new variants, then run: make all
#
# Supported syntax:
# Syntax:
# - Single values: repository: "43"
# - List values: repository: ["43", "rawhide"] (expands to multiple variants)
# - List modifiers: hypervisor_type: ["amdcpu", "intelcpu"] (expands to separate variants)
# - Booleans: hardware-support: true / false (feature flags)
#
# NOTE: List values create a cartesian product.
# Example: repository: ["43", "rawhide"] + storage: ["standard", "encrypted"]
# creates 4 variants: (43,standard), (43,encrypted), (rawhide,standard), (rawhide,encrypted)
#
# NOTE: The 'name' field is no longer used with the universal template.
# It can be kept for organization but doesn't affect generated filenames.
# NOTE: The 'name' field prefixes every generated dish/recipe filename, e.g.
# the group below yields dishes like desktop_43_gnome_standard_grub_guest-agents.cfg.
recipes:
# Desktop variants
@@ -55,18 +55,4 @@ recipes:
# hardware-support: false
# guest-agents: true
# hypervisor: desktop
# hypervisor_type: ["amdcpu", "intelcpu"]
#
# # Live desktop variants
# - name: desktop-live
# variants:
# - repository: 43
# hardware-support: true
# guest-agents: false
#
# # Live server variants
# - name: server-live
# variants:
# - repository: 43
# hardware-support: true
# guest-agents: false
# hypervisor_type: ["amdcpu", "intelcpu"]