|
@@ -1,3 +1,4 @@
|
|
|
+from enum import Enum
|
|
|
from typing import Literal, Optional
|
|
|
|
|
|
from httpx import post
|
|
@@ -28,7 +29,25 @@ class CodeExecutionResponse(BaseModel):
|
|
|
data: Data
|
|
|
|
|
|
|
|
|
+class CodeLanguage(str, Enum):
|
|
|
+ PYTHON3 = 'python3'
|
|
|
+ JINJA2 = 'jinja2'
|
|
|
+ JAVASCRIPT = 'javascript'
|
|
|
+
|
|
|
+
|
|
|
class CodeExecutor:
|
|
|
+ code_template_transformers = {
|
|
|
+ CodeLanguage.PYTHON3: PythonTemplateTransformer,
|
|
|
+ CodeLanguage.JINJA2: Jinja2TemplateTransformer,
|
|
|
+ CodeLanguage.JAVASCRIPT: NodeJsTemplateTransformer,
|
|
|
+ }
|
|
|
+
|
|
|
+ code_language_to_running_language = {
|
|
|
+ CodeLanguage.JAVASCRIPT: 'nodejs',
|
|
|
+ CodeLanguage.JINJA2: CodeLanguage.PYTHON3,
|
|
|
+ CodeLanguage.PYTHON3: CodeLanguage.PYTHON3,
|
|
|
+ }
|
|
|
+
|
|
|
@classmethod
|
|
|
def execute_code(cls, language: Literal['python3', 'javascript', 'jinja2'], preload: str, code: str) -> str:
|
|
|
"""
|
|
@@ -44,9 +63,7 @@ class CodeExecutor:
|
|
|
}
|
|
|
|
|
|
data = {
|
|
|
- 'language': 'python3' if language == 'jinja2' else
|
|
|
- 'nodejs' if language == 'javascript' else
|
|
|
- 'python3' if language == 'python3' else None,
|
|
|
+ 'language': cls.code_language_to_running_language.get(language),
|
|
|
'code': code,
|
|
|
'preload': preload
|
|
|
}
|
|
@@ -86,15 +103,9 @@ class CodeExecutor:
|
|
|
:param inputs: inputs
|
|
|
:return:
|
|
|
"""
|
|
|
- template_transformer = None
|
|
|
- if language == 'python3':
|
|
|
- template_transformer = PythonTemplateTransformer
|
|
|
- elif language == 'jinja2':
|
|
|
- template_transformer = Jinja2TemplateTransformer
|
|
|
- elif language == 'javascript':
|
|
|
- template_transformer = NodeJsTemplateTransformer
|
|
|
- else:
|
|
|
- raise CodeExecutionException('Unsupported language')
|
|
|
+ template_transformer = cls.code_template_transformers.get(language)
|
|
|
+ if not template_transformer:
|
|
|
+ raise CodeExecutionException(f'Unsupported language {language}')
|
|
|
|
|
|
runner, preload = template_transformer.transform_caller(code, inputs)
|
|
|
|