Skip to content

Commit 43b055c

Browse files
committed
Avoid computing expensive default values when the value is overridden anyways
The most expensive call at the moment is repo.get_changed_files, which does down the drain if: - another default_fn overrides the value - an explicit override is given when creating the `Parameters` With this change, the default function can return a function as a value, which is not evaluated unless necessary. Fixes #616
1 parent 5fb0641 commit 43b055c

File tree

2 files changed

+9
-4
lines changed

2 files changed

+9
-4
lines changed

src/taskgraph/parameters.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ def _get_defaults(repo_root=None):
110110
"do_not_optimize": [],
111111
"enable_always_target": True,
112112
"existing_tasks": {},
113-
"files_changed": repo.get_changed_files("AM"),
113+
"files_changed": lambda: repo.get_changed_files("AM"),
114114
"filters": ["target_tasks_method"],
115115
"head_ref": repo.branch or repo.head_rev,
116116
"head_repository": repo_url,
@@ -210,7 +210,7 @@ def _fill_defaults(repo_root=None, **kwargs):
210210

211211
for name, default in defaults.items():
212212
if name not in kwargs:
213-
kwargs[name] = default
213+
kwargs[name] = default() if callable(default) else default
214214
return kwargs
215215

216216
def check(self):

test/test_parameters.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,11 @@ def test_extend_parameters_schema(monkeypatch):
264264
}
265265
),
266266
)
267+
monkeypatch.setattr(
268+
parameters,
269+
"defaults_functions",
270+
list(parameters.defaults_functions),
271+
)
267272

268273
with pytest.raises(ParameterMismatch):
269274
Parameters(strict=False).check()
@@ -437,7 +442,7 @@ def test_extend_parameters_schema(monkeypatch):
437442
),
438443
),
439444
)
440-
def test_get_defaults(
445+
def test_defaults(
441446
monkeypatch, repo_root, is_repo, raises, expected_repo_root, expected
442447
):
443448
def mock_get_repository(repo_root):
@@ -478,4 +483,4 @@ def mock_parse(url):
478483
monkeypatch.setattr(parameters, "datetime", datetime_mock)
479484
monkeypatch.setattr(parameters, "get_version", lambda *_, **__: "1.0.0")
480485

481-
assert parameters._get_defaults(repo_root) == expected
486+
assert parameters.Parameters(strict=False, repo_root=repo_root) == expected

0 commit comments

Comments
 (0)