forked from FailproofAI/runtime
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdependent_string.py
More file actions
65 lines (52 loc) · 2.68 KB
/
Copy pathdependent_string.py
File metadata and controls
65 lines (52 loc) · 2.68 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
from pydantic import BaseModel, PrivateAttr
class Dependent(BaseModel):
identifier: str
field: str
tail: str
value: str | None = None
class DependentString(BaseModel):
head: str
dependents: dict[int, Dependent]
_mapping_key_to_dependent: dict[tuple[str, str], list[Dependent]] = PrivateAttr(default_factory=dict)
def generate_string(self) -> str:
base = self.head
for key in sorted(self.dependents.keys()):
dependent = self.dependents[key]
if dependent.value is None:
raise ValueError(f"Dependent value is not set for: {dependent}")
base += dependent.value + dependent.tail
return base
@staticmethod
def create_dependent_string(syntax_string: str) -> "DependentString":
splits = syntax_string.split("${{")
if len(splits) <= 1:
return DependentString(head=syntax_string, dependents={})
dependent_string = DependentString(head=splits[0], dependents={})
for order, split in enumerate(splits[1:]):
if "}}" not in split:
raise ValueError(f"Invalid syntax string placeholder {split} for: {syntax_string} '${{' not closed")
placeholder_content, tail = split.split("}}", 1)
parts = [p.strip() for p in placeholder_content.split(".")]
if len(parts) == 3 and parts[1] == "outputs":
dependent_string.dependents[order] = Dependent(identifier=parts[0], field=parts[2], tail=tail)
elif len(parts) == 2 and parts[0] == "store":
dependent_string.dependents[order] = Dependent(identifier=parts[0], field=parts[1], tail=tail)
else:
raise ValueError(f"Invalid syntax string placeholder {placeholder_content} for: {syntax_string}")
return dependent_string
def _build_mapping_key_to_dependent(self):
if self._mapping_key_to_dependent != {}:
return
for dependent in self.dependents.values():
mapping_key = (dependent.identifier, dependent.field)
if mapping_key not in self._mapping_key_to_dependent:
self._mapping_key_to_dependent[mapping_key] = []
self._mapping_key_to_dependent[mapping_key].append(dependent)
def set_value(self, identifier: str, field: str, value: str):
self._build_mapping_key_to_dependent()
mapping_key = (identifier, field)
for dependent in self._mapping_key_to_dependent[mapping_key]:
dependent.value = value
def get_identifier_field(self) -> list[tuple[str, str]]:
self._build_mapping_key_to_dependent()
return list(self._mapping_key_to_dependent.keys())