parser#
Самостоятельный парсер школьного расписания.
Содержит компоненты, свзяанные с работой расписания. Такие как парсер расписания, функции для работы с индексами, а также класс расписания.
Содержит:
Функция для сравнения двух расписаний.
Функция получения индекса.
Фнкцмя получения расписания.
Класс Schedule для работы с самим расписанием.
Функции для работы с расписанием#
Некоторые отдельные функции, которые используются при работе с расписанием и могут быть использованы отдельно от экземпляра класса Scheule.
- sp.parser.get_sc_updates(a: dict[str, list], b: dict[str, list]) list[dict[str, list]] #
Делает полное сравнение двух расписаний.
Делает полное построчное сравнение старого и нового расписания. Возвращает все найденные изменения в формате.
[ // дни ... { // классы ... "9в" [ // уроки ... null, // Ничего не изменилось ["старый:12", "новый:132"] // Предмет изменился ] } ]
- Параметры:
a (dict[str, list]) – Исходное расписание для сравнения.
b (dict[str, list]) – Другое расписание для сравнения с исходным.
- Результат:
Результаты поиска изменения в расписании.
- Тип результата:
list[dict[str, list]]
- sp.parser.get_index(sp_lessons: dict[str, list[str]], lessons_mode: bool | None = True) dict[str, list[dict]] #
Преобразует словарь расписания уроков в индекс.
В данном случае индексом называется словарь, где ключом вместо класса является название урока или кабинета.
Они так же часто используются, как и само расписание. Например при подсчёте количества элементов или при поиске в расписании определённого урока или кабинета.
Описание индексов:
Расписание: [Класс][День][Уроки]
l_mode True: [Урок][День][Кабинет][Класс][Номер урока]
l_mode False: [Кабинет][День][Урок][Класс][Номер урока]
- Параметры:
sp_lessons (dict[str, list[str]]) – Словарь расписания уроков.
lessons_mode (Optional[bool]) – Режим получени индекса уроков. По умолчанию да.
- Результат:
Индекс уроков или кабинетов.
- Тип результата:
dict[str, list]
- sp.parser.parse_lessons(csv_file: str) dict[str, list[list[str]]] #
Пересобирает CSV файл в словарь расписания.
Расписание в CSV файле представленно подобным образом.
+--+-------+---------+ | | класс | | <- Шапка с классами в расписание +--+-------+---------+ | 1| урок | кабинет | <- Первый урок понедельника. | n| ... | ... | +--+-------+---------+ | 1| урок | кабинет | <- Первый урок вторника. | n| ... | ... | +--+-------+---------+
Задача этой функции преобразовать таблицу выше в словарь расписания уроков формата:
{ // Классы "класс" { // Дни [ // Уроки в днях "урок:кабинет" ] } }
- Параметры:
csv_file (bytes) – Данные CSV файла расписания.
- Результат:
Словарь расписания уроков.
- Тип результата:
dict[str, list[str]]
Класс расписания#
Используется для прямой работы с самим расписанием уроков. Предоставляет так называемые «сырые» результаты. Которые вы после можете самостоятельно обработать.
Подсказка
Генератор сообщений.
Если же вас интересует готовый результат, обратитесь к
классу представления или так называемому генератору сообщений
sp.messages.SPMessages
.
В отличие от класса расписания, класс представления возвращает
уже готовые текстовые сообщения, которые вы можете испльзовать
например в чат-ботах.
- class sp.parser.Schedule(cl: str | None = None, sc_path: Path | str = PosixPath('sp_data/sc.json'), updates_path: Path | str = PosixPath('sp_data/updates.json'), index_path: Path | str = PosixPath('sp_data/index.json'))#
Предоставляет доступ к расписанию уроков.
В первую очередь занимается получение расписания из гугл таблиц. Отслеживает изменения в расписании и записывает их в файл. Вы можете получить расписание для конкретного класса, произвести полный поиск по урокам или кабинетам, использую фильтры, получить список изменений в расписании, также с возможностью отфильтровать результаты поиска. Тажке предосталвяет доступ к индексам расписания.
- Параметры:
cl (Optional[str]) – Ваш класс по умолчанию.
sc_path (Optional[Union[Path, str]]) – Ваш путь к файлу расписания.
updates_path (Optional[Union[Path, str]]) – Ваш путь к файлу списка изменений расписания.
index_path (Optional[Union[Path, str]]) – Ваш путь для сохранения индексов расписания.
- schedule: dict[str, int | dict | str]#
Полное расписание уроков, включая время получения и прочее
- lessons: dict[str, list[str]]#
Расписание уроков, он же индекс классов (часто используется)
Совет
Более подробно прочитать про значение schedule можно в методе get.
Более побробно почитать про значение lessons можно в функции parse_lessons.
Аттрибуты расписания:
- property l_index: dict[str, list[dict]] | None#
Индекс уроков.
Загружает индекс урокво из файла. Индекс урока предоставляет изменённый словарь расписания, где вместо ключа используется название урока, а не класс.
Пример структуры индекса:
{ "матем": [ { // Понедельник ... "204" { // Каибнет "8в" [ // класс 3 // Номер урока ] } }, {}, // Вторник ... {}, // Среда ... {}, // ... {}, {}, ] }
- Результат:
Полный индекс уроков.
- Тип результата:
dict[str, list[dict]]
- property c_index: dict[str, list[dict]] | None#
Индекс кабинетов.
Загружает индекс уроков из файла. Индекс кабинетов предоставляет изменённый словарь расписания, где вместо ключа используется название кабинета, а не класс.
Пример структуры индекса:
{ "204": [ { // Понедельник ... "матем" { // Каибнет "8в" [ // класс 3 // Номер урока ] } }, {}, // Вторник ... {}, // Среда ... {}, // ... {}, {}, ] }
- Результат:
Полный индекс уроков.
- Тип результата:
dict[str, list[dict]]
- property updates: list[dict[str, int | list[dict]]] | None#
Список изменений в расписании.
Загружает полный список изменений из файла. Список изменений представляет собой список из последних 30-ти записях об изменениях в расписании.
Каждая запись содержит начало и конец временрого отрезка, когда были зафиксированы изменеия. Также каждая запись содержит полный список изменений.
Пример одной из записи:
{ "start_time": 1703479133.752195, "end_time": 1703486843.468643, "updates": [ // Дни недели { "5а": [ // Классы ... [ // Изменение в расписании "тфк:110", // Старый урок:класс "None:110" // Новый урок:класс ], null, // Если уроки не изменились null, null, null, null, null, null ], }, {}, // Вторик ... {}, // Среда ... {}, // ... {}, {} ] }
- Результат:
Полный список изменений в расписании.
- Тип результата:
list[list[dict[str, Union[int, list[dict]]]]]
Методы для получения расписания:
- get() dict[str, int | dict | str] #
Получает расписание уроков.
Если расписание уроков пустое или таймёр истёк, запускает процесс обновления.
Процесс обновления:
- Загрузка файла расписания.
Если не удалосью, передвигаем метку обновления.
Сравниваем хеши расписаний.
- Если различаются:
Парсим расписание из файла.
Обновляем индексы расписания.
Отслеживает и записывает изменения в расписании.
Сдвигаем временнцую метку следующего обновления.
Расписание уроков представляет собой словарь:
hash: Хеш сумма рсписания уроков.
last_parse: Unixtime посленей проверки расписания.
next_parse: Ubixtume следующей проверки расписания.
lessons: Сам словарь расписаний уроков по классам.
- Результат:
Словарь данных расписания уроков.
- Тип результата:
dict[str, Union[int, dict, str]]
Методы для работы с расписанием:
- get_class(cl: str) str #
Получает класс из расписания.
Не рекомендуется, начиная с версии 5.7: Этот метод будет вскоре удалён
Лучшще используйте вместо этого:
if cl in sp.lessons: ...
- get_lessons(cl: str | None = None) list[list[str]] #
Получает полное расписание уроков для указанного класса.
- Параметры:
cl (str) – Для какого класса получить расписание.
- Результат:
расписание уроков на неделю.
- Тип результата:
list[list[str]]
- get_updates(intent: Intent, offset: int | None = None) list[list[dict[str, int | list[dict]]]] #
Получает список изменений расписания.
Проходится по списку обновленй в расписании. Для уточнения результата использует намерения. К примеру, получить все изменения на вторник. Ну или же для определённого класса.
- Параметры:
intent (Intent) – Намерения для уточнения результатов.
offset (int) – С какой временной метки обновления начать.
- Результат:
Список обновлений расписания.
- Тип результата:
list[list[dict[str, Union[int, list[dict]]]]]
- search(target: str, intent: Intent, cabinets: bool | None = False) list[list[list[str]]] #
Производит поиск в расписании.
Для поиска цели в индексах расписания. Сама же цель - название кабинета или урока. Для уточнения результатов поиска используются намерения. Например чтобы получить результаты на опрелдённый день. Ну или к примеру в определённых кабинетах, если речь об уроке.
Поиск немного изменяется в зависимости от режима.
cabinets
obj
another
false
lesson
cabinet
true
cabinet
lesson
Результат поиска возаращем подобный расписанию формат.
[ // Дни [ // Уроки (по умолчанию 8) [ // Найдённые результаты "{cl}", "{obj}", "{cl}:{obj}", "..." ], [], // Если список пустой - ничего не найдено [], [], [], [], [], [] ], [], // Вторник ... [], // Среда ... [], // ... [], [] ]
Как вы могли заметить, результат поиска - строка. Формат строки зависит от некоторых условий:
{cl} - Если в намерении 1 кабинет и указаны уроки.
{obj} - Если в намерении 1 класс (опускаем описание класса).
{cl}:{obj} - Для всех прочих случаев.
- Параметры:
target (str) – Цель для поиска, урок или кабинет.
intent (Intent) – Намерения для уточнения результатов поиска.
cabinets (bool) – Что ищём, урок или кабинет. Обычно урок.
- Результат:
Результаты поиска в расписании
- Тип результата:
list[list[list[str]]]
Методы для работы с намерениями:
- construct_intent(cl: Iterable[str] | str = (), days: Iterable[int] | int = (), lessons: Iterable[str] | str = (), cabinets: Iterable[str] | str = ()) Intent #
Создаёт новое намерение для текущего расписания.
Является сокращением для Intent.construct(sc, …)
sc = Schedule() # Можно использовать любой вариант i = Intent.construct(sc, ...) i = sc.construct_intent(...)
- Параметры:
cl (Union[Iterable[str], str]) – Какие классы расписания добавить в намерение
days (Union[Iterable[int], int]) – Какие дни добавить в намерение (0-5)
lessons (Union[Iterable[str], str]) – Какие уроки добавить в намерение (из l_index).
cabinets (Union[Iterable[str], str]) – Какие кабинеты добавить в намерение (c_index).
- Результат:
Проверенное намерение из переданных аргументов
- Тип результата:
- parse_intent(args: Iterable[str]) Intent #
Парсит намерение из строковых аргументов.
Парсит для текущего расписания. Является сокращением для Intent.parse(sc, args)
sc = Schedule() args = "матем 204".split() # Можно использовать любой вариант i = Intent.parse(sc, args) i = sc.parse_intent(args)
- Параметры:
args (Iterable[str]) – Арнументы парсинга намерений.
- Результат:
Готовое намерение из строковых аргументов.
- Тип результата: