All checks were successful
build / build-test (push) Successful in 1m52s
14 KiB
14 KiB
Changelog
All notable changes to the Top Drives Records Analyzer project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
Added
- New
improvecommand that generatesimprove.csv— owned cars not yet at a final tune build, sorted by track count normalized_configfield onBestCarRecord— maps any tune config to its closest final build (323/233/332)normalize_to_final_build()function — normalizes tune configs by incrementing the smallest digit until sum reaches 8owned_configsfield onMyCarsData— extracts actual player tune config (engineMajor/weightMajor/chassisMajor) frommy_cars.jsonowned_configsfield onCarCounts— passes player config data through to output functionsatomic_write()helper — writes to a temporary file first, then renames on success (no partial CSV files)empty_my_data()test helper — creates an empty owned configs map for tests- Version prefix stripping (
v2c_/v1c_) for config keys at parse time FinalBuildcolumn inbest.csv,very_best.csv,wishlist.csv,add.csv,remove.csvoutput files- Dedup check in
update_best_carnow considersnormalized_configto prevent same car+config duplicates
Changed
capture runaborts with a clear error when the game package is missing on the device, before any proxy/CA state is set up — a missing package was the launch failure that previously triggered the proxy leak- BlueStacks shutdown is now graceful:
adb reboot -pfirst (clean ext4 unmount), withtaskkill /Fonly as a 30 s fallback — force-killing the emulator corruptedData.vhdxand BlueStacks' boot repair then discardedpackages.xmlandaccounts.dbas corrupt files, which took the installed game and the Google account with it (2026-10-02) CarCounts.by_ridkey changed fromStringto(String, String)for per-config trackingCarCounts.guid_to_ridchanged fromHashMap<String, String>toHashMap<String, HashSet<(String, String)>>compute_car_counts()now acceptsowned_configsparametercompare_records()now sorts by normalized config as secondary key (after RQ, before brand)load_my_cars_data()now extracts tune config data for locked cards- CSV output files now include
FinalBuildcolumn showing the normalized config update_best_car()tie detection now checks bothcar_ridandnormalized_config- Applied
rustfmtformatting across the entire codebase capture runnow reverts the device to its pre-capture state before closing BlueStacks — clears the global proxy, removes the adb reverse rule, unmounts the tmpfs CA overlay, and deletes the CA staging files in/data/local/tmp(same revert ascapture clean)
Removed
plans/code-review-v2.md(completed action items)
Fixed
capture runno longer leaves BlueStacks offline when a step fails after the device is set up: CA injection, proxy listener bind, proxy/reverse setup, and game launch errors — and Ctrl+C during setup — now run the same device revert as the happy path instead of skipping it (revert_device_stateis now unconditional once the device is connected)trash.csvConfig column now lists only the copies to delete: for cars where just one tune is useless (e.g. owned 332 + best-everywhere 323) only the dead tune is shown instead of all owned configs- Cars the records site knows but has no times for (typically new prize cars, returned as
200with an empty body) no longer abortfetchafter 3 retries — they are skipped with an info log - Empty timing files are now treated like missing files instead of producing
EOF while parsing a valueparse errors - A crashed or killed capture no longer breaks BlueStacks networking:
capture runclears a stale globalhttp_proxyleft behind by a previous run at startup (the setting persists VM reboots and black-holes all proxy-honoring traffic, e.g. Play Store and the browser) - Missing
u8type annotation onparse()in output tests that broke compilation ofcargo testandcargo clippy --all-targetson current rustc
[0.3.0] - 2026-05-07
Added
- New
allcommand that generates all output CSV files in a single parse pass - New
wishlistcommand with--min-countand--max-wishlistflags for wishlist management --min-countflag onbestcommand to configure very_best threshold (default: 10)--max-wishlistflag onwishlistandallcommands (default: 300)CarCountsstruct andcompute_car_counts()function for shared analysis computation- CSV file output:
best.csv,very_best.csv,wishlist.csv,add.csv,remove.csv - All output files now include CSV headers
Changed
bestcommand now writes tobest.csvandvery_best.csvinstead of printing to stdouttrashcommand now writes totrash.csvinstead of printing to stdout- All output files are sorted by car RQ (via
compare_cars()) wishlistcommand now generates ideal wishlist, add/remove recommendations
Removed
missingcommand (functionality absorbed intowishlist/add/remove)+prefix from output (no longer needed with dedicated wishlist commands)-prefix from output (replaced by dedicatedremove.csv)print_best_cars(),print_wishlist_stale(),print_trash()functions
[0.2.0] - 2026-05-07
Added
- Comprehensive documentation suite in
docs/directory - Detailed code comments for all public functions
- Architecture documentation explaining system design
- User guide with command examples and troubleshooting
- Data structures documentation for JSON formats
- Development setup guide with dependency explanations
track_names.json— external config file mapping track codes to human-readable names (loaded at compile time viainclude_str!)clapdependency with derive feature for structured CLI argument parsing- Daily workflow documentation with output file descriptions (
best.csv,details.csv,add.csv,remove.csv,trash.csv,sorted.csv,very_best.csv,wishlist.csv) - Test suite covering
update_best_carlogic, RQ range analysis, time validation, track name completeness, and condition completeness
Changed
translate_track_name()inlib.rsnow loads track name mappings fromtrack_names.jsoninstead of a hardcoded match statement- Magic number 115 replaced with
const MAX_RQ: u8 = 113inrecords.rsfor clarity and maintainability parse_all_times()now uses a semaphore (limit 20) for bounded concurrency instead of unbounded task spawning- Replaced manual
env::args()CLI parsing withclapderive for proper--help,--version, and argument validation print_best_car()signature changed from(&String, &String, &String)to(&str, &str, u8)for idiomatic Rust and compile-time RQ validation- Empty test bodies removed from
records.rs - Better progress reporting during data fetching
- Improved CSV output formatting
Removed
- Club Module: Removed
src/club.rsbinary (topdrives.club is no longer maintained) - scraper dependency: Removed
scrapercrate fromCargo.toml(was only used by club module) - tracks.txt: Removed track definitions file (only used by club binary)
- Club module
Carstruct (separate struct withclass,upgradefields)
[0.2.0] - 2026-05-07
Added
- Track-Specific Analysis: New
trackcommand for targeted recommendations - Enhanced Output: CSV file generation for analysis results
- Improved Concurrency: Better handling of multiple simultaneous downloads
- Rate Limiting: Configurable download limits to respect server constraints
Changed
- Modular Architecture: Split functionality into separate binary targets
- Error Handling: More graceful handling of network and parsing errors
- Configuration: Externalized track and car data sources
- Performance: Optimized memory usage for large datasets
Fixed
- Memory Leaks: Fixed issues with async task cleanup
- File Handle Management: Proper cleanup of temporary files
- Network Timeouts: Better handling of slow or unreliable connections
[0.1.0] - 2024-01-XX
Added
- Initial Release: Core functionality for Top Drives car analysis
- Best Cars Analysis: Identify top performing cars in collection
- Missing Cars Detection: Find cars that would improve performance
- Collection Optimization: Identify cars safe to remove
- Detailed Performance Data: Comprehensive timing analysis
- JSON Data Processing: Parse community timing database
- Concurrent Processing: Multi-threaded analysis for performance
Features
- Multi-Platform Support: Windows, macOS, and Linux compatibility
- Comprehensive Track Support: All tracks and surface conditions
- RQ Range Analysis: Performance analysis across rarity brackets
- User Collection Integration: Import and analyze personal car collection
- Community Data Integration: Leverage crowd-sourced timing data
Technical Features by Version
Data Processing
- [0.1.0] Basic JSON parsing and analysis
- [0.2.0] Enhanced error handling and data validation
- [Unreleased] Track name mappings externalized to
track_names.json
Performance
- [0.1.0] Single-threaded processing
- [0.2.0] Concurrent downloads with rate limiting
- [Unreleased] Bounded concurrency via semaphore (limit 20);
MAX_RQconstant replaces magic number
User Interface
- [0.1.0] Basic command-line interface
- [0.2.0] Enhanced output formatting and CSV export
- [Unreleased]
full_scriptcommand for complete daily workflow
Data Sources
- [0.1.0] JSON-based records from community repository
- [0.2.0] Added HTML scraping from topdrives.club
- [Unreleased] Removed club scraping (topdrives.club no longer maintained)
Migration Guide
Upgrading to Unreleased from 0.2.0
Breaking Changes:
- Club module removed:
cargo run --bin clubis no longer available scraperdependency removed: No longer needed without club moduletracks.txtremoved: Track names now intrack_names.jsontranslate_track_name()changed: Now loads fromtrack_names.jsoninstead of hardcoded match- Magic number 115 →
MAX_RQ(113): RQ range analysis now usesMAX_RQ = 113constant
New Features Available:
full_scriptcommand: Run fetch + all analysis in one command- Additional output files:
add.csv,remove.csv,sorted.csv,very_best.csv,wishlist.csv - External track name config:
track_names.jsoncan be updated without code changes
Upgrading from 0.1.0 to 0.2.0
No breaking changes - the upgrade is fully backwards compatible.
New Features Available:
- Track Command: Specific track analysis with
cargo run --bin records -- track - CSV Output: Automatic generation of analysis files
Performance Improvements:
- Faster data fetching with concurrent downloads
- Better memory usage for large datasets
- Improved error recovery
Deprecation Notices
Removed in Unreleased
- Club Module:
src/club.rsandcargo run --bin club— topdrives.club is no longer maintained scraperdependency: Removed fromCargo.tomltracks.txt: Replaced bytrack_names.json
Deprecated Features
- None currently deprecated
Community Contributions
Notable Contributions
- Community Timing Data: All performance data from Top Drives community
- Track Definitions: Comprehensive track database
- Bug Reports: User feedback for improvements
Contribution Statistics
- Timing Submissions: 1000+ cars with community data
- Track Coverage: 200+ tracks across all conditions
- Active Contributors: Community-driven development
Performance Benchmarks
Data Processing Speed
- Initial Load: ~2-3 minutes (downloads 1000+ files)
- Subsequent Runs: <30 seconds (uses cached data)
- Concurrent Operations: 20 simultaneous downloads (semaphore bounded)
Memory Usage
- Base Application: ~50MB
- With Full Dataset: ~200MB
- Peak During Processing: ~300MB
Network Efficiency
- Compression: Efficient HTTP compression
- Connection Reuse: Persistent HTTP connections
- Rate Limiting: Semaphore-bounded concurrency (limit 20)
Known Issues and Limitations
Current Limitations
- Data Freshness: Requires manual refresh for latest community data
- Network Dependency: Requires internet for initial data download
- Storage Requirements: Large local dataset (~100MB)
- Single User: Designed for individual use, not multi-user
Platform-Specific Issues
- Windows: Potential path length limitations with many files
- macOS: Gatekeeper may flag the binary (code-signed in releases)
- Linux: No known issues
Future Roadmap
Planned Features (Unreleased)
- Historical Analysis: Track performance changes over time
- Advanced Analytics: Statistical analysis and trend detection
Potential Enhancements
- Real-time Updates: Live data synchronization
- Customization: User-defined analysis parameters
- Export Options: Multiple file formats (PDF, Excel)
Support Information
Getting Help
- Documentation: Check
docs/directory for comprehensive guides - Issue Tracker: Report bugs and request features
- Discussions: Community forum for questions and tips
Troubleshooting Resources
- User Guide: Step-by-step instructions and examples
- Development Setup: Technical installation guide
- Data Structures: Detailed format documentation
- Architecture Guide: System design and data flow
Acknowledgments
Contributors
- Original Author: Project creator and maintainer
- Community Contributors: Timing data providers and testers
- Open Source Projects: Rust ecosystem and tooling
Data Sources
- Top Drives Community: Primary timing data source
- GitHub Contributors: Track and car database maintenance
Changelog Format: Follows Keep a Changelog format Versioning: Follows Semantic Versioning principles Last Updated: 2026-05-07