Skip to content

Commit

Permalink
Experimental domjudge_package rule (#5)
Browse files Browse the repository at this point in the history
  • Loading branch information
nya3jp committed May 30, 2020
1 parent ddfcbab commit eb861b1
Show file tree
Hide file tree
Showing 9 changed files with 93 additions and 2 deletions.
5 changes: 4 additions & 1 deletion contest/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@ load("//lint:defs.bzl", "buildifier_test", "pycodestyle_test")

buildifier_test()

exports_files(["defs.bzl"])
exports_files([
"defs.bzl",
"experimental_defs.bzl",
])

sh_binary(
name = "exact_comparator",
Expand Down
18 changes: 18 additions & 0 deletions contest/experimental_defs.bzl
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
def domjudge_package(name, metadata, dataset, statements = [], **kwargs):
out = name + ".zip"
args = [
"'$(execpath @rules_contest//contest/impls:domjudge_package)'",
"--output='$@'",
"--metadata='$(execpath " + metadata + ")'",
"--dataset='$(execpath " + dataset + ")'",
]
for statement in statements:
args.append("--statement='$(execpath " + statement + ")'")
native.genrule(
name = name,
outs = [out],
srcs = [metadata, dataset] + statements,
tools = ["@rules_contest//contest/impls:domjudge_package"],
cmd = " ".join(args),
**kwargs
)
11 changes: 11 additions & 0 deletions contest/impls/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -134,3 +134,14 @@ pycodestyle_test(
name = "pycodestyle_test",
srcs = glob(["*.py"]),
)

py_binary(
name = "domjudge_package",
srcs = ["domjudge_package.py"],
srcs_version = "PY3",
visibility = ["//visibility:public"],
deps = [
":datasets",
"//third_party/yaml",
],
)
41 changes: 41 additions & 0 deletions contest/impls/domjudge_package.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import argparse
import os
import shutil
import tempfile

import yaml

from contest.impls import datasets


def main():
parser = argparse.ArgumentParser()
parser.add_argument('--output', required=True)
parser.add_argument('--metadata', required=True)
parser.add_argument('--statements', action='append')
parser.add_argument('--dataset', required=True)
options = parser.parse_args()

with tempfile.TemporaryDirectory() as tmp_dir:
with open(options.metadata, 'r') as f:
# Make sure the metadata YAML is well-formed.
yaml.safe_load(f)
shutil.copy(options.metadata, os.path.join(tmp_dir, 'problem.yaml'))

for statement in options.statements:
assert statement.endswith(('.html', '.pdf'))
statement_ext = statement.split('.')[-1]
shutil.copy(
statement,
os.path.join(tmp_dir, 'problem.%s' % statement_ext))

dataset_dir = os.path.join(tmp_dir, 'data', 'secret')
os.makedirs(dataset_dir)
datasets.extract(options.dataset, dataset_dir)

# TODO: Do not reuse datasets.create to create a problem ZIP archive.
datasets.create(tmp_dir, options.output)


if __name__ == '__main__':
main()
8 changes: 8 additions & 0 deletions tests/example/sqrt/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ load(
"markdown",
"py_yaml_library",
)
load("//contest:experimental_defs.bzl", "domjudge_package")

buildifier_test()

Expand All @@ -27,3 +28,10 @@ markdown(
name = "statement",
src = ":statement_subst",
)

domjudge_package(
name = "sqrt",
dataset = "//tests/example/sqrt/judge:dataset",
metadata = "problem.yaml",
statements = [":statement"],
)
1 change: 1 addition & 0 deletions tests/example/sqrt/problem.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
name: Square root
8 changes: 8 additions & 0 deletions tests/example/sum/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ load(
"markdown",
"py_yaml_library",
)
load("//contest:experimental_defs.bzl", "domjudge_package")

buildifier_test()

Expand All @@ -27,3 +28,10 @@ markdown(
name = "statement",
src = ":statement_subst",
)

domjudge_package(
name = "sum",
dataset = "//tests/example/sum/judge:dataset",
metadata = "problem.yaml",
statements = [":statement"],
)
1 change: 1 addition & 0 deletions tests/example/sum/problem.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
name: Sum of two numbers
2 changes: 1 addition & 1 deletion tests/example/sum/statement.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Sum two numbers
# Sum of two numbers

Compute the sum of two numbers.

Expand Down

0 comments on commit eb861b1

Please sign in to comment.