4
4
from atcodertools .codegen .code_generators import cpp , java , rust , python , nim , d , cs , swift
5
5
from atcodertools .codegen .models .code_gen_args import CodeGenArgs
6
6
from atcodertools .tools .templates import get_default_template_path
7
+ import platform
7
8
8
9
9
10
class LanguageNotFoundError (Exception ):
@@ -25,7 +26,10 @@ def __init__(self,
25
26
submission_lang_pattern : Pattern [str ],
26
27
default_code_generator : Callable [[CodeGenArgs ], str ],
27
28
default_template_path : str ,
28
- default_code_style = None
29
+ default_code_style = None ,
30
+ compile_command = None ,
31
+ test_command = None ,
32
+ exec_filename = None
29
33
):
30
34
self .name = name
31
35
self .display_name = display_name
@@ -34,11 +38,37 @@ def __init__(self,
34
38
self .default_code_generator = default_code_generator
35
39
self .default_template_path = default_template_path
36
40
self .default_code_style = default_code_style
41
+ self .compile_command = compile_command
42
+ self .test_command = test_command
43
+ self .code_filename = "{filename}." + extension
44
+ if platform .system () == "Windows" :
45
+ self .exec_filename = exec_filename .replace (
46
+ "{exec_extension}" , ".exe" )
47
+ else :
48
+ self .exec_filename = exec_filename .replace ("{exec_extension}" , "" )
37
49
38
50
def source_code_name (self , name_without_extension : str ) -> str :
39
51
# put extension to the name
40
52
return "{}.{}" .format (name_without_extension , self .extension )
41
53
54
+ def get_compile_command (self , filename : str ):
55
+ return self .compile_command .format (filename = filename )
56
+
57
+ def get_code_filename (self , filename : str ):
58
+ return self .code_filename .format (filename = filename )
59
+
60
+ def get_exec_filename (self , filename : str ):
61
+ return self .exec_filename .format (filename = filename , capitalized_filename = filename .capitalize ())
62
+
63
+ def get_test_command (self , filename : str , cwd : str = '.' ):
64
+ exec_filename = cwd + '/'
65
+ if platform .system () == "Windows" :
66
+ exec_filename += filename + ".exe"
67
+ else :
68
+ exec_filename += filename
69
+ capitalized_filename = filename .capitalize ()
70
+ return self .test_command .format (filename = filename , exec_filename = exec_filename , capitalized_filename = capitalized_filename )
71
+
42
72
@classmethod
43
73
def from_name (cls , name : str ):
44
74
for lang in ALL_LANGUAGES :
@@ -56,6 +86,9 @@ def from_name(cls, name: str):
56
86
".*C\\ +\\ + \\ (GCC 9.*|.*C\\ +\\ +14 \\ (GCC 5.*" ),
57
87
default_code_generator = cpp .main ,
58
88
default_template_path = get_default_template_path ('cpp' ),
89
+ compile_command = "g++ {filename}.cpp -o {filename} -std=c++14" ,
90
+ test_command = "{exec_filename}" ,
91
+ exec_filename = "{filename}{exec_extension}"
59
92
)
60
93
61
94
JAVA = Language (
@@ -65,6 +98,9 @@ def from_name(cls, name: str):
65
98
submission_lang_pattern = re .compile (".*Java8.*|.*Java \\ (OpenJDK 11.*" ),
66
99
default_code_generator = java .main ,
67
100
default_template_path = get_default_template_path ('java' ),
101
+ compile_command = "javac {filename}.java" ,
102
+ test_command = "java {capitalized_filename}" ,
103
+ exec_filename = "{capitalized_filename}.class"
68
104
)
69
105
70
106
RUST = Language (
@@ -74,6 +110,9 @@ def from_name(cls, name: str):
74
110
submission_lang_pattern = re .compile (".*Rust \\ (1.*" ),
75
111
default_code_generator = rust .main ,
76
112
default_template_path = get_default_template_path ('rs' ),
113
+ compile_command = "rustc {filename}.rs -o {filename}" ,
114
+ test_command = "{exec_filename}" ,
115
+ exec_filename = "{filename}{exec_extension}"
77
116
)
78
117
79
118
PYTHON = Language (
@@ -83,6 +122,9 @@ def from_name(cls, name: str):
83
122
submission_lang_pattern = re .compile (".*Python3.*|^Python$" ),
84
123
default_code_generator = python .main ,
85
124
default_template_path = get_default_template_path ('py' ),
125
+ compile_command = "python3 -mpy_compile {filename}.py" ,
126
+ test_command = "python3 {filename}.py" ,
127
+ exec_filename = "{filename}.pyc"
86
128
)
87
129
88
130
DLANG = Language (
@@ -92,6 +134,9 @@ def from_name(cls, name: str):
92
134
submission_lang_pattern = re .compile (".*D \\ (DMD.*" ),
93
135
default_code_generator = d .main ,
94
136
default_template_path = get_default_template_path ('d' ),
137
+ compile_command = "dmd {filename}.d -of={filename}" ,
138
+ test_command = "{exec_filename}" ,
139
+ exec_filename = "{filename}{exec_extension}"
95
140
)
96
141
97
142
NIM = Language (
@@ -101,7 +146,10 @@ def from_name(cls, name: str):
101
146
submission_lang_pattern = re .compile (".*Nim \\ (1.*" ),
102
147
default_code_generator = nim .main ,
103
148
default_template_path = get_default_template_path ('nim' ),
104
- default_code_style = CodeStyle (indent_width = 2 )
149
+ default_code_style = CodeStyle (indent_width = 2 ),
150
+ compile_command = "nim cpp -o:{filename} {filename}.nim" ,
151
+ test_command = "{exec_filename}" ,
152
+ exec_filename = "{filename}{exec_extension}"
105
153
)
106
154
107
155
CSHARP = Language (
@@ -111,6 +159,9 @@ def from_name(cls, name: str):
111
159
submission_lang_pattern = re .compile (".*C# \\ (Mono.*" ),
112
160
default_code_generator = cs .main ,
113
161
default_template_path = get_default_template_path ('cs' ),
162
+ compile_command = "mcs {filename}.cs -o {filename}" ,
163
+ test_command = "{exec_filename}" ,
164
+ exec_filename = "{filename}{exec_extension}"
114
165
)
115
166
116
167
SWIFT = Language (
@@ -120,6 +171,9 @@ def from_name(cls, name: str):
120
171
submission_lang_pattern = re .compile ("^Swift" ),
121
172
default_code_generator = swift .main ,
122
173
default_template_path = get_default_template_path ('swift' ),
174
+ compile_command = "swiftc {filename}.swift -o {filename}" ,
175
+ test_command = "{exec_filename}" ,
176
+ exec_filename = "{filename}{exec_extension}"
123
177
)
124
178
125
179
0 commit comments