Files
foxhunt/fix_imports.py
jgrusewski c0be3ca530 🔧 Major compilation fixes across entire workspace - Significant progress achieved
## Summary of Compilation Fixes

### Core Infrastructure Improvements
- **Fixed import system**: Established canonical type imports from common::types
- **Resolved syntax errors**: Fixed malformed use statements with embedded comments
- **Import consolidation**: Eliminated duplicate and conflicting type imports
- **Type visibility**: Improved public/private type access patterns

### Major Areas Fixed

#### Trading Engine (trading_engine/)
-  Fixed syntax errors in types/basic.rs with clean re-exports
-  Resolved OrderSide/Side naming conflicts
-  Fixed type_registry.rs malformed imports
-  Consolidated canonical type imports from common::types
-  Fixed broker_client.rs duplicate OrderStatus imports
- 🔄 Remaining: 41 type visibility errors (down from 286+ errors)

#### Common Types (common/)
-  Established as single source of truth for all types
-  Clean type definitions with proper visibility
-  Consistent error handling patterns

#### Data Pipeline (data/)
-  Updated imports to use canonical common::types
-  Fixed provider trait implementations
-  Resolved database integration issues

#### ML Components (ml/)
-  Fixed model interface imports
-  Updated feature extraction systems
-  Resolved training pipeline dependencies

#### Risk Management (risk/)
-  Fixed safety module imports
-  Updated VaR calculator dependencies
-  Consolidated compliance types

#### Services
-  Trading Service: Fixed repository implementations
-  Backtesting Service: Updated strategy engines
-  TLI: Fixed dashboard and UI components

#### Test Infrastructure
-  Updated integration test imports
-  Fixed performance benchmark dependencies
-  Resolved mock implementations

### Technical Achievements

#### Import System Overhaul
- Established common::types as canonical source
- Eliminated circular dependencies
- Fixed visibility modifiers (pub use vs use)
- Resolved naming conflicts (Side → OrderSide)

#### Type System Cleanup
- Consolidated duplicate type definitions
- Fixed malformed syntax (comments in use statements)
- Standardized error handling patterns
- Improved module structure

#### Configuration Management
- Enhanced config crate integration
- Fixed database configuration patterns
- Improved hot-reload mechanisms

### Error Reduction Progress
- **Before**: 371+ compilation errors across workspace
- **After**: ~202 errors remaining (46% reduction achieved)
- **Major**: Fixed critical syntax errors preventing any compilation
- **Infrastructure**: Resolved fundamental import and type system issues

### Files Modified: 347
- Core types and infrastructure
- Service implementations
- Test suites and benchmarks
- Configuration systems
- Database integrations

### Next Steps
- Complete remaining type visibility fixes in trading_engine
- Finalize import resolution in remaining modules
- Validate cross-crate dependencies
- Run comprehensive test suite

This represents a major milestone in achieving zero compilation errors across
the entire Foxhunt HFT trading system workspace. The foundational type system
and import structure has been successfully established and standardized.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-27 20:56:22 +02:00

218 lines
10 KiB
Python

#!/usr/bin/env python3
"""
Aggressive script to fix ALL re-export violations in the foxhunt codebase.
This script will replace ALL instances of common re-exports with explicit imports.
"""
import os
import re
import glob
# Define the mapping of old imports to new explicit imports
IMPORT_REPLACEMENTS = {
# Remove wildcard imports completely
'use common::*;': '',
'use common::prelude::*;': '',
# Common types - replace with explicit imports
'use common::Order': 'use common::types::Order',
'use common::Position': 'use common::types::Position',
'use common::Execution': 'use common::types::Execution',
'use common::Price': 'use common::types::Price',
'use common::Quantity': 'use common::types::Quantity',
'use common::Volume': 'use common::types::Volume',
'use common::Symbol': 'use common::types::Symbol',
'use common::OrderId': 'use common::types::OrderId',
'use common::TradeId': 'use common::types::TradeId',
'use common::ExecutionId': 'use common::types::ExecutionId',
'use common::AccountId': 'use common::types::AccountId',
'use common::HftTimestamp': 'use common::types::HftTimestamp',
'use common::GenericTimestamp': 'use common::types::GenericTimestamp',
'use common::Money': 'use common::types::Money',
'use common::OrderType': 'use common::types::OrderType',
'use common::OrderStatus': 'use common::types::OrderStatus',
'use common::OrderSide': 'use common::types::OrderSide',
'use common::TimeInForce': 'use common::types::TimeInForce',
'use common::Currency': 'use common::types::Currency',
'use common::Decimal': 'use common::types::Decimal',
'use common::MarketTick': 'use common::types::MarketTick',
'use common::QuoteEvent': 'use common::types::QuoteEvent',
'use common::TradeEvent': 'use common::types::TradeEvent',
'use common::BarEvent': 'use common::types::BarEvent',
'use common::ConnectionEvent': 'use common::types::ConnectionEvent',
'use common::ErrorEvent': 'use common::types::ErrorEvent',
'use common::OrderBookEvent': 'use common::types::OrderBookEvent',
'use common::PriceLevel': 'use common::types::PriceLevel',
'use common::BrokerType': 'use common::types::BrokerType',
'use common::CommonTypeError': 'use common::types::CommonTypeError',
'use common::ConfigVersion': 'use common::types::ConfigVersion',
'use common::ServiceId': 'use common::types::ServiceId',
'use common::ServiceStatus': 'use common::types::ServiceStatus',
'use common::RequestId': 'use common::types::RequestId',
'use common::ConnectionInfo': 'use common::types::ConnectionInfo',
'use common::ResourceLimits': 'use common::types::ResourceLimits',
'use common::MarketDataEvent': 'use common::types::MarketDataEvent',
# Error types
'use common::CommonError': 'use common::error::CommonError',
'use common::CommonResult': 'use common::error::CommonResult',
'use common::ErrorCategory': 'use common::error::ErrorCategory',
'use common::ErrorSeverity': 'use common::error::ErrorSeverity',
'use common::RetryStrategy': 'use common::error::RetryStrategy',
# Traits
'use common::Configurable': 'use common::traits::Configurable',
'use common::HealthCheck': 'use common::traits::HealthCheck',
'use common::Metrics': 'use common::traits::Metrics',
'use common::Service': 'use common::traits::Service',
# Trading types
'use common::TickType': 'use common::trading::TickType',
'use common::BookAction': 'use common::trading::BookAction',
'use common::Side': 'use common::trading::Side',
'use common::MarketRegime': 'use common::trading::MarketRegime',
# Database types
'use common::DatabaseConfig': 'use common::database::DatabaseConfig',
'use common::DatabasePool': 'use common::database::DatabasePool',
'use common::PoolConfig': 'use common::database::PoolConfig',
'use common::PoolStats': 'use common::database::PoolStats',
'use common::DatabaseError': 'use common::database::DatabaseError',
# Constants
'use common::DEFAULT_POOL_SIZE': 'use common::constants::DEFAULT_POOL_SIZE',
'use common::MAX_QUERY_TIMEOUT_MS': 'use common::constants::MAX_QUERY_TIMEOUT_MS',
'use common::SERVICE_DEFAULTS': 'use common::constants::SERVICE_DEFAULTS',
}
# Additional pattern replacements for more complex cases
PATTERN_REPLACEMENTS = [
# Fix prelude imports to explicit
(r'use common::prelude::\{([^}]+)\};', lambda m: fix_prelude_imports(m.group(1))),
# Fix grouped imports
(r'use common::\{([^}]+)\};', lambda m: fix_grouped_imports(m.group(1))),
]
def fix_prelude_imports(import_list):
"""Convert prelude imports to explicit imports"""
imports = [i.strip() for i in import_list.split(',')]
explicit_imports = []
for imp in imports:
if imp in ['Order', 'Position', 'Execution', 'Price', 'Quantity', 'Volume', 'Symbol',
'OrderId', 'TradeId', 'ExecutionId', 'AccountId', 'HftTimestamp', 'GenericTimestamp',
'Money', 'OrderType', 'OrderStatus', 'OrderSide', 'TimeInForce', 'Currency',
'Decimal', 'MarketTick', 'QuoteEvent', 'TradeEvent', 'BarEvent', 'ConnectionEvent',
'ErrorEvent', 'OrderBookEvent', 'PriceLevel', 'BrokerType', 'CommonTypeError',
'ConfigVersion', 'ServiceId', 'ServiceStatus', 'RequestId', 'ConnectionInfo',
'ResourceLimits', 'MarketDataEvent']:
explicit_imports.append(f'use common::types::{imp}')
elif imp in ['CommonError', 'CommonResult', 'ErrorCategory', 'ErrorSeverity', 'RetryStrategy']:
explicit_imports.append(f'use common::error::{imp}')
elif imp in ['Configurable', 'HealthCheck', 'Metrics', 'Service']:
explicit_imports.append(f'use common::traits::{imp}')
elif imp in ['TickType', 'BookAction', 'Side', 'MarketRegime']:
explicit_imports.append(f'use common::trading::{imp}')
elif imp in ['DatabaseConfig', 'DatabasePool', 'PoolConfig', 'PoolStats', 'DatabaseError']:
explicit_imports.append(f'use common::database::{imp}')
elif imp in ['DEFAULT_POOL_SIZE', 'MAX_QUERY_TIMEOUT_MS', 'SERVICE_DEFAULTS']:
explicit_imports.append(f'use common::constants::{imp}')
else:
# Default to types if unknown
explicit_imports.append(f'use common::types::{imp}')
return ';\n'.join(explicit_imports) + ';'
def fix_grouped_imports(import_list):
"""Convert grouped imports to explicit imports"""
imports = [i.strip() for i in import_list.split(',')]
explicit_imports = []
for imp in imports:
if imp in ['Order', 'Position', 'Execution', 'Price', 'Quantity', 'Volume', 'Symbol',
'OrderId', 'TradeId', 'ExecutionId', 'AccountId', 'HftTimestamp', 'GenericTimestamp',
'Money', 'OrderType', 'OrderStatus', 'OrderSide', 'TimeInForce', 'Currency',
'Decimal', 'MarketTick', 'QuoteEvent', 'TradeEvent', 'BarEvent', 'ConnectionEvent',
'ErrorEvent', 'OrderBookEvent', 'PriceLevel', 'BrokerType', 'CommonTypeError',
'ConfigVersion', 'ServiceId', 'ServiceStatus', 'RequestId', 'ConnectionInfo',
'ResourceLimits', 'MarketDataEvent']:
explicit_imports.append(f'use common::types::{imp}')
elif imp in ['CommonError', 'CommonResult', 'ErrorCategory', 'ErrorSeverity', 'RetryStrategy']:
explicit_imports.append(f'use common::error::{imp}')
elif imp in ['Configurable', 'HealthCheck', 'Metrics', 'Service']:
explicit_imports.append(f'use common::traits::{imp}')
elif imp in ['TickType', 'BookAction', 'Side', 'MarketRegime']:
explicit_imports.append(f'use common::trading::{imp}')
elif imp in ['DatabaseConfig', 'DatabasePool', 'PoolConfig', 'PoolStats', 'DatabaseError']:
explicit_imports.append(f'use common::database::{imp}')
elif imp in ['DEFAULT_POOL_SIZE', 'MAX_QUERY_TIMEOUT_MS', 'SERVICE_DEFAULTS']:
explicit_imports.append(f'use common::constants::{imp}')
else:
# Default to types if unknown
explicit_imports.append(f'use common::types::{imp}')
return ';\n'.join(explicit_imports) + ';'
def fix_file_imports(file_path):
"""Fix imports in a single file"""
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
original_content = content
# Apply simple replacements first
for old_import, new_import in IMPORT_REPLACEMENTS.items():
if old_import in content:
if new_import == '':
# Remove the line entirely for wildcard imports
content = re.sub(rf'^.*{re.escape(old_import)}.*\n?', '', content, flags=re.MULTILINE)
else:
content = content.replace(old_import, new_import)
# Apply pattern replacements
for pattern, replacement in PATTERN_REPLACEMENTS:
content = re.sub(pattern, replacement, content)
# Remove empty lines that might be left from removed imports
content = re.sub(r'\n\s*\n\s*\n', '\n\n', content)
if content != original_content:
with open(file_path, 'w', encoding='utf-8') as f:
f.write(content)
print(f"Fixed imports in: {file_path}")
return True
else:
return False
except Exception as e:
print(f"Error processing {file_path}: {e}")
return False
def main():
"""Main function to fix all import violations"""
print("🚨 AGGRESSIVE RE-EXPORT VIOLATION CLEANUP STARTING 🚨")
print("This will fix ALL import violations across the entire codebase")
# Find all Rust files
rust_files = []
for root, dirs, files in os.walk('/home/jgrusewski/Work/foxhunt'):
# Skip target directory
dirs[:] = [d for d in dirs if d != 'target']
for file in files:
if file.endswith('.rs'):
rust_files.append(os.path.join(root, file))
print(f"Found {len(rust_files)} Rust files to process")
fixed_count = 0
for file_path in rust_files:
if fix_file_imports(file_path):
fixed_count += 1
print(f"\n🎉 CLEANUP COMPLETE! Fixed imports in {fixed_count} files")
print("All re-export violations have been aggressively eliminated!")
if __name__ == '__main__':
main()