Skip to content

Commit 47035f8

Browse files
new function abstraction for ETL process
1 parent a25460f commit 47035f8

2 files changed

Lines changed: 41 additions & 22 deletions

File tree

snbackup/backup.py

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -60,17 +60,24 @@ def parse_html(html_text: str, regex_str=r"const json = '(?P<json_str>{.*?})'")
6060
return parsed
6161

6262

63-
def load_parsed(parsed: str, *, json_pl=False) -> list[dict] | list:
63+
def load_parsed(parsed: str, file_list=True) -> list[dict] | list:
6464
"""Deserialize json extracted from device for creating file objects."""
6565
try:
6666
parsed_dict = json.loads(parsed)
6767
except json.JSONDecodeError as e:
6868
logger.error(e)
6969
parsed_dict = {}
7070

71-
if json_pl:
72-
return parsed_dict
73-
return parsed_dict.get('fileList', [])
71+
if file_list:
72+
return parsed_dict.get('fileList', [])
73+
return parsed_dict
74+
75+
76+
def etl(device: Device, uri: str, *, file_list=True) -> dict:
77+
extract = talk_to_device(device, uri)
78+
transform = parse_html(extract.text)
79+
load = load_parsed(transform, file_list)
80+
return load
7481

7582

7683
def device_uri_gen(device: Device, file_details: list[dict]) -> Iterator[tuple[str, ...]]:
@@ -80,9 +87,10 @@ def device_uri_gen(device: Device, file_details: list[dict]) -> Iterator[tuple[s
8087
if not file.get('isDirectory'):
8188
yield file_uri, file.get('date'), file.get('size')
8289
else:
83-
html = talk_to_device(device, file_uri)
84-
re_parse = parse_html(html.text)
85-
new_file_details = load_parsed(re_parse)
90+
# html = talk_to_device(device, file_uri)
91+
# re_parse = parse_html(html.text)
92+
# new_file_details = load_parsed(re_parse)
93+
new_file_details = etl(device, file_uri)
8694
yield from device_uri_gen(device, new_file_details)
8795

8896

@@ -169,14 +177,13 @@ def run_inspection(to_download: set) -> None:
169177
logger.info('Inspection complete')
170178

171179

172-
# def device_meta(device: Device, html_path='/') -> tuple[str, int | None, int | None]:
173-
# response = device.http_request(html_path)
174-
# re_parse = parse_html(response.text)
175-
# payload = load_parsed(re_parse, json_pl=True)
176-
# name = payload.get('deviceName', 'Supernote Device')
177-
# mem = payload.get('totalByteSize')
178-
# mem_used = payload.get('usedMemory')
179-
# return name, mem, mem_used
180+
def device_info(device: Device, html_uri='Document') -> tuple[str, int | None, int | None]:
181+
payload = etl(device, html_uri, file_list=False)
182+
return (
183+
payload.get('deviceName', 'Supernote Device'),
184+
payload.get('totalByteSize'),
185+
payload.get('usedMemory'),
186+
)
180187

181188

182189
def backup() -> None:
@@ -229,9 +236,14 @@ def backup() -> None:
229236
raise SystemExit()
230237

231238
device = Device(device_url)
232-
logger.info(f'Device at {device.base_url}')
233-
239+
234240
try:
241+
device.name, device.memory, device.mem_used = device_info(device)
242+
logger.info(f'Backing up {device.name} at {device.base_url}')
243+
percent_mem = device.mem_usage()
244+
if percent_mem:
245+
logger.info(f'Device using {percent_mem} of available onboard memory.')
246+
235247
if args.upload:
236248
resp = upload_files(device, args.upload, FOLDERS.get(args.destination))
237249
msg = resp if resp else 'No files to upload.'
@@ -243,9 +255,10 @@ def backup() -> None:
243255
all_files = []
244256

245257
for folder in args.notes:
246-
httpx_response = talk_to_device(device, folder)
247-
re_parse = parse_html(httpx_response.text)
248-
device_data = load_parsed(re_parse)
258+
# httpx_response = talk_to_device(device, folder)
259+
# re_parse = parse_html(httpx_response.text)
260+
# device_data = load_parsed(re_parse)
261+
device_data = etl(device, folder)
249262
all_files.extend(device_data)
250263

251264
today = today_pth(save_dir)

snbackup/device.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
class Device:
55
"""Manages httpx Client."""
66

7-
def __init__(self, base_url: str, timeout=1) -> None:
7+
def __init__(self, base_url: str, timeout: int = 1) -> None:
88
self.base_url = base_url
99
self.timeout = timeout
1010
self.client = httpx.Client(base_url=self.base_url, timeout=self.timeout)
11+
self.memory = None
12+
self.mem_used = None
1113

12-
def http_request(self, uri: str, document=None) -> httpx.Response:
14+
def http_request(self, uri: str, document: dict = None) -> httpx.Response:
1315
"""Downloads and uploads files to remote device."""
1416
if document:
1517
response = self.client.post(uri, files=document)
@@ -21,5 +23,9 @@ def http_request(self, uri: str, document=None) -> httpx.Response:
2123
def close(self) -> None:
2224
self.client.close()
2325

26+
def mem_usage(self) -> str | None:
27+
if self.memory and self.mem_used:
28+
return f'{self.mem_used / self.memory * 100:.2f}%'
29+
2430
def __repr__(self) -> str:
2531
return f'{type(self).__name__}({self.base_url}, {self.timeout})'

0 commit comments

Comments
 (0)