1
1
from typing import Optional , Union
2
2
3
- from .base_types import Flavor , TestCase
3
+ from .base_types import Flavor , TestCase , TestCases
4
4
from .clients import Client
5
+
5
6
from .retry import RegularPeriodRetry , RetryMechanism
6
- from .submission import Submission
7
+ from .submission import Submission , Submissions
7
8
8
9
9
10
def resolve_client (
10
11
client : Optional [Union [Client , Flavor ]] = None ,
11
- submissions : Optional [Union [Submission , list [ Submission ] ]] = None ,
12
- ) -> Union [ Client , None ] :
12
+ submissions : Optional [Union [Submission , Submissions ]] = None ,
13
+ ) -> Client :
13
14
# User explicitly passed a client.
14
15
if isinstance (client , Client ):
15
16
return client
@@ -20,6 +21,9 @@ def resolve_client(
20
21
if isinstance (client , Flavor ):
21
22
return _get_implicit_client (flavor = client )
22
23
24
+ if client is None and isinstance (submissions , list ) and len (submissions ) == 0 :
25
+ raise ValueError ("Client cannot be determined from empty submissions." )
26
+
23
27
# client is None and we have to determine a flavor of the client from the
24
28
# submissions and the languages.
25
29
if isinstance (submissions , Submission ):
@@ -44,10 +48,9 @@ def resolve_client(
44
48
45
49
def wait (
46
50
client : Client ,
47
- submissions : Union [Submission , list [Submission ]],
48
- * ,
51
+ submissions : Union [Submission , Submissions ],
49
52
retry_mechanism : Optional [RetryMechanism ] = None ,
50
- ) -> Union [Submission , list [ Submission ] ]:
53
+ ) -> Union [Submission , Submissions ]:
51
54
if retry_mechanism is None :
52
55
retry_mechanism = RegularPeriodRetry ()
53
56
@@ -61,15 +64,7 @@ def wait(
61
64
}
62
65
63
66
while len (submissions_to_check ) > 0 and not retry_mechanism .is_done ():
64
- # We differentiate between getting a single submission and multiple
65
- # submissions to be consistent with the API, even though the API
66
- # allows to get single submission with the same endpoint as for getting
67
- # the multiple submissions.
68
- if len (submissions_to_check ) == 1 :
69
- client .get_submission (* submissions_to_check .values ())
70
- else :
71
- client .get_submissions (submissions_to_check .values ())
72
-
67
+ client .check_submissions (list (submissions_to_check .values ()))
73
68
for token in list (submissions_to_check ):
74
69
submission = submissions_to_check [token ]
75
70
if submission .is_done ():
@@ -86,20 +81,20 @@ def wait(
86
81
87
82
88
83
def create_submissions_from_test_cases (
89
- submissions : Union [Submission , list [ Submission ] ],
90
- test_cases : Optional [Union [TestCase , list [ TestCase ] ]] = None ,
84
+ submissions : Union [Submission , Submissions ],
85
+ test_cases : Optional [Union [TestCase , TestCases ]] = None ,
91
86
):
92
87
"""Utility function for creating submissions from the (submission, test_case) pairs.
93
88
94
89
The following table contains the return type based on the types of `submissions`
95
90
and `test_cases` arguments:
96
91
97
- | submissions | test_cases | returns |
98
- |:----------------- |:---------------|:----- ------------|
99
- | Submission | TestCase | Submission |
100
- | Submission | list[TestCase] | list[Submission] |
101
- | list[Submission] | TestCase | list[Submission] |
102
- | list[Submission] | list[TestCase] | list[Submission] |
92
+ | submissions | test_cases | returns |
93
+ |:------------|:-----------|: ------------|
94
+ | Submission | TestCase | Submission |
95
+ | Submission | TestCases | Submissions |
96
+ | Submissions | TestCase | Submissions |
97
+ | Submissions | TestCases | Submissions |
103
98
104
99
"""
105
100
# Let's deal with the simplest cases where no test cases are provided. We
@@ -127,7 +122,7 @@ def create_submissions_from_test_cases(
127
122
submission_copy .expected_output = test_case .expected_output
128
123
all_submissions .append (submission_copy )
129
124
130
- if isinstance (submissions , Submission ) and not isinstance (test_cases , list ):
125
+ if isinstance (submissions , Submission ) and isinstance (test_cases , TestCase ):
131
126
return all_submissions [0 ]
132
127
else :
133
128
return all_submissions
@@ -136,12 +131,12 @@ def create_submissions_from_test_cases(
136
131
def _execute (
137
132
* ,
138
133
client : Optional [Union [Client , Flavor ]] = None ,
139
- submissions : Optional [Union [Submission , list [ Submission ] ]] = None ,
134
+ submissions : Optional [Union [Submission , Submissions ]] = None ,
140
135
source_code : Optional [str ] = None ,
136
+ test_cases : Optional [Union [TestCase , TestCases ]] = None ,
141
137
wait_for_result : bool = False ,
142
- test_cases : Optional [Union [TestCase , list [TestCase ]]] = None ,
143
138
** kwargs ,
144
- ) -> Union [Submission , list [ Submission ] ]:
139
+ ) -> Union [Submission , Submissions ]:
145
140
if submissions is not None and source_code is not None :
146
141
raise ValueError (
147
142
"Both submissions and source_code arguments are provided. "
@@ -153,62 +148,42 @@ def _execute(
153
148
if source_code is not None :
154
149
submissions = Submission (source_code = source_code , ** kwargs )
155
150
156
- # TODO: Since kwargs is ignored if submissions argument is provided, maybe
157
- # use warnings if submission and kwargs are provided?
158
-
159
- # There is no need to check for other cases since we are explicitly
160
- # checking for submissions and source_code arguments.
161
- if client is None :
162
- if isinstance (submissions , list ) and len (submissions ) == 0 :
163
- raise ValueError ("Client cannot be determined from empty submissions." )
164
-
165
- client = resolve_client (client , submissions = submissions )
166
-
151
+ client = resolve_client (client = client , submissions = submissions )
167
152
all_submissions = create_submissions_from_test_cases (submissions , test_cases )
168
-
169
- # We differentiate between creating a single submission and multiple
170
- # submissions to be consistent with the API, even though the API
171
- # allows to create single submission with the same endpoint as for
172
- # creating the multiple submissions.
173
- if isinstance (all_submissions , Submission ):
174
- all_submissions = client .create_submission (all_submissions )
175
- elif len (all_submissions ) == 1 :
176
- all_submissions = [client .create_submission (all_submissions [0 ])]
177
- else :
178
- all_submissions = client .create_submissions (all_submissions )
153
+ all_submissions = client .submit (all_submissions )
179
154
180
155
if wait_for_result :
181
- all_submissions = wait (client , all_submissions )
156
+ all_submissions = wait (client = client , submissions = all_submissions )
182
157
183
158
return all_submissions
184
159
185
160
186
161
def async_execute (
187
162
* ,
188
163
client : Optional [Union [Client , Flavor ]] = None ,
189
- submissions : Optional [Union [Submission , list [ Submission ] ]] = None ,
164
+ submissions : Optional [Union [Submission , Submissions ]] = None ,
190
165
source_code : Optional [str ] = None ,
191
- test_cases : Optional [Union [TestCase , list [ TestCase ] ]] = None ,
166
+ test_cases : Optional [Union [TestCase , TestCases ]] = None ,
192
167
** kwargs ,
193
- ) -> Union [Submission , list [ Submission ] ]:
168
+ ) -> Union [Submission , Submissions ]:
194
169
return _execute (
195
170
client = client ,
196
171
submissions = submissions ,
197
172
source_code = source_code ,
198
- wait_for_result = False ,
199
173
test_cases = test_cases ,
174
+ wait_for_result = False ,
200
175
** kwargs ,
201
176
)
202
177
203
178
204
179
def sync_execute (
205
180
* ,
206
181
client : Optional [Union [Client , Flavor ]] = None ,
207
- submissions : Optional [Union [Submission , list [ Submission ] ]] = None ,
182
+ submissions : Optional [Union [Submission , Submissions ]] = None ,
208
183
source_code : Optional [str ] = None ,
209
- test_cases : Optional [Union [TestCase , list [ TestCase ] ]] = None ,
184
+ test_cases : Optional [Union [TestCase , TestCases ]] = None ,
210
185
** kwargs ,
211
- ) -> Union [Submission , list [ Submission ] ]:
186
+ ) -> Union [Submission , Submissions ]:
212
187
return _execute (
213
188
client = client ,
214
189
submissions = submissions ,
0 commit comments