From 02a691a350bf8878807ece983bfecb479602742e Mon Sep 17 00:00:00 2001 From: Floppyrj45 Date: Thu, 19 Feb 2026 16:04:42 +0100 Subject: [PATCH] =?UTF-8?q?Fix=20coverage=20filename=E2=86=92name,=20fix?= =?UTF-8?q?=20TasksProxy=20auto-save=20for=20multi-worker?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/app.py.cpython-313.pyc | Bin 93998 -> 95173 bytes app.py.final | 22 ++++++++++++++++++++-- index.html.final | 4 ++-- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/__pycache__/app.py.cpython-313.pyc b/__pycache__/app.py.cpython-313.pyc index a570823b618d499b958ddd43abf34718f8b13e92..5372173c7434be688529ba40a2c7a9931597e2dc 100644 GIT binary patch delta 13261 zcma)i33!y%x&NG*`DU_^g^+}hKr#eE7=f^hgb))}5e&<)Z_{CBk_=2{!ucjhqTUIu zwJvQ%Pw6POb!qhxvED*dZuPM?F4e2`3fGPMRjWRV8f?8%y;b=?z5Tzx_nRe&*xNi$ zesh-hZ0~m7bI$kBAGK#c)bc;e%geFQUwBd?boJO<^2@|C$7)wv$Cp{EEuK;37Ekf^ z*>i26uvp}r?X#*abIpvp!CF!18B=bN^`3IV1>0Tgy4Cn6N2vj8skShk+tHq_T(&%| zFeb(DrP|_jZi>BBTawOgq1@6`F0r#jWEXm74C-as_R;FM_TqeE#Z1pE&uq_}`8Ii( zS|g^|Tzh5PWiJ|3zb;ijVXr-?U%hLTUA4Ihw zU4L1c{VN95Z%o%;o~~axsD4wbUTMx!ZF4$zvol96bdJ!rq)U8MzcrPsSeIV4XHak3 zQuVcK()H^H)oYqPnx_8Cs0sitCw zT3S%uxJ@(pYq4ywZgZs4DQQkl7Wjy2^Mnnemh!9ZsnoV?m6z8tQ8RM9F`vH28;<(- z$gxCXGW^t9e;`*g;7L2*A<`>0p6ihl* zFzNKT>Vy7UbKb$vEje$F7=4@e>WIoO@+|pfH*fvn*7JHUwf^3mX1lH5p3_|9^d}XL zN-Y*xCjLJwBRFK)mQ)&Alt{5^qNPX{Q>|MV+1~Xu-6fb-eg49d1}fD@5cFE!EGWBe z)J^|#GHaZ=Iln2}EqFO{u6jNHV$s-_S5PLH+{i}{`WhMC-(A-k?QBx@g+H7+llqVs z1F%wwevJ~Zm-rA1`MthaOon!K#e%xmE1T5kh3+h;R`r)cp;fAyk>lg3^?Y^-wcAOn z*lv-+W06*mkT#E1+BaC{2#>AYvO7y^oVIh?;nAdXgJq$RSraX8hnz#r2bL4`Olj_l zMW^Y$eW6I33sP`hDSe%tLFsCZN|(IaZhIYz0;5 z=;_N|%jvSJ@8`W)SfTQ+*WS#^yTN%XtL(OtJICBU=B|17FM4In^w+Xx$SFkYw=o}9 z{fW}x!#4Ug|JIWPcEAvdQVVohGF-4)DCbPkCU*x*gm|+qON}ooUbKLe(wA?s%&=^p zu`Vk`nEAy-$+Cz%Q

NH++za88-3%4>)_L811*4N#t{hL`)|h`1)+=WK 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

hPK7zM2* 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 diff --git a/app.py.final b/app.py.final index 181c668..13689de 100644 --- a/app.py.final +++ b/app.py.final @@ -52,10 +52,13 @@ class TasksProxy: def __setitem__(self, key, value): with _task_lock: tasks = _load_tasks() - tasks[key] = value + if isinstance(value, dict): + tasks[key] = value + else: + tasks[key] = value _save_tasks(tasks) def __getitem__(self, key): - return _load_tasks()[key] + return _TaskDict(key) def __contains__(self, key): return key in _load_tasks() def pop(self, key, *args): @@ -65,6 +68,21 @@ class TasksProxy: _save_tasks(tasks) return result +class _TaskDict(dict): + """Auto-saving dict wrapper for a single task.""" + def __init__(self, task_id): + self._task_id = task_id + tasks = _load_tasks() + super().__init__(tasks.get(task_id, {})) + def __setitem__(self, key, value): + super().__setitem__(key, value) + with _task_lock: + tasks = _load_tasks() + if self._task_id not in tasks: + tasks[self._task_id] = {} + tasks[self._task_id][key] = value + _save_tasks(tasks) + TASKS = TasksProxy() # ========== UTILITY FUNCTIONS ========== diff --git a/index.html.final b/index.html.final index 6930367..1d12a82 100644 --- a/index.html.final +++ b/index.html.final @@ -2198,9 +2198,9 @@ function renderCoverage() { const x1 = ml + ((seg.startDate.getTime() - tMin) / tRange) * pw; const w = Math.max(2, ((seg.duration_sec || 0) / (tRange / 1000)) * pw); const color = lineColorMap[seg.line] || '#666'; - const escapedFn = seg.filename.replace(/'/g, "\\'"); + const escapedFn = (seg.filename||seg.name).replace(/'/g, "\\'"); svg += ``; - svg += `${seg.filename}\nBoard: ${seg.board_id || '?'}\nLine: ${seg.line || '?'} Point: ${seg.point || '?'}\nDuration: ${((seg.duration_sec || 0) / 3600).toFixed(1)}h\nStart: ${seg.date_str}`; + svg += `${(seg.filename||seg.name)}\nBoard: ${seg.board_id || '?'}\nLine: ${seg.line || '?'} Point: ${seg.point || '?'}\nDuration: ${((seg.duration_sec || 0) / 3600).toFixed(1)}h\nStart: ${seg.date_str}`; svg += ``; }); });