1 """Support for Azure DevOps sensors."""
3 from __future__
import annotations
5 from collections.abc
import Callable, Mapping
6 from dataclasses
import dataclass
7 from datetime
import datetime
11 from aioazuredevops.helper
import WorkItemState, WorkItemTypeAndState
12 from aioazuredevops.models.build
import Build
17 SensorEntityDescription,
24 from .
import AzureDevOpsConfigEntry
25 from .coordinator
import AzureDevOpsDataUpdateCoordinator
26 from .entity
import AzureDevOpsEntity
28 _LOGGER = logging.getLogger(__name__)
31 @dataclass(frozen=True, kw_only=True)
33 """Class describing Azure DevOps build sensor entities."""
35 attr_fn: Callable[[Build], dict[str, Any] |
None] =
lambda _:
None
36 value_fn: Callable[[Build], datetime | StateType]
39 @dataclass(frozen=True, kw_only=True)
41 """Class describing Azure DevOps work item sensor entities."""
43 value_fn: Callable[[WorkItemState], datetime | StateType]
46 BASE_BUILD_SENSOR_DESCRIPTIONS: tuple[AzureDevOpsBuildSensorEntityDescription, ...] = (
50 translation_key=
"latest_build",
51 attr_fn=
lambda build: {
52 "definition_id": (build.definition.build_id
if build.definition
else None),
53 "definition_name": (build.definition.name
if build.definition
else None),
55 "reason": build.reason,
56 "result": build.result,
57 "source_branch": build.source_branch,
58 "source_version": build.source_version,
59 "status": build.status,
60 "url": build.links.web
if build.links
else None,
61 "queue_time": build.queue_time,
62 "start_time": build.start_time,
63 "finish_time": build.finish_time,
65 value_fn=
lambda build: build.build_number,
69 translation_key=
"build_id",
70 entity_registry_visible_default=
False,
71 value_fn=
lambda build: build.build_id,
75 translation_key=
"reason",
76 entity_registry_visible_default=
False,
77 value_fn=
lambda build: build.reason,
81 translation_key=
"result",
82 entity_registry_visible_default=
False,
83 value_fn=
lambda build: build.result,
87 translation_key=
"source_branch",
88 entity_registry_enabled_default=
False,
89 entity_registry_visible_default=
False,
90 value_fn=
lambda build: build.source_branch,
94 translation_key=
"source_version",
95 entity_registry_visible_default=
False,
96 value_fn=
lambda build: build.source_version,
100 translation_key=
"queue_time",
101 device_class=SensorDeviceClass.TIMESTAMP,
102 entity_registry_enabled_default=
False,
103 entity_registry_visible_default=
False,
108 translation_key=
"start_time",
109 device_class=SensorDeviceClass.TIMESTAMP,
110 entity_registry_visible_default=
False,
115 translation_key=
"finish_time",
116 device_class=SensorDeviceClass.TIMESTAMP,
117 entity_registry_visible_default=
False,
122 translation_key=
"url",
123 value_fn=
lambda build: build.links.web
if build.links
else None,
127 BASE_WORK_ITEM_SENSOR_DESCRIPTIONS: tuple[
128 AzureDevOpsWorkItemSensorEntityDescription, ...
131 key=
"work_item_count",
132 translation_key=
"work_item_count",
133 value_fn=
lambda work_item_state: len(work_item_state.work_items),
139 """Parse datetime string."""
143 return dt_util.parse_datetime(value)
148 entry: AzureDevOpsConfigEntry,
149 async_add_entities: AddEntitiesCallback,
151 """Set up Azure DevOps sensor based on a config entry."""
152 coordinator = entry.runtime_data
153 initial_builds: list[Build] = coordinator.data.builds
155 entities: list[SensorEntity] = [
161 for description
in BASE_BUILD_SENSOR_DESCRIPTIONS
162 for key, build
in enumerate(initial_builds)
163 if build.project
and build.definition
173 for description
in BASE_WORK_ITEM_SENSOR_DESCRIPTIONS
174 for key, work_item_type_state
in enumerate(coordinator.data.work_items)
175 for state_key, _
in enumerate(work_item_type_state.state_items)
182 """Define a Azure DevOps build sensor."""
184 entity_description: AzureDevOpsBuildSensorEntityDescription
188 coordinator: AzureDevOpsDataUpdateCoordinator,
189 description: AzureDevOpsBuildSensorEntityDescription,
197 f
"{coordinator.data.organization}_"
198 f
"{coordinator.data.project.id}_"
199 f
"{self.build.definition.build_id}_"
203 "definition_name": self.
buildbuild.definition.name
208 """Return the build."""
209 return self.coordinator.data.builds[self.
item_keyitem_key]
213 """Return the state."""
218 """Return the state attributes of the entity."""
223 """Define a Azure DevOps work item sensor."""
225 entity_description: AzureDevOpsWorkItemSensorEntityDescription
229 coordinator: AzureDevOpsDataUpdateCoordinator,
230 description: AzureDevOpsWorkItemSensorEntityDescription,
240 f
"{coordinator.data.organization}_"
241 f
"{coordinator.data.project.id}_"
242 f
"{self.work_item_type.name}_"
243 f
"{self.work_item_state.name}_"
253 """Return the work item."""
254 return self.coordinator.data.work_items[self.
wits_keywits_key]
258 """Return the work item state."""
263 """Return the state."""
_attr_translation_placeholders
None __init__(self, AzureDevOpsDataUpdateCoordinator coordinator, AzureDevOpsBuildSensorEntityDescription description, int item_key)
datetime|StateType native_value(self)
Mapping[str, Any]|None extra_state_attributes(self)
WorkItemTypeAndState work_item_type(self)
WorkItemState work_item_state(self)
None __init__(self, AzureDevOpsDataUpdateCoordinator coordinator, AzureDevOpsWorkItemSensorEntityDescription description, int wits_key, int state_key)
datetime|StateType native_value(self)
_attr_translation_placeholders
None async_setup_entry(HomeAssistant hass, AzureDevOpsConfigEntry entry, AddEntitiesCallback async_add_entities)
datetime|None parse_datetime(str|None value)