import logging
import os
import json
from typing import Dict, Any
# Configure logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def log_config_operation(filepath: str, operation: str, data: Dict[str, Any] = None):
"""Logs the operation performed on a configuration file."""
try:
logging.info(f"Operation: {operation} on file: {filepath}")
if data:
logging.debug(f"Data: {data}")
except Exception as e:
logging.error(f"Error logging operation: {e}")
def load_config(filepath: str) -> Dict[str, Any]:
"""Loads configuration data from a file with error handling."""
try:
if not os.path.exists(filepath):
raise FileNotFoundError(f"File not found: {filepath}")
try:
with open(filepath, 'r') as f:
config = json.load(f)
return config
except json.JSONDecodeError as e:
raise ValueError(f"Invalid JSON format in {filepath}: {e}")
except Exception as e:
logging.error(f"Error loading config from {filepath}: {e}")
raise
def save_config(filepath: str, data: Dict[str, Any]):
"""Saves configuration data to a file with defensive checks."""
try:
if not isinstance(data, dict):
raise TypeError("Data must be a dictionary.")
with open(filepath, 'w') as f:
json.dump(data, f, indent=4)
logging.info(f"Successfully saved configuration to {filepath}")
except Exception as e:
logging.error(f"Error saving configuration to {filepath}: {e}")
raise
def validate_config(config: Dict[str, Any]) -> bool:
"""Validates the configuration data (example validation)."""
# Add your validation logic here. This is just an example.
if not isinstance(config, dict):
logging.warning("Configuration is not a dictionary.")
return False
if 'required_key' not in config:
logging.warning("Missing required key 'required_key'.")
return False
if not isinstance(config['required_key'], str):
logging.warning("Value of 'required_key' is not a string.")
return False
return True
def apply_config(filepath: str, config: Dict[str, Any]):
"""Applies the configuration data."""
try:
# Placeholder for applying the configuration.
# Replace with your actual application logic.
logging.info(f"Applying configuration from {filepath}: {config}")
validate_config(config) # Validate before applying
except Exception as e:
logging.error(f"Error applying configuration from {filepath}: {e}")
raise
if __name__ == '__main__':
# Example Usage
config_file = "config.json"
# Load configuration
try:
config = load_config(config_file)
log_config_operation(config_file, "load", config)
# Apply configuration
apply_config(config_file, config)
log_config_operation(config_file, "apply")
# Save configuration
config['new_key'] = 'new_value'
save_config(config_file, config)
log_config_operation(config_file, "save", config)
except Exception as e:
print(f"An error occurred: {e}")
Add your comment