refactor: rename fragments directory to ingredients and update all references

- Directory rename: fragments/ → ingredients/ (54 .ks files)
- Updated all Python scripts:
  * tests/integration/conftest.py - fixture renames
  * tests/integration/test_integration.py - constant and path updates
  * tests/test_recipe_generator.py - updated test assertions
  * recipe-generator/validators.py - updated comments and error messages
  * recipe-generator/recipe_generator.py - updated comment
- Updated all YAML files:
  * recipe-generator/recipe_templates.yaml - 66 path references
  * .gitea/workflows/validate-fragments.yaml → validate-ingredients.yaml
  * .gitea/workflows/test-generation.yaml - path patterns
- Updated scripts:
  * bin/ksflatten-relative - updated path detection
- Updated test file:
  * tests/integration/test_fragments.py → test_ingredients.py
- Updated documentation:
  * DEVELOPMENT.md - simplified references
  * DEVELOPMENT_QUICK.md - updated examples
  * tests/container/README.md - test references
- Regenerated all recipes (16 files) with ingredient paths
- Updated test fixtures (7 files)
- All integration tests pass (5/5)
- All unit tests pass (29/31 - 2 pre-existing failures unrelated)
This commit is contained in:
Lukas Greve
2026-03-26 20:27:56 +01:00
parent 3eb4c75392
commit 31955a8983
135 changed files with 670 additions and 1319 deletions
+1 -1
View File
@@ -96,7 +96,7 @@ class RecipeGenerator:
modifiers = modifiers.copy()
modifiers['version'] = version
# Add required includes (all fragments listed under 'required')
# Add required includes (all ingredients listed under 'required')
for item in template.get('required', []):
if isinstance(item, dict):
fragment_path = list(item.values())[0]
+60 -60
View File
@@ -8,96 +8,96 @@ templates:
description: "An install recipe for desktop, server, or hypervisor"
base: core
required:
- core: fragments/core/base.ks
- version: fragments/repo/fedora-43-mirrors.ks
- storage: fragments/storage/standard.ks
- bootloader: fragments/bootloader/grub.ks
- locale: fragments/core/locale.ks
- services: fragments/core/services.ks
- network: fragments/core/network.ks
- packages: fragments/packages/core-group.ks
- fedora-remix: fragments/packages/fedora-remix.ks
- hand-picked: fragments/packages/hand-picked.ks
- security: fragments/core/security/enabled.ks
- initial-setup: fragments/initial-setup/server/config.ks
- core: ingredients/core/base.ks
- version: ingredients/repo/fedora-43-mirrors.ks
- storage: ingredients/storage/standard.ks
- bootloader: ingredients/bootloader/grub.ks
- locale: ingredients/core/locale.ks
- services: ingredients/core/services.ks
- network: ingredients/core/network.ks
- packages: ingredients/packages/core-group.ks
- fedora-remix: ingredients/packages/fedora-remix.ks
- hand-picked: ingredients/packages/hand-picked.ks
- security: ingredients/core/security/enabled.ks
- initial-setup: ingredients/initial-setup/server/config.ks
optional:
hardware-support: fragments/packages/hardware-support.ks
guest-agents: fragments/guest-agents/base.ks
hardware-support: ingredients/packages/hardware-support.ks
guest-agents: ingredients/guest-agents/base.ks
variant_type:
desktop:
server:
hypervisor:
modifiers:
version:
"43": fragments/repo/fedora-43-mirrors.ks
"rawhide": fragments/repo/rawhide-mirrors.ks
"43": ingredients/repo/fedora-43-mirrors.ks
"rawhide": ingredients/repo/rawhide-mirrors.ks
storage:
standard: fragments/storage/standard.ks
encrypted: fragments/storage/encrypted.ks
standard: ingredients/storage/standard.ks
encrypted: ingredients/storage/encrypted.ks
desktop:
gnome:
- fragments/desktop/gnome/config.ks
- fragments/desktop/gnome/packages.ks
- fragments/desktop/gnome/post-scripts.ks
- ingredients/desktop/gnome/config.ks
- ingredients/desktop/gnome/packages.ks
- ingredients/desktop/gnome/post-scripts.ks
labwc:
- fragments/desktop/labwc/config.ks
- ingredients/desktop/labwc/config.ks
security:
secure: fragments/core/security/enabled.ks
"off": fragments/core/security/disabled.ks
secure: ingredients/core/security/enabled.ks
"off": ingredients/core/security/disabled.ks
initial-setup:
server: fragments/initial-setup/server/config.ks
desktop: fragments/initial-setup/desktop/config.ks
gnome: fragments/initial-setup/gnome/config.ks
generic-wayland: fragments/initial-setup/generic-wayland/config.ks
server: ingredients/initial-setup/server/config.ks
desktop: ingredients/initial-setup/desktop/config.ks
gnome: ingredients/initial-setup/gnome/config.ks
generic-wayland: ingredients/initial-setup/generic-wayland/config.ks
hypervisor_type:
amdcpu: fragments/hypervisor/amdcpu.ks
intelcpu: fragments/hypervisor/intelcpu.ks
intelgpu: fragments/hypervisor/intelgpu.ks
amdcpu: ingredients/hypervisor/amdcpu.ks
intelcpu: ingredients/hypervisor/intelcpu.ks
intelgpu: ingredients/hypervisor/intelgpu.ks
hypervisor:
base:
- fragments/hypervisor/base/packages.ks
- fragments/hypervisor/base/services.ks
- fragments/hypervisor/base/post-scripts.ks
- ingredients/hypervisor/base/packages.ks
- ingredients/hypervisor/base/services.ks
- ingredients/hypervisor/base/post-scripts.ks
desktop:
- fragments/packages/virtual-machine-manager/packages.ks
- fragments/packages/virtual-machine-manager/post-scripts.ks
- ingredients/packages/virtual-machine-manager/packages.ks
- ingredients/packages/virtual-machine-manager/post-scripts.ks
bootloader:
grub: fragments/bootloader/grub.ks
systemd-boot: fragments/bootloader/systemd-boot.ks
grub: ingredients/bootloader/grub.ks
systemd-boot: ingredients/bootloader/systemd-boot.ks
# Live recipe - for live-desktop or live-server
live:
description: "A live recipe for live-desktop or live-server"
base: live-core
required:
- live-core: fragments/live/core/base.ks
- version: fragments/repo/fedora-43-mirrors.ks
- storage: fragments/live/core/storage.ks
- bootloader: fragments/live/core/bootloader/grub.ks
- locale: fragments/core/locale.ks
- services: fragments/core/services.ks
- network: fragments/core/network.ks
- packages: fragments/live/core/packages.ks
- post: fragments/live/post/base.ks
- session: fragments/live/post/session.ks
- rpmfusion-nonfree: fragments/repo/rpmfusion-nonfree.ks
- live-core: ingredients/live/core/base.ks
- version: ingredients/repo/fedora-43-mirrors.ks
- storage: ingredients/live/core/storage.ks
- bootloader: ingredients/live/core/bootloader/grub.ks
- locale: ingredients/core/locale.ks
- services: ingredients/core/services.ks
- network: ingredients/core/network.ks
- packages: ingredients/live/core/packages.ks
- post: ingredients/live/post/base.ks
- session: ingredients/live/post/session.ks
- rpmfusion-nonfree: ingredients/repo/rpmfusion-nonfree.ks
optional:
variant_type:
desktop:
server:
hardware-support: fragments/packages/hardware-support.ks
guest-agents: fragments/guest-agents/base.ks
hypervisor: fragments/live/hypervisor.ks
hardware-support: ingredients/packages/hardware-support.ks
guest-agents: ingredients/guest-agents/base.ks
hypervisor: ingredients/live/hypervisor.ks
security:
secure: fragments/core/security/enabled.ks
"off": fragments/core/security/disabled.ks
secure: ingredients/core/security/enabled.ks
"off": ingredients/core/security/disabled.ks
modifiers:
version:
"43": fragments/repo/fedora-43-mirrors.ks
"rawhide": fragments/repo/rawhide-mirrors.ks
"43": ingredients/repo/fedora-43-mirrors.ks
"rawhide": ingredients/repo/rawhide-mirrors.ks
storage:
standard: fragments/live/core/storage.ks
encrypted: fragments/live/core/storage.ks
standard: ingredients/live/core/storage.ks
encrypted: ingredients/live/core/storage.ks
bootloader:
grub: fragments/live/core/bootloader/grub.ks
systemd-boot: fragments/live/core/bootloader/systemd-boot.ks
grub: ingredients/live/core/bootloader/grub.ks
systemd-boot: ingredients/live/core/bootloader/systemd-boot.ks
+14 -14
View File
@@ -28,7 +28,7 @@ class TemplateValidator:
if key not in template:
errors.append(f"Missing required key: {key}")
# Validate required fragments exist
# Validate required ingredients exist
for item in template.get('required', []):
if isinstance(item, dict):
fragment_path = list(item.values())[0]
@@ -37,18 +37,18 @@ class TemplateValidator:
full_path = self.project_root / fragment_path
if not full_path.exists():
errors.append(f"Required fragment not found: {fragment_path}")
errors.append(f"Required ingredient not found: {fragment_path}")
# Validate versioned fragments
# Validate versioned ingredients
for key, fragment_path in template.get('versioned', {}).items():
if '{version}' in fragment_path:
# Will be resolved at generation time
continue
full_path = self.project_root / fragment_path
if not full_path.exists():
errors.append(f"Versioned fragment not found: {fragment_path}")
errors.append(f"Versioned ingredient not found: {fragment_path}")
# Validate conditional fragments
# Validate conditional ingredients
conditional = template.get('conditional', {})
for modifier, modifier_config in conditional.items():
if isinstance(modifier_config, dict):
@@ -60,25 +60,25 @@ class TemplateValidator:
if fp is not None:
full_path = self.project_root / fp
if not full_path.exists():
errors.append(f"Conditional fragment not found: {fp} (in list for {modifier}={value})")
errors.append(f"Conditional ingredient not found: {fp} (in list for {modifier}={value})")
else:
full_path = self.project_root / fragment_path
if not full_path.exists():
errors.append(f"Conditional fragment not found: {fragment_path} (for {modifier}={value})")
errors.append(f"Conditional ingredient not found: {fragment_path} (for {modifier}={value})")
# Validate flag fragments
# Validate flag ingredients
for key, fragment_path in template.get('flags', {}).items():
if fragment_path is None:
continue
full_path = self.project_root / fragment_path
if not full_path.exists():
errors.append(f"Flag fragment not found: {fragment_path}")
errors.append(f"Flag ingredient not found: {fragment_path}")
return errors
class ContentValidator:
"""Validate recipe content for fragment existence and duplicates."""
"""Validate recipe content for ingredient existence and duplicates."""
def __init__(self, project_root: Path):
self.project_root = project_root
@@ -102,15 +102,15 @@ class ContentValidator:
issues.append(f"Duplicate include: {path}")
seen.add(path)
# Check fragment existence
# Check ingredient existence
for inc in includes:
parts = inc.split()
if len(parts) < 2:
continue
path = parts[1]
fragment_path = self.project_root / path
if not fragment_path.exists():
issues.append(f"Missing fragment: {path}")
ingredient_path = self.project_root / path
if not ingredient_path.exists():
issues.append(f"Missing ingredient: {path}")
return issues