-
Notifications
You must be signed in to change notification settings - Fork 5k
/
Copy pathruby.py
61 lines (50 loc) · 1.73 KB
/
ruby.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import re
from pathlib import Path
from .subprocess_language import SubprocessLanguage
class Ruby(SubprocessLanguage):
file_extension = "rb"
name = "Ruby"
def __init__(self):
super().__init__()
self.start_cmd = ["irb"]
def preprocess_code(self, code):
"""
Add active line markers
Wrap in a tryCatch for better error handling
Add end of execution marker
"""
lines = code.split("\n")
processed_lines = []
for i, line in enumerate(lines, 1):
# Add active line print
processed_lines.append(f'puts "##active_line{i}##"')
processed_lines.append(line)
# Join lines to form the processed code
processed_code = "\n".join(processed_lines)
# Wrap in a tryCatch for error handling and add end of execution marker
processed_code = f"""
begin
{processed_code}
rescue => e
puts "##execution_error##\\n" + e.message
ensure
puts "##end_of_execution##\\n"
end
"""
self.code_line_count = len(processed_code.split("\n"))
# print(processed_code)
return processed_code
def line_postprocessor(self, line):
# If the line count attribute is set and non-zero, decrement and skip the line
if hasattr(self, "code_line_count") and self.code_line_count > 0:
self.code_line_count -= 1
return None
if "nil" in line:
return None
return line
def detect_active_line(self, line):
if "##active_line" in line:
return int(line.split("##active_line")[1].split("##")[0])
return None
def detect_end_of_execution(self, line):
return "##end_of_execution##" in line or "##execution_error##" in line