Test suite cleanup: Further streamlined from ~600 to 373 assertions. All tests now pass locally with zero warnings and zero skips.
Test idiom improvements: Replaced expect_true(is.data.frame()) with expect_s3_class(), expect_equal(length()) with expect_length(). Removed redundant gg-class checks already covered by vdiffr snapshots.
Test file consolidation: Deleted fragmented files (test-smoke-and-errors.R, test-uncovered-branches.R, etc.) and merged relevant tests into per-feature files.
Dependency cleanup: Removed purrr entirely (only used once via superseded purrr::transpose()). R CMD check now passes with 0 errors and 0 warnings.
Packaging: Removed CITATION.cff (was flagged by R CMD check as non-standard), cleaned up NAMESPACE and .Rbuildignore.
Test suite rewrite: Reduced from ~1500 to ~200 focused tests with meaningful value assertions; added vdiffr snapshot testing for all plot functions (15 visual regression tests).
Bug fixes:
FITfileR::records() returns a listcalculate_ef_from_stream() column name mismatch (power vs watts)calculate_decoupling() column name mismatch (heart_rate vs heartrate)Analysis–plotting separation: All plot functions now require pre-computed data; passing analysis arguments emits a deprecation warning.
Custom S3 classes: All calculation functions return dedicated classes (athlytics_acwr, athlytics_ef, athlytics_decoupling, athlytics_pbs, athlytics_exposure).
Scientific references: Added references with DOIs throughout vignettes and roxygen documentation (Gabbett, Hulin, Impellizzeri, Coyle, Allen, Williams, etc.).
ACWR caveats: Added "Important Caveats" section discussing scientific debate on ACWR predictive validity.
New features:
gap_hr) support for EF calculationsmooth_per_activity_type option in plot_ef()plot_acwr()plot_exposure() risk zones no longer require an ACWR columncalculate_pbs()Documentation improvements:
pace_hr deprecated in favor of speed_hr)|> used in vignettesCode cleanup: Removed zzz.R, unused color palette functions, rStrava/mockery from Suggests, Strava API references; cleaned NAMESPACE imports.
CI: R CMD check now runs on 3 R versions (devel, release, oldrel-1) across 3 OS.
Shipped example files: inst/extdata/ contains example.fit, .gpx, .tcx.
Code style: Applied styler::style_pkg() formatting.
Runnable vignettes: Added executable demo chunks using built-in sample datasets so key plots render during build_vignettes().
Sample data naming: Renamed built-in datasets from athlytics_sample_* to sample_* and updated docs/examples accordingly.
Styling: Ran styler::style_pkg() to improve formatting consistency.
Reduced Cyclomatic Complexity: Refactored calculate_acwr() and calculate_exposure() by extracting shared load calculation logic into internal helper functions (calculate_daily_load_internal(), compute_single_load(), validate_load_metric_params()). This improves code maintainability and testability without changing the public API.
Dependency Cleanup: Removed unused viridis package from Imports. The package was declared as a dependency but never actually called (ggplot2's built-in scale_color_viridis_d() was used instead).
Documentation Fixes: Fixed Rd line width issues in plot_with_reference() examples.
API Naming Consistency: Added verb-first primary APIs and kept previous names as deprecated wrappers for backward compatibility.
calculate_cohort_reference() (replaces cohort_reference())summarize_quality() (replaces quality_summary())Build Configuration: Updated .Rbuildignore to properly exclude development files.
This major release transitions from Strava API to local data export processing, prioritizing user privacy and data ownership while eliminating API rate limits and authentication requirements.
Privacy-First Architecture: Complete shift from Strava API to local ZIP file processing
load_local_activities() function supports direct ZIP file loading (no manual extraction needed)Enhanced Documentation: Comprehensive documentation improvements across all core functions
calculate_acwr(), calculate_ef(), and calculate_decoupling() documentationMulti-Athlete Cohort Analysis: Improved support for research and team analytics
cohort_reference() and multi-athlete workflowsgroup_modify() for batch processingREADME & Package Updates
activities_df → activities_data)paper/paper.md and paper/paper.bib)
.gitignore to track README.md and paper/ directoryFor users upgrading from 0.1.x:
fetch_strava_activities() calls with load_local_activities("export.zip")activities_df → activities_data, plot_*() now accepts data directly\dontrun{} as advised) and ensuring metadata files meet all CRAN standards.This significant update enhances package reliability and ease of use by integrating sample datasets. This enables all examples to run offline and ensures core functionalities have undergone more rigorous, reproducible testing.
\donttest{} blocks.mockery, improving test robustness and parameter coverage.strava_oauth(...) scenarios for offline/testing contexts); providing accurate and refined documentation for data objects in R/data.R; fixing Roxygen import directives for precise namespace definition; improving help file readability through Rd line width adjustments; and optimizing package data loading by adding LazyData: true to DESCRIPTION.rStrava::get_activity_streams to direct Strava API calls using httr and jsonlite for fetching activity streams in calculate_decoupling. This aims to resolve previous errors but might impact performance and rate limiting.calculate_acwr error (condition has length > 1) by forcing evaluation before the dplyr pipe.plot_pbs usage in examples and test scripts to include the required distance_meters argument.httr, jsonlite) to DESCRIPTION file.rStrava.