-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathmemory_management.py
More file actions
133 lines (114 loc) · 5.94 KB
/
memory_management.py
File metadata and controls
133 lines (114 loc) · 5.94 KB
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import json
import os
import file_utils
from plain2code_console import console
from plain_modules import CODEPLAIN_MEMORY_SUBFOLDER
from render_machine.implementation_code_helpers import ImplementationCodeHelpers
from render_machine.render_context import RenderContext
CONFORMANCE_TESTS_SUCCESS_EXIT_CODE = 0
CONFORMANCE_TEST_MEMORY_SUBFOLDER = "conformance_test_memory"
class MemoryManager:
@staticmethod
def fetch_memory_files(memory_folder: str) -> tuple[list[str], dict[str, str]]:
"""Fetch memory files from memory_folder/conformance_test_memory."""
memory_path = os.path.join(memory_folder, CONFORMANCE_TEST_MEMORY_SUBFOLDER)
if not os.path.exists(memory_path):
return [], {}
memory_files = file_utils.list_all_text_files(memory_path)
memory_files_content = file_utils.get_existing_files_content(memory_path, memory_files)
console.debug(f"Loaded {len(memory_files_content)} memory files.")
return memory_files, memory_files_content
def __init__(self, codeplain_api, module_build_folder: str):
self.codeplain_api = codeplain_api
self.memory_folder = os.path.join(module_build_folder, CODEPLAIN_MEMORY_SUBFOLDER)
def create_conformance_tests_memory(
self, render_context: RenderContext, exit_code: int, conformance_tests_issue: str
):
current_conformance_tests_issue_frid = render_context.conformance_tests_running_context.current_testing_frid
current_conformance_tests_issue_module = (
render_context.conformance_tests_running_context.current_testing_module_name
)
old_conformance_tests_issue_frid = (
render_context.conformance_tests_running_context.previous_conformance_tests_issue_frid
)
old_conformance_tests_issue_module = (
render_context.conformance_tests_running_context.previous_conformance_tests_issue_module
)
old_conformance_tests_issue = (
render_context.conformance_tests_running_context.previous_conformance_tests_issue_old
)
is_first_time_running_conformance_tests = (
old_conformance_tests_issue_frid is None
or old_conformance_tests_issue_frid == ""
or old_conformance_tests_issue_module != current_conformance_tests_issue_module
)
is_same_frid_as_previous_failing_test = (
current_conformance_tests_issue_frid == old_conformance_tests_issue_frid
and current_conformance_tests_issue_module == old_conformance_tests_issue_module
)
is_conformance_test_failed = exit_code != CONFORMANCE_TESTS_SUCCESS_EXIT_CODE
should_create_memory = not is_first_time_running_conformance_tests and (
is_same_frid_as_previous_failing_test or is_conformance_test_failed
)
code_diff_files = render_context.conformance_tests_running_context.code_diff_files
if not should_create_memory or code_diff_files is None:
console.debug(
"Skipping creation of conformance test memory because the conditions for creating memories are not met."
)
return
existing_files, existing_files_content = ImplementationCodeHelpers.fetch_existing_files(
render_context.build_folder
)
memory_files, memory_files_content = MemoryManager.fetch_memory_files(self.memory_folder)
conformance_tests_folder_name = (
render_context.conformance_tests_running_context.get_current_conformance_test_folder_name()
)
(
_,
existing_conformance_test_files_content,
) = render_context.conformance_tests.fetch_existing_conformance_test_files(
render_context.module_name,
render_context.required_modules,
render_context.conformance_tests_running_context.current_testing_module_name,
conformance_tests_folder_name,
)
acceptance_tests = render_context.conformance_tests_running_context.get_current_acceptance_tests()
response_files = render_context.codeplain_api.create_conformance_test_memory(
render_context.frid_context.frid,
render_context.plain_source_tree,
render_context.frid_context.linked_resources,
existing_files_content,
memory_files_content,
render_context.module_name,
render_context.get_required_modules_functionalities(),
code_diff_files,
existing_conformance_test_files_content,
acceptance_tests,
conformance_tests_issue,
conformance_tests_folder_name,
old_conformance_tests_issue,
run_state=render_context.run_state,
)
if len(response_files) > 0:
memory_folder_path = os.path.join(self.memory_folder, CONFORMANCE_TEST_MEMORY_SUBFOLDER)
file_utils.store_response_files(memory_folder_path, response_files, memory_files)
def delete_unresolved_memory_files(self):
"""Delete memory files whose resolution_status is not 'RESOLVED'."""
memory_path = os.path.join(self.memory_folder, CONFORMANCE_TEST_MEMORY_SUBFOLDER)
if not os.path.exists(memory_path):
return
memory_files = file_utils.list_all_text_files(memory_path)
for file_name in memory_files:
file_path = os.path.join(memory_path, file_name)
try:
with open(file_path, "r") as f:
content = json.load(f)
if content.get("resolution_status") == "RESOLVED":
continue
else:
os.remove(file_path)
except (json.JSONDecodeError, OSError):
# Not a valid JSON file, unlikely to be a valid memory file, delete it
console.error(f"Memory file is not a valid JSON file: {file_name}. Deleting it.")
os.remove(file_path)
console.debug(f"Deleted temporary memory file: {file_name}")