Skip to content

Commit 2a0dc39

Browse files
authored
Cleanup backup model after changes (#47)
* Cleanup backup model after changes * None not allowed for location in upload/download
1 parent 981de7b commit 2a0dc39

File tree

4 files changed

+35
-44
lines changed

4 files changed

+35
-44
lines changed

aiohasupervisor/backups.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ async def upload_backup(
123123
if options:
124124
if options.location:
125125
for location in options.location:
126-
params.add("location", location or "")
126+
params.add("location", location)
127127
if options.filename:
128128
params.add("filename", options.filename.as_posix())
129129

@@ -145,7 +145,7 @@ async def download_backup(
145145
"""Download backup and return stream."""
146146
params = MultiDict()
147147
if options and options.location:
148-
params.add("location", options.location or "")
148+
params.add("location", options.location)
149149

150150
result = await self._client.get(
151151
f"backups/{backup}/download",

aiohasupervisor/models/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,15 @@
2525
SupervisorRole,
2626
)
2727
from aiohasupervisor.models.backups import (
28+
LOCATION_CLOUD_BACKUP,
29+
LOCATION_LOCAL_STORAGE,
2830
AddonSet,
2931
Backup,
3032
BackupAddon,
3133
BackupComplete,
3234
BackupContent,
3335
BackupJob,
36+
BackupLocationAttributes,
3437
BackupsInfo,
3538
BackupsOptions,
3639
BackupType,
@@ -211,12 +214,15 @@
211214
"GreenOptions",
212215
"YellowInfo",
213216
"YellowOptions",
217+
"LOCATION_CLOUD_BACKUP",
218+
"LOCATION_LOCAL_STORAGE",
214219
"AddonSet",
215220
"Backup",
216221
"BackupAddon",
217222
"BackupComplete",
218223
"BackupContent",
219224
"BackupJob",
225+
"BackupLocationAttributes",
220226
"BackupsInfo",
221227
"BackupsOptions",
222228
"BackupType",

aiohasupervisor/models/backups.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66
from enum import StrEnum
77
from pathlib import PurePath
88

9-
from .base import DEFAULT, Options, Request, ResponseData
9+
from .base import Options, Request, ResponseData
10+
11+
LOCATION_LOCAL_STORAGE = ".local"
12+
LOCATION_CLOUD_BACKUP = ".cloud_backup"
1013

1114
# --- ENUMS ----
1215

@@ -61,11 +64,6 @@ class BackupBaseFields(ABC):
6164
name: str
6265
date: datetime
6366
type: BackupType
64-
size: float
65-
size_bytes: int
66-
location: str | None
67-
locations: set[str | None]
68-
protected: bool
6967
location_attributes: dict[str, BackupLocationAttributes]
7068
compressed: bool
7169

@@ -151,7 +149,7 @@ class FullBackupOptions(Request):
151149
name: str | None = None
152150
password: str | None = None
153151
compressed: bool | None = None
154-
location: str | list[str | None] | None = DEFAULT # type: ignore[assignment]
152+
location: str | list[str] = None # type: ignore[assignment]
155153
homeassistant_exclude_database: bool | None = None
156154
background: bool | None = None
157155
extra: dict | None = None
@@ -185,7 +183,7 @@ class FullRestoreOptions(Request):
185183

186184
password: str | None = None
187185
background: bool | None = None
188-
location: str | None = DEFAULT # type: ignore[assignment]
186+
location: str = None # type: ignore[assignment]
189187

190188

191189
@dataclass(frozen=True, slots=True)
@@ -197,7 +195,7 @@ class PartialRestoreOptions(FullRestoreOptions, PartialBackupRestoreOptions):
197195
class UploadBackupOptions(Options):
198196
"""UploadBackupOptions model."""
199197

200-
location: set[str | None] = None
198+
location: set[str] = None
201199
filename: PurePath | None = None
202200

203201

@@ -212,11 +210,11 @@ class UploadedBackup(ResponseData):
212210
class RemoveBackupOptions(Request):
213211
"""RemoveBackupOptions model."""
214212

215-
location: set[str | None] = None
213+
location: set[str] = None
216214

217215

218216
@dataclass(frozen=True, slots=True)
219217
class DownloadBackupOptions(Request):
220218
"""DownloadBackupOptions model."""
221219

222-
location: str | None = DEFAULT # type: ignore[assignment]
220+
location: str = None # type: ignore[assignment]

tests/test_backups.py

Lines changed: 18 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from aiohasupervisor import SupervisorClient
1414
from aiohasupervisor.models import (
1515
AddonSet,
16+
BackupLocationAttributes,
1617
BackupsOptions,
1718
DownloadBackupOptions,
1819
Folder,
@@ -24,7 +25,6 @@
2425
RemoveBackupOptions,
2526
UploadBackupOptions,
2627
)
27-
from aiohasupervisor.models.backups import BackupLocationAttributes
2828

2929
from . import load_fixture
3030
from .const import SUPERVISOR_URL
@@ -143,23 +143,18 @@ async def test_backup_options_location() -> None:
143143
"location": ["test", None]
144144
}
145145
assert FullBackupOptions(location="test").to_dict() == {"location": "test"}
146-
assert FullBackupOptions(location=None).to_dict() == {"location": None}
147146
assert FullBackupOptions().to_dict() == {}
148147

149148
assert PartialBackupOptions(
150-
location=["test", None], folders={Folder.SSL}
149+
location=["test", ".local"], folders={Folder.SSL}
151150
).to_dict() == {
152-
"location": ["test", None],
151+
"location": ["test", ".local"],
153152
"folders": ["ssl"],
154153
}
155154
assert PartialBackupOptions(location="test", folders={Folder.SSL}).to_dict() == {
156155
"location": "test",
157156
"folders": ["ssl"],
158157
}
159-
assert PartialBackupOptions(location=None, folders={Folder.SSL}).to_dict() == {
160-
"location": None,
161-
"folders": ["ssl"],
162-
}
163158
assert PartialBackupOptions(folders={Folder.SSL}).to_dict() == {"folders": ["ssl"]}
164159

165160

@@ -177,10 +172,11 @@ def backup_callback(url: str, **kwargs: dict[str, Any]) -> CallbackResult: # no
177172
[
178173
(FullBackupOptions(name="Test", background=True), None),
179174
(FullBackupOptions(name="Test", background=False), "9ecf0028"),
180-
(FullBackupOptions(name="Test", background=False, location=None), "9ecf0028"),
181175
(FullBackupOptions(name="Test", background=False, location="test"), "9ecf0028"),
182176
(
183-
FullBackupOptions(name="Test", background=False, location={None, "test"}),
177+
FullBackupOptions(
178+
name="Test", background=False, location={".local", "test"}
179+
),
184180
"9ecf0028",
185181
),
186182
(
@@ -223,12 +219,6 @@ async def test_backups_full_backup(
223219
PartialBackupOptions(name="Test", background=False, addons={"core_ssh"}),
224220
"9ecf0028",
225221
),
226-
(
227-
PartialBackupOptions(
228-
name="Test", background=False, location=None, addons={"core_ssh"}
229-
),
230-
"9ecf0028",
231-
),
232222
(
233223
PartialBackupOptions(
234224
name="Test", background=False, location="test", addons={"core_ssh"}
@@ -239,7 +229,7 @@ async def test_backups_full_backup(
239229
PartialBackupOptions(
240230
name="Test",
241231
background=False,
242-
location={None, "test"},
232+
location={".local", "test"},
243233
addons={"core_ssh"},
244234
),
245235
"9ecf0028",
@@ -307,8 +297,6 @@ async def test_backup_info(
307297
assert result.slug == "69558789"
308298
assert result.type == "partial"
309299
assert result.date == datetime(2024, 5, 31, 0, 0, 0, 0, UTC)
310-
assert result.size == 0.01
311-
assert result.size_bytes == 10123
312300
assert result.compressed is True
313301
assert result.addons[0].slug == "core_mosquitto"
314302
assert result.addons[0].name == "Mosquitto broker"
@@ -324,8 +312,8 @@ async def test_backup_info(
324312
assert result.folders == []
325313
assert result.homeassistant_exclude_database is None
326314
assert result.extra is None
327-
assert result.location is None
328-
assert result.locations == {None}
315+
assert result.location_attributes[".local"].protected is False
316+
assert result.location_attributes[".local"].size_bytes == 10123
329317

330318

331319
async def test_backup_info_no_homeassistant(
@@ -370,8 +358,10 @@ async def test_backup_info_with_multiple_locations(
370358
result = await supervisor_client.backups.backup_info("d13dedd0")
371359
assert result.slug == "69558789"
372360
assert result.type == "partial"
373-
assert result.location is None
374-
assert result.locations == {None, "Test"}
361+
assert result.location_attributes[".local"].protected is False
362+
assert result.location_attributes[".local"].size_bytes == 10123
363+
assert result.location_attributes["Test"].protected is False
364+
assert result.location_attributes["Test"].size_bytes == 10123
375365

376366

377367
@pytest.mark.parametrize(
@@ -396,7 +386,6 @@ async def test_remove_backup(
396386
None,
397387
FullRestoreOptions(password="abc123"), # noqa: S106
398388
FullRestoreOptions(background=True),
399-
FullRestoreOptions(location=None),
400389
FullRestoreOptions(location="test"),
401390
],
402391
)
@@ -419,7 +408,7 @@ async def test_full_restore(
419408
"options",
420409
[
421410
PartialRestoreOptions(addons={"core_ssh"}),
422-
PartialRestoreOptions(homeassistant=True, location=None),
411+
PartialRestoreOptions(homeassistant=True, location=".local"),
423412
PartialRestoreOptions(folders={Folder.SHARE, Folder.SSL}, location="test"),
424413
PartialRestoreOptions(addons={"core_ssh"}, background=True),
425414
PartialRestoreOptions(addons={"core_ssh"}, password="abc123"), # noqa: S106
@@ -444,7 +433,10 @@ async def test_partial_restore(
444433
("options", "query"),
445434
[
446435
(None, ""),
447-
(UploadBackupOptions(location={None, "test"}), "?location=&location=test"),
436+
(
437+
UploadBackupOptions(location={".local", "test"}),
438+
"?location=.local&location=test",
439+
),
448440
(UploadBackupOptions(filename=PurePath("backup.tar")), "?filename=backup.tar"),
449441
],
450442
)
@@ -525,10 +517,6 @@ async def test_download_backup(
525517
PartialBackupOptions(homeassistant=True, location="test"),
526518
{"homeassistant": True, "location": "test"},
527519
),
528-
(
529-
PartialBackupOptions(homeassistant=True, location=None),
530-
{"homeassistant": True, "location": None},
531-
),
532520
(
533521
PartialBackupOptions(homeassistant=True, filename=PurePath("backup.tar")),
534522
{"homeassistant": True, "filename": "backup.tar"},
@@ -559,7 +547,6 @@ async def test_partial_backup_model(
559547
{"location": [".cloud_backup", "test"]},
560548
),
561549
(FullBackupOptions(location="test"), {"location": "test"}),
562-
(FullBackupOptions(location=None), {"location": None}),
563550
(
564551
FullBackupOptions(filename=PurePath("backup.tar")),
565552
{"filename": "backup.tar"},

0 commit comments

Comments
 (0)