unrealon 1.0.9__py3-none-any.whl → 1.1.1__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.
- unrealon/__init__.py +23 -21
- unrealon-1.1.1.dist-info/METADATA +722 -0
- unrealon-1.1.1.dist-info/RECORD +82 -0
- {unrealon-1.0.9.dist-info → unrealon-1.1.1.dist-info}/WHEEL +1 -1
- unrealon-1.1.1.dist-info/entry_points.txt +9 -0
- {unrealon-1.0.9.dist-info → unrealon-1.1.1.dist-info/licenses}/LICENSE +1 -1
- unrealon_bridge/__init__.py +114 -0
- unrealon_bridge/cli.py +316 -0
- unrealon_bridge/client/__init__.py +93 -0
- unrealon_bridge/client/base.py +78 -0
- unrealon_bridge/client/commands.py +89 -0
- unrealon_bridge/client/connection.py +90 -0
- unrealon_bridge/client/events.py +65 -0
- unrealon_bridge/client/health.py +38 -0
- unrealon_bridge/client/html_parser.py +146 -0
- unrealon_bridge/client/logging.py +139 -0
- unrealon_bridge/client/proxy.py +70 -0
- unrealon_bridge/client/scheduler.py +450 -0
- unrealon_bridge/client/session.py +70 -0
- unrealon_bridge/configs/__init__.py +14 -0
- unrealon_bridge/configs/bridge_config.py +212 -0
- unrealon_bridge/configs/bridge_config.yaml +39 -0
- unrealon_bridge/models/__init__.py +138 -0
- unrealon_bridge/models/base.py +28 -0
- unrealon_bridge/models/command.py +41 -0
- unrealon_bridge/models/events.py +40 -0
- unrealon_bridge/models/html_parser.py +79 -0
- unrealon_bridge/models/logging.py +55 -0
- unrealon_bridge/models/parser.py +63 -0
- unrealon_bridge/models/proxy.py +41 -0
- unrealon_bridge/models/requests.py +95 -0
- unrealon_bridge/models/responses.py +88 -0
- unrealon_bridge/models/scheduler.py +592 -0
- unrealon_bridge/models/session.py +28 -0
- unrealon_bridge/server/__init__.py +91 -0
- unrealon_bridge/server/base.py +171 -0
- unrealon_bridge/server/handlers/__init__.py +23 -0
- unrealon_bridge/server/handlers/command.py +110 -0
- unrealon_bridge/server/handlers/html_parser.py +139 -0
- unrealon_bridge/server/handlers/logging.py +95 -0
- unrealon_bridge/server/handlers/parser.py +95 -0
- unrealon_bridge/server/handlers/proxy.py +75 -0
- unrealon_bridge/server/handlers/scheduler.py +545 -0
- unrealon_bridge/server/handlers/session.py +66 -0
- unrealon_browser/__init__.py +61 -18
- unrealon_browser/{src/cli → cli}/browser_cli.py +6 -13
- unrealon_browser/{src/cli → cli}/cookies_cli.py +5 -1
- unrealon_browser/{src/core → core}/browser_manager.py +2 -2
- unrealon_browser/{src/managers → managers}/captcha.py +1 -1
- unrealon_browser/{src/managers → managers}/cookies.py +1 -1
- unrealon_browser/managers/logger_bridge.py +231 -0
- unrealon_browser/{src/managers → managers}/profile.py +1 -1
- unrealon_driver/__init__.py +73 -19
- unrealon_driver/browser/__init__.py +8 -0
- unrealon_driver/browser/config.py +74 -0
- unrealon_driver/browser/manager.py +416 -0
- unrealon_driver/exceptions.py +28 -0
- unrealon_driver/parser/__init__.py +55 -0
- unrealon_driver/parser/cli_manager.py +141 -0
- unrealon_driver/parser/daemon_manager.py +227 -0
- unrealon_driver/parser/managers/__init__.py +46 -0
- unrealon_driver/parser/managers/browser.py +51 -0
- unrealon_driver/parser/managers/config.py +281 -0
- unrealon_driver/parser/managers/error.py +412 -0
- unrealon_driver/parser/managers/html.py +732 -0
- unrealon_driver/parser/managers/logging.py +609 -0
- unrealon_driver/parser/managers/result.py +321 -0
- unrealon_driver/parser/parser_manager.py +628 -0
- unrealon/sdk_config.py +0 -88
- unrealon-1.0.9.dist-info/METADATA +0 -810
- unrealon-1.0.9.dist-info/RECORD +0 -246
- unrealon_browser/pyproject.toml +0 -182
- unrealon_browser/src/__init__.py +0 -62
- unrealon_browser/src/managers/logger_bridge.py +0 -395
- unrealon_driver/README.md +0 -204
- unrealon_driver/pyproject.toml +0 -187
- unrealon_driver/src/__init__.py +0 -90
- unrealon_driver/src/cli/__init__.py +0 -10
- unrealon_driver/src/cli/main.py +0 -66
- unrealon_driver/src/cli/simple.py +0 -510
- unrealon_driver/src/config/__init__.py +0 -11
- unrealon_driver/src/config/auto_config.py +0 -478
- unrealon_driver/src/core/__init__.py +0 -18
- unrealon_driver/src/core/exceptions.py +0 -289
- unrealon_driver/src/core/parser.py +0 -638
- unrealon_driver/src/dto/__init__.py +0 -66
- unrealon_driver/src/dto/cli.py +0 -119
- unrealon_driver/src/dto/config.py +0 -18
- unrealon_driver/src/dto/events.py +0 -237
- unrealon_driver/src/dto/execution.py +0 -313
- unrealon_driver/src/dto/services.py +0 -311
- unrealon_driver/src/execution/__init__.py +0 -23
- unrealon_driver/src/execution/daemon_mode.py +0 -317
- unrealon_driver/src/execution/interactive_mode.py +0 -88
- unrealon_driver/src/execution/modes.py +0 -45
- unrealon_driver/src/execution/scheduled_mode.py +0 -209
- unrealon_driver/src/execution/test_mode.py +0 -250
- unrealon_driver/src/logging/__init__.py +0 -24
- unrealon_driver/src/logging/driver_logger.py +0 -512
- unrealon_driver/src/services/__init__.py +0 -24
- unrealon_driver/src/services/browser_service.py +0 -726
- unrealon_driver/src/services/llm/__init__.py +0 -15
- unrealon_driver/src/services/llm/browser_llm_service.py +0 -363
- unrealon_driver/src/services/llm/llm.py +0 -195
- unrealon_driver/src/services/logger_service.py +0 -232
- unrealon_driver/src/services/metrics_service.py +0 -185
- unrealon_driver/src/services/scheduler_service.py +0 -489
- unrealon_driver/src/services/websocket_service.py +0 -362
- unrealon_driver/src/utils/__init__.py +0 -16
- unrealon_driver/src/utils/service_factory.py +0 -317
- unrealon_driver/src/utils/time_formatter.py +0 -338
- unrealon_llm/README.md +0 -44
- unrealon_llm/__init__.py +0 -26
- unrealon_llm/pyproject.toml +0 -154
- unrealon_llm/src/__init__.py +0 -228
- unrealon_llm/src/cli/__init__.py +0 -0
- unrealon_llm/src/core/__init__.py +0 -11
- unrealon_llm/src/core/smart_client.py +0 -438
- unrealon_llm/src/dto/__init__.py +0 -155
- unrealon_llm/src/dto/models/__init__.py +0 -0
- unrealon_llm/src/dto/models/config.py +0 -343
- unrealon_llm/src/dto/models/core.py +0 -328
- unrealon_llm/src/dto/models/enums.py +0 -123
- unrealon_llm/src/dto/models/html_analysis.py +0 -345
- unrealon_llm/src/dto/models/statistics.py +0 -473
- unrealon_llm/src/dto/models/translation.py +0 -383
- unrealon_llm/src/dto/models/type_conversion.py +0 -462
- unrealon_llm/src/dto/schemas/__init__.py +0 -0
- unrealon_llm/src/exceptions.py +0 -392
- unrealon_llm/src/llm_config/__init__.py +0 -20
- unrealon_llm/src/llm_config/logging_config.py +0 -178
- unrealon_llm/src/llm_logging/__init__.py +0 -42
- unrealon_llm/src/llm_logging/llm_events.py +0 -107
- unrealon_llm/src/llm_logging/llm_logger.py +0 -466
- unrealon_llm/src/managers/__init__.py +0 -15
- unrealon_llm/src/managers/cache_manager.py +0 -67
- unrealon_llm/src/managers/cost_manager.py +0 -107
- unrealon_llm/src/managers/request_manager.py +0 -298
- unrealon_llm/src/modules/__init__.py +0 -0
- unrealon_llm/src/modules/html_processor/__init__.py +0 -25
- unrealon_llm/src/modules/html_processor/base_processor.py +0 -415
- unrealon_llm/src/modules/html_processor/details_processor.py +0 -85
- unrealon_llm/src/modules/html_processor/listing_processor.py +0 -91
- unrealon_llm/src/modules/html_processor/models/__init__.py +0 -20
- unrealon_llm/src/modules/html_processor/models/processing_models.py +0 -40
- unrealon_llm/src/modules/html_processor/models/universal_model.py +0 -56
- unrealon_llm/src/modules/html_processor/processor.py +0 -102
- unrealon_llm/src/modules/llm/__init__.py +0 -0
- unrealon_llm/src/modules/translator/__init__.py +0 -0
- unrealon_llm/src/provider.py +0 -116
- unrealon_llm/src/utils/__init__.py +0 -95
- unrealon_llm/src/utils/common.py +0 -64
- unrealon_llm/src/utils/data_extractor.py +0 -188
- unrealon_llm/src/utils/html_cleaner.py +0 -767
- unrealon_llm/src/utils/language_detector.py +0 -308
- unrealon_llm/src/utils/models_cache.py +0 -592
- unrealon_llm/src/utils/smart_counter.py +0 -229
- unrealon_llm/src/utils/token_counter.py +0 -189
- unrealon_sdk/README.md +0 -25
- unrealon_sdk/__init__.py +0 -30
- unrealon_sdk/pyproject.toml +0 -231
- unrealon_sdk/src/__init__.py +0 -150
- unrealon_sdk/src/cli/__init__.py +0 -12
- unrealon_sdk/src/cli/commands/__init__.py +0 -22
- unrealon_sdk/src/cli/commands/benchmark.py +0 -42
- unrealon_sdk/src/cli/commands/diagnostics.py +0 -573
- unrealon_sdk/src/cli/commands/health.py +0 -46
- unrealon_sdk/src/cli/commands/integration.py +0 -498
- unrealon_sdk/src/cli/commands/reports.py +0 -43
- unrealon_sdk/src/cli/commands/security.py +0 -36
- unrealon_sdk/src/cli/commands/server.py +0 -483
- unrealon_sdk/src/cli/commands/servers.py +0 -56
- unrealon_sdk/src/cli/commands/tests.py +0 -55
- unrealon_sdk/src/cli/main.py +0 -126
- unrealon_sdk/src/cli/utils/reporter.py +0 -519
- unrealon_sdk/src/clients/openapi.yaml +0 -3347
- unrealon_sdk/src/clients/python_http/__init__.py +0 -3
- unrealon_sdk/src/clients/python_http/api_config.py +0 -228
- unrealon_sdk/src/clients/python_http/models/BaseModel.py +0 -12
- unrealon_sdk/src/clients/python_http/models/BroadcastDeliveryStats.py +0 -33
- unrealon_sdk/src/clients/python_http/models/BroadcastMessage.py +0 -17
- unrealon_sdk/src/clients/python_http/models/BroadcastMessageRequest.py +0 -35
- unrealon_sdk/src/clients/python_http/models/BroadcastPriority.py +0 -10
- unrealon_sdk/src/clients/python_http/models/BroadcastResponse.py +0 -21
- unrealon_sdk/src/clients/python_http/models/BroadcastResultResponse.py +0 -33
- unrealon_sdk/src/clients/python_http/models/BroadcastTarget.py +0 -11
- unrealon_sdk/src/clients/python_http/models/ConnectionStats.py +0 -27
- unrealon_sdk/src/clients/python_http/models/ConnectionsResponse.py +0 -21
- unrealon_sdk/src/clients/python_http/models/DeveloperMessageResponse.py +0 -23
- unrealon_sdk/src/clients/python_http/models/ErrorResponse.py +0 -25
- unrealon_sdk/src/clients/python_http/models/HTTPValidationError.py +0 -16
- unrealon_sdk/src/clients/python_http/models/HealthResponse.py +0 -23
- unrealon_sdk/src/clients/python_http/models/HealthStatus.py +0 -33
- unrealon_sdk/src/clients/python_http/models/LogLevel.py +0 -10
- unrealon_sdk/src/clients/python_http/models/LoggingRequest.py +0 -27
- unrealon_sdk/src/clients/python_http/models/LoggingResponse.py +0 -23
- unrealon_sdk/src/clients/python_http/models/MaintenanceMode.py +0 -9
- unrealon_sdk/src/clients/python_http/models/MaintenanceModeRequest.py +0 -33
- unrealon_sdk/src/clients/python_http/models/MaintenanceStatusResponse.py +0 -39
- unrealon_sdk/src/clients/python_http/models/ParserCommandRequest.py +0 -25
- unrealon_sdk/src/clients/python_http/models/ParserMessageResponse.py +0 -21
- unrealon_sdk/src/clients/python_http/models/ParserRegistrationRequest.py +0 -28
- unrealon_sdk/src/clients/python_http/models/ParserRegistrationResponse.py +0 -25
- unrealon_sdk/src/clients/python_http/models/ParserType.py +0 -10
- unrealon_sdk/src/clients/python_http/models/ProxyBlockRequest.py +0 -19
- unrealon_sdk/src/clients/python_http/models/ProxyEndpointResponse.py +0 -20
- unrealon_sdk/src/clients/python_http/models/ProxyListResponse.py +0 -19
- unrealon_sdk/src/clients/python_http/models/ProxyProvider.py +0 -10
- unrealon_sdk/src/clients/python_http/models/ProxyPurchaseRequest.py +0 -25
- unrealon_sdk/src/clients/python_http/models/ProxyResponse.py +0 -47
- unrealon_sdk/src/clients/python_http/models/ProxyRotationRequest.py +0 -23
- unrealon_sdk/src/clients/python_http/models/ProxyStatus.py +0 -10
- unrealon_sdk/src/clients/python_http/models/ProxyUsageRequest.py +0 -19
- unrealon_sdk/src/clients/python_http/models/ProxyUsageStatsResponse.py +0 -26
- unrealon_sdk/src/clients/python_http/models/ServiceRegistrationDto.py +0 -23
- unrealon_sdk/src/clients/python_http/models/ServiceStatsResponse.py +0 -31
- unrealon_sdk/src/clients/python_http/models/SessionStartRequest.py +0 -23
- unrealon_sdk/src/clients/python_http/models/SuccessResponse.py +0 -25
- unrealon_sdk/src/clients/python_http/models/SystemNotificationResponse.py +0 -23
- unrealon_sdk/src/clients/python_http/models/ValidationError.py +0 -18
- unrealon_sdk/src/clients/python_http/models/ValidationErrorResponse.py +0 -21
- unrealon_sdk/src/clients/python_http/models/WebSocketMetrics.py +0 -21
- unrealon_sdk/src/clients/python_http/models/__init__.py +0 -44
- unrealon_sdk/src/clients/python_http/services/None_service.py +0 -35
- unrealon_sdk/src/clients/python_http/services/ParserManagement_service.py +0 -190
- unrealon_sdk/src/clients/python_http/services/ProxyManagement_service.py +0 -289
- unrealon_sdk/src/clients/python_http/services/SocketLogging_service.py +0 -187
- unrealon_sdk/src/clients/python_http/services/SystemHealth_service.py +0 -119
- unrealon_sdk/src/clients/python_http/services/WebSocketAPI_service.py +0 -198
- unrealon_sdk/src/clients/python_http/services/__init__.py +0 -0
- unrealon_sdk/src/clients/python_http/services/admin_service.py +0 -125
- unrealon_sdk/src/clients/python_http/services/async_None_service.py +0 -35
- unrealon_sdk/src/clients/python_http/services/async_ParserManagement_service.py +0 -190
- unrealon_sdk/src/clients/python_http/services/async_ProxyManagement_service.py +0 -289
- unrealon_sdk/src/clients/python_http/services/async_SocketLogging_service.py +0 -189
- unrealon_sdk/src/clients/python_http/services/async_SystemHealth_service.py +0 -123
- unrealon_sdk/src/clients/python_http/services/async_WebSocketAPI_service.py +0 -200
- unrealon_sdk/src/clients/python_http/services/async_admin_service.py +0 -125
- unrealon_sdk/src/clients/python_websocket/__init__.py +0 -28
- unrealon_sdk/src/clients/python_websocket/client.py +0 -490
- unrealon_sdk/src/clients/python_websocket/events.py +0 -732
- unrealon_sdk/src/clients/python_websocket/example.py +0 -136
- unrealon_sdk/src/clients/python_websocket/types.py +0 -871
- unrealon_sdk/src/core/__init__.py +0 -64
- unrealon_sdk/src/core/client.py +0 -556
- unrealon_sdk/src/core/config.py +0 -465
- unrealon_sdk/src/core/exceptions.py +0 -239
- unrealon_sdk/src/core/metadata.py +0 -191
- unrealon_sdk/src/core/models.py +0 -142
- unrealon_sdk/src/core/types.py +0 -68
- unrealon_sdk/src/dto/__init__.py +0 -268
- unrealon_sdk/src/dto/authentication.py +0 -108
- unrealon_sdk/src/dto/cache.py +0 -208
- unrealon_sdk/src/dto/common.py +0 -19
- unrealon_sdk/src/dto/concurrency.py +0 -393
- unrealon_sdk/src/dto/events.py +0 -108
- unrealon_sdk/src/dto/health.py +0 -339
- unrealon_sdk/src/dto/load_balancing.py +0 -336
- unrealon_sdk/src/dto/logging.py +0 -230
- unrealon_sdk/src/dto/performance.py +0 -165
- unrealon_sdk/src/dto/rate_limiting.py +0 -295
- unrealon_sdk/src/dto/resource_pooling.py +0 -128
- unrealon_sdk/src/dto/structured_logging.py +0 -112
- unrealon_sdk/src/dto/task_scheduling.py +0 -121
- unrealon_sdk/src/dto/websocket.py +0 -55
- unrealon_sdk/src/enterprise/__init__.py +0 -59
- unrealon_sdk/src/enterprise/authentication.py +0 -401
- unrealon_sdk/src/enterprise/cache_manager.py +0 -578
- unrealon_sdk/src/enterprise/error_recovery.py +0 -494
- unrealon_sdk/src/enterprise/event_system.py +0 -549
- unrealon_sdk/src/enterprise/health_monitor.py +0 -747
- unrealon_sdk/src/enterprise/load_balancer.py +0 -964
- unrealon_sdk/src/enterprise/logging/__init__.py +0 -68
- unrealon_sdk/src/enterprise/logging/cleanup.py +0 -156
- unrealon_sdk/src/enterprise/logging/development.py +0 -744
- unrealon_sdk/src/enterprise/logging/service.py +0 -410
- unrealon_sdk/src/enterprise/multithreading_manager.py +0 -853
- unrealon_sdk/src/enterprise/performance_monitor.py +0 -539
- unrealon_sdk/src/enterprise/proxy_manager.py +0 -696
- unrealon_sdk/src/enterprise/rate_limiter.py +0 -652
- unrealon_sdk/src/enterprise/resource_pool.py +0 -763
- unrealon_sdk/src/enterprise/task_scheduler.py +0 -709
- unrealon_sdk/src/internal/__init__.py +0 -10
- unrealon_sdk/src/internal/command_router.py +0 -497
- unrealon_sdk/src/internal/connection_manager.py +0 -397
- unrealon_sdk/src/internal/http_client.py +0 -446
- unrealon_sdk/src/internal/websocket_client.py +0 -420
- unrealon_sdk/src/provider.py +0 -471
- unrealon_sdk/src/utils.py +0 -234
- /unrealon_browser/{src/cli → cli}/__init__.py +0 -0
- /unrealon_browser/{src/cli → cli}/interactive_mode.py +0 -0
- /unrealon_browser/{src/cli → cli}/main.py +0 -0
- /unrealon_browser/{src/core → core}/__init__.py +0 -0
- /unrealon_browser/{src/dto → dto}/__init__.py +0 -0
- /unrealon_browser/{src/dto → dto}/models/config.py +0 -0
- /unrealon_browser/{src/dto → dto}/models/core.py +0 -0
- /unrealon_browser/{src/dto → dto}/models/dataclasses.py +0 -0
- /unrealon_browser/{src/dto → dto}/models/detection.py +0 -0
- /unrealon_browser/{src/dto → dto}/models/enums.py +0 -0
- /unrealon_browser/{src/dto → dto}/models/statistics.py +0 -0
- /unrealon_browser/{src/managers → managers}/__init__.py +0 -0
- /unrealon_browser/{src/managers → managers}/stealth.py +0 -0
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Interactive Mode implementation for UnrealOn Driver v3.0 (Stub Implementation)
|
|
3
|
-
|
|
4
|
-
Live development and debugging shell.
|
|
5
|
-
TODO: Full implementation to be completed.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
import asyncio
|
|
9
|
-
from typing import Any, Dict
|
|
10
|
-
|
|
11
|
-
from unrealon_driver.src.dto.execution import InteractiveModeConfig
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class InteractiveMode:
|
|
15
|
-
"""
|
|
16
|
-
🎮 Interactive Mode - Live Development Shell
|
|
17
|
-
|
|
18
|
-
TODO: Full implementation with interactive shell
|
|
19
|
-
"""
|
|
20
|
-
|
|
21
|
-
def __init__(self, parser: Any, config: InteractiveModeConfig):
|
|
22
|
-
"""Initialize interactive mode."""
|
|
23
|
-
self.parser = parser
|
|
24
|
-
self.config = config
|
|
25
|
-
self.logger = parser.logger
|
|
26
|
-
self._is_running = False
|
|
27
|
-
|
|
28
|
-
async def start(self, **kwargs):
|
|
29
|
-
"""Start interactive mode."""
|
|
30
|
-
if self.logger:
|
|
31
|
-
self.logger.warning("Interactive mode not yet implemented")
|
|
32
|
-
self.logger.info(f"Parser: {self.parser.parser_name}")
|
|
33
|
-
|
|
34
|
-
print("\n" + "=" * 60)
|
|
35
|
-
print("🎮 UnrealOn Driver v3.0 - Interactive Mode")
|
|
36
|
-
print("📝 Parser:", self.parser.parser_name)
|
|
37
|
-
print("🆔 ID:", self.parser.parser_id)
|
|
38
|
-
print("\n⚠️ Interactive mode is not yet implemented")
|
|
39
|
-
print("Available commands will include:")
|
|
40
|
-
print(" - run : Execute parser")
|
|
41
|
-
print(" - config : Show configuration")
|
|
42
|
-
print(" - browser : Browser debugging tools")
|
|
43
|
-
print(" - llm : AI extraction tools")
|
|
44
|
-
print(" - metrics : Performance metrics")
|
|
45
|
-
print(" - help : Show help")
|
|
46
|
-
print(" - exit : Exit interactive mode")
|
|
47
|
-
print("=" * 60)
|
|
48
|
-
|
|
49
|
-
# Simple simulation
|
|
50
|
-
self._is_running = True
|
|
51
|
-
|
|
52
|
-
try:
|
|
53
|
-
while self._is_running:
|
|
54
|
-
try:
|
|
55
|
-
command = input("\nunrealon> ").strip().lower()
|
|
56
|
-
|
|
57
|
-
if command in ["exit", "quit"]:
|
|
58
|
-
break
|
|
59
|
-
elif command == "run":
|
|
60
|
-
print("🚀 Running parser...")
|
|
61
|
-
result = await self.parser.test()
|
|
62
|
-
print(f"✅ Result: {result.get('success', False)}")
|
|
63
|
-
elif command == "config":
|
|
64
|
-
print("� Configuration:")
|
|
65
|
-
print(f" Environment: {self.parser._config.environment}")
|
|
66
|
-
print(f" Debug mode: {self.parser._config.debug_mode}")
|
|
67
|
-
elif command == "help":
|
|
68
|
-
print("� Interactive mode commands (planned):")
|
|
69
|
-
print(" run, config, browser, llm, metrics, help, exit")
|
|
70
|
-
else:
|
|
71
|
-
print(
|
|
72
|
-
f"❓ Unknown command: {command}. Type 'help' for available commands."
|
|
73
|
-
)
|
|
74
|
-
|
|
75
|
-
except KeyboardInterrupt:
|
|
76
|
-
print("\n👋 Use 'exit' to quit interactive mode")
|
|
77
|
-
except EOFError:
|
|
78
|
-
break
|
|
79
|
-
finally:
|
|
80
|
-
await self.stop()
|
|
81
|
-
|
|
82
|
-
async def stop(self):
|
|
83
|
-
"""Stop interactive mode."""
|
|
84
|
-
self._is_running = False
|
|
85
|
-
print("\n👋 Interactive mode stopped")
|
|
86
|
-
|
|
87
|
-
def __repr__(self) -> str:
|
|
88
|
-
return f"<InteractiveMode(running={self._is_running}, stub=True)>"
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Execution mode enumeration and utilities for UnrealOn Driver v3.0
|
|
3
|
-
"""
|
|
4
|
-
|
|
5
|
-
from enum import Enum, auto
|
|
6
|
-
from typing import Any, Dict
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class ExecutionMode(Enum):
|
|
10
|
-
"""Enumeration of available execution modes."""
|
|
11
|
-
|
|
12
|
-
TEST = auto() # Development testing
|
|
13
|
-
DAEMON = auto() # Production WebSocket service
|
|
14
|
-
SCHEDULED = auto() # Automated recurring execution
|
|
15
|
-
INTERACTIVE = auto() # Live development shell
|
|
16
|
-
|
|
17
|
-
@classmethod
|
|
18
|
-
def from_string(cls, mode_str: str) -> "ExecutionMode":
|
|
19
|
-
"""Convert string to ExecutionMode."""
|
|
20
|
-
mode_map = {
|
|
21
|
-
"test": cls.TEST,
|
|
22
|
-
"daemon": cls.DAEMON,
|
|
23
|
-
"scheduled": cls.SCHEDULED,
|
|
24
|
-
"interactive": cls.INTERACTIVE,
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
mode_str = mode_str.lower().strip()
|
|
28
|
-
if mode_str not in mode_map:
|
|
29
|
-
raise ValueError(f"Unknown execution mode: {mode_str}")
|
|
30
|
-
|
|
31
|
-
return mode_map[mode_str]
|
|
32
|
-
|
|
33
|
-
def to_string(self) -> str:
|
|
34
|
-
"""Convert ExecutionMode to string."""
|
|
35
|
-
return self.name.lower()
|
|
36
|
-
|
|
37
|
-
def get_description(self) -> str:
|
|
38
|
-
"""Get human-readable description."""
|
|
39
|
-
descriptions = {
|
|
40
|
-
self.TEST: "Development testing and debugging",
|
|
41
|
-
self.DAEMON: "Production WebSocket service",
|
|
42
|
-
self.SCHEDULED: "Automated recurring execution",
|
|
43
|
-
self.INTERACTIVE: "Live development shell",
|
|
44
|
-
}
|
|
45
|
-
return descriptions[self]
|
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Scheduled Mode implementation for UnrealOn Driver v3.0
|
|
3
|
-
|
|
4
|
-
Automated recurring execution with human-readable intervals.
|
|
5
|
-
Full implementation using enterprise SchedulerService.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
import asyncio
|
|
9
|
-
import signal
|
|
10
|
-
from typing import Any, Optional
|
|
11
|
-
|
|
12
|
-
from unrealon_driver.src.dto.execution import ScheduledModeConfig, ScheduledModeStatus
|
|
13
|
-
from unrealon_driver.src.dto.services import SchedulerConfig
|
|
14
|
-
|
|
15
|
-
from unrealon_driver.src.services.scheduler_service import SchedulerService
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class ScheduledMode:
|
|
19
|
-
"""
|
|
20
|
-
⏰ Scheduled Mode - Automated Recurring Execution
|
|
21
|
-
|
|
22
|
-
Full implementation with enterprise features:
|
|
23
|
-
- Human-readable intervals ("30m", "1h", "daily")
|
|
24
|
-
- Smart load balancing with jitter
|
|
25
|
-
- Error recovery and retries
|
|
26
|
-
- Health monitoring and alerting
|
|
27
|
-
- Production-ready reliability
|
|
28
|
-
"""
|
|
29
|
-
|
|
30
|
-
def __init__(self, parser: Any, config: ScheduledModeConfig):
|
|
31
|
-
"""Initialize scheduled mode."""
|
|
32
|
-
self.parser = parser
|
|
33
|
-
self.config = config
|
|
34
|
-
self.logger = parser.logger
|
|
35
|
-
self._is_running = False
|
|
36
|
-
self._scheduler_service = None
|
|
37
|
-
self._shutdown_event = asyncio.Event()
|
|
38
|
-
|
|
39
|
-
async def start(self, every: str, at: Optional[str] = None, **kwargs):
|
|
40
|
-
"""Start scheduled execution with full enterprise features."""
|
|
41
|
-
if self.logger:
|
|
42
|
-
self.logger.info(
|
|
43
|
-
f"⏰ Starting scheduled mode for: {self.parser.parser_name}"
|
|
44
|
-
)
|
|
45
|
-
self.logger.info(f"📅 Schedule: every {every}")
|
|
46
|
-
if at:
|
|
47
|
-
self.logger.info(f"🕘 At time: {at}")
|
|
48
|
-
|
|
49
|
-
# Setup scheduler service with type safety
|
|
50
|
-
scheduler_config = SchedulerConfig(
|
|
51
|
-
parser_id=self.parser.parser_id,
|
|
52
|
-
max_concurrent_tasks=kwargs.get(
|
|
53
|
-
"max_concurrent", self.config.max_concurrent
|
|
54
|
-
),
|
|
55
|
-
enable_jitter=kwargs.get("jitter", self.config.jitter),
|
|
56
|
-
jitter_range=kwargs.get("jitter_range", self.config.jitter_range),
|
|
57
|
-
default_timeout=kwargs.get("timeout", self.config.timeout),
|
|
58
|
-
default_retries=kwargs.get("retry_attempts", self.config.retry_attempts),
|
|
59
|
-
enable_task_monitoring=True,
|
|
60
|
-
health_check_interval=60,
|
|
61
|
-
)
|
|
62
|
-
|
|
63
|
-
self._scheduler_service = SchedulerService(
|
|
64
|
-
config=scheduler_config,
|
|
65
|
-
logger=self.logger,
|
|
66
|
-
metrics=self.parser.metrics if hasattr(self.parser, "metrics") else None,
|
|
67
|
-
)
|
|
68
|
-
|
|
69
|
-
# Create scheduled parse task with type safety
|
|
70
|
-
self._scheduler_service.add_task(
|
|
71
|
-
task_id=f"{self.parser.parser_id}_scheduled",
|
|
72
|
-
name=f"Scheduled {self.parser.parser_name}",
|
|
73
|
-
func=self._scheduled_parse_task,
|
|
74
|
-
every=every,
|
|
75
|
-
enabled=True,
|
|
76
|
-
timeout=kwargs.get("timeout", 300),
|
|
77
|
-
retry_attempts=kwargs.get("retry_attempts", 3),
|
|
78
|
-
max_runs=kwargs.get("max_runs"),
|
|
79
|
-
)
|
|
80
|
-
|
|
81
|
-
# Setup signal handlers for graceful shutdown
|
|
82
|
-
self._setup_signal_handlers()
|
|
83
|
-
|
|
84
|
-
self._is_running = True
|
|
85
|
-
|
|
86
|
-
try:
|
|
87
|
-
if self.logger:
|
|
88
|
-
self.logger.info("✅ Scheduler configured successfully")
|
|
89
|
-
self.logger.info("👂 Starting scheduled execution...")
|
|
90
|
-
self.logger.info(" Press Ctrl+C to stop")
|
|
91
|
-
|
|
92
|
-
# Start scheduler service
|
|
93
|
-
await self._scheduler_service.start()
|
|
94
|
-
|
|
95
|
-
except KeyboardInterrupt:
|
|
96
|
-
if self.logger:
|
|
97
|
-
self.logger.info("⏹️ Scheduled mode interrupted")
|
|
98
|
-
except Exception as e:
|
|
99
|
-
if self.logger:
|
|
100
|
-
self.logger.error(f"❌ Scheduled mode error: {e}")
|
|
101
|
-
raise
|
|
102
|
-
finally:
|
|
103
|
-
await self.stop()
|
|
104
|
-
|
|
105
|
-
def _setup_signal_handlers(self):
|
|
106
|
-
"""Setup signal handlers for graceful shutdown."""
|
|
107
|
-
|
|
108
|
-
def signal_handler(signum, frame):
|
|
109
|
-
if self.logger:
|
|
110
|
-
self.logger.info(f"\n🛑 Shutdown signal received (signal {signum})...")
|
|
111
|
-
self._shutdown_event.set()
|
|
112
|
-
|
|
113
|
-
# Stop scheduler
|
|
114
|
-
if self._scheduler_service:
|
|
115
|
-
asyncio.create_task(self._scheduler_service.stop())
|
|
116
|
-
|
|
117
|
-
# Register signal handlers
|
|
118
|
-
try:
|
|
119
|
-
signal.signal(signal.SIGINT, signal_handler)
|
|
120
|
-
signal.signal(signal.SIGTERM, signal_handler)
|
|
121
|
-
except Exception as e:
|
|
122
|
-
if self.logger:
|
|
123
|
-
self.logger.warning(f"Could not register signal handlers: {e}")
|
|
124
|
-
|
|
125
|
-
async def _scheduled_parse_task(self):
|
|
126
|
-
"""Scheduled parse task handler with full monitoring."""
|
|
127
|
-
start_time = asyncio.get_event_loop().time()
|
|
128
|
-
|
|
129
|
-
try:
|
|
130
|
-
if self.logger:
|
|
131
|
-
self.logger.info("🚀 Executing scheduled parse task")
|
|
132
|
-
|
|
133
|
-
# Setup parser if needed
|
|
134
|
-
if hasattr(self.parser, "setup"):
|
|
135
|
-
await self.parser.setup()
|
|
136
|
-
|
|
137
|
-
# Execute parse method
|
|
138
|
-
result = await self.parser.parse()
|
|
139
|
-
|
|
140
|
-
# Cleanup if needed
|
|
141
|
-
if hasattr(self.parser, "cleanup"):
|
|
142
|
-
await self.parser.cleanup()
|
|
143
|
-
|
|
144
|
-
duration = asyncio.get_event_loop().time() - start_time
|
|
145
|
-
items_count = len(result) if isinstance(result, (list, dict)) else 1
|
|
146
|
-
|
|
147
|
-
if self.logger:
|
|
148
|
-
self.logger.info(
|
|
149
|
-
f"✅ Scheduled task completed in {duration:.2f}s - {items_count} items"
|
|
150
|
-
)
|
|
151
|
-
|
|
152
|
-
return result
|
|
153
|
-
|
|
154
|
-
except Exception as e:
|
|
155
|
-
duration = asyncio.get_event_loop().time() - start_time
|
|
156
|
-
|
|
157
|
-
if self.logger:
|
|
158
|
-
self.logger.error(
|
|
159
|
-
f"❌ Scheduled task failed after {duration:.2f}s: {e}"
|
|
160
|
-
)
|
|
161
|
-
|
|
162
|
-
# Re-raise for scheduler error handling
|
|
163
|
-
raise
|
|
164
|
-
|
|
165
|
-
async def get_status(self) -> ScheduledModeStatus:
|
|
166
|
-
"""Get current scheduling status with type safety."""
|
|
167
|
-
|
|
168
|
-
if not self._scheduler_service:
|
|
169
|
-
return ScheduledModeStatus(
|
|
170
|
-
status="not_started",
|
|
171
|
-
is_running=False,
|
|
172
|
-
parser_id=self.parser.parser_id,
|
|
173
|
-
parser_name=self.parser.parser_name,
|
|
174
|
-
scheduler_health=None,
|
|
175
|
-
)
|
|
176
|
-
|
|
177
|
-
health = await self._scheduler_service.health_check()
|
|
178
|
-
return ScheduledModeStatus(
|
|
179
|
-
status="running" if self._is_running else "stopped",
|
|
180
|
-
is_running=self._is_running,
|
|
181
|
-
parser_id=self.parser.parser_id,
|
|
182
|
-
parser_name=self.parser.parser_name,
|
|
183
|
-
scheduler_health=health,
|
|
184
|
-
)
|
|
185
|
-
|
|
186
|
-
async def stop(self):
|
|
187
|
-
"""Stop scheduled mode gracefully."""
|
|
188
|
-
if self.logger:
|
|
189
|
-
self.logger.info("🛑 Stopping scheduled mode...")
|
|
190
|
-
|
|
191
|
-
self._is_running = False
|
|
192
|
-
self._shutdown_event.set()
|
|
193
|
-
|
|
194
|
-
# Stop scheduler service
|
|
195
|
-
if self._scheduler_service:
|
|
196
|
-
try:
|
|
197
|
-
await self._scheduler_service.stop()
|
|
198
|
-
except Exception as e:
|
|
199
|
-
if self.logger:
|
|
200
|
-
self.logger.error(f"Error stopping scheduler: {e}")
|
|
201
|
-
|
|
202
|
-
if self.logger:
|
|
203
|
-
self.logger.info("✅ Scheduled mode stopped")
|
|
204
|
-
|
|
205
|
-
def __repr__(self) -> str:
|
|
206
|
-
task_count = (
|
|
207
|
-
len(self._scheduler_service._tasks) if self._scheduler_service else 0
|
|
208
|
-
)
|
|
209
|
-
return f"<ScheduledMode(running={self._is_running}, tasks={task_count})>"
|
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Test Mode implementation for UnrealOn Driver v3.0
|
|
3
|
-
|
|
4
|
-
Development and debugging execution mode with detailed output and error reporting.
|
|
5
|
-
COMPLIANCE: 100% Pydantic v2 compliant, no Dict[str, Any] usage.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
import asyncio
|
|
9
|
-
import time
|
|
10
|
-
from datetime import datetime
|
|
11
|
-
from typing import Any, Optional
|
|
12
|
-
|
|
13
|
-
from unrealon_driver.src.core.exceptions import ParserError
|
|
14
|
-
from unrealon_driver.src.dto.execution import (
|
|
15
|
-
ParserTestConfig,
|
|
16
|
-
ExecutionResult,
|
|
17
|
-
ErrorInfo,
|
|
18
|
-
PerformanceMetrics,
|
|
19
|
-
ExecutionEnvironment,
|
|
20
|
-
)
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class TestMode:
|
|
24
|
-
"""
|
|
25
|
-
🧪 Test Mode - Development and debugging
|
|
26
|
-
|
|
27
|
-
Single execution for development and testing with:
|
|
28
|
-
- Detailed logging and debugging
|
|
29
|
-
- Error reporting with suggestions
|
|
30
|
-
- Performance metrics
|
|
31
|
-
- Results visualization
|
|
32
|
-
"""
|
|
33
|
-
|
|
34
|
-
def __init__(self, parser: Any, config: ParserTestConfig):
|
|
35
|
-
"""Initialize test mode with type-safe configuration."""
|
|
36
|
-
self.parser = parser
|
|
37
|
-
self.config = config
|
|
38
|
-
self.logger = parser.logger
|
|
39
|
-
self.metrics = parser.metrics
|
|
40
|
-
|
|
41
|
-
async def execute(self, **kwargs) -> ExecutionResult:
|
|
42
|
-
"""Execute parser in test mode with type-safe results."""
|
|
43
|
-
start_time = time.time()
|
|
44
|
-
start_datetime = datetime.now()
|
|
45
|
-
execution_id = f"test_{int(start_time)}"
|
|
46
|
-
|
|
47
|
-
if self.config.verbose:
|
|
48
|
-
self._print_test_header()
|
|
49
|
-
|
|
50
|
-
try:
|
|
51
|
-
# Initialize parser if needed
|
|
52
|
-
await self._initialize_test_environment()
|
|
53
|
-
|
|
54
|
-
# Execute the parse method
|
|
55
|
-
if self.config.verbose:
|
|
56
|
-
print("🚀 Starting parse execution...")
|
|
57
|
-
|
|
58
|
-
parse_start = time.time()
|
|
59
|
-
result = await self.parser.parse()
|
|
60
|
-
parse_duration = time.time() - parse_start
|
|
61
|
-
|
|
62
|
-
# Process results
|
|
63
|
-
processed_result = await self._process_test_result(
|
|
64
|
-
result, parse_duration, execution_id, start_datetime
|
|
65
|
-
)
|
|
66
|
-
|
|
67
|
-
if self.config.verbose:
|
|
68
|
-
self._print_test_success(processed_result, time.time() - start_time)
|
|
69
|
-
|
|
70
|
-
return processed_result
|
|
71
|
-
|
|
72
|
-
except Exception as e:
|
|
73
|
-
# In test mode, let critical exceptions propagate for debugging
|
|
74
|
-
if isinstance(e, (RuntimeError, NotImplementedError)):
|
|
75
|
-
raise
|
|
76
|
-
|
|
77
|
-
error_result = await self._handle_test_error(
|
|
78
|
-
e, execution_id, start_datetime, time.time() - start_time
|
|
79
|
-
)
|
|
80
|
-
|
|
81
|
-
if self.config.verbose:
|
|
82
|
-
self._print_test_error(error_result)
|
|
83
|
-
|
|
84
|
-
return error_result
|
|
85
|
-
|
|
86
|
-
finally:
|
|
87
|
-
await self._cleanup_test_environment()
|
|
88
|
-
|
|
89
|
-
def _print_test_header(self):
|
|
90
|
-
"""Print test mode header."""
|
|
91
|
-
print("\n" + "=" * 60)
|
|
92
|
-
print(f"🧪 UnrealOn Driver v3.0 - Test Mode")
|
|
93
|
-
print(f"📝 Parser: {self.parser.parser_name}")
|
|
94
|
-
print(f"🆔 ID: {self.parser.parser_id}")
|
|
95
|
-
print(f"⏰ Started: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
|
96
|
-
print("=" * 60)
|
|
97
|
-
|
|
98
|
-
async def _initialize_test_environment(self):
|
|
99
|
-
"""Initialize test environment."""
|
|
100
|
-
if self.config.show_browser:
|
|
101
|
-
# Override browser config to show browser
|
|
102
|
-
if hasattr(self.parser, "_browser") and self.parser._browser:
|
|
103
|
-
self.parser._browser.config["headless"] = False
|
|
104
|
-
else:
|
|
105
|
-
self.parser._config.browser_config["headless"] = False
|
|
106
|
-
|
|
107
|
-
# Ensure system directories exist
|
|
108
|
-
system_dir = self.parser._config._get_system_dir()
|
|
109
|
-
system_dir.mkdir(parents=True, exist_ok=True)
|
|
110
|
-
|
|
111
|
-
if self.logger:
|
|
112
|
-
self.logger.info(f"Starting test execution for {self.parser.parser_name}")
|
|
113
|
-
|
|
114
|
-
async def _process_test_result(
|
|
115
|
-
self, result: Any, duration: float, execution_id: str, start_time: datetime
|
|
116
|
-
) -> ExecutionResult:
|
|
117
|
-
"""Process and enrich test results with type safety."""
|
|
118
|
-
end_time = datetime.now()
|
|
119
|
-
|
|
120
|
-
# Count items processed
|
|
121
|
-
items_count = 0
|
|
122
|
-
if isinstance(result, list):
|
|
123
|
-
items_count = len(result)
|
|
124
|
-
elif isinstance(result, dict) and "data" in result:
|
|
125
|
-
data = result["data"]
|
|
126
|
-
if isinstance(data, list):
|
|
127
|
-
items_count = len(data)
|
|
128
|
-
else:
|
|
129
|
-
items_count = 1
|
|
130
|
-
elif result is not None:
|
|
131
|
-
items_count = 1
|
|
132
|
-
|
|
133
|
-
# Create performance metrics
|
|
134
|
-
performance_metrics = PerformanceMetrics(
|
|
135
|
-
execution_time_seconds=duration,
|
|
136
|
-
memory_usage_mb=0.0, # TODO: Add real memory tracking
|
|
137
|
-
cpu_usage_percent=0.0, # TODO: Add real CPU tracking
|
|
138
|
-
operations_count=items_count,
|
|
139
|
-
operations_per_second=items_count / duration if duration > 0 else 0.0,
|
|
140
|
-
)
|
|
141
|
-
|
|
142
|
-
return ExecutionResult(
|
|
143
|
-
success=True,
|
|
144
|
-
execution_id=execution_id,
|
|
145
|
-
start_time=start_time.isoformat(),
|
|
146
|
-
end_time=end_time.isoformat(),
|
|
147
|
-
duration_seconds=duration,
|
|
148
|
-
data=result if isinstance(result, dict) else {"result": result},
|
|
149
|
-
items_processed=items_count,
|
|
150
|
-
error=None,
|
|
151
|
-
parser_id=self.parser.parser_id,
|
|
152
|
-
execution_mode="test",
|
|
153
|
-
environment=self.config.environment,
|
|
154
|
-
performance_metrics=performance_metrics,
|
|
155
|
-
)
|
|
156
|
-
|
|
157
|
-
async def _handle_test_error(
|
|
158
|
-
self,
|
|
159
|
-
error: Exception,
|
|
160
|
-
execution_id: str,
|
|
161
|
-
start_time: datetime,
|
|
162
|
-
total_duration: float,
|
|
163
|
-
) -> ExecutionResult:
|
|
164
|
-
"""Handle test execution errors with type safety."""
|
|
165
|
-
end_time = datetime.now()
|
|
166
|
-
|
|
167
|
-
# Create error info
|
|
168
|
-
error_info = ErrorInfo(
|
|
169
|
-
message=str(error),
|
|
170
|
-
error_type=type(error).__name__,
|
|
171
|
-
error_code=getattr(
|
|
172
|
-
error, "error_code", None
|
|
173
|
-
), # OK for exception attributes
|
|
174
|
-
traceback=None, # We can add traceback if needed
|
|
175
|
-
context={
|
|
176
|
-
"parser_id": self.parser.parser_id,
|
|
177
|
-
"execution_id": execution_id,
|
|
178
|
-
"test_config": self.config.model_dump(),
|
|
179
|
-
},
|
|
180
|
-
)
|
|
181
|
-
|
|
182
|
-
# Log error
|
|
183
|
-
if self.logger:
|
|
184
|
-
self.logger.error(f"Test execution failed: {error}")
|
|
185
|
-
|
|
186
|
-
# Create performance metrics for error case
|
|
187
|
-
performance_metrics = PerformanceMetrics(
|
|
188
|
-
execution_time_seconds=total_duration,
|
|
189
|
-
memory_usage_mb=0.0,
|
|
190
|
-
cpu_usage_percent=0.0,
|
|
191
|
-
operations_count=0,
|
|
192
|
-
operations_per_second=0.0,
|
|
193
|
-
)
|
|
194
|
-
|
|
195
|
-
return ExecutionResult(
|
|
196
|
-
success=False,
|
|
197
|
-
execution_id=execution_id,
|
|
198
|
-
start_time=start_time.isoformat(),
|
|
199
|
-
end_time=end_time.isoformat(),
|
|
200
|
-
duration_seconds=total_duration,
|
|
201
|
-
data=None,
|
|
202
|
-
items_processed=0,
|
|
203
|
-
error=error_info,
|
|
204
|
-
parser_id=self.parser.parser_id,
|
|
205
|
-
execution_mode="test",
|
|
206
|
-
environment=self.config.environment,
|
|
207
|
-
performance_metrics=performance_metrics,
|
|
208
|
-
)
|
|
209
|
-
|
|
210
|
-
async def _cleanup_test_environment(self):
|
|
211
|
-
"""Clean up test environment."""
|
|
212
|
-
try:
|
|
213
|
-
# Capture final screenshots if enabled
|
|
214
|
-
if self.config.save_screenshots:
|
|
215
|
-
# Implementation for screenshot capture
|
|
216
|
-
pass
|
|
217
|
-
|
|
218
|
-
if self.logger:
|
|
219
|
-
self.logger.info("Test environment cleanup completed")
|
|
220
|
-
|
|
221
|
-
except Exception as e:
|
|
222
|
-
# Don't fail on screenshot errors, but log for debugging
|
|
223
|
-
if self.logger:
|
|
224
|
-
self.logger.debug(f"Screenshot capture failed (non-critical): {e}")
|
|
225
|
-
|
|
226
|
-
def _print_test_success(self, result: ExecutionResult, total_duration: float):
|
|
227
|
-
"""Print successful test results."""
|
|
228
|
-
print("\n✅ Test completed successfully!")
|
|
229
|
-
print(f"⏱️ Total duration: {total_duration:.2f}s")
|
|
230
|
-
print(f"📊 Parse duration: {result.duration_seconds:.2f}s")
|
|
231
|
-
print(f"📈 Items processed: {result.items_processed}")
|
|
232
|
-
print(f"🆔 Execution ID: {result.execution_id}")
|
|
233
|
-
|
|
234
|
-
if result.data and self.config.verbose:
|
|
235
|
-
print(f"📄 Result preview: {str(result.data)[:100]}...")
|
|
236
|
-
|
|
237
|
-
def _print_test_error(self, result: ExecutionResult):
|
|
238
|
-
"""Print test error information."""
|
|
239
|
-
print("\n❌ Test failed!")
|
|
240
|
-
print(f"⏱️ Duration: {result.duration_seconds:.2f}s")
|
|
241
|
-
print(f"🆔 Execution ID: {result.execution_id}")
|
|
242
|
-
|
|
243
|
-
if result.error:
|
|
244
|
-
print(f"🚫 Error: {result.error.message}")
|
|
245
|
-
print(f"📝 Type: {result.error.error_type}")
|
|
246
|
-
if result.error.error_code:
|
|
247
|
-
print(f"🔢 Code: {result.error.error_code}")
|
|
248
|
-
|
|
249
|
-
def __repr__(self) -> str:
|
|
250
|
-
return f"<TestMode(parser={self.parser.parser_id}, config={self.config.environment})>"
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
UnrealOn Driver v3.0 Logging Module
|
|
3
|
-
|
|
4
|
-
Zero-configuration logging with enterprise features:
|
|
5
|
-
- Integration with UnrealOn SDK DevelopmentLogger
|
|
6
|
-
- Specialized Driver operations logging
|
|
7
|
-
- Real-time WebSocket streaming (optional)
|
|
8
|
-
- Structured logging with Pydantic v2
|
|
9
|
-
- Performance metrics and operation tracking
|
|
10
|
-
"""
|
|
11
|
-
|
|
12
|
-
from .driver_logger import (
|
|
13
|
-
DriverLogger,
|
|
14
|
-
initialize_driver_logger,
|
|
15
|
-
get_driver_logger,
|
|
16
|
-
ensure_driver_logger,
|
|
17
|
-
)
|
|
18
|
-
|
|
19
|
-
__all__ = [
|
|
20
|
-
"DriverLogger",
|
|
21
|
-
"initialize_driver_logger",
|
|
22
|
-
"get_driver_logger",
|
|
23
|
-
"ensure_driver_logger",
|
|
24
|
-
]
|