Coverage report: 98%

Files Functions Classes

coverage.py v7.16.2, created at 2026-11-13 19:28 +0000

File class   statements missing excluded   coverage
src/data_api/__init__.py (no class)   2 0 0   100%
src/data_api/api/__init__.py (no class)   1 0 0   100%
src/data_api/api/api.py _SafeUnexpectedErrorsMiddleware   16 0 0   100%
src/data_api/api/api.py (no class)   91 4 0   96%
src/data_api/api/errors.py (no class)   15 0 0   100%
src/data_api/api/main.py (no class)   5 5 0   0%
src/data_api/api/routers/__init__.py (no class)   2 0 0   100%
src/data_api/api/routers/announcements.py (no class)   19 0 0   100%
src/data_api/api/routers/buses.py (no class)   36 0 0   100%
src/data_api/api/routers/calendars.py (no class)   42 0 0   100%
src/data_api/api/routers/courses.py (no class)   63 0 0   100%
src/data_api/api/routers/dining.py (no class)   13 0 0   100%
src/data_api/api/routers/directory.py (no class)   12 0 0   100%
src/data_api/api/routers/energy.py (no class)   10 0 0   100%
src/data_api/api/routers/libraries.py (no class)   24 0 0   100%
src/data_api/api/routers/locations.py (no class)   14 0 0   100%
src/data_api/api/routers/newsletters.py (no class)   17 0 0   100%
src/data_api/api/routers/ping.py (no class)   35 0 0   100%
src/data_api/api/schemas/__init__.py (no class)   2 0 0   100%
src/data_api/api/schemas/announcements.py (no class)   2 0 0   100%
src/data_api/api/schemas/buses.py BusQuery   0 0 0   100%
src/data_api/api/schemas/buses.py (no class)   8 0 0   100%
src/data_api/api/schemas/calendars.py (no class)   2 0 0   100%
src/data_api/api/schemas/courses.py (no class)   2 0 0   100%
src/data_api/api/schemas/departments.py (no class)   2 0 0   100%
src/data_api/api/schemas/dining.py (no class)   2 0 0   100%
src/data_api/api/schemas/energy.py EnergyElectricityInfo   0 0 0   100%
src/data_api/api/schemas/energy.py (no class)   7 0 0   100%
src/data_api/api/schemas/errors.py ErrorResponse   0 0 0   100%
src/data_api/api/schemas/errors.py ValidationIssue   0 0 0   100%
src/data_api/api/schemas/errors.py ValidationErrorResponse   0 0 0   100%
src/data_api/api/schemas/errors.py (no class)   9 0 0   100%
src/data_api/api/schemas/libraries.py (no class)   2 0 0   100%
src/data_api/api/schemas/locations.py LocationDetail   0 0 0   100%
src/data_api/api/schemas/locations.py (no class)   5 0 0   100%
src/data_api/api/schemas/meta.py MetaResponse   0 0 0   100%
src/data_api/api/schemas/meta.py (no class)   2 0 0   100%
src/data_api/api/schemas/newsletters.py (no class)   2 0 0   100%
src/data_api/api/schemas/ping.py DatasetError   0 0 0   100%
src/data_api/api/schemas/ping.py DatasetHealth   0 0 0   100%
src/data_api/api/schemas/ping.py PingResponse   0 0 0   100%
src/data_api/api/schemas/ping.py (no class)   18 0 0   100%
src/data_api/api/schemas/responses.py (no class)   5 0 0   100%
src/data_api/checks/__init__.py (no class)   0 0 0   100%
src/data_api/checks/common.py CheckFailure   1 0 0   100%
src/data_api/checks/common.py (no class)   40 0 0   100%
src/data_api/checks/mcp.py (no class)   33 13 0   61%
src/data_api/checks/openapi.py (no class)   49 16 0   67%
src/data_api/checks/published.py (no class)   125 19 0   85%
src/data_api/checks/release.py (no class)   137 22 0   84%
src/data_api/checks/smoke.py EndpointCheck   0 0 0   100%
src/data_api/checks/smoke.py (no class)   85 10 0   88%
src/data_api/core/__init__.py (no class)   1 0 0   100%
src/data_api/core/config.py (no class)   1 0 0   100%
src/data_api/core/exceptions.py DataAPIException   0 0 0   100%
src/data_api/core/exceptions.py DataNotAvailableException   0 0 0   100%
src/data_api/core/exceptions.py DataUpdateException   0 0 0   100%
src/data_api/core/exceptions.py UpstreamException   0 0 0   100%
src/data_api/core/exceptions.py UpstreamTimeoutException   0 0 0   100%
src/data_api/core/exceptions.py UpstreamResponseException   0 0 0   100%
src/data_api/core/exceptions.py (no class)   15 0 0   100%
src/data_api/core/settings.py Settings   0 0 0   100%
src/data_api/core/settings.py (no class)   15 0 0   100%
src/data_api/core/upstream.py (no class)   23 0 0   100%
src/data_api/data/__init__.py (no class)   2 0 0   100%
src/data_api/data/manager.py (no class)   3 0 0   100%
src/data_api/data/nthudata.py Freshness   0 0 0   100%
src/data_api/data/nthudata.py FetchFailure   3 0 0   100%
src/data_api/data/nthudata.py RefreshError   0 0 0   100%
src/data_api/data/nthudata.py Snapshot   0 0 0   100%
src/data_api/data/nthudata.py DatasetState   1 0 0   100%
src/data_api/data/nthudata.py DataFetcher   29 0 0   100%
src/data_api/data/nthudata.py ManifestEntry   1 0 0   100%
src/data_api/data/nthudata.py PublishedManifest   0 0 0   100%
src/data_api/data/nthudata.py FileDetailsManager   27 1 0   96%
src/data_api/data/nthudata.py NTHUDataManager   116 4 0   97%
src/data_api/data/nthudata.py (no class)   91 0 0   100%
src/data_api/data/validation.py Coordinates   0 0 0   100%
src/data_api/data/validation.py CalendarPayload   0 0 0   100%
src/data_api/data/validation.py LibraryCalendarPayload   0 0 0   100%
src/data_api/data/validation.py LibraryPayload   0 0 0   100%
src/data_api/data/validation.py (no class)   60 0 0   100%
src/data_api/domain/__init__.py (no class)   2 0 0   100%
src/data_api/domain/announcements/__init__.py (no class)   2 0 0   100%
src/data_api/domain/announcements/services.py AnnouncementsService   39 0 0   100%
src/data_api/domain/announcements/services.py (no class)   29 0 0   100%
src/data_api/domain/buses/__init__.py (no class)   2 0 0   100%
src/data_api/domain/buses/adapters.py (no class)   1 0 0   100%
src/data_api/domain/buses/enums.py BusStopsName   0 0 0   100%
src/data_api/domain/buses/enums.py BusRouteType   0 0 0   100%
src/data_api/domain/buses/enums.py BusType   0 0 0   100%
src/data_api/domain/buses/enums.py BusDirection   0 0 0   100%
src/data_api/domain/buses/enums.py BusDay   0 0 0   100%
src/data_api/domain/buses/enums.py BusDayWithCurrent   0 0 0   100%
src/data_api/domain/buses/enums.py (no class)   29 0 0   100%
src/data_api/domain/buses/graph.py RouteResolver   23 0 0   100%
src/data_api/domain/buses/graph.py (no class)   33 0 0   100%
src/data_api/domain/buses/models.py Stop   0 0 0   100%
src/data_api/domain/buses/models.py Route   0 0 0   100%
src/data_api/domain/buses/models.py BusSchedule   0 0 0   100%
src/data_api/domain/buses/models.py BusDetailedSchedule   0 0 0   100%
src/data_api/domain/buses/models.py (no class)   11 0 0   100%
src/data_api/domain/buses/query.py BusTimeState   0 0 0   100%
src/data_api/domain/buses/query.py (no class)   9 0 0   100%
src/data_api/domain/buses/services.py PreparedBusData   156 11 0   93%
src/data_api/domain/buses/services.py BusesService   15 1 0   93%
src/data_api/domain/buses/services.py (no class)   105 11 0   90%
src/data_api/domain/calendars/__init__.py (no class)   0 0 0   100%
src/data_api/domain/calendars/services.py CalendarsService   29 0 0   100%
src/data_api/domain/calendars/services.py (no class)   20 0 0   100%
src/data_api/domain/courses/__init__.py (no class)   2 0 0   100%
src/data_api/domain/courses/models.py Condition   10 0 0   100%
src/data_api/domain/courses/models.py Conditions   30 1 0   97%
src/data_api/domain/courses/models.py (no class)   47 1 0   98%
src/data_api/domain/courses/services.py UnknownSemester   0 0 0   100%
src/data_api/domain/courses/services.py CoursesService   18 0 0   100%
src/data_api/domain/courses/services.py (no class)   26 0 0   100%
src/data_api/domain/departments/__init__.py (no class)   2 0 0   100%
src/data_api/domain/departments/services.py DepartmentsService   31 0 0   100%
src/data_api/domain/departments/services.py (no class)   27 0 0   100%
src/data_api/domain/dining/__init__.py (no class)   2 0 0   100%
src/data_api/domain/dining/enums.py DiningBuildingName   0 0 0   100%
src/data_api/domain/dining/enums.py DiningScheduleName   0 0 0   100%
src/data_api/domain/dining/enums.py DiningScheduleKeyword   0 0 0   100%
src/data_api/domain/dining/enums.py (no class)   15 0 0   100%
src/data_api/domain/dining/services.py DiningService   32 0 0   100%
src/data_api/domain/dining/services.py (no class)   36 0 0   100%
src/data_api/domain/energy/__init__.py (no class)   2 0 0   100%
src/data_api/domain/energy/services.py EnergyService   9 0 0   100%
src/data_api/domain/energy/services.py (no class)   26 0 0   100%
src/data_api/domain/libraries/__init__.py (no class)   2 0 0   100%
src/data_api/domain/libraries/services.py LibrariesService   26 0 0   100%
src/data_api/domain/libraries/services.py (no class)   51 0 0   100%
src/data_api/domain/locations/__init__.py (no class)   2 0 0   100%
src/data_api/domain/locations/services.py LocationsService   15 1 0   93%
src/data_api/domain/locations/services.py (no class)   12 0 0   100%
src/data_api/domain/newsletters/__init__.py (no class)   2 0 0   100%
src/data_api/domain/newsletters/services.py NewslettersService   25 0 0   100%
src/data_api/domain/newsletters/services.py (no class)   17 0 0   100%
src/data_api/mcp/__init__.py (no class)   2 0 0   100%
src/data_api/mcp/errors.py (no class)   16 0 0   100%
src/data_api/mcp/server.py DatasetErrors   8 1 0   88%
src/data_api/mcp/server.py create_mcp.RuntimeBinding   2 0 0   100%
src/data_api/mcp/server.py (no class)   17 0 2   100%
src/data_api/mcp/tools/__init__.py (no class)   10 0 0   100%
src/data_api/mcp/tools/announcements.py (no class)   15 0 0   100%
src/data_api/mcp/tools/buses.py (no class)   23 0 0   100%
src/data_api/mcp/tools/courses.py (no class)   33 0 0   100%
src/data_api/mcp/tools/dining.py (no class)   16 0 0   100%
src/data_api/mcp/tools/directory.py (no class)   9 0 0   100%
src/data_api/mcp/tools/energy.py (no class)   16 0 0   100%
src/data_api/mcp/tools/library.py (no class)   17 0 0   100%
src/data_api/mcp/tools/locations.py (no class)   13 0 0   100%
src/data_api/mcp/tools/newsletters.py (no class)   10 0 0   100%
src/data_api/mcp/tools/result_types.py LocationResult   0 0 0   100%
src/data_api/mcp/tools/result_types.py CampusPersonResult   0 0 0   100%
src/data_api/mcp/tools/result_types.py CampusDepartmentDetailsResult   0 0 0   100%
src/data_api/mcp/tools/result_types.py CampusDepartmentResult   0 0 0   100%
src/data_api/mcp/tools/result_types.py LocationsResult   0 0 0   100%
src/data_api/mcp/tools/result_types.py DirectoryResult   0 0 0   100%
src/data_api/mcp/tools/result_types.py BusDepartureResult   0 0 0   100%
src/data_api/mcp/tools/result_types.py BusArrivalResult   0 0 0   100%
src/data_api/mcp/tools/result_types.py BusDetailedResult   0 0 0   100%
src/data_api/mcp/tools/result_types.py BusStopResult   0 0 0   100%
src/data_api/mcp/tools/result_types.py BusRouteInfoResult   0 0 0   100%
src/data_api/mcp/tools/result_types.py BusResult   0 0 0   100%
src/data_api/mcp/tools/result_types.py CoursesResult   0 0 0   100%
src/data_api/mcp/tools/result_types.py AnnouncementArticleResult   0 0 0   100%
src/data_api/mcp/tools/result_types.py AnnouncementSourceResult   0 0 0   100%
src/data_api/mcp/tools/result_types.py AnnouncementsResult   0 0 0   100%
src/data_api/mcp/tools/result_types.py DiningRestaurantResult   0 0 0   100%
src/data_api/mcp/tools/result_types.py DiningBuildingResult   0 0 0   100%
src/data_api/mcp/tools/result_types.py DiningBuildingsResult   0 0 0   100%
src/data_api/mcp/tools/result_types.py LibrarySpaceResult   0 0 0   100%
src/data_api/mcp/tools/result_types.py LibrarySpacesResult   0 0 0   100%
src/data_api/mcp/tools/result_types.py LibraryItemsResult   0 0 0   100%
src/data_api/mcp/tools/result_types.py NewsletterArticleResult   0 0 0   100%
src/data_api/mcp/tools/result_types.py NewsletterResult   0 0 0   100%
src/data_api/mcp/tools/result_types.py NewslettersResult   0 0 0   100%
src/data_api/mcp/tools/result_types.py EnergyZoneResult   0 0 0   100%
src/data_api/mcp/tools/result_types.py EnergyResult   0 0 0   100%
src/data_api/mcp/tools/result_types.py (no class)   28 0 0   100%
src/data_api/models/__init__.py (no class)   0 0 0   100%
src/data_api/models/announcements.py AnnouncementArticle   0 0 0   100%
src/data_api/models/announcements.py AnnouncementSource   0 0 0   100%
src/data_api/models/announcements.py AnnouncementDetail   0 0 0   100%
src/data_api/models/announcements.py AnnouncementLanguageOption   0 0 0   100%
src/data_api/models/announcements.py (no class)   18 0 0   100%
src/data_api/models/buses.py BusInfo   0 0 0   100%
src/data_api/models/buses.py BusStopsInfo   0 0 0   100%
src/data_api/models/buses.py BusSchedule   0 0 0   100%
src/data_api/models/buses.py BusArriveTime   0 0 0   100%
src/data_api/models/buses.py BusDetailedSchedule   0 0 0   100%
src/data_api/models/buses.py BusCanonicalSchedule   1 0 0   100%
src/data_api/models/buses.py BusCanonicalDetailedSchedule   0 0 0   100%
src/data_api/models/buses.py (no class)   34 0 0   100%
src/data_api/models/calendars.py Calendar   0 0 0   100%
src/data_api/models/calendars.py CalendarEvent   0 0 0   100%
src/data_api/models/calendars.py (no class)   17 0 0   100%
src/data_api/models/courses.py CourseLanguage   0 0 0   100%
src/data_api/models/courses.py LecturerLabel   0 0 0   100%
src/data_api/models/courses.py LecturerNames   0 0 0   100%
src/data_api/models/courses.py CourseMeeting   0 0 0   100%
src/data_api/models/courses.py CourseExpertise   0 0 0   100%
src/data_api/models/courses.py CurriculumRequirement   0 0 0   100%
src/data_api/models/courses.py CourseData   5 0 0   100%
src/data_api/models/courses.py CourseCatalog   3 0 0   100%
src/data_api/models/courses.py CourseFieldName   0 0 0   100%
src/data_api/models/courses.py CourseSearchParams   0 0 0   100%
src/data_api/models/courses.py CourseCondition   3 0 0   100%
src/data_api/models/courses.py CourseQueryOperation   0 0 0   100%
src/data_api/models/courses.py CourseQueryCondition   19 0 0   100%
src/data_api/models/courses.py CourseListName   0 0 0   100%
src/data_api/models/courses.py CourseGetParams   0 0 0   100%
src/data_api/models/courses.py (no class)   171 0 0   100%
src/data_api/models/departments.py DepartmentPerson   0 0 0   100%
src/data_api/models/departments.py DepartmentContact   0 0 0   100%
src/data_api/models/departments.py DepartmentDetails   0 0 0   100%
src/data_api/models/departments.py Department   0 0 0   100%
src/data_api/models/departments.py (no class)   27 0 0   100%
src/data_api/models/dining.py DiningRestaurant   0 0 0   100%
src/data_api/models/dining.py DiningBuilding   0 0 0   100%
src/data_api/models/dining.py (no class)   15 0 0   100%
src/data_api/models/libraries.py LibraryRssImage   0 0 0   100%
src/data_api/models/libraries.py LibraryRssItem   0 0 0   100%
src/data_api/models/libraries.py LibraryRssData   0 0 0   100%
src/data_api/models/libraries.py LibraryRssType   0 0 0   100%
src/data_api/models/libraries.py LibrarySpace   0 0 0   100%
src/data_api/models/libraries.py LibraryLostAndFound   0 0 0   100%
src/data_api/models/libraries.py (no class)   44 0 0   100%
src/data_api/models/newsletters.py NewsletterArticle   0 0 0   100%
src/data_api/models/newsletters.py NewsletterSource   0 0 0   100%
src/data_api/models/newsletters.py NewsletterInfo   0 0 0   100%
src/data_api/models/newsletters.py (no class)   13 0 0   100%
src/data_api/runtime.py Runtime   15 0 0   100%
src/data_api/runtime.py RuntimeMiddleware   4 0 0   100%
src/data_api/runtime.py (no class)   39 0 0   100%
src/data_api/utils/__init__.py (no class)   1 0 0   100%
src/data_api/utils/calendars.py (no class)   26 0 0   100%
src/data_api/utils/schema.py (no class)   10 0 0   100%
src/data_api/utils/search.py (no class)   9 0 0   100%
tests/conftest.py (no class)   55 1 0   98%
tests/test_announcements.py TestAnnouncementsEndpoints   31 0 0   100%
tests/test_announcements.py (no class)   75 0 0   100%
tests/test_api_endpoints.py TestAnnouncementsEndpoints   13 0 0   100%
tests/test_api_endpoints.py TestDiningEndpoints   11 0 0   100%
tests/test_api_endpoints.py TestLocationsEndpoints   4 0 0   100%
tests/test_api_endpoints.py TestNewslettersEndpoints   4 0 0   100%
tests/test_api_endpoints.py TestCoursesEndpoints   7 0 0   100%
tests/test_api_endpoints.py TestBusesEndpoints   8 0 0   100%
tests/test_api_endpoints.py TestDirectoryEndpoints   7 0 0   100%
tests/test_api_endpoints.py (no class)   76 0 0   100%
tests/test_app_lifespan.py TestCombinedLifespan   56 1 0   98%
tests/test_app_lifespan.py TestCoursesAfterStartup   9 0 0   100%
tests/test_app_lifespan.py (no class)   144 3 0   98%
tests/test_bus_schedule.py test_current_day_ignores_time.FixedDatetime   1 0 0   100%
tests/test_bus_schedule.py (no class)   302 1 0   99%
tests/test_buses.py TestBusesRoutes   4 0 0   100%
tests/test_buses.py TestBusesStopMetadata   8 0 0   100%
tests/test_buses.py TestBusesSchedules   4 0 0   100%
tests/test_buses.py TestBusesStops   4 0 0   100%
tests/test_buses.py (no class)   63 0 0   100%
tests/test_buses_graph.py TestStopsData   8 0 0   100%
tests/test_buses_graph.py TestCreateRoute   7 0 0   100%
tests/test_buses_graph.py TestRouteDefinitions   12 0 0   100%
tests/test_buses_graph.py TestRouteResolver   32 0 0   100%
tests/test_buses_graph.py TestModels   15 0 0   100%
tests/test_buses_graph.py (no class)   44 0 0   100%
tests/test_calendars.py (no class)   253 0 0   100%
tests/test_courses.py (no class)   79 0 0   100%
tests/test_courses_models.py (no class)   72 0 0   100%
tests/test_courses_query_grammar.py TestCourseQueryGrammarEndpoints   23 0 0   100%
tests/test_courses_query_grammar.py (no class)   76 0 0   100%
tests/test_courses_semesters.py SemesterPublisher   24 2 0   92%
tests/test_courses_semesters.py (no class)   191 0 0   100%
tests/test_data_manager.py Clock   3 0 0   100%
tests/test_data_manager.py Publisher   26 0 0   100%
tests/test_data_manager.py (no class)   469 0 0   100%
tests/test_departments_services.py (no class)   12 0 0   100%
tests/test_dining.py dining_candidates.Saturday   2 0 0   100%
tests/test_dining.py TestDiningEndpoints   67 0 0   100%
tests/test_dining.py (no class)   62 0 0   100%
tests/test_directory.py (no class)   116 0 0   100%
tests/test_energy.py TestEnergyEndpoints   15 0 0   100%
tests/test_energy.py (no class)   11 0 0   100%
tests/test_exceptions.py TestDataAPIException   5 0 0   100%
tests/test_exceptions.py TestDataNotAvailableException   5 0 0   100%
tests/test_exceptions.py TestDataUpdateException   5 0 0   100%
tests/test_exceptions.py TestExceptionHierarchy   8 0 0   100%
tests/test_exceptions.py (no class)   22 0 0   100%
tests/test_external_checks.py (no class)   172 1 0   99%
tests/test_libraries.py TestEventFiltering   9 0 0   100%
tests/test_libraries.py TestLibraryRss   15 0 0   100%
tests/test_libraries.py TestLibraryCalendars   45 0 0   100%
tests/test_libraries.py TestLibrariesLiveEndpoints   23 0 0   100%
tests/test_libraries.py (no class)   71 1 0   99%
tests/test_locations.py TestLocationsEndpoints   42 0 0   100%
tests/test_locations.py (no class)   34 0 0   100%
tests/test_mcp_metadata.py (no class)   17 0 0   100%
tests/test_mcp_search.py dining_candidates.Saturday   1 0 0   100%
tests/test_mcp_search.py (no class)   259 0 0   100%
tests/test_mcp_tools.py TestMCPTools   91 0 0   100%
tests/test_mcp_tools.py TestMCPToolIntegration   26 7 0   73%
tests/test_mcp_tools.py TestRegisteredPayloads   67 0 0   100%
tests/test_mcp_tools.py (no class)   66 0 0   100%
tests/test_meta.py (no class)   47 1 0   98%
tests/test_newsletters.py TestNewslettersEndpoints   11 0 0   100%
tests/test_newsletters.py (no class)   132 0 0   100%
tests/test_openapi_contract.py (no class)   115 0 0   100%
tests/test_ping.py (no class)   190 2 0   99%
tests/test_refactoring.py (no class)   204 0 0   100%
tests/test_release.py (no class)   220 0 0   100%
tests/test_removed_endpoints.py (no class)   15 0 0   100%
tests/test_rss_contract.py (no class)   86 0 0   100%
tests/test_runtime_lifecycle.py (no class)   111 1 0   99%
tests/test_schemas.py (no class)   43 0 0   100%
tests/test_services.py TestDiningService   11 0 0   100%
tests/test_services.py TestDiningScheduleKeyword   4 0 0   100%
tests/test_services.py test_today_uses_taiwan_date.FrozenDatetime   2 0 0   100%
tests/test_services.py (no class)   39 0 0   100%
tests/test_upstream_errors.py (no class)   161 0 0   100%
tests/test_utils.py TestUrlCorrector   17 0 0   100%
tests/test_utils.py (no class)   31 0 0   100%
Total     7953 142 2   98%

No items found using the specified filter.