maqet 0.0.1.4__py3-none-any.whl → 0.0.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. maqet/__init__.py +50 -6
  2. maqet/__main__.py +96 -0
  3. maqet/__version__.py +3 -0
  4. maqet/api/__init__.py +35 -0
  5. maqet/api/decorators.py +184 -0
  6. maqet/api/metadata.py +147 -0
  7. maqet/api/registry.py +182 -0
  8. maqet/cli.py +71 -0
  9. maqet/config/__init__.py +26 -0
  10. maqet/config/merger.py +237 -0
  11. maqet/config/parser.py +198 -0
  12. maqet/config/validators.py +519 -0
  13. maqet/config_handlers.py +684 -0
  14. maqet/constants.py +200 -0
  15. maqet/exceptions.py +226 -0
  16. maqet/formatters.py +294 -0
  17. maqet/generators/__init__.py +12 -0
  18. maqet/generators/base_generator.py +101 -0
  19. maqet/generators/cli_generator.py +635 -0
  20. maqet/generators/python_generator.py +247 -0
  21. maqet/generators/rest_generator.py +58 -0
  22. maqet/handlers/__init__.py +12 -0
  23. maqet/handlers/base.py +108 -0
  24. maqet/handlers/init.py +147 -0
  25. maqet/handlers/stage.py +196 -0
  26. maqet/ipc/__init__.py +29 -0
  27. maqet/ipc/retry.py +265 -0
  28. maqet/ipc/runner_client.py +285 -0
  29. maqet/ipc/unix_socket_server.py +239 -0
  30. maqet/logger.py +160 -55
  31. maqet/machine.py +884 -0
  32. maqet/managers/__init__.py +7 -0
  33. maqet/managers/qmp_manager.py +333 -0
  34. maqet/managers/snapshot_coordinator.py +327 -0
  35. maqet/managers/vm_manager.py +683 -0
  36. maqet/maqet.py +1120 -0
  37. maqet/os_interactions.py +46 -0
  38. maqet/process_spawner.py +395 -0
  39. maqet/qemu_args.py +76 -0
  40. maqet/qmp/__init__.py +10 -0
  41. maqet/qmp/commands.py +92 -0
  42. maqet/qmp/keyboard.py +311 -0
  43. maqet/qmp/qmp.py +17 -0
  44. maqet/snapshot.py +473 -0
  45. maqet/state.py +958 -0
  46. maqet/storage.py +702 -162
  47. maqet/validation/__init__.py +9 -0
  48. maqet/validation/config_validator.py +170 -0
  49. maqet/vm_runner.py +523 -0
  50. maqet-0.0.5.dist-info/METADATA +237 -0
  51. maqet-0.0.5.dist-info/RECORD +55 -0
  52. {maqet-0.0.1.4.dist-info → maqet-0.0.5.dist-info}/WHEEL +1 -1
  53. maqet-0.0.5.dist-info/entry_points.txt +2 -0
  54. maqet-0.0.5.dist-info/licenses/LICENSE +21 -0
  55. {maqet-0.0.1.4.dist-info → maqet-0.0.5.dist-info}/top_level.txt +0 -1
  56. maqet/core.py +0 -411
  57. maqet/functions.py +0 -104
  58. maqet-0.0.1.4.dist-info/METADATA +0 -6
  59. maqet-0.0.1.4.dist-info/RECORD +0 -33
  60. qemu/machine/__init__.py +0 -36
  61. qemu/machine/console_socket.py +0 -142
  62. qemu/machine/machine.py +0 -954
  63. qemu/machine/py.typed +0 -0
  64. qemu/machine/qtest.py +0 -191
  65. qemu/qmp/__init__.py +0 -59
  66. qemu/qmp/error.py +0 -50
  67. qemu/qmp/events.py +0 -717
  68. qemu/qmp/legacy.py +0 -319
  69. qemu/qmp/message.py +0 -209
  70. qemu/qmp/models.py +0 -146
  71. qemu/qmp/protocol.py +0 -1057
  72. qemu/qmp/py.typed +0 -0
  73. qemu/qmp/qmp_client.py +0 -655
  74. qemu/qmp/qmp_shell.py +0 -618
  75. qemu/qmp/qmp_tui.py +0 -655
  76. qemu/qmp/util.py +0 -219
  77. qemu/utils/__init__.py +0 -162
  78. qemu/utils/accel.py +0 -84
  79. qemu/utils/py.typed +0 -0
  80. qemu/utils/qemu_ga_client.py +0 -323
  81. qemu/utils/qom.py +0 -273
  82. qemu/utils/qom_common.py +0 -175
  83. qemu/utils/qom_fuse.py +0 -207
maqet/logger.py CHANGED
@@ -1,69 +1,174 @@
1
+ """
2
+ Advanced logging setup for MAQET with configurable verbosity and file output.
3
+
4
+ Provides colored console output, file logging, and verbosity level control.
5
+ """
6
+
1
7
  import logging
2
- from functools import wraps
3
- from inspect import ismethod
4
- from pprint import pformat
8
+ import sys
9
+ from pathlib import Path
10
+ from typing import Optional
5
11
 
6
12
 
7
- class CustomFormatter(logging.Formatter):
8
- grey = "\x1b[38;2m"
9
- blue = "\x1b[34;1m"
10
- yellow = "\x1b[33;1m"
11
- red = "\x1b[31;1m"
12
- blink_red = "\x1b[31;5m"
13
- r = "\x1b[0m"
13
+ class ColoredFormatter(logging.Formatter):
14
+ """Custom formatter with colored output for different log levels."""
14
15
 
15
- prefix = (
16
- "[%(levelname)s]"
17
- )
16
+ # Bold colors for severe levels
17
+ RED_BOLD = "\x1b[31;1m"
18
+ YELLOW_BOLD = "\x1b[33;1m"
19
+ CYAN_BOLD = "\x1b[36;1m"
18
20
 
19
- message = (
20
- " %(message)s |%(filename)s:%(lineno)d "
21
- )
21
+ # Dim/regular colors for info levels
22
+ GREY_DIM = "\x1b[90m" # Dim grey for debug
23
+ WHITE = "\x1b[97m" # Bright white for info
22
24
 
23
- postfix = (
24
- "|%(asctime)s"
25
- )
25
+ # Reset
26
+ RESET = "\x1b[0m"
27
+
28
+ MESSAGE_FORMAT = " %(message)s "
26
29
 
27
30
  FORMATS = {
28
- logging.DEBUG: blue + prefix + r + grey + message + r + postfix + r,
29
- logging.INFO: grey + prefix + r + grey + message + r + postfix + r,
30
- logging.WARNING: yellow + prefix + r + message + yellow + postfix + r,
31
- logging.ERROR: red + prefix + r + message + red + postfix + r,
32
- logging.CRITICAL: blink_red + prefix + r + message + red + postfix + r}
31
+ logging.DEBUG: GREY_DIM
32
+ + "D"
33
+ + RESET
34
+ + GREY_DIM
35
+ + MESSAGE_FORMAT
36
+ + RESET,
37
+ logging.INFO: WHITE + "I" + RESET + WHITE + MESSAGE_FORMAT + RESET,
38
+ logging.WARNING: CYAN_BOLD + "W" + RESET + MESSAGE_FORMAT,
39
+ logging.ERROR: YELLOW_BOLD + "E" + RESET + MESSAGE_FORMAT,
40
+ logging.CRITICAL: RED_BOLD + "C" + RESET + MESSAGE_FORMAT,
41
+ }
33
42
 
34
43
  def format(self, record):
35
- log_fmt = self.FORMATS.get(record.levelno)
44
+ """Format log record with appropriate color."""
45
+ log_fmt = self.FORMATS.get(record.levelno, self.MESSAGE_FORMAT)
36
46
  formatter = logging.Formatter(log_fmt)
37
47
  return formatter.format(record)
38
48
 
39
49
 
40
- LOG = logging.getLogger('maqet')
41
-
42
- ch = logging.StreamHandler()
43
- ch.setFormatter(CustomFormatter())
44
- LOG.propagate = True
45
- LOG.addHandler(ch)
46
-
47
-
48
- def debug(func):
49
- if ismethod(func):
50
- @wraps(func)
51
- def wrapper(*args, **kwargs):
52
- signature = f"{args[0].__name__}.{
53
- func.__name__}({args[1:]}, {kwargs})"
54
- LOG.debug(f"{signature}")
55
- r = func(*args, **kwargs)
56
- LOG.debug(f"{signature} \n-> {r}")
57
- return r
58
- else:
59
- @wraps(func)
60
- def wrapper(*args, **kwargs):
61
- signature = f"{func.__name__}({args}, {kwargs})"
62
- LOG.debug(f"{signature}")
63
- r = func(*args, **kwargs)
64
- LOG.debug(f"{signature} \n-> {r}")
65
- return r
66
- return wrapper
67
-
68
-
69
- PFORMAT = pformat
50
+ class MaqetLogger:
51
+ """MAQET logging manager with configurable verbosity and file output.
52
+
53
+ Features:
54
+ - Colored console output for improved readability
55
+ - Rotating file logs (10MB max, 5 backups = 60MB total)
56
+ - Configurable verbosity levels (ERROR/WARNING/INFO/DEBUG)
57
+ """
58
+
59
+ def __init__(self, name: str = "maqet"):
60
+ """
61
+ Initialize the logger.
62
+
63
+ Args:
64
+ name: Logger name
65
+ """
66
+ self.logger = logging.getLogger(name)
67
+ self.logger.setLevel(logging.DEBUG)
68
+ self.logger.propagate = False
69
+
70
+ # Clear any existing handlers
71
+ self.logger.handlers.clear()
72
+
73
+ # Setup console handler with colored formatting
74
+ self._setup_console_handler()
75
+
76
+ # File handler will be added when configure_file_logging is called
77
+ self._file_handler: Optional[logging.FileHandler] = None
78
+
79
+ def _setup_console_handler(self):
80
+ """Setup colored console output handler."""
81
+ console_handler = logging.StreamHandler(sys.stdout)
82
+ console_handler.setFormatter(ColoredFormatter())
83
+ console_handler.setLevel(logging.INFO) # Default console level
84
+ self.logger.addHandler(console_handler)
85
+
86
+ def set_verbosity(self, verbosity_level: int):
87
+ """
88
+ Set logging verbosity level.
89
+
90
+ Args:
91
+ verbosity_level: 0=ERROR, 1=WARNING, 2=INFO, 3=DEBUG, 4+=DEBUG
92
+ """
93
+ level_map = {
94
+ 0: logging.ERROR,
95
+ 1: logging.WARNING,
96
+ 2: logging.INFO,
97
+ 3: logging.DEBUG,
98
+ }
99
+
100
+ # Cap at DEBUG level for anything >= 3
101
+ level = level_map.get(verbosity_level, logging.DEBUG)
102
+
103
+ # Update console handler level
104
+ for handler in self.logger.handlers:
105
+ if (
106
+ isinstance(handler, logging.StreamHandler)
107
+ and handler.stream == sys.stdout
108
+ ):
109
+ handler.setLevel(level)
110
+ break
111
+
112
+ def configure_file_logging(
113
+ self, log_file: Optional[Path] = None, mode: str = "w"
114
+ ):
115
+ """
116
+ Configure file logging output with rotation.
117
+
118
+ Uses RotatingFileHandler to prevent unbounded log growth:
119
+ - Maximum file size: 10MB
120
+ - Backup count: 5 files
121
+ - Total maximum size: 60MB (current + 5 backups)
122
+
123
+ Args:
124
+ log_file: Path to log file. If None, uses 'maqet.log' in current directory
125
+ mode: File open mode ('w' for overwrite, 'a' for append) - ignored for rotating handler
126
+ """
127
+ from logging.handlers import RotatingFileHandler
128
+
129
+ if self._file_handler:
130
+ self.logger.removeHandler(self._file_handler)
131
+ self._file_handler = None
132
+
133
+ if log_file is None:
134
+ log_file = Path("maqet.log")
135
+
136
+ # Create log file parent directory if it doesn't exist
137
+ log_file.parent.mkdir(parents=True, exist_ok=True)
138
+
139
+ # Setup rotating file handler with 10MB max size and 5 backups
140
+ max_bytes = 10 * 1024 * 1024 # 10MB
141
+ backup_count = 5 # Keep 5 old log files
142
+
143
+ self._file_handler = RotatingFileHandler(
144
+ log_file, maxBytes=max_bytes, backupCount=backup_count
145
+ )
146
+ self._file_handler.setLevel(
147
+ logging.DEBUG
148
+ ) # Always log everything to file
149
+
150
+ file_formatter = logging.Formatter(
151
+ "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
152
+ )
153
+ self._file_handler.setFormatter(file_formatter)
154
+
155
+ self.logger.addHandler(self._file_handler)
156
+
157
+ def get_logger(self) -> logging.Logger:
158
+ """Get the underlying logger instance."""
159
+ return self.logger
160
+
161
+
162
+ # Global logger instance
163
+ _maqet_logger = MaqetLogger()
164
+ LOG = _maqet_logger.get_logger()
165
+
166
+
167
+ def set_verbosity(level: int):
168
+ """Set global logging verbosity level."""
169
+ _maqet_logger.set_verbosity(level)
170
+
171
+
172
+ def configure_file_logging(log_file: Optional[Path] = None, mode: str = "w"):
173
+ """Configure global file logging."""
174
+ _maqet_logger.configure_file_logging(log_file, mode)