pytest-homeassistant-custom-component 0.13.297__py3-none-any.whl → 0.13.299__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1539,7 +1539,7 @@ def mock_storage(data: dict[str, Any] | None = None) -> Generator[dict[str, Any]
1539
1539
  return loaded
1540
1540
 
1541
1541
  async def mock_write_data(
1542
- store: storage.Store, path: str, data_to_write: dict[str, Any]
1542
+ store: storage.Store, data_to_write: dict[str, Any]
1543
1543
  ) -> None:
1544
1544
  """Mock version of write data."""
1545
1545
  # To ensure that the data can be serialized
@@ -1616,12 +1616,16 @@ def mock_integration(
1616
1616
  top_level_files: set[str] | None = None,
1617
1617
  ) -> loader.Integration:
1618
1618
  """Mock an integration."""
1619
- integration = loader.Integration(
1620
- hass,
1619
+ path = (
1621
1620
  f"{loader.PACKAGE_BUILTIN}.{module.DOMAIN}"
1622
1621
  if built_in
1623
- else f"{loader.PACKAGE_CUSTOM_COMPONENTS}.{module.DOMAIN}",
1624
- pathlib.Path(""),
1622
+ else f"{loader.PACKAGE_CUSTOM_COMPONENTS}.{module.DOMAIN}"
1623
+ )
1624
+
1625
+ integration = loader.Integration(
1626
+ hass,
1627
+ path,
1628
+ pathlib.Path(path.replace(".", "/")),
1625
1629
  module.mock_manifest(),
1626
1630
  top_level_files,
1627
1631
  )
@@ -3,3 +3,354 @@ The tests for components.
3
3
 
4
4
  This file is originally from homeassistant/core and modified by pytest-homeassistant-custom-component.
5
5
  """
6
+
7
+ from enum import StrEnum
8
+ import itertools
9
+ from typing import TypedDict
10
+
11
+ from homeassistant.const import (
12
+ ATTR_AREA_ID,
13
+ ATTR_DEVICE_ID,
14
+ ATTR_FLOOR_ID,
15
+ ATTR_LABEL_ID,
16
+ CONF_ENTITY_ID,
17
+ CONF_OPTIONS,
18
+ CONF_PLATFORM,
19
+ CONF_TARGET,
20
+ STATE_UNAVAILABLE,
21
+ STATE_UNKNOWN,
22
+ )
23
+ from homeassistant.core import HomeAssistant
24
+ from homeassistant.helpers import (
25
+ area_registry as ar,
26
+ device_registry as dr,
27
+ entity_registry as er,
28
+ floor_registry as fr,
29
+ label_registry as lr,
30
+ )
31
+ from homeassistant.setup import async_setup_component
32
+
33
+ from ..common import MockConfigEntry, mock_device_registry
34
+
35
+
36
+ async def target_entities(
37
+ hass: HomeAssistant, domain: str
38
+ ) -> tuple[list[str], list[str]]:
39
+ """Create multiple entities associated with different targets.
40
+
41
+ Returns a dict with the following keys:
42
+ - included: List of entity_ids meant to be targeted.
43
+ - excluded: List of entity_ids not meant to be targeted.
44
+ """
45
+ await async_setup_component(hass, domain, {})
46
+
47
+ config_entry = MockConfigEntry(domain="test")
48
+ config_entry.add_to_hass(hass)
49
+
50
+ floor_reg = fr.async_get(hass)
51
+ floor = floor_reg.async_get_floor_by_name("Test Floor") or floor_reg.async_create(
52
+ "Test Floor"
53
+ )
54
+
55
+ area_reg = ar.async_get(hass)
56
+ area = area_reg.async_get_area_by_name("Test Area") or area_reg.async_create(
57
+ "Test Area", floor_id=floor.floor_id
58
+ )
59
+
60
+ label_reg = lr.async_get(hass)
61
+ label = label_reg.async_get_label_by_name("Test Label") or label_reg.async_create(
62
+ "Test Label"
63
+ )
64
+
65
+ device = dr.DeviceEntry(id="test_device", area_id=area.id, labels={label.label_id})
66
+ mock_device_registry(hass, {device.id: device})
67
+
68
+ entity_reg = er.async_get(hass)
69
+ # Entities associated with area
70
+ entity_area = entity_reg.async_get_or_create(
71
+ domain=domain,
72
+ platform="test",
73
+ unique_id=f"{domain}_area",
74
+ suggested_object_id=f"area_{domain}",
75
+ )
76
+ entity_reg.async_update_entity(entity_area.entity_id, area_id=area.id)
77
+ entity_area_excluded = entity_reg.async_get_or_create(
78
+ domain=domain,
79
+ platform="test",
80
+ unique_id=f"{domain}_area_excluded",
81
+ suggested_object_id=f"area_{domain}_excluded",
82
+ )
83
+ entity_reg.async_update_entity(entity_area_excluded.entity_id, area_id=area.id)
84
+
85
+ # Entities associated with device
86
+ entity_reg.async_get_or_create(
87
+ domain=domain,
88
+ platform="test",
89
+ unique_id=f"{domain}_device",
90
+ suggested_object_id=f"device_{domain}",
91
+ device_id=device.id,
92
+ )
93
+ entity_reg.async_get_or_create(
94
+ domain=domain,
95
+ platform="test",
96
+ unique_id=f"{domain}_device_excluded",
97
+ suggested_object_id=f"device_{domain}_excluded",
98
+ device_id=device.id,
99
+ )
100
+
101
+ # Entities associated with label
102
+ entity_label = entity_reg.async_get_or_create(
103
+ domain=domain,
104
+ platform="test",
105
+ unique_id=f"{domain}_label",
106
+ suggested_object_id=f"label_{domain}",
107
+ )
108
+ entity_reg.async_update_entity(entity_label.entity_id, labels={label.label_id})
109
+ entity_label_excluded = entity_reg.async_get_or_create(
110
+ domain=domain,
111
+ platform="test",
112
+ unique_id=f"{domain}_label_excluded",
113
+ suggested_object_id=f"label_{domain}_excluded",
114
+ )
115
+ entity_reg.async_update_entity(
116
+ entity_label_excluded.entity_id, labels={label.label_id}
117
+ )
118
+
119
+ # Return all available entities
120
+ return {
121
+ "included": [
122
+ f"{domain}.standalone_{domain}",
123
+ f"{domain}.label_{domain}",
124
+ f"{domain}.area_{domain}",
125
+ f"{domain}.device_{domain}",
126
+ ],
127
+ "excluded": [
128
+ f"{domain}.standalone_{domain}_excluded",
129
+ f"{domain}.label_{domain}_excluded",
130
+ f"{domain}.area_{domain}_excluded",
131
+ f"{domain}.device_{domain}_excluded",
132
+ ],
133
+ }
134
+
135
+
136
+ def parametrize_target_entities(domain: str) -> list[tuple[dict, str, int]]:
137
+ """Parametrize target entities for different target types.
138
+
139
+ Meant to be used with target_entities.
140
+ """
141
+ return [
142
+ (
143
+ {CONF_ENTITY_ID: f"{domain}.standalone_{domain}"},
144
+ f"{domain}.standalone_{domain}",
145
+ 1,
146
+ ),
147
+ ({ATTR_LABEL_ID: "test_label"}, f"{domain}.label_{domain}", 2),
148
+ ({ATTR_AREA_ID: "test_area"}, f"{domain}.area_{domain}", 2),
149
+ ({ATTR_FLOOR_ID: "test_floor"}, f"{domain}.area_{domain}", 2),
150
+ ({ATTR_LABEL_ID: "test_label"}, f"{domain}.device_{domain}", 2),
151
+ ({ATTR_AREA_ID: "test_area"}, f"{domain}.device_{domain}", 2),
152
+ ({ATTR_FLOOR_ID: "test_floor"}, f"{domain}.device_{domain}", 2),
153
+ ({ATTR_DEVICE_ID: "test_device"}, f"{domain}.device_{domain}", 1),
154
+ ]
155
+
156
+
157
+ class _StateDescription(TypedDict):
158
+ """Test state and expected service call count."""
159
+
160
+ state: str | None
161
+ attributes: dict
162
+
163
+
164
+ class StateDescription(TypedDict):
165
+ """Test state and expected service call count."""
166
+
167
+ included: _StateDescription
168
+ excluded: _StateDescription
169
+ count: int
170
+
171
+
172
+ def parametrize_trigger_states(
173
+ *,
174
+ trigger: str,
175
+ target_states: list[str | None | tuple[str | None, dict]],
176
+ other_states: list[str | None | tuple[str | None, dict]],
177
+ additional_attributes: dict | None = None,
178
+ trigger_from_none: bool = True,
179
+ ) -> list[tuple[str, list[StateDescription]]]:
180
+ """Parametrize states and expected service call counts.
181
+
182
+ The target_states and other_states iterables are either iterables of
183
+ states or iterables of (state, attributes) tuples.
184
+
185
+ Set `trigger_from_none` to False if the trigger is not expected to fire
186
+ when the initial state is None.
187
+
188
+ Returns a list of tuples with (trigger, list of states),
189
+ where states is a list of StateDescription dicts.
190
+ """
191
+
192
+ additional_attributes = additional_attributes or {}
193
+
194
+ def state_with_attributes(
195
+ state: str | None | tuple[str | None, dict], count: int
196
+ ) -> dict:
197
+ """Return (state, attributes) dict."""
198
+ if isinstance(state, str) or state is None:
199
+ return {
200
+ "included": {
201
+ "state": state,
202
+ "attributes": additional_attributes,
203
+ },
204
+ "excluded": {
205
+ "state": state,
206
+ "attributes": {},
207
+ },
208
+ "count": count,
209
+ }
210
+ return {
211
+ "included": {
212
+ "state": state[0],
213
+ "attributes": state[1] | additional_attributes,
214
+ },
215
+ "excluded": {
216
+ "state": state[0],
217
+ "attributes": state[1],
218
+ },
219
+ "count": count,
220
+ }
221
+
222
+ return [
223
+ # Initial state None
224
+ (
225
+ trigger,
226
+ list(
227
+ itertools.chain.from_iterable(
228
+ (
229
+ state_with_attributes(None, 0),
230
+ state_with_attributes(target_state, 0),
231
+ state_with_attributes(other_state, 0),
232
+ state_with_attributes(
233
+ target_state, 1 if trigger_from_none else 0
234
+ ),
235
+ )
236
+ for target_state in target_states
237
+ for other_state in other_states
238
+ )
239
+ ),
240
+ ),
241
+ # Initial state different from target state
242
+ (
243
+ trigger,
244
+ # other_state,
245
+ list(
246
+ itertools.chain.from_iterable(
247
+ (
248
+ state_with_attributes(other_state, 0),
249
+ state_with_attributes(target_state, 1),
250
+ state_with_attributes(other_state, 0),
251
+ state_with_attributes(target_state, 1),
252
+ )
253
+ for target_state in target_states
254
+ for other_state in other_states
255
+ )
256
+ ),
257
+ ),
258
+ # Initial state same as target state
259
+ (
260
+ trigger,
261
+ list(
262
+ itertools.chain.from_iterable(
263
+ (
264
+ state_with_attributes(target_state, 0),
265
+ state_with_attributes(target_state, 0),
266
+ state_with_attributes(other_state, 0),
267
+ state_with_attributes(target_state, 1),
268
+ )
269
+ for target_state in target_states
270
+ for other_state in other_states
271
+ )
272
+ ),
273
+ ),
274
+ # Initial state unavailable / unknown
275
+ (
276
+ trigger,
277
+ list(
278
+ itertools.chain.from_iterable(
279
+ (
280
+ state_with_attributes(STATE_UNAVAILABLE, 0),
281
+ state_with_attributes(target_state, 0),
282
+ state_with_attributes(other_state, 0),
283
+ state_with_attributes(target_state, 1),
284
+ )
285
+ for target_state in target_states
286
+ for other_state in other_states
287
+ )
288
+ ),
289
+ ),
290
+ (
291
+ trigger,
292
+ list(
293
+ itertools.chain.from_iterable(
294
+ (
295
+ state_with_attributes(STATE_UNKNOWN, 0),
296
+ state_with_attributes(target_state, 0),
297
+ state_with_attributes(other_state, 0),
298
+ state_with_attributes(target_state, 1),
299
+ )
300
+ for target_state in target_states
301
+ for other_state in other_states
302
+ )
303
+ ),
304
+ ),
305
+ ]
306
+
307
+
308
+ async def arm_trigger(
309
+ hass: HomeAssistant,
310
+ trigger: str,
311
+ trigger_options: dict | None,
312
+ trigger_target: dict,
313
+ ) -> None:
314
+ """Arm the specified trigger, call service test.automation when it triggers."""
315
+
316
+ # Local include to avoid importing the automation component unnecessarily
317
+ from homeassistant.components import automation # noqa: PLC0415
318
+
319
+ options = {CONF_OPTIONS: {**trigger_options}} if trigger_options is not None else {}
320
+
321
+ await async_setup_component(
322
+ hass,
323
+ automation.DOMAIN,
324
+ {
325
+ automation.DOMAIN: {
326
+ "trigger": {
327
+ CONF_PLATFORM: trigger,
328
+ CONF_TARGET: {**trigger_target},
329
+ }
330
+ | options,
331
+ "action": {
332
+ "service": "test.automation",
333
+ "data_template": {CONF_ENTITY_ID: "{{ trigger.entity_id }}"},
334
+ },
335
+ }
336
+ },
337
+ )
338
+
339
+
340
+ def set_or_remove_state(
341
+ hass: HomeAssistant,
342
+ entity_id: str,
343
+ state: StateDescription,
344
+ ) -> None:
345
+ """Set or remove the state of an entity."""
346
+ if state["state"] is None:
347
+ hass.states.async_remove(entity_id)
348
+ else:
349
+ hass.states.async_set(
350
+ entity_id, state["state"], state["attributes"], force_update=True
351
+ )
352
+
353
+
354
+ def other_states(state: StrEnum) -> list[str]:
355
+ """Return a sorted list with all states except the specified one."""
356
+ return sorted({s.value for s in state.__class__} - {state.value})
@@ -5,8 +5,8 @@ This file is originally from homeassistant/core and modified by pytest-homeassis
5
5
  """
6
6
  from typing import TYPE_CHECKING, Final
7
7
  MAJOR_VERSION: Final = 2025
8
- MINOR_VERSION: Final = 11
9
- PATCH_VERSION: Final = "3"
8
+ MINOR_VERSION: Final = 12
9
+ PATCH_VERSION: Final = "1"
10
10
  __short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}"
11
11
  __version__: Final = f"{__short_version__}.{PATCH_VERSION}"
12
12
  CONF_API_VERSION: Final = "api_version"
@@ -2133,3 +2133,14 @@ def _dhcp_service_info_init(self: DhcpServiceInfo, *args: Any, **kwargs: Any) ->
2133
2133
 
2134
2134
 
2135
2135
  DhcpServiceInfo.__init__ = _dhcp_service_info_init
2136
+
2137
+
2138
+ @pytest.fixture(autouse=True)
2139
+ def disable_http_server() -> Generator[None]:
2140
+ """Disable automatic start of HTTP server during .
2141
+
2142
+ This prevents the HTTP server from starting in tests that setup
2143
+ integrations which depend on the HTTP component.
2144
+ """
2145
+ with patch("homeassistant.components.http.start_http_server_and_save_config"):
2146
+ yield
@@ -225,8 +225,8 @@ class AiohttpClientMockResponse:
225
225
 
226
226
  if (
227
227
  self._url.scheme != url.scheme
228
- or self._url.host != url.host
229
- or self._url.path != url.path
228
+ or self._url.raw_host != url.raw_host
229
+ or self._url.raw_path != url.raw_path
230
230
  ):
231
231
  return False
232
232
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytest-homeassistant-custom-component
3
- Version: 0.13.297
3
+ Version: 0.13.299
4
4
  Summary: Experimental package to automatically extract test plugins for Home Assistant custom components
5
5
  Home-page: https://github.com/MatthewFlamm/pytest-homeassistant-custom-component
6
6
  Author: Matthew Flamm
@@ -27,7 +27,7 @@ Requires-Dist: mock-open==1.4.0
27
27
  Requires-Dist: pydantic==2.12.2
28
28
  Requires-Dist: pylint-per-file-ignores==1.4.0
29
29
  Requires-Dist: pipdeptree==2.26.1
30
- Requires-Dist: pytest-asyncio==1.2.0
30
+ Requires-Dist: pytest-asyncio==1.3.0
31
31
  Requires-Dist: pytest-aiohttp==1.1.0
32
32
  Requires-Dist: pytest-cov==7.0.0
33
33
  Requires-Dist: pytest-freezer==0.4.9
@@ -38,12 +38,12 @@ Requires-Dist: pytest-timeout==2.4.0
38
38
  Requires-Dist: pytest-unordered==0.7.0
39
39
  Requires-Dist: pytest-picked==0.5.1
40
40
  Requires-Dist: pytest-xdist==3.8.0
41
- Requires-Dist: pytest==8.4.2
41
+ Requires-Dist: pytest==9.0.0
42
42
  Requires-Dist: requests-mock==1.12.1
43
43
  Requires-Dist: respx==0.22.0
44
44
  Requires-Dist: syrupy==5.0.0
45
45
  Requires-Dist: tqdm==4.67.1
46
- Requires-Dist: homeassistant==2025.11.3
46
+ Requires-Dist: homeassistant==2025.12.1
47
47
  Requires-Dist: SQLAlchemy==2.0.41
48
48
  Requires-Dist: paho-mqtt==2.1.0
49
49
  Requires-Dist: numpy==2.3.2
@@ -61,9 +61,7 @@ Dynamic: summary
61
61
 
62
62
  # pytest-homeassistant-custom-component
63
63
 
64
- ![HA core version](https://img.shields.io/static/v1?label=HA+core+version&message=2025.11.3&labelColor=blue)
65
-
66
- [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/MatthewFlamm/pytest-homeassistant-custom-component)
64
+ ![HA core version](https://img.shields.io/static/v1?label=HA+core+version&message=2025.12.1&labelColor=blue)
67
65
 
68
66
  Package to automatically extract testing plugins from Home Assistant for custom component testing.
69
67
  The goal is to provide the same functionality as the tests in home-assistant/core.
@@ -1,28 +1,28 @@
1
1
  pytest_homeassistant_custom_component/__init__.py,sha256=pUI8j-H-57ncCLnvZSDWZPCtJpvi3ACZqPtH5SbedZA,138
2
2
  pytest_homeassistant_custom_component/asyncio_legacy.py,sha256=UdkV2mKqeS21QX9LSdBYsBRbm2h4JCVVZeesaOLKOAE,3886
3
- pytest_homeassistant_custom_component/common.py,sha256=51NiAKz0WppfuJzZq4d2ljFrXMpWBhvZSwCglw86ahI,65438
4
- pytest_homeassistant_custom_component/const.py,sha256=8fYZ-Hm2EA6wpneZylwic8TWwIYE5kcvum4m3zIdNAw,440
3
+ pytest_homeassistant_custom_component/common.py,sha256=1UprBAnCk8VgxwD2Py893jNr0Fsjn-1Q_vx7pYcjB1M,65480
4
+ pytest_homeassistant_custom_component/const.py,sha256=8G4ANQS43RPIqA-VcLj7WWMgn0S7-BhyyJe-mgdUROs,440
5
5
  pytest_homeassistant_custom_component/ignore_uncaught_exceptions.py,sha256=rilak_dQGMNhDqST1ZzhjZl_qmytFjkcez0vYmLMQ4Q,1601
6
6
  pytest_homeassistant_custom_component/patch_json.py,sha256=hNUeb1yxAr7ONfvX-o_WkI6zhQDCdKl7GglPjkVUiHo,1063
7
7
  pytest_homeassistant_custom_component/patch_recorder.py,sha256=lW8N_3ZIKQ5lsVjRc-ROo7d0egUZcpjquWKqe7iEF94,819
8
8
  pytest_homeassistant_custom_component/patch_time.py,sha256=jdnOAXDxUA0AKqvyeSrRC18rHDGfcpWYuLhmUglebCE,3374
9
- pytest_homeassistant_custom_component/plugins.py,sha256=B5EXdcXOTZLyfL-Wm5yrK7fgJNmwCP5mopYfqNgSEy0,69609
9
+ pytest_homeassistant_custom_component/plugins.py,sha256=ui8WsonovfIEb0eI-UkV6IE80fm63_YUHD9RzD6wj2k,69969
10
10
  pytest_homeassistant_custom_component/syrupy.py,sha256=N_g_90dWqruzUogQi0rJsuN0XRbA6ffJen62r8P9cdo,15588
11
11
  pytest_homeassistant_custom_component/typing.py,sha256=zGhdf6U6aRq5cPwIfRUdtZeApLOyPD2EArjznKoIRZM,1734
12
- pytest_homeassistant_custom_component/components/__init__.py,sha256=0BHCdArl5gPjDJWaZrqvApHvzL_29FbE1RMg_mg__Qs,138
12
+ pytest_homeassistant_custom_component/components/__init__.py,sha256=49s3Tf-mHQQnQPnjuD94LeCnYDypnm6y7Dhfr5lJkCQ,11427
13
13
  pytest_homeassistant_custom_component/components/diagnostics/__init__.py,sha256=O_ys8t0iHvRorFr4TrR9k3sa3Xh5qBb4HsylY775UFA,2431
14
14
  pytest_homeassistant_custom_component/components/recorder/__init__.py,sha256=ugrLzvjSQFSmYRjy88ZZSiyA-NLgKlLkFp0OKguy6a4,225
15
15
  pytest_homeassistant_custom_component/components/recorder/common.py,sha256=8c_oqbQtg7dI-JoOaZrLYKFAjEJvjvSIA1atfui-WpQ,22091
16
16
  pytest_homeassistant_custom_component/components/recorder/db_schema_0.py,sha256=0mez9slhL-I286dDAxq06UDvWRU6RzCA2GKOwtj9JOI,5547
17
17
  pytest_homeassistant_custom_component/test_util/__init__.py,sha256=ljLmNeblq1vEgP0vhf2P1-SuyGSHvLKVA0APSYA0Xl8,1034
18
- pytest_homeassistant_custom_component/test_util/aiohttp.py,sha256=oPQaFRgXcAfHj9dE2Rjl1UJCBfhQp80CnQV02rXMYLo,11520
18
+ pytest_homeassistant_custom_component/test_util/aiohttp.py,sha256=sJHmGf4Oig0SUMvfylBaZIsDTfpTwmYvuLfE--OXYx4,11536
19
19
  pytest_homeassistant_custom_component/testing_config/__init__.py,sha256=SRp6h9HJi2I_vA6cPNkMiR0BTYib5XVmL03H-l3BPL0,158
20
20
  pytest_homeassistant_custom_component/testing_config/custom_components/__init__.py,sha256=-l6KCBLhwEDkCztlY6S-j53CjmKY6-A_3eX5JVS02NY,173
21
21
  pytest_homeassistant_custom_component/testing_config/custom_components/test_constant_deprecation/__init__.py,sha256=2vF_C-VP9tDjZMX7h6iJRAugtH2Bf3b4fE3i9j4vGeY,383
22
- pytest_homeassistant_custom_component-0.13.297.dist-info/licenses/LICENSE,sha256=7h-vqUxyeQNXiQgRJ8350CSHOy55M07DZuv4KG70AS8,1070
23
- pytest_homeassistant_custom_component-0.13.297.dist-info/licenses/LICENSE_HA_CORE.md,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
24
- pytest_homeassistant_custom_component-0.13.297.dist-info/METADATA,sha256=-FrZSAmD3Xr-jPQaWEfE2Ctw6En5NfU_DH1P86wjVXM,5958
25
- pytest_homeassistant_custom_component-0.13.297.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
26
- pytest_homeassistant_custom_component-0.13.297.dist-info/entry_points.txt,sha256=bOCTSuP8RSPg0QfwdfurUShvMGWg4MI2F8rxbWx-VtQ,73
27
- pytest_homeassistant_custom_component-0.13.297.dist-info/top_level.txt,sha256=PR2cize2la22eOO7dQChJWK8dkJnuMmDC-fhafmdOWw,38
28
- pytest_homeassistant_custom_component-0.13.297.dist-info/RECORD,,
22
+ pytest_homeassistant_custom_component-0.13.299.dist-info/licenses/LICENSE,sha256=7h-vqUxyeQNXiQgRJ8350CSHOy55M07DZuv4KG70AS8,1070
23
+ pytest_homeassistant_custom_component-0.13.299.dist-info/licenses/LICENSE_HA_CORE.md,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
24
+ pytest_homeassistant_custom_component-0.13.299.dist-info/METADATA,sha256=es9Va3VlzSC_7CHq9XReJup_au-ie8yXvVnV6Cf8CvU,5802
25
+ pytest_homeassistant_custom_component-0.13.299.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
26
+ pytest_homeassistant_custom_component-0.13.299.dist-info/entry_points.txt,sha256=bOCTSuP8RSPg0QfwdfurUShvMGWg4MI2F8rxbWx-VtQ,73
27
+ pytest_homeassistant_custom_component-0.13.299.dist-info/top_level.txt,sha256=PR2cize2la22eOO7dQChJWK8dkJnuMmDC-fhafmdOWw,38
28
+ pytest_homeassistant_custom_component-0.13.299.dist-info/RECORD,,