blob: a5a957d08d9c2591f81a2d39add83f853ad49506 [file] [log] [blame]
# Copyright 2020 The LUCI Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Internal API for registering and checking experiments."""
def _register(experiment_id):
"""Register an experiment with the given ID.
This ID becomes a valid target for lucicfg.enable_experiment(...) call.
Returns an object that can be used to check whether the experiment was
enabled. It is fine and even recommended to register the experiments during
the module loading time:
```python
load('@stdlib//internal/experiments.star', 'experiments')
new_cool_feature_experiment = experiments.register('new_cool_feature')
...
def something(...):
new_cool_feature_experiment.require()
```
Registering the same experiment ID multiple times is fine, it results in the
exact same experiment.
Args:
experiment_id: an ID of the experiment to register.
Returns:
A struct with methods `require()` and `is_enabled()`:
`is_enabled()` returns True if the experiment is enabled.
`require()` fails the execution if the experiment is not enabled.
"""
__native__.register_experiment(experiment_id)
return struct(
is_enabled = lambda: _is_enabled(experiment_id),
require = lambda: _require(experiment_id),
)
def _require(experiment_id):
"""Fails the execution if the given experiment ID is not enabled.
Args:
experiment_id: a string with the ID of the experiment to check.
"""
if not _is_enabled(experiment_id):
fail(
"This feature requires enabling the experiment %r.\n" % experiment_id +
"To enable it, add this line somewhere early in your script:\n" +
" lucicfg.enable_experiment(%r)\n" % experiment_id +
"Note that using experimental features comes with zero guarantees. " +
"See the doc for lucicfg.enable_experiment(...) for more information",
)
def _is_enabled(experiment_id):
"""Returns True if the experiment was enabled."""
return __native__.is_experiment_enabled(experiment_id)
experiments = struct(
register = _register,
)