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).

Результат:

Проверенное намерение из переданных аргументов

Тип результата:

Intent

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]) – Арнументы парсинга намерений.

Результат:

Готовое намерение из строковых аргументов.

Тип результата:

Intent