# Schedulo API
A Python CLI tool for retrieving public data from Canadian universities, including the University of Ottawa and Carleton University.
**This is a fork of [andrewnags/uoapi](https://github.com/andrewnags/uoapi) with added support for Carleton University.**
[](https://badge.fury.io/py/schedulo-api)
[](https://www.python.org/downloads/)
## Features
- **University of Ottawa**: Course data, timetables, important dates, Rate My Professor integration
- **NEW: Carleton University**: Complete course catalog, real-time course availability, term information
- Modular CLI with consistent JSON output
- Support for multiple data sources and formats
### Installation
Install from PyPI:
```bash
pip install schedulo-api
```
Or install from source:
```bash
pip install git+https://github.com/Rain6435/uoapi.git@carleton
```
## Usage
### University of Ottawa
```bash
# Get course timetables
uoapi timetable --term winter --year 2020 CSI3104 PHY4 YDD
# Get course information
uoapi course --courses MAT PHY
uoapi course --nosubjects CSI3105 CSI3131
# Get important academic dates
uoapi dates
# Rate My Professor data
uoapi rmp --school "University of Ottawa" --instructor "John Doe"
```
### Carleton University (NEW!)
```bash
# Get available terms
uoapi carleton --available-terms
# List all subjects
uoapi carleton --subjects
# Get courses for specific subjects
uoapi carleton --courses COMP MATH
# Search specific courses with real-time availability
uoapi carleton --courses COMP1405 MATH1007
```
### Output Format
All commands return structured JSON with consistent format:
```json
{
"data": { ... },
"messages": [ ... ]
}
```
## Development
### Requirements
- Python 3.10+
- Dependencies: requests, bs4, lxml, pandas, pydantic<2
### Development Setup
```bash
git clone https://github.com/Rain6435/uoapi.git
cd uoapi
pip install -e .[tests]
```
### Testing
```bash
make test # Run pytest with coverage
make check # Run type checking with mypy
make lint # Run code linting with flake8
```
## Data Structures and Entities
### University of Ottawa Models
#### Subject
Represents academic departments/subjects:
```python
{
"subject": "Computer Science", # Full department name
"subject_code": "CSI", # Short identifier
"link": "https://catalogue.uottawa.ca/en/courses/csi/"
}
```
#### Course
Complete course information:
```python
{
"course_code": "CSI3140", # Course identifier
"title": "World Wide Web Programming", # Course title
"credits": 3, # Academic credits
"description": "Introduction to...", # Full description
"components": ["LECTURE", "LAB"], # Course delivery methods
"prerequisites": "CSI2520, CSI2101", # Raw prerequisite text
"dependencies": [["CSI2520"], ["CSI2101"]] # Parsed dependencies
}
```
### Carleton University Models
#### Course Section
Individual course section with scheduling:
```python
{
"crn": "12345", # Course reference number
"section": "A", # Section identifier
"status": "Open", # Enrollment status
"credits": 0.5, # Course credits
"schedule_type": "Lecture", # Delivery method
"instructor": "Dr. Smith", # Instructor name
"meeting_times": [ # Schedule information
{
"start_date": "2024-01-08",
"end_date": "2024-04-05",
"days": "MWF",
"start_time": "10:05",
"end_time": "11:25"
}
],
"notes": ["Additional requirements"]
}
```
#### Complete Course
Full course with all sections:
```python
{
"course_code": "COMP1405", # Full course code
"subject_code": "COMP", # Subject prefix
"course_number": "1405", # Course number
"catalog_title": "Introduction to...", # Official title
"catalog_credits": 0.5, # Credit value
"is_offered": true, # Availability status
"sections_found": 3, # Number of sections
"banner_title": "Intro Computer Programming",
"banner_credits": 0.5,
"sections": [...], # Array of CourseSection objects
"error": false,
"error_message": ""
}
```
#### Term Result
Complete term discovery results:
```python
{
"term_code": "202401", # Term identifier
"term_name": "Winter 2024", # Human-readable term
"session_id": "abc123", # Session identifier
"total_subjects_available": 45, # Total subjects
"subjects_tested": 45, # Subjects processed
"total_courses_tested": 2847, # Courses checked
"courses_offered": 1923, # Available courses
"errors": 12, # Processing errors
"processing_time_seconds": 324.5, # Execution time
"offering_rate_percent": 67.5, # Availability rate
"subject_statistics": {...}, # Per-subject stats
"courses": [...], # Array of Course objects
"processed_at": "2024-01-15T10:30:00Z"
}
```
### Common Output Format
All commands return structured JSON:
```python
{
"data": { # Main response data
"subjects": [...], # or "courses", "dates", etc.
},
"messages": [ # Status/error messages
"Successfully retrieved 45 subjects"
]
}
```
### Prerequisites and Dependencies
#### Raw Prerequisites
Text as scraped from university catalogs:
- University of Ottawa: `"Prerequisite: CSI2520, CSI2101"`
- Carleton: Usually embedded in course descriptions
#### Parsed Dependencies
Structured prerequisite relationships:
```python
{
"dependencies": [
["CSI2520"], # Required course
["CSI2101", "CSI2110"] # Alternative courses (OR relationship)
]
}
```
## What's New in This Fork
- **Complete Carleton University integration**
- **Real-time course availability** via Banner ERP system
- **Comprehensive course catalog** from CourseLeaf CMS
- **Term and subject discovery** with full metadata
- **Parallel processing** for efficient data collection
- **Rate limiting and error handling** for robust scraping
## Contributing
Contributions are welcome! Please see the `CONTRIBUTING.md` file for more.
## Acknowledgments
- Original [uoapi](https://github.com/andrewnags/uoapi) by Andrew Nagarajah
- University of Ottawa and Carleton University for providing public data access
## License
GNU LGPLv3.0
See the `COPYING` and `COPYING.LESSER` files for the exact license.
Generally speaking, LGPL permits use, distribution, and alteration in open source (as long as the licence is propagated),
and permits use and distribution in closed source projects
(this is **not** legal advice, just my best personal summary).
Raw data
{
"_id": null,
"home_page": "https://github.com/Rain6435/uoapi",
"name": "schedulo-api",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10.0",
"maintainer_email": "Mohammed Elhasnaoui <brosimo@outlook.fr>",
"keywords": "university, ottawa, carleton, courses, api, scraping, education",
"author": "Mohammed Elhasnaoui",
"author_email": "Mohammed Elhasnaoui <brosimo@outlook.fr>",
"download_url": "https://files.pythonhosted.org/packages/08/92/9a0b397264b29a1596e155dc071ac8b24321e04c8f158f41b1b608de2818/schedulo_api-1.3.1.tar.gz",
"platform": null,
"description": "# Schedulo API\n\nA Python CLI tool for retrieving public data from Canadian universities, including the University of Ottawa and Carleton University.\n\n**This is a fork of [andrewnags/uoapi](https://github.com/andrewnags/uoapi) with added support for Carleton University.**\n\n[](https://badge.fury.io/py/schedulo-api)\n[](https://www.python.org/downloads/)\n\n## Features\n\n- **University of Ottawa**: Course data, timetables, important dates, Rate My Professor integration\n- **NEW: Carleton University**: Complete course catalog, real-time course availability, term information\n- Modular CLI with consistent JSON output\n- Support for multiple data sources and formats\n\n### Installation\n\nInstall from PyPI:\n```bash\npip install schedulo-api\n```\n\nOr install from source:\n```bash\npip install git+https://github.com/Rain6435/uoapi.git@carleton\n```\n\n## Usage\n\n### University of Ottawa\n```bash\n# Get course timetables\nuoapi timetable --term winter --year 2020 CSI3104 PHY4 YDD\n\n# Get course information\nuoapi course --courses MAT PHY\nuoapi course --nosubjects CSI3105 CSI3131\n\n# Get important academic dates\nuoapi dates\n\n# Rate My Professor data\nuoapi rmp --school \"University of Ottawa\" --instructor \"John Doe\"\n```\n\n### Carleton University (NEW!)\n```bash\n# Get available terms\nuoapi carleton --available-terms\n\n# List all subjects\nuoapi carleton --subjects\n\n# Get courses for specific subjects\nuoapi carleton --courses COMP MATH\n\n# Search specific courses with real-time availability\nuoapi carleton --courses COMP1405 MATH1007\n```\n\n### Output Format\nAll commands return structured JSON with consistent format:\n```json\n{\n \"data\": { ... },\n \"messages\": [ ... ]\n}\n```\n\n## Development\n\n### Requirements\n- Python 3.10+\n- Dependencies: requests, bs4, lxml, pandas, pydantic<2\n\n### Development Setup\n```bash\ngit clone https://github.com/Rain6435/uoapi.git\ncd uoapi\npip install -e .[tests]\n```\n\n### Testing\n```bash\nmake test # Run pytest with coverage\nmake check # Run type checking with mypy\nmake lint # Run code linting with flake8\n```\n\n## Data Structures and Entities\n\n### University of Ottawa Models\n\n#### Subject\nRepresents academic departments/subjects:\n```python\n{\n \"subject\": \"Computer Science\", # Full department name\n \"subject_code\": \"CSI\", # Short identifier\n \"link\": \"https://catalogue.uottawa.ca/en/courses/csi/\"\n}\n```\n\n#### Course\nComplete course information:\n```python\n{\n \"course_code\": \"CSI3140\", # Course identifier\n \"title\": \"World Wide Web Programming\", # Course title\n \"credits\": 3, # Academic credits\n \"description\": \"Introduction to...\", # Full description\n \"components\": [\"LECTURE\", \"LAB\"], # Course delivery methods\n \"prerequisites\": \"CSI2520, CSI2101\", # Raw prerequisite text\n \"dependencies\": [[\"CSI2520\"], [\"CSI2101\"]] # Parsed dependencies\n}\n```\n\n### Carleton University Models\n\n#### Course Section\nIndividual course section with scheduling:\n```python\n{\n \"crn\": \"12345\", # Course reference number\n \"section\": \"A\", # Section identifier\n \"status\": \"Open\", # Enrollment status\n \"credits\": 0.5, # Course credits\n \"schedule_type\": \"Lecture\", # Delivery method\n \"instructor\": \"Dr. Smith\", # Instructor name\n \"meeting_times\": [ # Schedule information\n {\n \"start_date\": \"2024-01-08\",\n \"end_date\": \"2024-04-05\", \n \"days\": \"MWF\",\n \"start_time\": \"10:05\",\n \"end_time\": \"11:25\"\n }\n ],\n \"notes\": [\"Additional requirements\"]\n}\n```\n\n#### Complete Course\nFull course with all sections:\n```python\n{\n \"course_code\": \"COMP1405\", # Full course code\n \"subject_code\": \"COMP\", # Subject prefix\n \"course_number\": \"1405\", # Course number\n \"catalog_title\": \"Introduction to...\", # Official title\n \"catalog_credits\": 0.5, # Credit value\n \"is_offered\": true, # Availability status\n \"sections_found\": 3, # Number of sections\n \"banner_title\": \"Intro Computer Programming\", \n \"banner_credits\": 0.5,\n \"sections\": [...], # Array of CourseSection objects\n \"error\": false,\n \"error_message\": \"\"\n}\n```\n\n#### Term Result\nComplete term discovery results:\n```python\n{\n \"term_code\": \"202401\", # Term identifier\n \"term_name\": \"Winter 2024\", # Human-readable term\n \"session_id\": \"abc123\", # Session identifier\n \"total_subjects_available\": 45, # Total subjects\n \"subjects_tested\": 45, # Subjects processed\n \"total_courses_tested\": 2847, # Courses checked\n \"courses_offered\": 1923, # Available courses\n \"errors\": 12, # Processing errors\n \"processing_time_seconds\": 324.5, # Execution time\n \"offering_rate_percent\": 67.5, # Availability rate\n \"subject_statistics\": {...}, # Per-subject stats\n \"courses\": [...], # Array of Course objects\n \"processed_at\": \"2024-01-15T10:30:00Z\"\n}\n```\n\n### Common Output Format\n\nAll commands return structured JSON:\n```python\n{\n \"data\": { # Main response data\n \"subjects\": [...], # or \"courses\", \"dates\", etc.\n },\n \"messages\": [ # Status/error messages\n \"Successfully retrieved 45 subjects\"\n ]\n}\n```\n\n### Prerequisites and Dependencies\n\n#### Raw Prerequisites\nText as scraped from university catalogs:\n- University of Ottawa: `\"Prerequisite: CSI2520, CSI2101\"`\n- Carleton: Usually embedded in course descriptions\n\n#### Parsed Dependencies \nStructured prerequisite relationships:\n```python\n{\n \"dependencies\": [\n [\"CSI2520\"], # Required course\n [\"CSI2101\", \"CSI2110\"] # Alternative courses (OR relationship)\n ]\n}\n```\n\n## What's New in This Fork\n\n- **Complete Carleton University integration**\n- **Real-time course availability** via Banner ERP system\n- **Comprehensive course catalog** from CourseLeaf CMS\n- **Term and subject discovery** with full metadata\n- **Parallel processing** for efficient data collection\n- **Rate limiting and error handling** for robust scraping\n\n## Contributing\n\nContributions are welcome! Please see the `CONTRIBUTING.md` file for more.\n\n## Acknowledgments\n\n- Original [uoapi](https://github.com/andrewnags/uoapi) by Andrew Nagarajah\n- University of Ottawa and Carleton University for providing public data access\n\n## License\n\nGNU LGPLv3.0\n\nSee the `COPYING` and `COPYING.LESSER` files for the exact license.\n\nGenerally speaking, LGPL permits use, distribution, and alteration in open source (as long as the licence is propagated),\nand permits use and distribution in closed source projects\n(this is **not** legal advice, just my best personal summary).\n",
"bugtrack_url": null,
"license": "LGPL-3.0-or-later",
"summary": "An API for retrieving public data from the University of Ottawa and Carleton University.",
"version": "1.3.1",
"project_urls": {
"Bug Reports": "https://github.com/Rain6435/uoapi/issues",
"Documentation": "https://github.com/Rain6435/uoapi#readme",
"Homepage": "https://github.com/Rain6435/uoapi",
"Issues": "https://github.com/Rain6435/uoapi/issues",
"Release Notes": "https://github.com/Rain6435/uoapi/releases",
"Repository": "https://github.com/Rain6435/uoapi",
"Source Code": "https://github.com/Rain6435/uoapi"
},
"split_keywords": [
"university",
" ottawa",
" carleton",
" courses",
" api",
" scraping",
" education"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "2780bcc5fe6a61f5306b2f4495c1ef2adb8597b1cbdac5024c34fbe6dacf75fa",
"md5": "356f78c0c0d39d508d89230171e13bcd",
"sha256": "2eaa3cf9666a5ece303244818b550e49c1bcc734e50088a0e6dc2b91d6639949"
},
"downloads": -1,
"filename": "schedulo_api-1.3.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "356f78c0c0d39d508d89230171e13bcd",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10.0",
"size": 60649,
"upload_time": "2025-07-27T18:40:30",
"upload_time_iso_8601": "2025-07-27T18:40:30.164900Z",
"url": "https://files.pythonhosted.org/packages/27/80/bcc5fe6a61f5306b2f4495c1ef2adb8597b1cbdac5024c34fbe6dacf75fa/schedulo_api-1.3.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "08929a0b397264b29a1596e155dc071ac8b24321e04c8f158f41b1b608de2818",
"md5": "fb8f2b13fbc02bf38a60677a6033e19a",
"sha256": "2d2b34fe4310873f980771c84599e3ffc8ce57be0b3cfe3a85f1a9f87e7fbee4"
},
"downloads": -1,
"filename": "schedulo_api-1.3.1.tar.gz",
"has_sig": false,
"md5_digest": "fb8f2b13fbc02bf38a60677a6033e19a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10.0",
"size": 3006748,
"upload_time": "2025-07-27T18:40:32",
"upload_time_iso_8601": "2025-07-27T18:40:32.795197Z",
"url": "https://files.pythonhosted.org/packages/08/92/9a0b397264b29a1596e155dc071ac8b24321e04c8f158f41b1b608de2818/schedulo_api-1.3.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-27 18:40:32",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "Rain6435",
"github_project": "uoapi",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "schedulo-api"
}