Идея: трансляция в скрипты

Последняя правка 3792 дня назад
Материал из Daysper manual
Перейти к навигации Перейти к поиску

Общая идея[править | править код]

Все действия, которые выполняет 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\ никакой скрипт создан не будет.