__init__.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. """Packer module with multi-schema support."""
  2. import logging
  3. from collections import OrderedDict
  4. from ...core.module import Module
  5. from ...core.registry import registry
  6. from ...core.schema import has_schema, list_versions, load_schema
  7. logger = logging.getLogger(__name__)
  8. def _load_json_spec_as_dict(version: str) -> OrderedDict:
  9. """Load JSON schema and convert to dict format for backward compatibility.
  10. Args:
  11. version: Schema version
  12. Returns:
  13. OrderedDict in the same format as Python specs
  14. """
  15. logger.debug(f"Loading packer schema {version} from JSON")
  16. json_spec = load_schema("packer", version)
  17. # Convert JSON array format to OrderedDict format
  18. spec_dict = OrderedDict()
  19. for section_data in json_spec:
  20. section_key = section_data["key"]
  21. # Build section dict
  22. section_dict = {}
  23. if "title" in section_data:
  24. section_dict["title"] = section_data["title"]
  25. if "description" in section_data:
  26. section_dict["description"] = section_data["description"]
  27. if "toggle" in section_data:
  28. section_dict["toggle"] = section_data["toggle"]
  29. if "required" in section_data:
  30. section_dict["required"] = section_data["required"]
  31. if "needs" in section_data:
  32. section_dict["needs"] = section_data["needs"]
  33. # Convert vars array to dict
  34. vars_dict = OrderedDict()
  35. for var_data in section_data["vars"]:
  36. var_name = var_data["name"]
  37. var_dict = {k: v for k, v in var_data.items() if k != "name"}
  38. vars_dict[var_name] = var_dict
  39. section_dict["vars"] = vars_dict
  40. spec_dict[section_key] = section_dict
  41. return spec_dict
  42. # Schema version mapping - loads JSON schemas on-demand
  43. class _SchemaDict(dict):
  44. """Dict subclass that loads JSON schemas on-demand."""
  45. def __getitem__(self, version):
  46. if not has_schema("packer", version):
  47. raise KeyError(
  48. f"Schema version {version} not found for packer module. Available: {', '.join(list_versions('packer'))}"
  49. )
  50. return _load_json_spec_as_dict(version)
  51. def __contains__(self, version):
  52. return has_schema("packer", version)
  53. # Initialize schema dict
  54. SCHEMAS = _SchemaDict()
  55. # Default spec - load latest version
  56. spec = _load_json_spec_as_dict("1.0")
  57. class PackerModule(Module):
  58. """Packer module."""
  59. name = "packer"
  60. description = "Manage Packer configurations"
  61. schema_version = "1.0" # Current schema version supported by this module
  62. schemas = SCHEMAS # Available schema versions
  63. registry.register(PackerModule)