]>
iEval git - gruntmaster-data.git/blob - lib/Gruntmaster/App/Command/Add.pm
1 package Gruntmaster
::App
::Command
::Add
;
6 our $VERSION = '5999.000_004';
8 use Gruntmaster
::App
'-command';
11 use Date
::Parse qw
/str2time/;
12 use File
::Slurp qw
/read_file write_file/;
13 use IO
::Prompter
[ -style
=> 'bold', '-stdio', '-verbatim' ];
14 use JSON
::MaybeXS qw
/encode_json/;
15 use Term
::ANSIColor qw
/RED RESET/;
17 use constant LEVEL_VALUES
=> {
24 sub usage_desc
{ '%c [-cp] add id' }
27 contest
=> \
&add_contest
,
28 problem
=> \
&add_problem
,
32 my ($self, $opt, $args) = @_;
34 $self->usage_error('No table selected') unless $self->app->table;
35 $self->usage_error('Don\'t know how to add this object type') unless $TABLE{$self->app->object};
36 $self->usage_error('Wrong number of arguments') if @args != 1;
40 my ($self, $opt, $args) = @_;
42 $TABLE{$self->app->object}->($self, $id);
48 my $name = prompt
'Contest name';
49 my $owner = prompt
'Owner';
50 my $start = str2time prompt
'Start time' or die 'Cannot parse time';
51 my $stop = str2time prompt
'Stop time' or die 'Cannot parse time';
53 db
->insert(contests
=> {id
=> $id, name
=> $name, owner
=> $owner, start
=> $start, stop
=> $stop});
58 my $db = $self->app->db;
60 my $name = prompt
'Problem name';
61 my $private = prompt
('Private?', '-yn') eq 'y';
62 my $contest = prompt
'Contest';
63 my $author = prompt
'Problem author (full name)';
64 my $writer = prompt
'Problem statement writer (full name)';
65 my $owner = prompt
'Problem owner (username)';
66 my $level = prompt
'Problem level', -menu
=> "beginner\neasy\nmedium\nhard";
67 my $value = LEVEL_VALUES
->{$level};
68 my $statement = read_file prompt
'File with problem statement', -complete
=> 'filenames';
69 my $generator = prompt
'Generator', -menu
=> "File\nRun\nUndef";
70 my $runner = prompt
'Runner', -menu
=> "File\nVerifier\nInteractive";
71 my $judge = prompt
'Judge', -menu
=> "Absolute\nPoints";
72 my $testcnt = prompt
'Test count', '-i';
74 my $timeout = prompt
'Time limit (seconds)', '-n';
75 my $olimit = prompt
'Output limit (bytes)', '-i';
76 say 'Memory limits are broken, so I won\'t ask you for one';
78 my (@tests, $gensource, $genformat, $versource, $verformat);
80 if ($generator eq 'Run') {
81 $gensource = read_file prompt
'[Generator::Run] Generator file name', -complete
=> 'filenames';
82 $genformat = prompt
'[Generator::Run] Generator format', -menu
=> [qw
/C CPP MONO JAVA PASCAL PERL PYTHON/];
85 if ($runner eq 'File') {
86 my $default = $judge eq 'Points' ?
10 : 'Ok';
87 $tests[$_ - 1] = prompt
"[Runner::File] Score for test ${_} [$default]", -default => $default for 1 .. $testcnt;
90 if ($runner eq 'Verifier' || $runner eq 'Interactive') {
91 say RED
, 'WARNING: Runner::Interactive is experimental', RESET
if $runner eq 'Interactive';
92 $versource = prompt
"[Runner::$runner] Verifier file name", -complete
=> 'filenames';
93 $verformat = prompt
"[Runner::$runner] Verifier format", -menu
=> [qw
/C CPP MONO JAVA PASCAL PERL PYTHON/];
101 statement
=> $statement,
105 generator
=> $generator,
110 $options{private
} = $private if $private;
111 $options{timeout
} = $timeout if $timeout;
112 $options{olimit
} = $olimit if $olimit;
113 $options{tests
} = encode_json \
@tests if @tests;
114 $options{gensource
} = $gensource if $gensource;
115 $options{genformat
} = $genformat if $genformat;
116 $options{versource
} = $versource if $versource;
117 $options{verformat
} = $verformat if $verformat;
118 db
->insert(problems
=> \
%options);
119 db
->insert(contest_problems
=> {problem
=> $id, contest
=> $contest}) if $contest;
This page took 0.049469 seconds and 4 git commands to generate.