Commit graph

34 commits

Author SHA1 Message Date
fc9f637c60 Generalize config prefix stripping and refactor improve CSV output
- Replace hardcoded v2c_/v1c_ prefix stripping with generic rsplit_once('_')
  approach that handles any prefix (v2b_, v3a_, etc.) while validating
  the suffix is exactly 3 ASCII digits
- Refactor write_improve_csv to emit one row per normalized config per car
  instead of a single aggregated row, giving visibility into all viable
  upgrade paths
- Add 4 new tests covering prefix stripping and improve CSV behavior
2026-05-11 20:16:09 +02:00
2b0602d564 docs: update documentation for normalized config and improve command
- Add improve command to all command tables and usage sections
- Add normalized_config field to BestCarRecord struct documentation
- Update CarCounts.by_rid type from String to (String, String)
- Update CarCounts.guid_to_rid type to HashMap<String, HashSet<(String, String)>>
- Add owned_configs field to MyCarsData and CarCounts docs
- Add normalize_to_final_build() to API docs
- Update CSV format examples to include FinalBuild column
- Update my_cars.json structure with engineMajor/weightMajor/chassisMajor
- Update timing file example with v2c_ version prefix
- Add version prefix stripping to data transformation docs
- Update CHANGELOG.md with Unreleased section
- Fix compare_records description to include normalized config sorting
2026-05-11 16:58:01 +02:00
bf21d3d1f6 feat: add normalized config tracking and improve command
- Add normalize_to_final_build() to map tune configs to final builds (323/233/332)
- Add normalized_config field to BestCarRecord
- Change CarCounts.by_rid key from String to (String, String) for per-config tracking
- Change CarCounts.guid_to_rid to HashMap<String, HashSet<(String, String)>>
- Extract owned tune configs from my_cars.json (engineMajor/weightMajor/chassisMajor)
- Add improve command: owned cars not yet at final build, sorted by track count
- Strip version prefixes (v2c_/v1c_) from config keys at parse time
- Update dedup check in update_best_car to consider normalized_config
- Add atomic_write helper for safe CSV output
- Delete completed plans/code-review-v2.md
- Apply rustfmt formatting across codebase
2026-05-11 16:23:04 +02:00
67a79f190a Refactor: extract lib.rs into focused sub-modules, add --output-dir CLI option
- Split monolithic src/lib.rs (~640 lines) into 7 sub-modules:
  types.rs, context.rs, user_data.rs, translate.rs, http.rs,
  csv_util.rs, test_utils.rs
- Add configurable --output-dir CLI option for CSV output files
- Implement atomic file writes (write-to-temp + rename) for all CSVs
- Change compute_car_counts() to return CarCounts directly (not Result)
- Add test-utils feature gate for shared test helpers
- Add HTTP mock tests with mockito (6 tests)
- Add proptest tests for compute_car_counts (3 property tests)
- Update integration tests to use shared test utilities
- Update documentation (API.md, ARCHITECTURE.md, DATA_STRUCTURES.md)
2026-05-08 20:21:46 +02:00
d2c1418e5e docs: update documentation to match refactored codebase
- Delete obsolete plans/code-review.md (all suggestions implemented)
- Rewrite docs/API.md to reflect modular architecture, DashMap, corrected
  AppError variants, accurate function signatures and module locations
- Rewrite docs/ARCHITECTURE.md to reflect DashMap concurrency, remove
  completed future enhancements, fix AnalysisContext description
- Update docs/USER_GUIDE.md with global CLI path options (--my-cars,
  --cars-db, --times-dir, --tracks-db) and updated troubleshooting
2026-05-08 16:36:14 +02:00
a9a46ee551 refactor: modular architecture with unified error handling and DashMap concurrency
- Break monolithic records.rs into commands/, output/, parsing/ modules
- Add lib.rs with shared types (AppError, Car, BestCarRecord, etc.)
- Replace Arc<Mutex<HashMap>> with DashMap for concurrent access
- Add unified AppError enum with thiserror
- Add configurable CLI paths (--my-cars, --cars-db, --times-dir, --tracks-db)
- Add serde deserialization for Car struct
- Add CSV escaping for fields with commas/quotes/newlines
- Fix track name splitting: split_once -> rsplit_once for _a handling
- Add integration tests, proptest property-based tests, and unit tests
- Add rustfmt.toml configuration
- Update documentation (API, ARCHITECTURE, DATA_STRUCTURES, README)
2026-05-08 16:19:01 +02:00
9d57b18a4e Release v0.3.0: CSV output, wishlist commands, improved error handling
- Replace stdout output with structured CSV file generation
- Add wishlist, all commands with --min-count and --max-wishlist flags
- Introduce CarCounts struct for shared analysis computation
- Improve error handling: return Result instead of unwrap/panic
- Add prize field to BestCarRecord
- Remove TODO.md
2026-05-07 20:13:30 +02:00
08c96d9981 Replace manual CLI parsing with clap derive
- Add clap dependency with derive feature for structured CLI argument parsing
- Replace env::args() manual matching with clap subcommands (fetch, best, missing, wishlist, trash, details, track)
- Change print_best_car() signature from (&String, &String, &String) to (&str, &str, u8) for idiomatic Rust
- Add TODO.md tracking known tech debt and planned features
- Update CHANGELOG.md with clap migration details and set v0.2.0 release date
2026-05-07 12:27:11 +02:00
89fa69e3c8 refactor: extract lib.rs, remove club module, add bounded concurrency
- Extract shared types (Car, BestCarRecord, AnalysisContext) into src/lib.rs
- Replace global static BEST_CARS with injected AnalysisContext for testability
- Add semaphore-bounded concurrency (limit 20) in parse_all_times()
- Replace hardcoded track name match with track_names.json loaded via include_str!
- Replace magic number 115 with const MAX_RQ: u8 = 113
- Improve floating-point tie comparison with TIME_TOLERANCE (5ms) constant
- Remove src/club.rs binary (topdrives.club no longer maintained)
- Remove scraper dependency from Cargo.toml
- Remove tracks.txt (replaced by track_names.json)
- Remove empty/placeholder test bodies
- Improve error handling in get_file() for response body read
- Add load_my_cars_data() combining owned + wishlist extraction in one I/O
- Update CHANGELOG, README, and all docs to reflect changes
2026-05-06 20:20:15 +02:00
6a68469239 Modernize dependencies, add wishlist features, improve error handling
- Remove once_cell and serde dependencies; use std::sync::LazyLock
  and manual serde_json::Value parsing instead
- Add wishlist support: load wishlist from my_cars.json, prefix
  missing cars with '+' in missing mode, add 'wishlist' command
  to show stale wishlist entries (prefixed with '-')
- Replace unwrap()/expect() with graceful eprintln warnings and
  early returns throughout (get_car_list, parse_car_times, etc.)
- Scope all Mutex locks tightly to avoid holding during I/O
  (print_best_times, print_best_cars, print_trash, print_wishlist_stale)
- Replace custom split_prefix_postfix with str::split_once
- Pass owned-car set into parse_all_times/parse_car_times via
  Arc<HashSet> instead of reading file per task
- Consolidate my_cars.json loading into single load_my_cars_data()
  returning both owned and wishlist sets
- Add .gitignore and Cargo.lock to version control
- Report task failures in parse_all_times join loop
2026-05-06 00:30:56 +02:00
32c4d3c10e Added documentation
Added test cases
Added comments
2025-10-02 17:35:56 +02:00
7a8d9beedc Exclude RQ 80+ from trash 2025-06-17 13:10:16 +02:00
a109940c5d Fixed warning
Exclude prize cars from trash
2025-06-16 16:07:11 +02:00
b8433909fd Added trash feature 2025-06-16 11:42:39 +02:00
48e623a1a3 Added feature for missing cars 2025-06-16 11:07:14 +02:00
4e299db3c0 Corrected handling of tied times 2025-05-29 10:47:05 +02:00
ad60ab1b11 Sort by RQ and car name rather than RQ and occurences 2025-04-25 09:17:54 +02:00
4a21a552d7 Fixed a bug that was miscounting the best time occurences for cars 2025-04-24 17:30:48 +02:00
5dd278b8f1 Fix: For the best cars the highest RQ of any given track where they were best was printed, instead of the car's RQ. The list was also sorted by that wrong RQ 2025-04-02 14:53:35 +02:00
1a6ea07ed9 Get rid of DB, parse into memory 2025-03-31 12:15:01 +02:00
12a3868a46 Fixes and preparation for in-memory solution 2025-03-30 17:07:36 +02:00
02ff6eddb2 Multi-threaded fetch 2025-03-30 16:33:04 +02:00
431ea2814b Implemented search for best car for track 2025-03-28 16:21:07 +01:00
21e53eb9e2 Perform parsing in-memory 2025-03-28 15:47:09 +01:00
137ebde68b Caching SQL INSERTS 2025-03-23 10:35:55 +01:00
2fa2966aaa Update to TD Records and new cars 2025-02-13 08:18:05 +01:00
5783bb4826 Bugfix: Overflow in the counter 2024-11-21 14:08:31 +01:00
e565866ba8 Added counter for tracks the cars are best for in the non-detailed output 2024-11-21 10:44:43 +01:00
195a306b79 Corrected executable name
Incremented version
Removed outdated imports
2024-10-20 14:07:07 +02:00
a495f4d4d7 Introduced switch for detailed track output 2024-10-19 15:46:32 +02:00
e2efe052b5 Fix: if no rq10 car finishes, the track's best car is not in the list 2024-10-18 15:49:46 +02:00
5c3a05d2e6 Fixed an error with unknown track ids
Fixed track list
2024-10-18 08:11:01 +02:00
Jan-Peter von Hunnius
abda9a3313 Added the tracks a car ist best for to the output plus the car's configuration 2024-10-16 16:24:39 +02:00
Jan-Peter von Hunnius
3a826e3903 Copied initial source 2024-10-16 11:24:12 +02:00