From 4d215a78cc7278299ff552b147c1ff589fee4e18 Mon Sep 17 00:00:00 2001 From: Lorenz Gaertner Date: Thu, 7 Dec 2023 14:57:30 +0100 Subject: [PATCH] feat: Allow skipping of validation when combining workspaces (#2385) * Add validate arg to workspace.combine to allow for optionally skipping workspace validation during. Default is to validate. * Add test for validate arg being used. * Add Lorenz Gaertner to contributors list. --- docs/contributors.rst | 1 + src/pyhf/workspace.py | 7 +++++-- tests/test_workspace.py | 22 ++++++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/docs/contributors.rst b/docs/contributors.rst index c2d0b0a698..d29fd0974b 100644 --- a/docs/contributors.rst +++ b/docs/contributors.rst @@ -33,3 +33,4 @@ Contributors include: - Beojan Stanislaus - Daniel Werner - Jonas Rembser +- Lorenz Gaertner diff --git a/src/pyhf/workspace.py b/src/pyhf/workspace.py index 00abcf77f4..7ce0bc486d 100644 --- a/src/pyhf/workspace.py +++ b/src/pyhf/workspace.py @@ -706,7 +706,9 @@ def rename(self, modifiers=None, samples=None, channels=None, measurements=None) ) @classmethod - def combine(cls, left, right, join='none', merge_channels=False): + def combine( + cls, left, right, join='none', merge_channels=False, validate: bool = True + ): """ Return a new workspace specification that is the combination of the two workspaces. @@ -733,6 +735,7 @@ def combine(cls, left, right, join='none', merge_channels=False): right (~pyhf.workspace.Workspace): Another workspace join (:obj:`str`): How to join the two workspaces. Pick from "none", "outer", "left outer", or "right outer". merge_channels (:obj:`bool`): Whether or not to merge channels when performing the combine. This is only done with "outer", "left outer", and "right outer" options. + validate (:obj:`bool`): Whether to validate against a JSON schema. Returns: ~pyhf.workspace.Workspace: A new combined workspace object @@ -770,7 +773,7 @@ def combine(cls, left, right, join='none', merge_channels=False): 'observations': new_observations, 'version': new_version, } - return cls(newspec) + return cls(newspec, validate=validate) @classmethod def sorted(cls, workspace): diff --git a/tests/test_workspace.py b/tests/test_workspace.py index 55ee0df046..e966d6c3f1 100644 --- a/tests/test_workspace.py +++ b/tests/test_workspace.py @@ -791,6 +791,28 @@ def test_combine_workspace(workspace_factory, join): ) +@pytest.mark.parametrize("join", pyhf.Workspace.valid_joins) +def test_combine_workspace_without_validation(mocker, workspace_factory, join): + ws = workspace_factory() + new_ws = ws.rename( + channels={channel: f"renamed_{channel}" for channel in ws.channels}, + samples={sample: f"renamed_{sample}" for sample in ws.samples}, + modifiers={ + modifier: f"renamed_{modifier}" + for modifier, _ in ws.modifiers + if modifier != "lumi" + }, + measurements={ + measurement: f"renamed_{measurement}" + for measurement in ws.measurement_names + }, + ) + + mocker.patch("pyhf.schema.validate") + pyhf.Workspace.combine(ws, new_ws, join=join, validate=False) + assert pyhf.schema.validate.called is False + + def test_workspace_equality(workspace_factory): ws = workspace_factory() ws_other = workspace_factory()