| # Copyright 2025 The Bazel Authors. All rights reserved. | |
| # | |
| # 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. | |
| """Builders for creating attributes et al. | |
| :::{versionadded} 1.3.0 | |
| ::: | |
| """ | |
| load("@bazel_skylib//lib:types.bzl", "types") | |
| load( | |
| ":builders_util.bzl", | |
| "kwargs_getter", | |
| "kwargs_getter_doc", | |
| "kwargs_getter_mandatory", | |
| "kwargs_set_default_doc", | |
| "kwargs_set_default_ignore_none", | |
| "kwargs_set_default_list", | |
| "kwargs_set_default_mandatory", | |
| "kwargs_setter", | |
| "kwargs_setter_doc", | |
| "kwargs_setter_mandatory", | |
| "normalize_transition_in_out_values", | |
| "to_label_maybe", | |
| ) | |
| # Various string constants for kwarg key names used across two or more | |
| # functions, or in contexts with optional lookups (e.g. dict.dict, key in dict). | |
| # Constants are used to reduce the chance of typos. | |
| # NOTE: These keys are often part of function signature via `**kwargs`; they | |
| # are not simply internal names. | |
| _ALLOW_FILES = "allow_files" | |
| _ALLOW_EMPTY = "allow_empty" | |
| _ALLOW_SINGLE_FILE = "allow_single_file" | |
| _DEFAULT = "default" | |
| _INPUTS = "inputs" | |
| _OUTPUTS = "outputs" | |
| _CFG = "cfg" | |
| _VALUES = "values" | |
| def _kwargs_set_default_allow_empty(kwargs): | |
| existing = kwargs.get(_ALLOW_EMPTY) | |
| if existing == None: | |
| kwargs[_ALLOW_EMPTY] = True | |
| def _kwargs_getter_allow_empty(kwargs): | |
| return kwargs_getter(kwargs, _ALLOW_EMPTY) | |
| def _kwargs_setter_allow_empty(kwargs): | |
| return kwargs_setter(kwargs, _ALLOW_EMPTY) | |
| def _kwargs_set_default_allow_files(kwargs): | |
| existing = kwargs.get(_ALLOW_FILES) | |
| if existing == None: | |
| kwargs[_ALLOW_FILES] = False | |
| def _kwargs_getter_allow_files(kwargs): | |
| return kwargs_getter(kwargs, _ALLOW_FILES) | |
| def _kwargs_setter_allow_files(kwargs): | |
| return kwargs_setter(kwargs, _ALLOW_FILES) | |
| def _kwargs_set_default_aspects(kwargs): | |
| kwargs_set_default_list(kwargs, "aspects") | |
| def _kwargs_getter_aspects(kwargs): | |
| return kwargs_getter(kwargs, "aspects") | |
| def _kwargs_getter_providers(kwargs): | |
| return kwargs_getter(kwargs, "providers") | |
| def _kwargs_set_default_providers(kwargs): | |
| kwargs_set_default_list(kwargs, "providers") | |
| def _common_label_build(self, attr_factory): | |
| kwargs = dict(self.kwargs) | |
| kwargs[_CFG] = self.cfg.build() | |
| return attr_factory(**kwargs) | |
| def _WhichCfg_typedef(): | |
| """Values returned by `AttrCfg.which_cfg` | |
| :::{field} TARGET | |
| Indicates the target config is set. | |
| ::: | |
| :::{field} EXEC | |
| Indicates the exec config is set. | |
| ::: | |
| :::{field} NONE | |
| Indicates the "none" config is set (see {obj}`config.none`). | |
| ::: | |
| :::{field} IMPL | |
| Indicates a custom transition is set. | |
| ::: | |
| """ | |
| # buildifier: disable=name-conventions | |
| _WhichCfg = struct( | |
| TYPEDEF = _WhichCfg_typedef, | |
| TARGET = "target", | |
| EXEC = "exec", | |
| NONE = "none", | |
| IMPL = "impl", | |
| ) | |
| def _AttrCfg_typedef(): | |
| """Builder for `cfg` arg of label attributes. | |
| :::{function} inputs() -> list[Label] | |
| ::: | |
| :::{function} outputs() -> list[Label] | |
| ::: | |
| :::{function} which_cfg() -> attrb.WhichCfg | |
| Tells which of the cfg modes is set. Will be one of: target, exec, none, | |
| or implementation | |
| ::: | |
| """ | |
| _ATTR_CFG_WHICH = "which" | |
| _ATTR_CFG_VALUE = "value" | |
| def _AttrCfg_new( | |
| inputs = None, | |
| outputs = None, | |
| **kwargs): | |
| """Creates a builder for the `attr.cfg` attribute. | |
| Args: | |
| inputs: {type}`list[Label] | None` inputs to use for a transition | |
| outputs: {type}`list[Label] | None` outputs to use for a transition | |
| **kwargs: {type}`dict` Three different keyword args are supported. | |
| The presence of a keyword arg will mark the respective mode | |
| returned by `which_cfg`. | |
| - `cfg`: string of either "target" or "exec" | |
| - `exec_group`: string of an exec group name to use. None means | |
| to use regular exec config (i.e. `config.exec()`) | |
| - `implementation`: callable for a custom transition function. | |
| Returns: | |
| {type}`AttrCfg` | |
| """ | |
| state = { | |
| _INPUTS: inputs, | |
| _OUTPUTS: outputs, | |
| # Value depends on _ATTR_CFG_WHICH key. See associated setters. | |
| _ATTR_CFG_VALUE: True, | |
| # str: one of the _WhichCfg values | |
| _ATTR_CFG_WHICH: _WhichCfg.TARGET, | |
| } | |
| kwargs_set_default_list(state, _INPUTS) | |
| kwargs_set_default_list(state, _OUTPUTS) | |
| normalize_transition_in_out_values("input", state[_INPUTS]) | |
| normalize_transition_in_out_values("output", state[_OUTPUTS]) | |
| # buildifier: disable=uninitialized | |
| self = struct( | |
| # keep sorted | |
| _state = state, | |
| build = lambda: _AttrCfg_build(self), | |
| exec_group = lambda: _AttrCfg_exec_group(self), | |
| implementation = lambda: _AttrCfg_implementation(self), | |
| inputs = kwargs_getter(state, _INPUTS), | |
| none = lambda: _AttrCfg_none(self), | |
| outputs = kwargs_getter(state, _OUTPUTS), | |
| set_exec = lambda *a, **k: _AttrCfg_set_exec(self, *a, **k), | |
| set_implementation = lambda *a, **k: _AttrCfg_set_implementation(self, *a, **k), | |
| set_none = lambda: _AttrCfg_set_none(self), | |
| set_target = lambda: _AttrCfg_set_target(self), | |
| target = lambda: _AttrCfg_target(self), | |
| which_cfg = kwargs_getter(state, _ATTR_CFG_WHICH), | |
| ) | |
| # Only one of the three kwargs should be present. We just process anything | |
| # we see because it's simpler. | |
| if _CFG in kwargs: | |
| cfg = kwargs.pop(_CFG) | |
| if cfg == "target" or cfg == None: | |
| self.set_target() | |
| elif cfg == "exec": | |
| self.set_exec() | |
| elif cfg == "none": | |
| self.set_none() | |
| else: | |
| self.set_implementation(cfg) | |
| if "exec_group" in kwargs: | |
| self.set_exec(kwargs.pop("exec_group")) | |
| if "implementation" in kwargs: | |
| self.set_implementation(kwargs.pop("implementation")) | |
| return self | |
| def _AttrCfg_from_attr_kwargs_pop(attr_kwargs): | |
| """Creates a `AttrCfg` from the cfg arg passed to an attribute bulider. | |
| Args: | |
| attr_kwargs: dict of attr kwargs, it's "cfg" key will be removed. | |
| Returns: | |
| {type}`AttrCfg` | |
| """ | |
| cfg = attr_kwargs.pop(_CFG, None) | |
| if not types.is_dict(cfg): | |
| kwargs = {_CFG: cfg} | |
| else: | |
| kwargs = cfg | |
| return _AttrCfg_new(**kwargs) | |
| def _AttrCfg_implementation(self): | |
| """Tells the custom transition function, if any and applicable. | |
| Returns: | |
| {type}`callable | None` the custom transition function to use, if | |
| any, or `None` if a different config mode is being used. | |
| """ | |
| return self._state[_ATTR_CFG_VALUE] if self._state[_ATTR_CFG_WHICH] == _WhichCfg.IMPL else None | |
| def _AttrCfg_none(self): | |
| """Tells if none cfg (`config.none()`) is set. | |
| Returns: | |
| {type}`bool` True if none cfg is set, False if not. | |
| """ | |
| return self._state[_ATTR_CFG_VALUE] if self._state[_ATTR_CFG_WHICH] == _WhichCfg.NONE else False | |
| def _AttrCfg_target(self): | |
| """Tells if target cfg is set. | |
| Returns: | |
| {type}`bool` True if target cfg is set, False if not. | |
| """ | |
| return self._state[_ATTR_CFG_VALUE] if self._state[_ATTR_CFG_WHICH] == _WhichCfg.TARGET else False | |
| def _AttrCfg_exec_group(self): | |
| """Tells the exec group to use if an exec transition is being used. | |
| Args: | |
| self: implicitly added. | |
| Returns: | |
| {type}`str | None` the name of the exec group to use if any, | |
| or `None` if `which_cfg` isn't `exec` | |
| """ | |
| return self._state[_ATTR_CFG_VALUE] if self._state[_ATTR_CFG_WHICH] == _WhichCfg.EXEC else None | |
| def _AttrCfg_set_implementation(self, impl): | |
| """Sets a custom transition function to use. | |
| Args: | |
| self: implicitly added. | |
| impl: {type}`callable` a transition implementation function. | |
| """ | |
| self._state[_ATTR_CFG_WHICH] = _WhichCfg.IMPL | |
| self._state[_ATTR_CFG_VALUE] = impl | |
| def _AttrCfg_set_none(self): | |
| """Sets to use the "none" transition.""" | |
| self._state[_ATTR_CFG_WHICH] = _WhichCfg.NONE | |
| self._state[_ATTR_CFG_VALUE] = True | |
| def _AttrCfg_set_exec(self, exec_group = None): | |
| """Sets to use an exec transition. | |
| Args: | |
| self: implicitly added. | |
| exec_group: {type}`str | None` the exec group name to use, if any. | |
| """ | |
| self._state[_ATTR_CFG_WHICH] = _WhichCfg.EXEC | |
| self._state[_ATTR_CFG_VALUE] = exec_group | |
| def _AttrCfg_set_target(self): | |
| """Sets to use the target transition.""" | |
| self._state[_ATTR_CFG_WHICH] = _WhichCfg.TARGET | |
| self._state[_ATTR_CFG_VALUE] = True | |
| def _AttrCfg_build(self): | |
| which = self._state[_ATTR_CFG_WHICH] | |
| value = self._state[_ATTR_CFG_VALUE] | |
| if which == None: | |
| return None | |
| elif which == _WhichCfg.TARGET: | |
| # config.target is Bazel 8+ | |
| if hasattr(config, "target"): | |
| return config.target() | |
| else: | |
| return "target" | |
| elif which == _WhichCfg.EXEC: | |
| return config.exec(value) | |
| elif which == _WhichCfg.NONE: | |
| return config.none() | |
| elif types.is_function(value): | |
| return transition( | |
| implementation = value, | |
| # Transitions only accept unique lists of strings. | |
| inputs = {str(v): None for v in self._state[_INPUTS]}.keys(), | |
| outputs = {str(v): None for v in self._state[_OUTPUTS]}.keys(), | |
| ) | |
| else: | |
| # Otherwise, just assume the value is valid and whoever set it knows | |
| # what they're doing. | |
| return value | |
| # buildifier: disable=name-conventions | |
| AttrCfg = struct( | |
| TYPEDEF = _AttrCfg_typedef, | |
| new = _AttrCfg_new, | |
| # keep sorted | |
| exec_group = _AttrCfg_exec_group, | |
| implementation = _AttrCfg_implementation, | |
| none = _AttrCfg_none, | |
| set_exec = _AttrCfg_set_exec, | |
| set_implementation = _AttrCfg_set_implementation, | |
| set_none = _AttrCfg_set_none, | |
| set_target = _AttrCfg_set_target, | |
| target = _AttrCfg_target, | |
| ) | |
| def _Bool_typedef(): | |
| """Builder for attr.bool. | |
| :::{function} build() -> attr.bool | |
| ::: | |
| :::{function} default() -> bool. | |
| ::: | |
| :::{function} doc() -> str | |
| ::: | |
| :::{include} /_includes/field_kwargs_doc.md | |
| ::: | |
| :::{function} mandatory() -> bool | |
| ::: | |
| :::{function} set_default(v: bool) | |
| ::: | |
| :::{function} set_doc(v: str) | |
| ::: | |
| :::{function} set_mandatory(v: bool) | |
| ::: | |
| """ | |
| def _Bool_new(**kwargs): | |
| """Creates a builder for `attr.bool`. | |
| Args: | |
| **kwargs: Same kwargs as {obj}`attr.bool` | |
| Returns: | |
| {type}`Bool` | |
| """ | |
| kwargs_set_default_ignore_none(kwargs, _DEFAULT, False) | |
| kwargs_set_default_doc(kwargs) | |
| kwargs_set_default_mandatory(kwargs) | |
| # buildifier: disable=uninitialized | |
| self = struct( | |
| # keep sorted | |
| build = lambda: attr.bool(**self.kwargs), | |
| default = kwargs_getter(kwargs, _DEFAULT), | |
| doc = kwargs_getter_doc(kwargs), | |
| kwargs = kwargs, | |
| mandatory = kwargs_getter_mandatory(kwargs), | |
| set_default = kwargs_setter(kwargs, _DEFAULT), | |
| set_doc = kwargs_setter_doc(kwargs), | |
| set_mandatory = kwargs_setter_mandatory(kwargs), | |
| ) | |
| return self | |
| # buildifier: disable=name-conventions | |
| Bool = struct( | |
| TYPEDEF = _Bool_typedef, | |
| new = _Bool_new, | |
| ) | |
| def _Int_typedef(): | |
| """Builder for attr.int. | |
| :::{function} build() -> attr.int | |
| ::: | |
| :::{function} default() -> int | |
| ::: | |
| :::{function} doc() -> str | |
| ::: | |
| :::{include} /_includes/field_kwargs_doc.md | |
| ::: | |
| :::{function} mandatory() -> bool | |
| ::: | |
| :::{function} values() -> list[int] | |
| The returned value is a mutable reference to the underlying list. | |
| ::: | |
| :::{function} set_default(v: int) | |
| ::: | |
| :::{function} set_doc(v: str) | |
| ::: | |
| :::{function} set_mandatory(v: bool) | |
| ::: | |
| """ | |
| def _Int_new(**kwargs): | |
| """Creates a builder for `attr.int`. | |
| Args: | |
| **kwargs: Same kwargs as {obj}`attr.int` | |
| Returns: | |
| {type}`Int` | |
| """ | |
| kwargs_set_default_ignore_none(kwargs, _DEFAULT, 0) | |
| kwargs_set_default_doc(kwargs) | |
| kwargs_set_default_mandatory(kwargs) | |
| kwargs_set_default_list(kwargs, _VALUES) | |
| # buildifier: disable=uninitialized | |
| self = struct( | |
| build = lambda: attr.int(**self.kwargs), | |
| default = kwargs_getter(kwargs, _DEFAULT), | |
| doc = kwargs_getter_doc(kwargs), | |
| kwargs = kwargs, | |
| mandatory = kwargs_getter_mandatory(kwargs), | |
| values = kwargs_getter(kwargs, _VALUES), | |
| set_default = kwargs_setter(kwargs, _DEFAULT), | |
| set_doc = kwargs_setter_doc(kwargs), | |
| set_mandatory = kwargs_setter_mandatory(kwargs), | |
| ) | |
| return self | |
| # buildifier: disable=name-conventions | |
| Int = struct( | |
| TYPEDEF = _Int_typedef, | |
| new = _Int_new, | |
| ) | |
| def _IntList_typedef(): | |
| """Builder for attr.int_list. | |
| :::{function} allow_empty() -> bool | |
| ::: | |
| :::{function} build() -> attr.int_list | |
| ::: | |
| :::{function} default() -> list[int] | |
| ::: | |
| :::{function} doc() -> str | |
| ::: | |
| :::{include} /_includes/field_kwargs_doc.md | |
| ::: | |
| :::{function} mandatory() -> bool | |
| ::: | |
| :::{function} set_allow_empty(v: bool) | |
| ::: | |
| :::{function} set_doc(v: str) | |
| ::: | |
| :::{function} set_mandatory(v: bool) | |
| ::: | |
| """ | |
| def _IntList_new(**kwargs): | |
| """Creates a builder for `attr.int_list`. | |
| Args: | |
| **kwargs: Same as {obj}`attr.int_list`. | |
| Returns: | |
| {type}`IntList` | |
| """ | |
| kwargs_set_default_list(kwargs, _DEFAULT) | |
| kwargs_set_default_doc(kwargs) | |
| kwargs_set_default_mandatory(kwargs) | |
| _kwargs_set_default_allow_empty(kwargs) | |
| # buildifier: disable=uninitialized | |
| self = struct( | |
| # keep sorted | |
| allow_empty = _kwargs_getter_allow_empty(kwargs), | |
| build = lambda: attr.int_list(**self.kwargs), | |
| default = kwargs_getter(kwargs, _DEFAULT), | |
| doc = kwargs_getter_doc(kwargs), | |
| kwargs = kwargs, | |
| mandatory = kwargs_getter_mandatory(kwargs), | |
| set_allow_empty = _kwargs_setter_allow_empty(kwargs), | |
| set_doc = kwargs_setter_doc(kwargs), | |
| set_mandatory = kwargs_setter_mandatory(kwargs), | |
| ) | |
| return self | |
| # buildifier: disable=name-conventions | |
| IntList = struct( | |
| TYPEDEF = _IntList_typedef, | |
| new = _IntList_new, | |
| ) | |
| def _Label_typedef(): | |
| """Builder for `attr.label` objects. | |
| :::{function} allow_files() -> bool | list[str] | None | |
| Note that `allow_files` is mutually exclusive with `allow_single_file`. | |
| Only one of the two can have a value set. | |
| ::: | |
| :::{function} allow_single_file() -> bool | None | |
| Note that `allow_single_file` is mutually exclusive with `allow_files`. | |
| Only one of the two can have a value set. | |
| ::: | |
| :::{function} aspects() -> list[aspect] | |
| The returned list is a mutable reference to the underlying list. | |
| ::: | |
| :::{function} build() -> attr.label | |
| ::: | |
| :::{field} cfg | |
| :type: AttrCfg | |
| ::: | |
| :::{function} default() -> str | label | configuration_field | None | |
| ::: | |
| :::{function} doc() -> str | |
| ::: | |
| :::{function} executable() -> bool | |
| ::: | |
| :::{include} /_includes/field_kwargs_doc.md | |
| ::: | |
| :::{function} mandatory() -> bool | |
| ::: | |
| :::{function} providers() -> list[list[provider]] | |
| The returned list is a mutable reference to the underlying list. | |
| ::: | |
| :::{function} set_default(v: str | Label) | |
| ::: | |
| :::{function} set_doc(v: str) | |
| ::: | |
| :::{function} set_executable(v: bool) | |
| ::: | |
| :::{function} set_mandatory(v: bool) | |
| ::: | |
| """ | |
| def _Label_new(**kwargs): | |
| """Creates a builder for `attr.label`. | |
| Args: | |
| **kwargs: The same as {obj}`attr.label`. | |
| Returns: | |
| {type}`Label` | |
| """ | |
| kwargs_set_default_ignore_none(kwargs, "executable", False) | |
| _kwargs_set_default_aspects(kwargs) | |
| _kwargs_set_default_providers(kwargs) | |
| kwargs_set_default_doc(kwargs) | |
| kwargs_set_default_mandatory(kwargs) | |
| kwargs[_DEFAULT] = to_label_maybe(kwargs.get(_DEFAULT)) | |
| # buildifier: disable=uninitialized | |
| self = struct( | |
| # keep sorted | |
| add_allow_files = lambda v: _Label_add_allow_files(self, v), | |
| allow_files = _kwargs_getter_allow_files(kwargs), | |
| allow_single_file = kwargs_getter(kwargs, _ALLOW_SINGLE_FILE), | |
| aspects = _kwargs_getter_aspects(kwargs), | |
| build = lambda: _common_label_build(self, attr.label), | |
| cfg = _AttrCfg_from_attr_kwargs_pop(kwargs), | |
| default = kwargs_getter(kwargs, _DEFAULT), | |
| doc = kwargs_getter_doc(kwargs), | |
| executable = kwargs_getter(kwargs, "executable"), | |
| kwargs = kwargs, | |
| mandatory = kwargs_getter_mandatory(kwargs), | |
| providers = _kwargs_getter_providers(kwargs), | |
| set_allow_files = lambda v: _Label_set_allow_files(self, v), | |
| set_allow_single_file = lambda v: _Label_set_allow_single_file(self, v), | |
| set_default = kwargs_setter(kwargs, _DEFAULT), | |
| set_doc = kwargs_setter_doc(kwargs), | |
| set_executable = kwargs_setter(kwargs, "executable"), | |
| set_mandatory = kwargs_setter_mandatory(kwargs), | |
| ) | |
| return self | |
| def _Label_set_allow_files(self, v): | |
| """Set the allow_files arg | |
| NOTE: Setting `allow_files` unsets `allow_single_file` | |
| Args: | |
| self: implicitly added. | |
| v: {type}`bool | list[str] | None` the value to set to. | |
| If set to `None`, then `allow_files` is unset. | |
| """ | |
| if v == None: | |
| self.kwargs.pop(_ALLOW_FILES, None) | |
| else: | |
| self.kwargs[_ALLOW_FILES] = v | |
| self.kwargs.pop(_ALLOW_SINGLE_FILE, None) | |
| def _Label_add_allow_files(self, *values): | |
| """Adds allowed file extensions | |
| NOTE: Add an allowed file extension unsets `allow_single_file` | |
| Args: | |
| self: implicitly added. | |
| *values: {type}`str` file extensions to allow (including dot) | |
| """ | |
| self.kwargs.pop(_ALLOW_SINGLE_FILE, None) | |
| if not types.is_list(self.kwargs.get(_ALLOW_FILES)): | |
| self.kwargs[_ALLOW_FILES] = [] | |
| existing = self.kwargs[_ALLOW_FILES] | |
| existing.extend([v for v in values if v not in existing]) | |
| def _Label_set_allow_single_file(self, v): | |
| """Sets the allow_single_file arg. | |
| NOTE: Setting `allow_single_file` unsets `allow_file` | |
| Args: | |
| self: implicitly added. | |
| v: {type}`bool | None` the value to set to. | |
| If set to `None`, then `allow_single_file` is unset. | |
| """ | |
| if v == None: | |
| self.kwargs.pop(_ALLOW_SINGLE_FILE, None) | |
| else: | |
| self.kwargs[_ALLOW_SINGLE_FILE] = v | |
| self.kwargs.pop(_ALLOW_FILES, None) | |
| # buildifier: disable=name-conventions | |
| Label = struct( | |
| TYPEDEF = _Label_typedef, | |
| new = _Label_new, | |
| set_allow_files = _Label_set_allow_files, | |
| add_allow_files = _Label_add_allow_files, | |
| set_allow_single_file = _Label_set_allow_single_file, | |
| ) | |
| def _LabelKeyedStringDict_typedef(): | |
| """Builder for attr.label_keyed_string_dict. | |
| :::{function} aspects() -> list[aspect] | |
| The returned list is a mutable reference to the underlying list. | |
| ::: | |
| :::{function} allow_files() -> bool | list[str] | |
| ::: | |
| :::{function} allow_empty() -> bool | |
| ::: | |
| :::{field} cfg | |
| :type: AttrCfg | |
| ::: | |
| :::{function} default() -> dict[str | Label, str] | callable | |
| ::: | |
| :::{function} doc() -> str | |
| ::: | |
| :::{include} /_includes/field_kwargs_doc.md | |
| ::: | |
| :::{function} mandatory() -> bool | |
| ::: | |
| :::{function} providers() -> list[provider | list[provider]] | |
| Returns a mutable reference to the underlying list. | |
| ::: | |
| :::{function} set_mandatory(v: bool) | |
| ::: | |
| :::{function} set_allow_empty(v: bool) | |
| ::: | |
| :::{function} set_default(v: dict[str | Label, str] | callable) | |
| ::: | |
| :::{function} set_doc(v: str) | |
| ::: | |
| :::{function} set_allow_files(v: bool | list[str]) | |
| ::: | |
| """ | |
| def _LabelKeyedStringDict_new(**kwargs): | |
| """Creates a builder for `attr.label_keyed_string_dict`. | |
| Args: | |
| **kwargs: Same as {obj}`attr.label_keyed_string_dict`. | |
| Returns: | |
| {type}`LabelKeyedStringDict` | |
| """ | |
| kwargs_set_default_ignore_none(kwargs, _DEFAULT, {}) | |
| _kwargs_set_default_aspects(kwargs) | |
| _kwargs_set_default_providers(kwargs) | |
| _kwargs_set_default_allow_empty(kwargs) | |
| _kwargs_set_default_allow_files(kwargs) | |
| kwargs_set_default_doc(kwargs) | |
| kwargs_set_default_mandatory(kwargs) | |
| # buildifier: disable=uninitialized | |
| self = struct( | |
| # keep sorted | |
| add_allow_files = lambda *v: _LabelKeyedStringDict_add_allow_files(self, *v), | |
| allow_empty = _kwargs_getter_allow_empty(kwargs), | |
| allow_files = _kwargs_getter_allow_files(kwargs), | |
| aspects = _kwargs_getter_aspects(kwargs), | |
| build = lambda: _common_label_build(self, attr.label_keyed_string_dict), | |
| cfg = _AttrCfg_from_attr_kwargs_pop(kwargs), | |
| default = kwargs_getter(kwargs, _DEFAULT), | |
| doc = kwargs_getter_doc(kwargs), | |
| kwargs = kwargs, | |
| mandatory = kwargs_getter_mandatory(kwargs), | |
| providers = _kwargs_getter_providers(kwargs), | |
| set_allow_empty = _kwargs_setter_allow_empty(kwargs), | |
| set_allow_files = _kwargs_setter_allow_files(kwargs), | |
| set_default = kwargs_setter(kwargs, _DEFAULT), | |
| set_doc = kwargs_setter_doc(kwargs), | |
| set_mandatory = kwargs_setter_mandatory(kwargs), | |
| ) | |
| return self | |
| def _LabelKeyedStringDict_add_allow_files(self, *values): | |
| """Adds allowed file extensions | |
| Args: | |
| self: implicitly added. | |
| *values: {type}`str` file extensions to allow (including dot) | |
| """ | |
| if not types.is_list(self.kwargs.get(_ALLOW_FILES)): | |
| self.kwargs[_ALLOW_FILES] = [] | |
| existing = self.kwargs[_ALLOW_FILES] | |
| existing.extend([v for v in values if v not in existing]) | |
| # buildifier: disable=name-conventions | |
| LabelKeyedStringDict = struct( | |
| TYPEDEF = _LabelKeyedStringDict_typedef, | |
| new = _LabelKeyedStringDict_new, | |
| add_allow_files = _LabelKeyedStringDict_add_allow_files, | |
| ) | |
| def _LabelList_typedef(): | |
| """Builder for `attr.label_list` | |
| :::{function} aspects() -> list[aspect] | |
| ::: | |
| :::{function} allow_files() -> bool | list[str] | |
| ::: | |
| :::{function} allow_empty() -> bool | |
| ::: | |
| :::{function} build() -> attr.label_list | |
| ::: | |
| :::{field} cfg | |
| :type: AttrCfg | |
| ::: | |
| :::{function} default() -> list[str|Label] | configuration_field | callable | |
| ::: | |
| :::{function} doc() -> str | |
| ::: | |
| :::{include} /_includes/field_kwargs_doc.md | |
| ::: | |
| :::{function} mandatory() -> bool | |
| ::: | |
| :::{function} providers() -> list[provider | list[provider]] | |
| ::: | |
| :::{function} set_allow_empty(v: bool) | |
| ::: | |
| :::{function} set_allow_files(v: bool | list[str]) | |
| ::: | |
| :::{function} set_default(v: list[str|Label] | configuration_field | callable) | |
| ::: | |
| :::{function} set_doc(v: str) | |
| ::: | |
| :::{function} set_mandatory(v: bool) | |
| ::: | |
| """ | |
| def _LabelList_new(**kwargs): | |
| """Creates a builder for `attr.label_list`. | |
| Args: | |
| **kwargs: Same as {obj}`attr.label_list`. | |
| Returns: | |
| {type}`LabelList` | |
| """ | |
| _kwargs_set_default_allow_empty(kwargs) | |
| kwargs_set_default_mandatory(kwargs) | |
| kwargs_set_default_doc(kwargs) | |
| if kwargs.get(_ALLOW_FILES) == None: | |
| kwargs[_ALLOW_FILES] = False | |
| _kwargs_set_default_aspects(kwargs) | |
| kwargs_set_default_list(kwargs, _DEFAULT) | |
| _kwargs_set_default_providers(kwargs) | |
| # buildifier: disable=uninitialized | |
| self = struct( | |
| # keep sorted | |
| allow_empty = _kwargs_getter_allow_empty(kwargs), | |
| allow_files = _kwargs_getter_allow_files(kwargs), | |
| aspects = _kwargs_getter_aspects(kwargs), | |
| build = lambda: _common_label_build(self, attr.label_list), | |
| cfg = _AttrCfg_from_attr_kwargs_pop(kwargs), | |
| default = kwargs_getter(kwargs, _DEFAULT), | |
| doc = kwargs_getter_doc(kwargs), | |
| kwargs = kwargs, | |
| mandatory = kwargs_getter_mandatory(kwargs), | |
| providers = _kwargs_getter_providers(kwargs), | |
| set_allow_empty = _kwargs_setter_allow_empty(kwargs), | |
| set_allow_files = _kwargs_setter_allow_files(kwargs), | |
| set_default = kwargs_setter(kwargs, _DEFAULT), | |
| set_doc = kwargs_setter_doc(kwargs), | |
| set_mandatory = kwargs_setter_mandatory(kwargs), | |
| ) | |
| return self | |
| # buildifier: disable=name-conventions | |
| LabelList = struct( | |
| TYPEDEF = _LabelList_typedef, | |
| new = _LabelList_new, | |
| ) | |
| def _Output_typedef(): | |
| """Builder for attr.output | |
| :::{function} build() -> attr.output | |
| ::: | |
| :::{function} doc() -> str | |
| ::: | |
| :::{include} /_includes/field_kwargs_doc.md | |
| ::: | |
| :::{function} mandatory() -> bool | |
| ::: | |
| :::{function} set_doc(v: str) | |
| ::: | |
| :::{function} set_mandatory(v: bool) | |
| ::: | |
| """ | |
| def _Output_new(**kwargs): | |
| """Creates a builder for `attr.output`. | |
| Args: | |
| **kwargs: Same as {obj}`attr.output`. | |
| Returns: | |
| {type}`Output` | |
| """ | |
| kwargs_set_default_doc(kwargs) | |
| kwargs_set_default_mandatory(kwargs) | |
| # buildifier: disable=uninitialized | |
| self = struct( | |
| # keep sorted | |
| build = lambda: attr.output(**self.kwargs), | |
| doc = kwargs_getter_doc(kwargs), | |
| kwargs = kwargs, | |
| mandatory = kwargs_getter_mandatory(kwargs), | |
| set_doc = kwargs_setter_doc(kwargs), | |
| set_mandatory = kwargs_setter_mandatory(kwargs), | |
| ) | |
| return self | |
| # buildifier: disable=name-conventions | |
| Output = struct( | |
| TYPEDEF = _Output_typedef, | |
| new = _Output_new, | |
| ) | |
| def _OutputList_typedef(): | |
| """Builder for attr.output_list | |
| :::{function} allow_empty() -> bool | |
| ::: | |
| :::{function} build() -> attr.output | |
| ::: | |
| :::{function} doc() -> str | |
| ::: | |
| :::{include} /_includes/field_kwargs_doc.md | |
| ::: | |
| :::{function} mandatory() -> bool | |
| ::: | |
| :::{function} set_allow_empty(v: bool) | |
| ::: | |
| :::{function} set_doc(v: str) | |
| ::: | |
| :::{function} set_mandatory(v: bool) | |
| ::: | |
| """ | |
| def _OutputList_new(**kwargs): | |
| """Creates a builder for `attr.output_list`. | |
| Args: | |
| **kwargs: Same as {obj}`attr.output_list`. | |
| Returns: | |
| {type}`OutputList` | |
| """ | |
| kwargs_set_default_doc(kwargs) | |
| kwargs_set_default_mandatory(kwargs) | |
| _kwargs_set_default_allow_empty(kwargs) | |
| # buildifier: disable=uninitialized | |
| self = struct( | |
| allow_empty = _kwargs_getter_allow_empty(kwargs), | |
| build = lambda: attr.output_list(**self.kwargs), | |
| doc = kwargs_getter_doc(kwargs), | |
| kwargs = kwargs, | |
| mandatory = kwargs_getter_mandatory(kwargs), | |
| set_allow_empty = _kwargs_setter_allow_empty(kwargs), | |
| set_doc = kwargs_setter_doc(kwargs), | |
| set_mandatory = kwargs_setter_mandatory(kwargs), | |
| ) | |
| return self | |
| # buildifier: disable=name-conventions | |
| OutputList = struct( | |
| TYPEDEF = _OutputList_typedef, | |
| new = _OutputList_new, | |
| ) | |
| def _String_typedef(): | |
| """Builder for `attr.string` | |
| :::{function} build() -> attr.string | |
| ::: | |
| :::{function} default() -> str | configuration_field | |
| ::: | |
| :::{function} doc() -> str | |
| ::: | |
| :::{include} /_includes/field_kwargs_doc.md | |
| ::: | |
| :::{function} mandatory() -> bool | |
| ::: | |
| :::{function} values() -> list[str] | |
| ::: | |
| :::{function} set_default(v: str | configuration_field) | |
| ::: | |
| :::{function} set_doc(v: str) | |
| ::: | |
| :::{function} set_mandatory(v: bool) | |
| ::: | |
| """ | |
| def _String_new(**kwargs): | |
| """Creates a builder for `attr.string`. | |
| Args: | |
| **kwargs: Same as {obj}`attr.string`. | |
| Returns: | |
| {type}`String` | |
| """ | |
| kwargs_set_default_ignore_none(kwargs, _DEFAULT, "") | |
| kwargs_set_default_list(kwargs, _VALUES) | |
| kwargs_set_default_doc(kwargs) | |
| kwargs_set_default_mandatory(kwargs) | |
| # buildifier: disable=uninitialized | |
| self = struct( | |
| default = kwargs_getter(kwargs, _DEFAULT), | |
| doc = kwargs_getter_doc(kwargs), | |
| mandatory = kwargs_getter_mandatory(kwargs), | |
| build = lambda: attr.string(**self.kwargs), | |
| kwargs = kwargs, | |
| values = kwargs_getter(kwargs, _VALUES), | |
| set_default = kwargs_setter(kwargs, _DEFAULT), | |
| set_doc = kwargs_setter_doc(kwargs), | |
| set_mandatory = kwargs_setter_mandatory(kwargs), | |
| ) | |
| return self | |
| # buildifier: disable=name-conventions | |
| String = struct( | |
| TYPEDEF = _String_typedef, | |
| new = _String_new, | |
| ) | |
| def _StringDict_typedef(): | |
| """Builder for `attr.string_dict` | |
| :::{function} default() -> dict[str, str] | |
| ::: | |
| :::{function} doc() -> str | |
| ::: | |
| :::{function} mandatory() -> bool | |
| ::: | |
| :::{function} allow_empty() -> bool | |
| ::: | |
| :::{function} build() -> attr.string_dict | |
| ::: | |
| :::{include} /_includes/field_kwargs_doc.md | |
| ::: | |
| :::{function} set_doc(v: str) | |
| ::: | |
| :::{function} set_mandatory(v: bool) | |
| ::: | |
| :::{function} set_allow_empty(v: bool) | |
| ::: | |
| """ | |
| def _StringDict_new(**kwargs): | |
| """Creates a builder for `attr.string_dict`. | |
| Args: | |
| **kwargs: The same args as for `attr.string_dict`. | |
| Returns: | |
| {type}`StringDict` | |
| """ | |
| kwargs_set_default_ignore_none(kwargs, _DEFAULT, {}) | |
| kwargs_set_default_doc(kwargs) | |
| kwargs_set_default_mandatory(kwargs) | |
| _kwargs_set_default_allow_empty(kwargs) | |
| # buildifier: disable=uninitialized | |
| self = struct( | |
| allow_empty = _kwargs_getter_allow_empty(kwargs), | |
| build = lambda: attr.string_dict(**self.kwargs), | |
| default = kwargs_getter(kwargs, _DEFAULT), | |
| doc = kwargs_getter_doc(kwargs), | |
| kwargs = kwargs, | |
| mandatory = kwargs_getter_mandatory(kwargs), | |
| set_allow_empty = _kwargs_setter_allow_empty(kwargs), | |
| set_doc = kwargs_setter_doc(kwargs), | |
| set_mandatory = kwargs_setter_mandatory(kwargs), | |
| ) | |
| return self | |
| # buildifier: disable=name-conventions | |
| StringDict = struct( | |
| TYPEDEF = _StringDict_typedef, | |
| new = _StringDict_new, | |
| ) | |
| def _StringKeyedLabelDict_typedef(): | |
| """Builder for attr.string_keyed_label_dict. | |
| :::{function} allow_empty() -> bool | |
| ::: | |
| :::{function} allow_files() -> bool | list[str] | |
| ::: | |
| :::{function} aspects() -> list[aspect] | |
| ::: | |
| :::{function} build() -> attr.string_list | |
| ::: | |
| :::{field} cfg | |
| :type: AttrCfg | |
| ::: | |
| :::{function} default() -> dict[str, Label] | callable | |
| ::: | |
| :::{function} doc() -> str | |
| ::: | |
| :::{function} mandatory() -> bool | |
| ::: | |
| :::{function} providers() -> list[list[provider]] | |
| ::: | |
| :::{include} /_includes/field_kwargs_doc.md | |
| ::: | |
| :::{function} set_allow_empty(v: bool) | |
| ::: | |
| :::{function} set_allow_files(v: bool | list[str]) | |
| ::: | |
| :::{function} set_doc(v: str) | |
| ::: | |
| :::{function} set_default(v: dict[str, Label] | callable) | |
| ::: | |
| :::{function} set_mandatory(v: bool) | |
| ::: | |
| """ | |
| def _StringKeyedLabelDict_new(**kwargs): | |
| """Creates a builder for `attr.string_keyed_label_dict`. | |
| Args: | |
| **kwargs: Same as {obj}`attr.string_keyed_label_dict`. | |
| Returns: | |
| {type}`StringKeyedLabelDict` | |
| """ | |
| kwargs_set_default_ignore_none(kwargs, _DEFAULT, {}) | |
| kwargs_set_default_doc(kwargs) | |
| kwargs_set_default_mandatory(kwargs) | |
| _kwargs_set_default_allow_files(kwargs) | |
| _kwargs_set_default_allow_empty(kwargs) | |
| _kwargs_set_default_aspects(kwargs) | |
| _kwargs_set_default_providers(kwargs) | |
| # buildifier: disable=uninitialized | |
| self = struct( | |
| allow_empty = _kwargs_getter_allow_empty(kwargs), | |
| allow_files = _kwargs_getter_allow_files(kwargs), | |
| build = lambda: _common_label_build(self, attr.string_keyed_label_dict), | |
| cfg = _AttrCfg_from_attr_kwargs_pop(kwargs), | |
| default = kwargs_getter(kwargs, _DEFAULT), | |
| doc = kwargs_getter_doc(kwargs), | |
| kwargs = kwargs, | |
| mandatory = kwargs_getter_mandatory(kwargs), | |
| set_allow_empty = _kwargs_setter_allow_empty(kwargs), | |
| set_allow_files = _kwargs_setter_allow_files(kwargs), | |
| set_default = kwargs_setter(kwargs, _DEFAULT), | |
| set_doc = kwargs_setter_doc(kwargs), | |
| set_mandatory = kwargs_setter_mandatory(kwargs), | |
| providers = _kwargs_getter_providers(kwargs), | |
| aspects = _kwargs_getter_aspects(kwargs), | |
| ) | |
| return self | |
| # buildifier: disable=name-conventions | |
| StringKeyedLabelDict = struct( | |
| TYPEDEF = _StringKeyedLabelDict_typedef, | |
| new = _StringKeyedLabelDict_new, | |
| ) | |
| def _StringList_typedef(): | |
| """Builder for `attr.string_list` | |
| :::{function} allow_empty() -> bool | |
| ::: | |
| :::{function} build() -> attr.string_list | |
| ::: | |
| :::{field} default | |
| :type: list[str] | configuration_field | |
| ::: | |
| :::{function} doc() -> str | |
| ::: | |
| :::{function} mandatory() -> bool | |
| ::: | |
| :::{include} /_includes/field_kwargs_doc.md | |
| ::: | |
| :::{function} set_allow_empty(v: bool) | |
| ::: | |
| :::{function} set_default(v: list[str] | configuration_field) | |
| ::: | |
| :::{function} set_doc(v: str) | |
| ::: | |
| :::{function} set_mandatory(v: bool) | |
| ::: | |
| """ | |
| def _StringList_new(**kwargs): | |
| """Creates a builder for `attr.string_list`. | |
| Args: | |
| **kwargs: Same as {obj}`attr.string_list`. | |
| Returns: | |
| {type}`StringList` | |
| """ | |
| kwargs_set_default_ignore_none(kwargs, _DEFAULT, []) | |
| kwargs_set_default_doc(kwargs) | |
| kwargs_set_default_mandatory(kwargs) | |
| _kwargs_set_default_allow_empty(kwargs) | |
| # buildifier: disable=uninitialized | |
| self = struct( | |
| allow_empty = _kwargs_getter_allow_empty(kwargs), | |
| build = lambda: attr.string_list(**self.kwargs), | |
| default = kwargs_getter(kwargs, _DEFAULT), | |
| doc = kwargs_getter_doc(kwargs), | |
| kwargs = kwargs, | |
| mandatory = kwargs_getter_mandatory(kwargs), | |
| set_allow_empty = _kwargs_setter_allow_empty(kwargs), | |
| set_default = kwargs_setter(kwargs, _DEFAULT), | |
| set_doc = kwargs_setter_doc(kwargs), | |
| set_mandatory = kwargs_setter_mandatory(kwargs), | |
| ) | |
| return self | |
| # buildifier: disable=name-conventions | |
| StringList = struct( | |
| TYPEDEF = _StringList_typedef, | |
| new = _StringList_new, | |
| ) | |
| def _StringListDict_typedef(): | |
| """Builder for attr.string_list_dict. | |
| :::{function} allow_empty() -> bool | |
| ::: | |
| :::{function} build() -> attr.string_list | |
| ::: | |
| :::{function} default() -> dict[str, list[str]] | |
| ::: | |
| :::{function} doc() -> str | |
| ::: | |
| :::{function} mandatory() -> bool | |
| ::: | |
| :::{include} /_includes/field_kwargs_doc.md | |
| ::: | |
| :::{function} set_allow_empty(v: bool) | |
| ::: | |
| :::{function} set_doc(v: str) | |
| ::: | |
| :::{function} set_mandatory(v: bool) | |
| ::: | |
| """ | |
| def _StringListDict_new(**kwargs): | |
| """Creates a builder for `attr.string_list_dict`. | |
| Args: | |
| **kwargs: Same as {obj}`attr.string_list_dict`. | |
| Returns: | |
| {type}`StringListDict` | |
| """ | |
| kwargs_set_default_ignore_none(kwargs, _DEFAULT, {}) | |
| kwargs_set_default_doc(kwargs) | |
| kwargs_set_default_mandatory(kwargs) | |
| _kwargs_set_default_allow_empty(kwargs) | |
| # buildifier: disable=uninitialized | |
| self = struct( | |
| allow_empty = _kwargs_getter_allow_empty(kwargs), | |
| build = lambda: attr.string_list_dict(**self.kwargs), | |
| default = kwargs_getter(kwargs, _DEFAULT), | |
| doc = kwargs_getter_doc(kwargs), | |
| kwargs = kwargs, | |
| mandatory = kwargs_getter_mandatory(kwargs), | |
| set_allow_empty = _kwargs_setter_allow_empty(kwargs), | |
| set_default = kwargs_setter(kwargs, _DEFAULT), | |
| set_doc = kwargs_setter_doc(kwargs), | |
| set_mandatory = kwargs_setter_mandatory(kwargs), | |
| ) | |
| return self | |
| # buildifier: disable=name-conventions | |
| StringListDict = struct( | |
| TYPEDEF = _StringListDict_typedef, | |
| new = _StringListDict_new, | |
| ) | |
| attrb = struct( | |
| # keep sorted | |
| Bool = _Bool_new, | |
| Int = _Int_new, | |
| IntList = _IntList_new, | |
| Label = _Label_new, | |
| LabelKeyedStringDict = _LabelKeyedStringDict_new, | |
| LabelList = _LabelList_new, | |
| Output = _Output_new, | |
| OutputList = _OutputList_new, | |
| String = _String_new, | |
| StringDict = _StringDict_new, | |
| StringKeyedLabelDict = _StringKeyedLabelDict_new, | |
| StringList = _StringList_new, | |
| StringListDict = _StringListDict_new, | |
| WhichCfg = _WhichCfg, | |
| ) |