1. import json
  2. import logging
  3. import os
  4. from datetime import datetime
  5. class MetadataLogger:
  6. def __init__(self, log_file="metadata_migration.log", version_mapping=None):
  7. self.log_file = log_file
  8. self.logger = logging.getLogger(__name__)
  9. self.logger.setLevel(logging.INFO)
  10. # Create a file handler
  11. file_handler = logging.FileHandler(log_file)
  12. formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
  13. file_handler.setFormatter(formatter)
  14. self.logger.addHandler(file_handler)
  15. self.version_mapping = version_mapping if version_mapping else {} # Dict: OldVersion: NewVersion
  16. def log_operation(self, operation_type, metadata, old_version=None, new_version=None):
  17. """Logs a metadata operation.
  18. Args:
  19. operation_type (str): The type of operation (e.g., 'migrate', 'transform', 'validate').
  20. metadata (dict): The metadata being operated on.
  21. old_version (str, optional): The version of the metadata before the operation. Defaults to None.
  22. new_version (str, optional): The version of the metadata after the operation. Defaults to None.
  23. """
  24. log_entry = {
  25. "operation_type": operation_type,
  26. "timestamp": datetime.now().isoformat(),
  27. "metadata": metadata,
  28. "old_version": old_version,
  29. "new_version": new_version
  30. }
  31. self.logger.info(json.dumps(log_entry))
  32. def register_version_mapping(self, old_version, new_version):
  33. """Registers a mapping between old and new metadata versions.
  34. Args:
  35. old_version (str): The old metadata version.
  36. new_version (str): The new metadata version.
  37. """
  38. self.version_mapping[old_version] = new_version
  39. self.logger.info(f"Registered version mapping: {old_version} -> {new_version}")
  40. def get_new_version(self, old_version):
  41. """Retrieves the new version for a given old version.
  42. Args:
  43. old_version (str): The old metadata version.
  44. Returns:
  45. str: The new metadata version, or None if no mapping exists.
  46. """
  47. return self.version_mapping.get(old_version)
  48. def load_metadata(filepath):
  49. """Loads metadata from a JSON file.
  50. Args:
  51. filepath (str): The path to the JSON metadata file.
  52. Returns:
  53. dict: The loaded metadata. Returns an empty dict if file not found.
  54. """
  55. try:
  56. with open(filepath, 'r') as f:
  57. metadata = json.load(f)
  58. return metadata
  59. except FileNotFoundError:
  60. print(f"Warning: Metadata file not found at {filepath}. Returning empty dictionary.")
  61. return {}
  62. except json.JSONDecodeError:
  63. print(f"Error decoding JSON from {filepath}. Returning empty dictionary.")
  64. return {}
  65. if __name__ == '__main__':
  66. # Example Usage
  67. logger = MetadataLogger()
  68. logger.register_version_mapping("v1.0", "v2.0")
  69. # Simulate a metadata migration
  70. metadata = load_metadata("metadata_v1.json") # Replace with your actual file
  71. if metadata:
  72. logger.log_operation("migrate", metadata, old_version="v1.0", new_version="v2.0")
  73. # Simulate a transformation
  74. transformed_metadata = {"name": "NewName", "value": 123}
  75. logger.log_operation("transform", transformed_metadata, old_version="v2.0")
  76. # Simulate a validation
  77. validated_metadata = {"valid": True}
  78. logger.log_operation("validate", validated_metadata, old_version="v2.0")
  79. # Retrieving the new version
  80. new_version = logger.get_new_version("v1.0")
  81. print(f"The new version for v1.0 is: {new_version}")

Add your comment