11
11
from atcodertools .client .atcoder import AtCoderClient , LoginError
12
12
from atcodertools .tools import tester
13
13
from atcodertools .common .logging import logger
14
+ from atcodertools .config .config import Config , ConfigType , USER_CONFIG_PATH
14
15
15
16
from atcodertools .tools .models .metadata import Metadata
17
+ from atcodertools .tools import get_default_config_path
18
+ from atcodertools .executils .run_command import run_command
16
19
17
20
18
- def main (prog , args , credential_supplier = None , use_local_session_cache = True ) -> bool :
21
+ def main (prog , args , credential_supplier = None , use_local_session_cache = True , client = None ) -> bool :
19
22
parser = argparse .ArgumentParser (
20
23
prog = prog ,
21
24
formatter_class = argparse .RawTextHelpFormatter )
@@ -67,25 +70,63 @@ def main(prog, args, credential_supplier=None, use_local_session_cache=True) ->
67
70
type = float ,
68
71
default = None )
69
72
70
- args = parser .parse_args (args )
73
+ parser .add_argument ('--exec-before-submit' ,
74
+ help = 'exec command before submit:'
75
+ ' [Default] None' ,
76
+ type = str ,
77
+ default = None )
78
+
79
+ parser .add_argument ('--exec-after-submit' ,
80
+ help = 'run command after submit:'
81
+ ' [Default] None' ,
82
+ type = str ,
83
+ default = None )
84
+
85
+ parser .add_argument ('--submit-filename' ,
86
+ help = 'file for submit will changed to this name:'
87
+ ' [Default] None' ,
88
+ type = str ,
89
+ default = None )
71
90
91
+ parser .add_argument ("--config" ,
92
+ help = "File path to your config file\n {0}{1}" .format ("[Default (Primary)] {}\n " .format (
93
+ USER_CONFIG_PATH ),
94
+ "[Default (Secondary)] {}\n " .format (
95
+ get_default_config_path ())),
96
+ type = str ,
97
+ default = None )
98
+
99
+ args = parser .parse_args (args )
100
+ if args .config is None :
101
+ if os .path .exists (USER_CONFIG_PATH ):
102
+ args .config = USER_CONFIG_PATH
103
+ logger .info (
104
+ f"config is loaded from USER_CONFIG_PATH({ USER_CONFIG_PATH } )" )
105
+ else :
106
+ args .config = get_default_config_path ()
107
+ logger .info (
108
+ f"No USER_CONFIG_PATH({ USER_CONFIG_PATH } ). Default config path({ args .config } ) is laoded. " )
72
109
metadata_file = os .path .join (args .dir , "metadata.json" )
110
+
73
111
try :
74
112
metadata = Metadata .load_from (metadata_file )
75
113
except IOError :
76
114
logger .error (
77
115
"{0} is not found! You need {0} to use this submission functionality." .format (metadata_file ))
78
116
return False
79
117
80
- try :
81
- client = AtCoderClient ()
82
- client .login (save_session_cache = not args .save_no_session_cache ,
83
- credential_supplier = credential_supplier ,
84
- use_local_session_cache = use_local_session_cache ,
85
- )
86
- except LoginError :
87
- logger .error ("Login failed. Try again." )
88
- return False
118
+ with open (args .config , "r" ) as f :
119
+ config = Config .load (f , {ConfigType .SUBMIT }, args , metadata .lang .name )
120
+ if client is None :
121
+ try :
122
+ client = AtCoderClient ()
123
+ client .login (save_session_cache = not args .save_no_session_cache ,
124
+ credential_supplier = credential_supplier ,
125
+ use_local_session_cache = use_local_session_cache ,
126
+ )
127
+ except LoginError :
128
+ logger .error ("Login failed. Try again." )
129
+ return False
89
130
90
131
tester_args = []
91
132
if args .exec :
@@ -100,8 +141,9 @@ def main(prog, args, credential_supplier=None, use_local_session_cache=True) ->
100
141
tester_args += ["-v" , str (args .error_value )]
101
142
102
143
if args .force or tester .main ("" , tester_args ):
103
- submissions = client .download_submission_list (metadata .problem .contest )
104
144
if not args .unlock_safety :
145
+ submissions = client .download_submission_list (
146
+ metadata .problem .contest )
105
147
for submission in submissions :
106
148
if submission .problem_id == metadata .problem .problem_id :
107
149
logger .error (with_color ("Cancel submitting because you already sent some code to the problem. Please "
@@ -110,9 +152,18 @@ def main(prog, args, credential_supplier=None, use_local_session_cache=True) ->
110
152
return False
111
153
112
154
code_path = args .code or os .path .join (args .dir , metadata .code_filename )
155
+
156
+ if config .submit_config .exec_before_submit :
157
+ run_command (config .submit_config .exec_before_submit , args .dir )
158
+ if not config .submit_config .submit_filename :
159
+ logger .error ("submit_filename is not specified" )
160
+ return False
161
+ code_path = config .submit_config .submit_filename
162
+ logger .info (f"changed to submitfile: { code_path } " )
163
+
113
164
for encoding in ['utf8' , 'utf-8_sig' , 'cp932' ]:
114
165
try :
115
- with open (code_path , 'r' , encoding = encoding ) as f :
166
+ with open (os . path . join ( args . dir , code_path ) , 'r' , encoding = encoding ) as f :
116
167
source = f .read ()
117
168
break
118
169
except UnicodeDecodeError :
@@ -124,6 +175,8 @@ def main(prog, args, credential_supplier=None, use_local_session_cache=True) ->
124
175
logger .info ("{} {}" .format (
125
176
with_color ("Done!" , Fore .LIGHTGREEN_EX ),
126
177
metadata .problem .contest .get_submissions_url (submission )))
178
+ if config .submit_config .exec_after_submit :
179
+ run_command (config .submit_config .exec_after_submit , args .dir )
127
180
128
181
return True
129
182
0 commit comments