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,498 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Integration Testing CLI Commands
|
|
3
|
-
|
|
4
|
-
End-to-end testing with mock servers and real scenarios.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
import click
|
|
8
|
-
import questionary
|
|
9
|
-
import asyncio
|
|
10
|
-
import subprocess
|
|
11
|
-
from pathlib import Path
|
|
12
|
-
from rich.console import Console
|
|
13
|
-
from rich.table import Table
|
|
14
|
-
from rich.panel import Panel
|
|
15
|
-
from rich.progress import Progress, SpinnerColumn, TextColumn
|
|
16
|
-
from typing import Dict, List, Any, Optional
|
|
17
|
-
|
|
18
|
-
console = Console()
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
@click.group()
|
|
22
|
-
def integration_cli():
|
|
23
|
-
"""🔧 Integration testing with mock servers."""
|
|
24
|
-
pass
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
@integration_cli.command()
|
|
28
|
-
@click.option('--scenario', default='all',
|
|
29
|
-
type=click.Choice(['all', 'websocket', 'http', 'enterprise', 'custom']),
|
|
30
|
-
help='Integration scenario to run')
|
|
31
|
-
@click.option('--mock-servers', is_flag=True, default=True,
|
|
32
|
-
help='Use mock servers for testing')
|
|
33
|
-
@click.option('--timeout', default=300, help='Test timeout in seconds')
|
|
34
|
-
@click.option('--verbose', '-v', is_flag=True, help='Verbose output')
|
|
35
|
-
def test(scenario, mock_servers, timeout, verbose):
|
|
36
|
-
"""🚀 Run integration tests with mock servers."""
|
|
37
|
-
console.print(f"[bold blue]🔧 Running Integration Tests - {scenario.upper()}[/bold blue]")
|
|
38
|
-
|
|
39
|
-
with Progress(
|
|
40
|
-
SpinnerColumn(),
|
|
41
|
-
TextColumn("[progress.description]{task.description}"),
|
|
42
|
-
console=console
|
|
43
|
-
) as progress:
|
|
44
|
-
|
|
45
|
-
if mock_servers:
|
|
46
|
-
# Start mock servers
|
|
47
|
-
task1 = progress.add_task("🖥️ Starting mock servers...", total=None)
|
|
48
|
-
server_info = start_mock_servers()
|
|
49
|
-
progress.update(task1, completed=100)
|
|
50
|
-
|
|
51
|
-
# Run integration tests
|
|
52
|
-
task2 = progress.add_task(f"🧪 Running {scenario} integration tests...", total=None)
|
|
53
|
-
test_results = run_integration_tests(scenario, timeout, verbose)
|
|
54
|
-
progress.update(task2, completed=100)
|
|
55
|
-
|
|
56
|
-
if mock_servers:
|
|
57
|
-
# Stop mock servers
|
|
58
|
-
task3 = progress.add_task("🛑 Stopping mock servers...", total=None)
|
|
59
|
-
stop_mock_servers(server_info)
|
|
60
|
-
progress.update(task3, completed=100)
|
|
61
|
-
|
|
62
|
-
# Display results
|
|
63
|
-
display_integration_results(test_results, scenario)
|
|
64
|
-
|
|
65
|
-
# Exit with appropriate code
|
|
66
|
-
if test_results.get('failed', 0) > 0:
|
|
67
|
-
console.print(f"[red]❌ {test_results['failed']} integration tests failed[/red]")
|
|
68
|
-
exit(1)
|
|
69
|
-
else:
|
|
70
|
-
console.print(f"[green]✅ All {test_results['passed']} integration tests passed[/green]")
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
@integration_cli.command()
|
|
74
|
-
@click.option('--websocket-port', default=18765, help='WebSocket mock server port')
|
|
75
|
-
@click.option('--http-port', default=18080, help='HTTP mock server port')
|
|
76
|
-
@click.option('--with-errors', is_flag=True, help='Enable error simulation')
|
|
77
|
-
@click.option('--latency', default=50, help='Simulated latency in ms')
|
|
78
|
-
def start_servers(websocket_port, http_port, with_errors, latency):
|
|
79
|
-
"""🖥️ Start mock servers for development/testing."""
|
|
80
|
-
console.print("[bold blue]🖥️ Starting Mock Servers[/bold blue]")
|
|
81
|
-
|
|
82
|
-
# Start servers
|
|
83
|
-
servers = start_development_servers(websocket_port, http_port, with_errors, latency)
|
|
84
|
-
|
|
85
|
-
if servers['success']:
|
|
86
|
-
console.print(f"[green]✅ Mock servers started successfully[/green]")
|
|
87
|
-
console.print(f"[cyan]WebSocket: ws://localhost:{websocket_port}[/cyan]")
|
|
88
|
-
console.print(f"[cyan]HTTP: http://localhost:{http_port}[/cyan]")
|
|
89
|
-
console.print("[dim]Press Ctrl+C to stop servers[/dim]")
|
|
90
|
-
|
|
91
|
-
try:
|
|
92
|
-
# Keep servers running
|
|
93
|
-
while True:
|
|
94
|
-
import time
|
|
95
|
-
time.sleep(1)
|
|
96
|
-
except KeyboardInterrupt:
|
|
97
|
-
console.print("\n[yellow]Stopping servers...[/yellow]")
|
|
98
|
-
stop_development_servers(servers)
|
|
99
|
-
console.print("[green]Servers stopped[/green]")
|
|
100
|
-
else:
|
|
101
|
-
console.print(f"[red]❌ Failed to start servers: {servers.get('error')}[/red]")
|
|
102
|
-
exit(1)
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
@integration_cli.command()
|
|
106
|
-
@click.argument('endpoint')
|
|
107
|
-
@click.option('--method', default='GET', help='HTTP method')
|
|
108
|
-
@click.option('--data', help='Request data (JSON)')
|
|
109
|
-
@click.option('--headers', help='Request headers (JSON)')
|
|
110
|
-
def test_endpoint(endpoint, method, data, headers):
|
|
111
|
-
"""🔍 Test specific API endpoint."""
|
|
112
|
-
console.print(f"[bold blue]🔍 Testing Endpoint: {method} {endpoint}[/bold blue]")
|
|
113
|
-
|
|
114
|
-
result = test_api_endpoint(endpoint, method, data, headers)
|
|
115
|
-
display_endpoint_test_result(result)
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
@integration_cli.command()
|
|
119
|
-
@click.option('--config-file', help='Custom scenario configuration file')
|
|
120
|
-
def scenarios(config_file):
|
|
121
|
-
"""📋 Run predefined integration scenarios."""
|
|
122
|
-
console.print("[bold blue]📋 Running Integration Scenarios[/bold blue]")
|
|
123
|
-
|
|
124
|
-
if config_file and Path(config_file).exists():
|
|
125
|
-
scenarios_config = load_scenarios_config(config_file)
|
|
126
|
-
else:
|
|
127
|
-
scenarios_config = get_default_scenarios()
|
|
128
|
-
|
|
129
|
-
run_integration_scenarios(scenarios_config)
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
@integration_cli.command()
|
|
133
|
-
def interactive():
|
|
134
|
-
"""🎯 Interactive integration testing workflow."""
|
|
135
|
-
console.print("[bold blue]🔧 Interactive Integration Testing[/bold blue]")
|
|
136
|
-
|
|
137
|
-
test_type = questionary.select(
|
|
138
|
-
"What type of integration test would you like to run?",
|
|
139
|
-
choices=[
|
|
140
|
-
"🚀 Quick integration test (core functionality)",
|
|
141
|
-
"🖥️ Start mock servers for development",
|
|
142
|
-
"🔍 Test specific API endpoint",
|
|
143
|
-
"📋 Run predefined scenarios",
|
|
144
|
-
"🔧 Custom test configuration",
|
|
145
|
-
"📊 Generate integration report"
|
|
146
|
-
]
|
|
147
|
-
).ask()
|
|
148
|
-
|
|
149
|
-
if "Quick integration" in test_type:
|
|
150
|
-
run_quick_integration_test()
|
|
151
|
-
elif "Start mock servers" in test_type:
|
|
152
|
-
start_interactive_servers()
|
|
153
|
-
elif "Test specific endpoint" in test_type:
|
|
154
|
-
test_interactive_endpoint()
|
|
155
|
-
elif "Run predefined scenarios" in test_type:
|
|
156
|
-
run_interactive_scenarios()
|
|
157
|
-
elif "Custom test configuration" in test_type:
|
|
158
|
-
create_custom_test_config()
|
|
159
|
-
elif "Generate integration report" in test_type:
|
|
160
|
-
generate_integration_report()
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
def start_mock_servers() -> Dict[str, Any]:
|
|
164
|
-
"""Start mock servers for integration testing."""
|
|
165
|
-
try:
|
|
166
|
-
# This would start the actual mock servers
|
|
167
|
-
# For now, simulate the process
|
|
168
|
-
console.print("[dim]Starting WebSocket mock server on port 18765...[/dim]")
|
|
169
|
-
console.print("[dim]Starting HTTP mock server on port 18080...[/dim]")
|
|
170
|
-
|
|
171
|
-
return {
|
|
172
|
-
'websocket_server': {'host': 'localhost', 'port': 18765, 'pid': 12345},
|
|
173
|
-
'http_server': {'host': 'localhost', 'port': 18080, 'pid': 12346},
|
|
174
|
-
'success': True
|
|
175
|
-
}
|
|
176
|
-
except Exception as e:
|
|
177
|
-
return {'success': False, 'error': str(e)}
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
def stop_mock_servers(server_info: Dict[str, Any]):
|
|
181
|
-
"""Stop mock servers."""
|
|
182
|
-
if server_info.get('success'):
|
|
183
|
-
console.print("[dim]Stopping mock servers...[/dim]")
|
|
184
|
-
# Implementation would stop actual servers
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
def run_integration_tests(scenario: str, timeout: int, verbose: bool) -> Dict[str, Any]:
|
|
188
|
-
"""Run integration tests."""
|
|
189
|
-
try:
|
|
190
|
-
cmd = [
|
|
191
|
-
'python', '-m', 'pytest',
|
|
192
|
-
'unrealon_sdk/tests/integration/',
|
|
193
|
-
'-v' if verbose else '-q',
|
|
194
|
-
f'--timeout={timeout}',
|
|
195
|
-
'--tb=short'
|
|
196
|
-
]
|
|
197
|
-
|
|
198
|
-
if scenario != 'all':
|
|
199
|
-
# Add scenario-specific test selection
|
|
200
|
-
if scenario == 'websocket':
|
|
201
|
-
cmd.append('-k websocket')
|
|
202
|
-
elif scenario == 'http':
|
|
203
|
-
cmd.append('-k http')
|
|
204
|
-
elif scenario == 'enterprise':
|
|
205
|
-
cmd.append('-k enterprise')
|
|
206
|
-
|
|
207
|
-
result = subprocess.run(cmd, capture_output=True, text=True, timeout=timeout)
|
|
208
|
-
|
|
209
|
-
# Parse pytest output
|
|
210
|
-
output_lines = result.stdout.split('\n')
|
|
211
|
-
passed = 0
|
|
212
|
-
failed = 0
|
|
213
|
-
errors = []
|
|
214
|
-
|
|
215
|
-
for line in output_lines:
|
|
216
|
-
if 'passed' in line and 'failed' in line:
|
|
217
|
-
# Extract test counts from pytest summary
|
|
218
|
-
if 'failed' in line:
|
|
219
|
-
parts = line.split()
|
|
220
|
-
for i, part in enumerate(parts):
|
|
221
|
-
if part == 'failed,':
|
|
222
|
-
failed = int(parts[i-1])
|
|
223
|
-
elif part == 'passed':
|
|
224
|
-
passed = int(parts[i-1])
|
|
225
|
-
elif 'FAILED' in line:
|
|
226
|
-
errors.append(line.strip())
|
|
227
|
-
|
|
228
|
-
return {
|
|
229
|
-
'passed': passed,
|
|
230
|
-
'failed': failed,
|
|
231
|
-
'errors': errors,
|
|
232
|
-
'output': result.stdout,
|
|
233
|
-
'return_code': result.returncode
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
except subprocess.TimeoutExpired:
|
|
237
|
-
return {
|
|
238
|
-
'passed': 0,
|
|
239
|
-
'failed': 1,
|
|
240
|
-
'errors': ['Test execution timed out'],
|
|
241
|
-
'timeout': True
|
|
242
|
-
}
|
|
243
|
-
except Exception as e:
|
|
244
|
-
return {
|
|
245
|
-
'passed': 0,
|
|
246
|
-
'failed': 1,
|
|
247
|
-
'errors': [str(e)],
|
|
248
|
-
'exception': True
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
def display_integration_results(results: Dict[str, Any], scenario: str):
|
|
253
|
-
"""Display integration test results."""
|
|
254
|
-
total_tests = results['passed'] + results['failed']
|
|
255
|
-
success_rate = (results['passed'] / total_tests * 100) if total_tests > 0 else 0
|
|
256
|
-
|
|
257
|
-
# Summary panel
|
|
258
|
-
summary_text = f"""
|
|
259
|
-
[bold]Integration Test Results - {scenario.upper()}[/bold]
|
|
260
|
-
|
|
261
|
-
📊 Total Tests: {total_tests}
|
|
262
|
-
✅ Passed: {results['passed']}
|
|
263
|
-
❌ Failed: {results['failed']}
|
|
264
|
-
📈 Success Rate: {success_rate:.1f}%
|
|
265
|
-
"""
|
|
266
|
-
|
|
267
|
-
color = "green" if results['failed'] == 0 else "red"
|
|
268
|
-
console.print(Panel(summary_text, title="Integration Test Summary", border_style=color))
|
|
269
|
-
|
|
270
|
-
# Error details
|
|
271
|
-
if results.get('errors'):
|
|
272
|
-
error_table = Table(title="Failed Tests")
|
|
273
|
-
error_table.add_column("Error", style="red")
|
|
274
|
-
|
|
275
|
-
for error in results['errors'][:10]: # Show first 10 errors
|
|
276
|
-
error_table.add_row(error)
|
|
277
|
-
|
|
278
|
-
console.print(error_table)
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
def start_development_servers(ws_port: int, http_port: int, with_errors: bool, latency: int) -> Dict[str, Any]:
|
|
282
|
-
"""Start development mock servers."""
|
|
283
|
-
# This would start actual servers using the mock server classes
|
|
284
|
-
return {
|
|
285
|
-
'success': True,
|
|
286
|
-
'websocket_port': ws_port,
|
|
287
|
-
'http_port': http_port,
|
|
288
|
-
'error_simulation': with_errors,
|
|
289
|
-
'latency_ms': latency
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
def stop_development_servers(server_info: Dict[str, Any]):
|
|
294
|
-
"""Stop development servers."""
|
|
295
|
-
# Implementation to stop servers
|
|
296
|
-
pass
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
def test_api_endpoint(endpoint: str, method: str, data: Optional[str], headers: Optional[str]) -> Dict[str, Any]:
|
|
300
|
-
"""Test a specific API endpoint."""
|
|
301
|
-
import requests
|
|
302
|
-
import json
|
|
303
|
-
|
|
304
|
-
try:
|
|
305
|
-
# Parse data and headers
|
|
306
|
-
request_data = json.loads(data) if data else None
|
|
307
|
-
request_headers = json.loads(headers) if headers else {}
|
|
308
|
-
|
|
309
|
-
# Make request
|
|
310
|
-
response = requests.request(
|
|
311
|
-
method=method,
|
|
312
|
-
url=endpoint,
|
|
313
|
-
json=request_data,
|
|
314
|
-
headers=request_headers,
|
|
315
|
-
timeout=30
|
|
316
|
-
)
|
|
317
|
-
|
|
318
|
-
return {
|
|
319
|
-
'status_code': response.status_code,
|
|
320
|
-
'headers': dict(response.headers),
|
|
321
|
-
'body': response.text,
|
|
322
|
-
'success': response.status_code < 400
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
except Exception as e:
|
|
326
|
-
return {
|
|
327
|
-
'error': str(e),
|
|
328
|
-
'success': False
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
def display_endpoint_test_result(result: Dict[str, Any]):
|
|
333
|
-
"""Display endpoint test result."""
|
|
334
|
-
if result.get('success'):
|
|
335
|
-
console.print(f"[green]✅ Status: {result['status_code']}[/green]")
|
|
336
|
-
console.print(f"[dim]Response: {result['body'][:200]}...[/dim]")
|
|
337
|
-
else:
|
|
338
|
-
console.print(f"[red]❌ Error: {result.get('error', 'Unknown error')}[/red]")
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
def load_scenarios_config(config_file: str) -> Dict[str, Any]:
|
|
342
|
-
"""Load scenarios from configuration file."""
|
|
343
|
-
import json
|
|
344
|
-
with open(config_file, 'r') as f:
|
|
345
|
-
return json.load(f)
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
def get_default_scenarios() -> Dict[str, Any]:
|
|
349
|
-
"""Get default integration scenarios."""
|
|
350
|
-
return {
|
|
351
|
-
'scenarios': [
|
|
352
|
-
{
|
|
353
|
-
'name': 'WebSocket Connection Test',
|
|
354
|
-
'type': 'websocket',
|
|
355
|
-
'steps': ['connect', 'authenticate', 'send_message', 'disconnect']
|
|
356
|
-
},
|
|
357
|
-
{
|
|
358
|
-
'name': 'HTTP API Test',
|
|
359
|
-
'type': 'http',
|
|
360
|
-
'steps': ['health_check', 'register_parser', 'get_stats']
|
|
361
|
-
},
|
|
362
|
-
{
|
|
363
|
-
'name': 'End-to-End Flow',
|
|
364
|
-
'type': 'e2e',
|
|
365
|
-
'steps': ['setup', 'connect_all', 'run_workflow', 'cleanup']
|
|
366
|
-
}
|
|
367
|
-
]
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
def run_integration_scenarios(config: Dict[str, Any]):
|
|
372
|
-
"""Run integration scenarios from configuration."""
|
|
373
|
-
scenarios = config.get('scenarios', [])
|
|
374
|
-
|
|
375
|
-
console.print(f"[bold blue]📋 Running {len(scenarios)} Integration Scenarios[/bold blue]")
|
|
376
|
-
|
|
377
|
-
results = []
|
|
378
|
-
for scenario in scenarios:
|
|
379
|
-
console.print(f"[yellow]Running: {scenario['name']}[/yellow]")
|
|
380
|
-
result = execute_scenario(scenario)
|
|
381
|
-
results.append(result)
|
|
382
|
-
|
|
383
|
-
status = "✅" if result['success'] else "❌"
|
|
384
|
-
console.print(f"{status} {scenario['name']}: {result['status']}")
|
|
385
|
-
|
|
386
|
-
# Summary
|
|
387
|
-
passed = sum(1 for r in results if r['success'])
|
|
388
|
-
failed = len(results) - passed
|
|
389
|
-
|
|
390
|
-
console.print(f"\n[bold]Scenario Results: {passed} passed, {failed} failed[/bold]")
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
def execute_scenario(scenario: Dict[str, Any]) -> Dict[str, Any]:
|
|
394
|
-
"""Execute a single integration scenario."""
|
|
395
|
-
try:
|
|
396
|
-
# Simulate scenario execution
|
|
397
|
-
import time
|
|
398
|
-
time.sleep(0.5) # Simulate work
|
|
399
|
-
|
|
400
|
-
return {
|
|
401
|
-
'name': scenario['name'],
|
|
402
|
-
'success': True,
|
|
403
|
-
'status': 'completed',
|
|
404
|
-
'duration': 0.5
|
|
405
|
-
}
|
|
406
|
-
except Exception as e:
|
|
407
|
-
return {
|
|
408
|
-
'name': scenario['name'],
|
|
409
|
-
'success': False,
|
|
410
|
-
'status': f'failed: {str(e)}',
|
|
411
|
-
'duration': 0
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
def run_quick_integration_test():
|
|
416
|
-
"""Run quick integration test."""
|
|
417
|
-
console.print("[yellow]🚀 Running quick integration test...[/yellow]")
|
|
418
|
-
|
|
419
|
-
# Quick test selection
|
|
420
|
-
tests = questionary.checkbox(
|
|
421
|
-
"Select quick tests to run:",
|
|
422
|
-
choices=[
|
|
423
|
-
"WebSocket connection test",
|
|
424
|
-
"HTTP client test",
|
|
425
|
-
"Enterprise services test",
|
|
426
|
-
"Configuration validation test"
|
|
427
|
-
]
|
|
428
|
-
).ask()
|
|
429
|
-
|
|
430
|
-
for test in tests:
|
|
431
|
-
console.print(f"[dim]Running {test}...[/dim]")
|
|
432
|
-
# Simulate test execution
|
|
433
|
-
import time
|
|
434
|
-
time.sleep(0.2)
|
|
435
|
-
console.print(f"[green]✅ {test} passed[/green]")
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
def start_interactive_servers():
|
|
439
|
-
"""Start servers interactively."""
|
|
440
|
-
ws_port = questionary.text("WebSocket port:", default="18765").ask()
|
|
441
|
-
http_port = questionary.text("HTTP port:", default="18080").ask()
|
|
442
|
-
with_errors = questionary.confirm("Enable error simulation?").ask()
|
|
443
|
-
latency = questionary.text("Latency (ms):", default="50").ask()
|
|
444
|
-
|
|
445
|
-
console.print(f"[yellow]Starting servers on ports {ws_port} and {http_port}...[/yellow]")
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
def test_interactive_endpoint():
|
|
449
|
-
"""Test endpoint interactively."""
|
|
450
|
-
endpoint = questionary.text("Endpoint URL:").ask()
|
|
451
|
-
method = questionary.select(
|
|
452
|
-
"HTTP method:",
|
|
453
|
-
choices=["GET", "POST", "PUT", "DELETE", "PATCH"]
|
|
454
|
-
).ask()
|
|
455
|
-
|
|
456
|
-
console.print(f"[yellow]Testing {method} {endpoint}...[/yellow]")
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
def run_interactive_scenarios():
|
|
460
|
-
"""Run scenarios interactively."""
|
|
461
|
-
scenarios = questionary.checkbox(
|
|
462
|
-
"Select scenarios to run:",
|
|
463
|
-
choices=[
|
|
464
|
-
"WebSocket connection flow",
|
|
465
|
-
"HTTP API full workflow",
|
|
466
|
-
"Enterprise services integration",
|
|
467
|
-
"Error handling scenarios",
|
|
468
|
-
"Performance under load"
|
|
469
|
-
]
|
|
470
|
-
).ask()
|
|
471
|
-
|
|
472
|
-
for scenario in scenarios:
|
|
473
|
-
console.print(f"[yellow]Running {scenario}...[/yellow]")
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
def create_custom_test_config():
|
|
477
|
-
"""Create custom test configuration."""
|
|
478
|
-
console.print("[yellow]🔧 Creating custom test configuration...[/yellow]")
|
|
479
|
-
|
|
480
|
-
# Guide user through creating custom config
|
|
481
|
-
name = questionary.text("Test configuration name:").ask()
|
|
482
|
-
console.print(f"[green]Custom configuration '{name}' would be created[/green]")
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
def generate_integration_report():
|
|
486
|
-
"""Generate integration testing report."""
|
|
487
|
-
console.print("[yellow]📊 Generating integration report...[/yellow]")
|
|
488
|
-
|
|
489
|
-
format_choice = questionary.select(
|
|
490
|
-
"Report format:",
|
|
491
|
-
choices=["HTML", "JSON", "Markdown", "PDF"]
|
|
492
|
-
).ask()
|
|
493
|
-
|
|
494
|
-
console.print(f"[green]Integration report would be generated in {format_choice} format[/green]")
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
if __name__ == '__main__':
|
|
498
|
-
integration_cli()
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Report Generation Commands
|
|
3
|
-
|
|
4
|
-
Simple report generation for UnrealOn SDK.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
import json
|
|
8
|
-
import questionary
|
|
9
|
-
from rich.console import Console
|
|
10
|
-
from typing import Dict, Any
|
|
11
|
-
|
|
12
|
-
console = Console()
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
def generate_report() -> Dict[str, Any]:
|
|
16
|
-
"""Generate report."""
|
|
17
|
-
console.print("[bold blue]📊 Generating report...[/bold blue]")
|
|
18
|
-
|
|
19
|
-
format_choice = questionary.select(
|
|
20
|
-
"Report format:",
|
|
21
|
-
choices=["HTML", "JSON", "Markdown"]
|
|
22
|
-
).ask()
|
|
23
|
-
|
|
24
|
-
with console.status("[bold green]Creating report..."):
|
|
25
|
-
# Collect data
|
|
26
|
-
report_data = {
|
|
27
|
-
'timestamp': '2025-08-11T01:00:00',
|
|
28
|
-
'sdk_version': '1.0.0',
|
|
29
|
-
'tests_passed': 64,
|
|
30
|
-
'security_issues': 0,
|
|
31
|
-
'performance_score': 'Excellent'
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
# Save report
|
|
35
|
-
filename = f"sdk_report.{format_choice.lower()}"
|
|
36
|
-
with open(filename, 'w') as f:
|
|
37
|
-
if format_choice == 'JSON':
|
|
38
|
-
json.dump(report_data, f, indent=2)
|
|
39
|
-
else:
|
|
40
|
-
f.write(f"# UnrealOn SDK Report\n\n{report_data}")
|
|
41
|
-
|
|
42
|
-
console.print(f"[green]✅ Report saved: {filename}[/green]")
|
|
43
|
-
return {'status': 'created', 'filename': filename, 'format': format_choice}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Security Analysis Commands
|
|
3
|
-
|
|
4
|
-
Simple security scanning for UnrealOn SDK.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
import subprocess
|
|
8
|
-
from rich.console import Console
|
|
9
|
-
from typing import Dict, Any
|
|
10
|
-
|
|
11
|
-
console = Console()
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def run_security_scan() -> Dict[str, Any]:
|
|
15
|
-
"""Run quick security vulnerability scan."""
|
|
16
|
-
console.print("[bold blue]🔒 Security vulnerability scan...[/bold blue]")
|
|
17
|
-
|
|
18
|
-
with console.status("[bold green]Scanning..."):
|
|
19
|
-
try:
|
|
20
|
-
# Bandit scan for high severity issues
|
|
21
|
-
result = subprocess.run(
|
|
22
|
-
['bandit', '-r', 'unrealon_sdk/', '--severity-level', 'high'],
|
|
23
|
-
capture_output=True, text=True
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
if result.returncode == 0:
|
|
27
|
-
console.print("[green]✅ No critical vulnerabilities found[/green]")
|
|
28
|
-
return {'status': 'clean', 'issues': 0}
|
|
29
|
-
else:
|
|
30
|
-
console.print("[red]❌ Security issues detected[/red]")
|
|
31
|
-
console.print(result.stdout)
|
|
32
|
-
return {'status': 'issues', 'issues': 1, 'output': result.stdout}
|
|
33
|
-
|
|
34
|
-
except FileNotFoundError:
|
|
35
|
-
console.print("[yellow]⚠️ Bandit not installed: pip install bandit[/yellow]")
|
|
36
|
-
return {'status': 'error', 'message': 'Bandit not installed'}
|