docs: add project README
- Project overview and features - Supported leagues (8 sports) - Installation and setup instructions - Project structure and architecture - Development commands - Test suite summary Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
161
README.md
Normal file
161
README.md
Normal file
@@ -0,0 +1,161 @@
|
||||
# SportsTime
|
||||
|
||||
An iOS app for planning multi-stop sports road trips across North America. Plan your ultimate stadium-hopping adventure with intelligent route optimization, real-time game schedules, and detailed trip itineraries.
|
||||
|
||||
## Features
|
||||
|
||||
- **Multi-Sport Trip Planning** - Plan trips across 8 professional and college leagues
|
||||
- **Three Planning Modes**
|
||||
- **By Date Range** - Find the best games within your travel window
|
||||
- **By Must-See Games** - Build a trip around specific matchups you want to attend
|
||||
- **By Cities** - Select departure/arrival cities and discover games along the route
|
||||
- **Intelligent Route Optimization** - TSP solver optimizes multi-stop routes for minimum travel time
|
||||
- **Driving Constraints** - Respects max daily driving hours and number of drivers
|
||||
- **Offline-First** - Works without internet using locally cached schedule data
|
||||
- **PDF Export** - Generate detailed trip itineraries with maps, stadium info, and nearby attractions
|
||||
- **Stadium Tracking** - Track which stadiums you've visited across all leagues
|
||||
|
||||
## Supported Leagues
|
||||
|
||||
| League | Sport | Season |
|
||||
|--------|-------|--------|
|
||||
| MLB | Baseball | March - October |
|
||||
| NBA | Basketball | October - June |
|
||||
| NHL | Hockey | October - June |
|
||||
| NFL | Football | September - February |
|
||||
| MLS | Soccer | February - December |
|
||||
| WNBA | Basketball | May - October |
|
||||
| NWSL | Soccer | March - November |
|
||||
| CBB | College Basketball | November - April |
|
||||
|
||||
## Requirements
|
||||
|
||||
- iOS 26.0+
|
||||
- Xcode 26.0+
|
||||
- Swift 6.0+
|
||||
|
||||
## Installation
|
||||
|
||||
1. Clone the repository:
|
||||
```bash
|
||||
git clone https://github.com/yourusername/SportsTime.git
|
||||
cd SportsTime
|
||||
```
|
||||
|
||||
2. Open the project in Xcode:
|
||||
```bash
|
||||
open SportsTime.xcodeproj
|
||||
```
|
||||
|
||||
3. Build and run on simulator or device.
|
||||
|
||||
## Project Structure
|
||||
|
||||
```
|
||||
SportsTime/
|
||||
├── SportsTime/ # Main app target
|
||||
│ ├── Core/ # Data layer
|
||||
│ │ ├── Models/
|
||||
│ │ │ ├── Domain/ # Pure Swift structs (Trip, Game, Stadium, Team)
|
||||
│ │ │ ├── CloudKit/ # CKRecord wrappers
|
||||
│ │ │ └── Local/ # SwiftData models
|
||||
│ │ └── Services/ # CloudKit, Location services
|
||||
│ ├── Planning/ # Domain layer - trip planning logic
|
||||
│ │ └── Engine/ # TripPlanningEngine, RouteOptimizer, etc.
|
||||
│ ├── Features/ # Presentation layer - SwiftUI views
|
||||
│ │ ├── Home/
|
||||
│ │ ├── Trip/
|
||||
│ │ ├── Schedule/
|
||||
│ │ ├── Progress/
|
||||
│ │ └── Settings/
|
||||
│ ├── Export/ # PDF generation
|
||||
│ └── Resources/ # Bundled JSON data
|
||||
├── SportsTimeTests/ # Unit tests
|
||||
├── Scripts/ # Python data pipeline
|
||||
│ └── sportstime_parser/ # Schedule scraping & CloudKit upload
|
||||
├── data/ # Local data files
|
||||
└── docs/ # Documentation
|
||||
```
|
||||
|
||||
## Architecture
|
||||
|
||||
**Clean MVVM** with feature-based modules and offline-first data architecture.
|
||||
|
||||
### Three-Layer Architecture
|
||||
|
||||
1. **Presentation Layer** (`Features/`) - SwiftUI Views + `@Observable` ViewModels
|
||||
2. **Domain Layer** (`Planning/`) - Trip planning algorithms
|
||||
3. **Data Layer** (`Core/`) - Models and services
|
||||
|
||||
### Data Flow
|
||||
|
||||
```
|
||||
AppDataProvider.shared (Single Source of Truth)
|
||||
│
|
||||
├── Bundled JSON (bootstrap on first launch)
|
||||
├── SwiftData (local persistence)
|
||||
└── CloudKit (background sync)
|
||||
```
|
||||
|
||||
All schedule data flows through `AppDataProvider.shared` - never access CloudKit or SwiftData directly for canonical data.
|
||||
|
||||
## Development
|
||||
|
||||
### Build
|
||||
|
||||
```bash
|
||||
xcodebuild -project SportsTime.xcodeproj \
|
||||
-scheme SportsTime \
|
||||
-destination 'platform=iOS Simulator,name=iPhone 17,OS=26.2' \
|
||||
build
|
||||
```
|
||||
|
||||
### Run Tests
|
||||
|
||||
```bash
|
||||
# All tests
|
||||
xcodebuild -project SportsTime.xcodeproj \
|
||||
-scheme SportsTime \
|
||||
-destination 'platform=iOS Simulator,name=iPhone 17,OS=26.2' \
|
||||
test
|
||||
|
||||
# Specific test suite
|
||||
xcodebuild -project SportsTime.xcodeproj \
|
||||
-scheme SportsTime \
|
||||
-destination 'platform=iOS Simulator,name=iPhone 17,OS=26.2' \
|
||||
-only-testing:SportsTimeTests/EdgeCaseTests \
|
||||
test
|
||||
```
|
||||
|
||||
### Data Pipeline
|
||||
|
||||
The Python pipeline scrapes schedules from multiple sources and uploads to CloudKit:
|
||||
|
||||
```bash
|
||||
cd Scripts
|
||||
pip install -r requirements.txt
|
||||
python -m sportstime_parser scrape --sport all --season 2026
|
||||
python -m sportstime_parser upload --sport all
|
||||
```
|
||||
|
||||
## Test Suite
|
||||
|
||||
124 tests across 11 phases covering:
|
||||
|
||||
- Trip planning engine (all 3 scenarios)
|
||||
- Route optimization (TSP solver)
|
||||
- Travel estimation
|
||||
- Game filtering and matching
|
||||
- Edge cases and boundary conditions
|
||||
- Concurrency behavior
|
||||
|
||||
## Documentation
|
||||
|
||||
- `CLAUDE.md` - Development guidelines and architecture details
|
||||
- `ARCHITECTURE.md` - Detailed system architecture
|
||||
- `docs/TEST_PLAN.md` - Test suite documentation
|
||||
- `docs/MARKET_RESEARCH.md` - Competitive analysis
|
||||
|
||||
## License
|
||||
|
||||
MIT License - see LICENSE file for details.
|
||||
Reference in New Issue
Block a user