Project: reglib → OSU Course Planner v2.0 Goal: Transform deprecated Banner 8 scraper into modern course planning tool Timeline: 4-6 weeks (development) + ongoing maintenance
Build a student-first course planning tool that helps OSU students:
- 📚 Explore course offerings across multiple terms
- 📅 Build conflict-free schedules automatically
- 🎯 Plan their academic path toward graduation
- 📊 Analyze course availability patterns
- 📤 Export schedules to calendars and planners
What makes this different:
- ✅ Focus on planning, not registration automation
- ✅ Uses public data only (no authentication hacks)
- ✅ Respectful of OSU systems (rate limiting, caching)
- ✅ Open source and community-driven
- ✅ Modern Python (3.8+, type hints, async support)
- Analyze current codebase
- Research OSU systems and APIs
- Document compatibility issues
- Modernize Python 2 → Python 3
- Design new architecture
- Create roadmap
Deliverables:
- ✅ COMPATIBILITY_ANALYSIS.md
- ✅ ARCHITECTURE_V2.md
- ✅ ROADMAP.md (this document)
Goal: Set up project infrastructure and core data models
-
Project Setup
- Create new branch:
feature/v2-course-planner - Update
pyproject.tomlwith new dependencies - Set up development environment (venv, pre-commit hooks)
- Configure testing framework (pytest, coverage)
- Set up linting (ruff, mypy)
- Create new branch:
-
Dependencies:
dependencies = [ "requests>=2.31.0", "lxml>=4.9.0", "python-dateutil>=2.8.0", "pydantic>=2.0.0", # Data validation "tenacity>=8.0.0", # Retry logic "rich>=13.0.0", # Beautiful CLI output "typer>=0.9.0", # CLI framework ] [project.optional-dependencies] export = [ "icalendar>=5.0.0", "reportlab>=4.0.0", # PDF generation ] dev = [ "pytest>=7.4.0", "pytest-cov>=4.1.0", "pytest-asyncio>=0.21.0", "mypy>=1.5.0", "ruff>=0.1.0", ]
-
Core Data Models
- Implement
Coursemodel with Pydantic - Implement
MeetingTimemodel - Implement
Schedulemodel - Implement
Termmodel - Add conflict detection to
Course.conflicts_with() - Write unit tests for models
- Implement
-
Utilities (Port from v1)
- Port
time_conflict()function - Port
format_course()function - Port
format_term()functions - Modernize with type hints
- Add comprehensive tests
- Port
Deliverables:
- New module structure in
reglib/ - Working data models with tests
- 90%+ test coverage on models
Success Criteria:
# This should work:
from reglib.models import Course, MeetingTime, Schedule
course1 = Course(
crn='12345',
subject='CS',
course_number='161',
title='Introduction to Computer Science I',
credits=4.0,
meeting_times=[...]
)
course2 = Course(...)
assert not course1.conflicts_with(course2)Goal: Implement robust data fetching from OSU sources
-
API Client
- Request API key from developer.oregonstate.edu
- Implement
OSUAPIClientclass - Add authentication handling
- Implement rate limiting (60 req/min)
- Add retry logic with exponential backoff
- Implement pagination handling
-
API Endpoints
-
get_terms()- Fetch available terms -
search_classes()- Search courses -
get_subjects()- Get subject list - Parse responses into models
-
-
Scraper Implementation
- Implement
EcampusScraperclass - Add respectful request handling
- User-Agent: 'OSU-CoursePlanner/2.0 (+github.com/...)'
- Rate limit: 1 req/second
- Respect robots.txt
- Parse subject listing page
- Parse course detail pages
- Parse term selection
- Error handling for missing/changed HTML
- Implement
-
Data Normalization
- Create
DataAdapterinterface - Implement API → Model adapter
- Implement Scraper → Model adapter
- Ensure consistent output format
- Create
-
Caching Layer
- Implement SQLite cache
- Cache course data (TTL: 1 hour)
- Cache term data (TTL: 24 hours)
- Implement cache invalidation
- Add cache statistics
Deliverables:
- Working data fetcher (API or scraper)
- Caching system
- Integration tests
Success Criteria:
from reglib.api import get_client
client = get_client() # Auto-detects API/scraper
terms = client.get_terms(open_only=True)
courses = client.search_classes(
term=terms[0].code,
subject='CS'
)
assert len(courses) > 0
assert isinstance(courses[0], Course)Goal: Implement core planning features
-
Conflict Detection
- Implement time overlap detection
- Handle TBA times gracefully
- Detect same-course conflicts
- Add conflict reporting
-
Schedule Generator
- Port
make_schedule()logic - Implement constraint system
- Add preference handling
- Implement schedule scoring
- Optimize algorithm performance
- Port
-
Constraints System
# Time blocks (work, other commitments) builder.add_time_block( days=['M', 'W', 'F'], start='08:00', end='10:00' ) # Preferences builder.add_preferences( prefer_online=True, prefer_morning=False, avoid_friday=True, max_courses_per_day=3, lunch_break=True # 12:00-13:00 )
-
Schedule Ranking
- Implement scoring algorithm
- Factors: compactness, preferences, instructor ratings
- Customizable weights
Deliverables:
- Working schedule builder
- Constraint system
- Ranking algorithm
Success Criteria:
from reglib import ScheduleBuilder
builder = ScheduleBuilder(term='202501')
builder.add_course_preference('CS 361')
builder.add_course_preference('CS 362')
builder.add_course_preference('MTH 231')
schedules = builder.generate_schedules(max_results=10)
assert len(schedules) > 0
assert all(not s.has_conflicts for s in schedules)
assert schedules[0].score >= schedules[-1].score # Sorted-
Multi-Term Planning
- Implement degree requirement parser
- Create prerequisite tracker
- Build term-by-term planner
- Suggest course sequences
-
Course Analysis
- Historical availability tracking
- Find alternative courses
- Seat availability predictions
- Popular time slot analysis
-
Export Functionality
- iCalendar (.ics) export
- PDF schedule export
- JSON export
- Plain text export
- Markdown export
Success Criteria:
schedule.export_ical('fall-2025.ics') # Import to Google Calendar
schedule.export_pdf('schedule.pdf') # Print-friendly-
Command Line Interface
# Search courses osu-planner search --term 202501 --subject CS # Build schedule osu-planner build --term 202501 \ --courses "CS 361" "CS 362" "MTH 231" \ --avoid-friday \ --prefer-online # Export osu-planner export schedule.json --format ical # Multi-term plan osu-planner plan --major "Computer Science BS" \ --completed courses.txt \ --starting 202503 \ --quarters 4
-
Interactive Mode
osu-planner interactive > search CS 361 > add to cart > build schedule > export to calendar
-
Web UI (Future/Optional)
- Simple Flask/FastAPI app
- Vue.js/React frontend
- Visual schedule builder
- Drag-and-drop interface
Deliverables:
- Fully functional CLI
- Interactive mode
- Documentation
-
Testing
- Unit tests (90%+ coverage)
- Integration tests
- End-to-end tests
- Performance tests
- Load tests (caching, rate limiting)
-
Documentation
- API reference (Sphinx)
- User guide
- Tutorial (Jupyter notebook)
- Contributing guide
- FAQ
-
Examples
examples/ ├── 01_basic_search.py ├── 02_build_schedule.py ├── 03_multi_term_plan.py ├── 04_export_formats.py └── tutorial.ipynb -
README Update
- Clear feature list
- Quick start guide
- Installation instructions
- Screenshots/examples
- Link to documentation
Success Criteria:
- All tests passing
- Documentation complete
- Examples working
- README compelling
-
Beta Release (v2.0.0-beta.1)
- Tag release on GitHub
- Publish to PyPI (test.pypi.org first)
- Share with OSU subreddit
- Gather feedback
-
Public Release (v2.0.0)
- Address beta feedback
- Final testing
- Publish to PyPI
- Create release announcement
- Share with OSU community
-
Community Building
- Set up GitHub Discussions
- Create contribution guidelines
- Label good first issues
- Respond to issues/PRs
- Regular releases
Option 1: Side-by-Side
# Install v2 alongside v1
pip install osu-course-planner # New package name
# Old code still works
import reglib # v1 (deprecated)
# New code
import osu_planner # v2Option 2: Breaking Change
# Upgrade to v2
pip install --upgrade reglib
# Update imports
from reglib import ScheduleBuilder # New API-
Immediate (Nov 2025):
- Add deprecation warnings to v1 code
- Update README with v2 timeline
-
Q1 2026:
- Release v2.0.0
- Maintain v1 security fixes only
-
Q3 2026:
- End v1 support
- Archive v1 branch
- Performance: Search < 2s, Schedule generation < 5s
- Reliability: 99% uptime (caching helps)
- Cache Hit Rate: > 80%
- Test Coverage: > 90%
- Adoption: 100+ users in first month
- Satisfaction: Positive feedback
- Issues: < 5 open bugs at any time
- Community: 10+ contributors
| Risk | Impact | Mitigation |
|---|---|---|
| API access denied | High | Use Ecampus scraper |
| HTML structure changes | Medium | Version checks, alerts |
| Rate limiting issues | Low | Aggressive caching |
| Legal/ToS concerns | High | Only public data, clear attribution |
-
API Access:
- Can we get API keys from developer.oregonstate.edu?
- What are the rate limits?
- Is it free for students?
-
Data Freshness:
- How often do course offerings change?
- What's acceptable cache TTL?
-
Community:
- Where should we host discussions? (GitHub, Discord, Slack?)
- How to engage with OSU IT?
- Time: 80-120 hours (1-2 months part-time)
- Skills: Python, web scraping, API design
- Tools: GitHub, PyPI, documentation hosting
- Hosting: GitHub Pages (docs), PyPI (package)
- CI/CD: GitHub Actions
- Testing: pytest, coverage.io
- Support: GitHub Issues/Discussions
- Documentation: ReadTheDocs or GitHub Pages
This Week:
- Request API access from OSU
- Set up development environment
- Implement core models
- Port time conflict logic
This Month: 5. Complete data access layer 6. Implement schedule builder 7. Beta release to small group
Next Month: 8. Add advanced features 9. Build CLI 10. Public release
Ready to start? Let's begin with Phase 1!
# Create development branch
git checkout -b feature/v2-course-planner
# Set up virtual environment
python -m venv venv
source venv/bin/activate
# Install development dependencies
pip install -e ".[dev]"
# Run initial tests
pytestLet's build something amazing for the OSU community! 🦫