Идея: трансляция в скрипты
Общая идея[править | править код]
Все действия, которые выполняет daysper, связанные с конкретными манипуляциями файлами (генерация тестов, проверка решений, ...), по возможности делаются так: сначала создается скрипт (поддерживаемый операционной системой, т.е. .cmd или .sh-скрипт), который будет выполнять эти действия (или несколько скриптов и один главный скрипт, который их вызывает), потом запускается этот скрипт.
Если обрабатывается несколько задач (например, при запуске команды типа build в каталоге, где нет задачи, но в поддереве которого есть несколько задач) сначала будут созданы скрипты для генерации этих задач, а также дополнительные скрипты, позволяющие генерировать сразу все эти задачи (путем вызова скриптов, созданных для задач).
Почему[править | править код]
Такая методика имеет как минимум следующие преимущества:
- Скрипт можно создавать теоретически на любом языке, для этого требуется лишь написать класс, предоставляющий элементарные функции типа "записать в скрипт команду копирования файлов". Классы для cmd и sh уже написаны.
- Для запуска скриптов не требуется daysper. Поэтому легко можно сделать так, чтобы нужные действия (генерацию тестов и т.п.) можно было выполнить без daysper — для этого надо лишь заранее с помощью daysper создать нужные скрипты и распространять их вместе с задачей.
- При возникновении какой-либо ошибки на этапе создания скрипта никакие действия с файлами не будут выполнены. Например, если окажется, что решение, которое хотелось использовать для генерации ответов, отсутствует, то скрипт не будет создан и никаких вообще действие по генерации тестов не будет произведено; задача будет максимально сохранена в том же виде, какой она была до запуска команды. Если обрабатывается несколько задач, то при возникновении ошибки в любой никаких действий ни с одной задачей не будет произведено. (Это все относится, конечно, только к ошибкам, которые выявляются на этапе создания скрипта).
Об обработке нескольких задач[править | править код]
Более строгий алгоритм обработки нескольких задач. Пусть некоторая команда запущена в некотором каталоге. Будет выполнен рекурсивный обход каталогов, начиная с текущего, и в каждом найденном каталоге будут выполнены следующие действия:
- если это — каталог с задачей, то там будет создан скрипт для выполнения требуемого действия.
- если это — не каталог с задачей, то его подкаталоги будут рекурсивно обойдены и, если хотя бы в одном был создан скрипт (т.е. где-то в глубине дерева каталогов найдена задача), то в текущем каталоге будет создан скрипт, вызывающий все скрипты, созданные в подкаталогах текущего каталога.
После этого будет запущен скрипт, созданный в текущем каталоге (если такой был создан).
Пример: если запустить команды daysper build в некотором каталоге, структура подкаталогов которого такая:
. (текущий каталог) testlib\ aplusb\ (задача) more\ temp1\ (задача) temp2\ (задача)
то будут созданы скрипты aplusb\_generate.* (генерирующий тесты), more\temp1\_generate.* (генерирующий тесты), more\temp2\_generate.* (генерирующий тесты), more\_generate.* (вызывающий скрипты more\temp1\_generate и more\temp2\_generate) и _generate.* (вызывающий скрипты alpusb\_generate и more\_generate), и будет вызван последний скрипт. Обратите внимание, что в testlib\ никакой скрипт создан не будет.