blob: ecfc570a2b658eff50248c76a1e3ca1f06318a3f [file] [log] [blame]
# 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,
)