|
60 | 60 | def wrap_testbook( |
61 | 61 | notebook_name: str, |
62 | 62 | timeout_seconds: float = 10, |
63 | | - replacements: list[tuple[str, str]] | None = None, |
| 63 | + replacements_regex: list[tuple[str, str]] | None = None, |
| 64 | + replacements_variables: list[tuple[str, str]] | None = None, |
64 | 65 | ) -> Callable: |
65 | 66 | def inner_decorator(func: Callable) -> Any: |
66 | 67 | _patch_testbook() |
67 | 68 |
|
68 | 69 | notebook_path = resolve_notebook_path(notebook_name) |
69 | 70 |
|
70 | | - with NotebookReplace(notebook_path, replacements): |
| 71 | + with NotebookReplace( |
| 72 | + notebook_path, replacements_regex, replacements_variables |
| 73 | + ) as nr: |
71 | 74 | for decorator in [ |
72 | 75 | _build_patch_testbook_client_decorator(notebook_name), |
73 | 76 | testbook(notebook_path, execute=True, timeout=timeout_seconds), |
74 | | - (lambda x: x) if replacements else qmod_compare_decorator, |
| 77 | + (lambda x: x) if nr.replacements else qmod_compare_decorator, |
75 | 78 | _build_cd_decorator(notebook_path), |
76 | 79 | _build_skip_decorator(notebook_path), |
77 | 80 | ]: |
@@ -101,28 +104,45 @@ def inner(*args: Any, **kwargs: Any) -> Any: |
101 | 104 | @dataclass |
102 | 105 | class NotebookReplace: |
103 | 106 | file_path: str |
104 | | - replacements: list[tuple[str, str]] | None |
| 107 | + replacements_regex: list[tuple[str, str]] | None |
| 108 | + replacements_variables: list[tuple[str, str]] | None |
105 | 109 |
|
106 | 110 | def __post_init__(self): |
107 | 111 | self.was_file_copied = False |
108 | 112 |
|
| 113 | + self.replacements = self._group_replacements() |
| 114 | + |
109 | 115 | @property |
110 | 116 | def file_path_copied(self): |
111 | 117 | return self.file_path + FILE_COPY_SUFFIX |
112 | 118 |
|
113 | | - def __enter__(self): |
114 | | - if not self.replacements: |
115 | | - return |
| 119 | + def _group_replacements(self) -> list[tuple[str, str]]: |
| 120 | + replacements = [] |
| 121 | + |
| 122 | + if self.replacements_regex: |
| 123 | + replacements.extend(self.replacements_regex) |
116 | 124 |
|
117 | | - self._backup_notebook() |
118 | | - self.was_file_copied = True |
| 125 | + if self.replacements_variables: |
| 126 | + replacements.extend( |
| 127 | + [ |
| 128 | + (f"({variable}\\s*=\\s*)", f"\\1 {new_value} # ") |
| 129 | + for variable, new_value in self.replacements_variables |
| 130 | + ] |
| 131 | + ) |
119 | 132 |
|
120 | | - used_replacements = self._replace_notebook_content() |
| 133 | + return replacements |
121 | 134 |
|
122 | | - # verify all replacements were used |
123 | | - assert ( |
124 | | - self.replacements == used_replacements |
125 | | - ), f"Not all replacements given were used. The onces used are: {used_replacements}. The unused are {[r for r in replacements if r not in used_replacements]}" |
| 135 | + def __enter__(self): |
| 136 | + if self.replacements: |
| 137 | + self._backup_notebook() |
| 138 | + self.was_file_copied = True |
| 139 | + |
| 140 | + used_replacements = self._replace_notebook_content() |
| 141 | + assert ( |
| 142 | + self.replacements == used_replacements |
| 143 | + ), f"Not all replacements given were used. The onces used are: {used_replacements}. The unused are {[r for r in self.replacements if r not in used_replacements]}" |
| 144 | + |
| 145 | + return self |
126 | 146 |
|
127 | 147 | def __exit__(self, *args, **kwargs): |
128 | 148 | if not self.replacements: |
|
0 commit comments