Git Product home page Git Product logo

prpr's Introduction

prpr

example workflow

Вряд ли вы здесь случайно.

Как воспользоваться

Нужен Python 3.9+.

Dotfile

.prpr-example.yaml нужно скопировать в ~/.prpr.yaml и адаптировать на свой вкус. Туда точно нужно положить токен доступа к Стартреку.

Также можно определить первое число для начала месяца расчёта зарплаты и определить суффиксы для уточнения когорт (в зависимости от курса):

startrek_token: your_token_here
# Optional:
free_work_owner: robot-botlegger  # owner of unassigned (free) tickets
month_start: 16  # Meaning closed tickets are grouped by May 16-June 15, June 16-July 16 and so on.
component_suffixes:  # suffixes for cohort definition according to course
  backend-developer: ''
  python-developer-plus: '+'

Запуск

Клонируем, (по желанию) создаем окружение, ставим зависимости.

python3 -m prpr.main

Также удобно создать bash alias, чтобы можно было запускать из любого местоположения, например, так:

alias prpr='cd /path/to/dir/prpr/ && source venv/bin/activate && python -m prpr.main'

Опции запуска

Доступна встроенная справка:

python3 -m prpr.main --help
usage: main.py [-h] [-m {standard,all,open,closed,closed-this-month,closed-previous-month}] [-p PROBLEMS [PROBLEMS ...]] [-n NO] [-s STUDENT] [-c COHORTS [COHORTS ...]] [-f FROM_DATE] [-t TO_DATE] [-o] [-d [{one,all,interactive,interactive-all}]] [--head] [-i] [-v] [--post-process]

optional arguments:
  -h, --help            show this help message and exit
  -o, --open            open homework pages in browser
  -v, --verbose

filters:
  these allow to specify the subset of homeworks to be displayed, can be composed

  -m {standard,all,open,closed,closed-this-month,closed-previous-month}, --mode {standard,all,open,closed,closed-this-month,closed-previous-month}
                        filter mode
                                    standard: in review, open or on the side of user
                                    open: in review or open
                                    closed: resolved or closed
                                    closed-this-month: resolved or closed this "month" aka 💰.
                                    closed-previous-month: resolved or closed previous "month" aka 💰.
                                    all: all, duh
  -p PROBLEMS [PROBLEMS ...], --problems PROBLEMS [PROBLEMS ...]
                        the numbers of problems to be shown; multiple space-separated values are accepted
  -n NO, --no NO        the no of the homework to be shown, all other filters are ignored
  -s STUDENT, --student STUDENT
                        the substring to be found in the student column, mail works best
  -c COHORTS [COHORTS ...], --cohorts COHORTS [COHORTS ...]
                        cohorts to be shown; multiple space-separated values are accepted
  -f FROM_DATE, --from-date FROM_DATE
                        the start date (YYYY-MM-DD)
  -t TO_DATE, --to-date TO_DATE
                        the end date (YYYY-MM-DD)
  -u USER, --user USER
                        show issues assigned for USER (name in tracker, like y-nikulin)
  --free
                        show unassigned (free) tickets (overrides -u/--user)

download:
  -d [{one,all,interactive,interactive-all}], --download [{one,all,interactive,interactive-all}]
                        download mode
                                    one: first by deadline,
                                    all: all, duh
                                    interactive: choose one interactively,
                                    interactive-all: choose one interactively, repeat

  --head                download with visible browser window (default is headless, i.e. the window is hidden)
  -i, --interactive     choose which homework to download interactively (deprecated)

process:
  --post-process

Примеры использования опций запуска

Скачать и обработать архив с интерактивным выбором работы с повтором, открыть браузер, логирование уровня INFO (это рекомендованный вариант запуска):

python -m prpr.main -v --download interactive-all --post-process --open

То же самое, только одна работа:

python -m prpr.main -v --download interactive --post-process --open

Скачать и обработать все работы, открыть браузер:

python -m prpr.main -v --download all --post-process --open

Вывести только 1 и 2 проекты для студентов 16 когорты и 1 когорты "Питон+":

python -m prpr.main --problems 1 2 --cohorts 16 1+

Открыть в браузере работу № 100:

python -m prpr.main --no 100 --open

Скачать архив с работой:

python -m prpr.main --down

Скачать и обработать архив с работой:

python -m prpr.main --down --post-process

Вывести все работы по конкретному студенту (емейл, имя, фамилия):

python -m prpr.main --mode all --student [email protected]
python -m prpr.main --mode all --student "Василиса Пупкина"

Вывести все закрытые работы в определенный период времени. Даты указываются в формате YYYY-MM-DD:

python -m prpr.main --mode closed --from-date 2021-04-16 --to-date 2021-05-15

Вывести закрытые в текущем/предыдущем учетном месяце работы:

python -m prpr.main --mode closed-this-month
python -m prpr.main --mode closed-previous-month

Вывести свободные работы

python -m prpr.main --free

Достаточно указывать уникальный префикс ключа: можно --down, а не --download.

Как работают итерации

Номер итерации равен количеству переходов в статус Открыт.

Получение истории статусов требует отдельного запроса на каждый тикет, так что (пока?) для экономии номер итерации отображается только для заданий со статусом Открыт или Ревью.

Как настроить скачку

  1. Нужно установить драйвер Selenium для Firefox.
  2. До Ревизора должен быть доступ (VPN, 2FA etc).
  3. Нужно указать в .prpr профиль Firefox с залогином в Ревизоре.
# .prpr fragment
download:
    directory: path/to/downloaded/homeworks
    browser:
        type: firefox
        profile_path: path/to/firefox/profile

Как работает скачка

В тикете есть ссылка на Ревизор. Она открывается в Firefox с помощью Selenium 🤦🏻‍♀️, там кликается нужная вкладка. Из страницы вынимаются ссылки на zip-файлы. Недостающие архивы скачиваются в директорию, указанную в дотфайле. Нужная структура поддиректорий будет создана автоматически.

Как настроить обработку

В .prpr нужно добавить секцию process, в ней можно настроить шаги для обработки.

Шаги -- шаблоны, в которых заполняются некоторые переменные. Самая интересная переменная -- it_last, она будет заменена на абсолютный путь до директории с последней версией последней итерации (а it_prev -- для предпоследней). Полный список переменных доступен в .prpr.yaml (отрывок см. ниже). Для it_last можно запускать проверки (как стандартные линтеры, так и свои), для it_prev и it_last -- строить диффы.

Заполненный шаблон подается на process.runner. Если runner -- ["bash", "-c"], будут работать стандартные возможности, такие как перенаправления и пайпы.

  • Шаги из process.default будут применены всегда.
  • При совпадении имени курса -- шаги из process.courses.<course_name>.default.
  • При совпадении имени курса и номера задачи -- шаги из process.courses.<course_name>.problems.<problem_number>.
  • Для первой итерации пропускаются шаги, которым нужна предыдущая итерация.

Вывод шагов сохраняется в директорию домашней работы. Имена шагов должны быть допустимыми именами файлов.

Пример:

# .prpr fragment
process:
    # Which steps are applied?
    # 1. The steps in process.default
    # 2. If the course name matches, the steps in process.courses.<course_name>.default
    # 3. If the problem number matches as well, the steps in process.courses.<course_name>.problems.<problem_number>
    runner: ["bash", "-c"]
    default:
        steps:
            # The following variables are supported:
            #
            # hw -- the absolute path of the homework directory,
            # it_last -- the absolute path of the last iteration directory,
            # it_last_ -- the path of the last iteration directory relative to the homework directory,
            # it_last_zip and it_last_zip_ are similar, but point to zip files,
            # it_last_number -- the number of the current iteration,
            # it_prev, it_prev_ and so on refer to the corresponding counterparts for the previous iteration.
            # if it_prev, it_prev_... are present the step is skipped for the first iteration.
            diff: "cd {hw} && diff -r -N {it_prev_} {it_last_}"
            # Check out https://github.com/jeffkaufman/icdiff for a better alternative.
            # icdiff: "cd {hw} && icdiff -r -N {it_prev_} {it_last_}"
    courses:
        backend-developer:
            default:
                steps:
                    pycodestyle: "/usr/local/bin/pycodestyle {it_last} | grep -v -e 'master/tests/' -e migrations -e settings"
            problems:
                2:  # communities
                    steps:
                        # This is an example of a problem-specific check:
                        find_set_null: "cd {it_last} && grep -r SET_NULL ."

История изменений

2023-07-12

  • Добавлена переменная с номером текущей итерации. Теперь его можно пробросить в вызываемые команды, например в авто-ревьювер.

2023-07-04

  • Разрешен баг, когда не скачивались новые работы в "Убунту" 22.04: #2
  • Разнесены пример конфига и собственно конфиг (иначе конфиг иногда пытался закоммитится).
  • Работы из банка теперь на другой учетке: robot-botlegger . Обновили настройки.

2022-06-29

  • Закэшированы обращения к API. Время работы скрипта при формировании списка задач сократилось примерно в 2 раза (главным образом за счёт /v2/components/ - получение названия курса).

2022-06-20

  • [Refactor] Метод PraktikTrackerClient.get_status_history() переписан с использованием штатного интерфейса клиента Яндекс-трекера.
  • [Refactor] Удален метод PraktikTrackerClient.get_iteration_and_updated().

2022-05-24

  • Добавлен вывод свободных работ и отображение тикетов других ревьюверов. NB: не забудьте скопировать настройку free_work_owner: lepervushina в ~/.prpr.yaml.

2022-04-27

  • Поиск по студентам сделан регистронезависимым.

2021-08-27

  • Фикс селектора для скачки.

2021-08-24

  • Добавлен режим --download interactive-all.
  • В меню появилось обновления статусов.

2021-08-06

  • Добавлен режим --download all.
  • Вместо --interactive рекомендуется использовать --download interactive.

2021-06-21

  • Устранен баг в распаковке архивов.

2021-06-18

  • Устранен баг в сортировке архивов итераций.

2021-06-13

  • Домашнюю работу для скачивания можно выбрать интерактивно: -i/--interactive.
  • Для домашних работ в ревью с пропущенными дедлайнами выставлена иконка 🔎.

2021-06-09

  • Добавлен пост-процессинг aka «диффы» 🥳

2021-06-04

  • Архивы распакуются при скачке.

2021-05-31

  • Теперь можно скачать архивы с домашними заданиями, пока только через Firefox.
  • Теперь -v включает логи со статусом INFO и выше, -vv -- со статусом DEBUG и выше.
  • Ссылка на Стартрек не обрезается на узких терминалах.

2021-05-30

  • Добавлен режим closed-previous-month.

2021-05-29

  • Добавлен вывод когорт в таблицу.
  • Добавлен фильтр по когортам.

2021-05-27

  • Добавлен режим closed-this-month.
  • Ключи фильтров по датам переименованы в --date-from и --date-to.
  • Режим default переименован в standard.

2021-05-26

  • Добавлена поддержка фильтров по дате.

2021-05-24

  • Добавлена поддержка номеров итераций и отображение дедлайнов для тикетов в статусе Ревью.

2021-05-20

  • Добавлены примеры запусков.

Тубидубидутуду

  1. Настройки и украшения
  2. Создать пакет cо скриптом запуска
  3. Уведомления
  4. Статистика
  5. Тесты 😹
  6. Кэширование
  7. Демонстрационный запуск

prpr's People

Contributors

mav1984 avatar nikulin avatar roxe322 avatar salmiakki avatar theoden-dd avatar vitaliy-chernyshov avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar

prpr's Issues

Fix Selenium click error (on Ubuntu 22.04)

There were errors for lots of more or less recent homeworks.

The download part crashed with an error like:

Traceback (most recent call last):
  File "{$HOME}/.pyenv/versions/3.9.10/lib/python3.9/runpy.py", line 197, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "{$HOME}/.pyenv/versions/3.9.10/lib/python3.9/runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "*/prpr/prpr/main.py", line 213, in <module>
    main()
  File "*/prpr/prpr/main.py", line 160, in main
    for results, homework in zip(
  File "*/prpr/prpr/download.py", line 88, in download_batch
    urls = _get_zip_urls(driver, homework.revisor_url)
  File "*/prpr/prpr/download.py", line 209, in _get_zip_urls
    element.click()
  File "{$HOME}/.pyenv/versions/3.9.10/envs/yapr-prpr/lib/python3.9/site-packages/selenium/webdriver/remote/webelement.py", line 80, in click
    self._execute(Command.CLICK_ELEMENT)
  File "{$HOME}/.pyenv/versions/3.9.10/envs/yapr-prpr/lib/python3.9/site-packages/selenium/webdriver/remote/webelement.py", line 633, in _execute
    return self._parent.execute(command, params)
  File "{$HOME}/.pyenv/versions/3.9.10/envs/yapr-prpr/lib/python3.9/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "{$HOME}/.pyenv/versions/3.9.10/envs/yapr-prpr/lib/python3.9/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)

selenium.common.exceptions.ElementClickInterceptedException: Message: Element <article class="tab__text"> is not clickable at point (811,266) because another element <div class="skills-modal skills-modal_align_center skills-modal_theme_transparent expanded-image expanded-image_align_center expanded-image_theme_transparent"> obscures it

I'll attach couple of examples of {homework_number}.{iteration} {cohort} to make possible some suggestions on the content version on the platform.
See also the thread in Pachca (limited access): https://app.pachca.com/chats?thread_id=1086996

OS: Ubuntu 22.04

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.