From e7350700075365a9f23f9f95fe1fae94bf28c48e Mon Sep 17 00:00:00 2001 From: yumoqing Date: Mon, 1 Jun 2026 18:10:31 +0800 Subject: [PATCH] refactor: bind hot_reload event via EventDispatcher, add on_hot_reload to UAPIData --- uapi/__pycache__/apidata.cpython-310.pyc | Bin 0 -> 5134 bytes uapi/__pycache__/init.cpython-310.pyc | Bin 0 -> 970 bytes uapi/apidata.py | 8 +++++++- uapi/init.py | 3 +++ 4 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 uapi/__pycache__/apidata.cpython-310.pyc create mode 100644 uapi/__pycache__/init.cpython-310.pyc diff --git a/uapi/__pycache__/apidata.cpython-310.pyc b/uapi/__pycache__/apidata.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..417b1ebb7e3bc52df32bd180da24fa5558eca9bb GIT binary patch literal 5134 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 BxpDvi literal 0 HcmV?d00001 diff --git a/uapi/__pycache__/init.cpython-310.pyc b/uapi/__pycache__/init.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..131f67d4a972a953c8394969a25753e533844c0a GIT binary patch literal 970 zcmZva&u`N(6vyo}&95eD*G*_3AtZ#5dRhN~A;bh6xJ*dXF1|!=ZPs*g6WMO1p>Z02 z2psvBeC4z=H!kp=yU`tR;*X#07yG?$URx9yfi`7Nm%lRPzb{b&DHGTh%DItktWd?DwT)w;9XTvo<% zyEd*w7j<>FYTWQ{`;(Mn#^;x=-1%!O1%#iRcPAaZwYMSgcii$h=62sOE6|?2g>F6r zEV&_Hh^5!0qBZ~qws%8d3~e9Sw-GS1F)+3XFtI5xwHYw81K_~sz}yzV!j{0&4zJ<= z-30phnk+}(_5_@~4432Y0Vq$-e4q4A-AHca3WTUl$1RAUUAAa#rDfA{G1=Ex5*p*x zL&ON+Qm?&$%rw@M?jsUJiii*~Vt~jI1)>DFc)<;~R_i^Sg|m7kT+yzo2e(p3FMbex z2oAqrP8Y3`QwU5+!|SP*U2CQoz!vqYwnyESOEF$w6bJB`c@BsuK8fen-Z2Xv(eRIc z0&b_112^UiXYL{>FSu)~fX{Q6-7aHP!A09*_;1o72J97dF<4$Yl+p*_ f6McZkcv|vGwPM}K*H|wGHO$EidYI->PV?X|&TH>V literal 0 HcmV?d00001 diff --git a/uapi/apidata.py b/uapi/apidata.py index 6bfa8fe..5923464 100644 --- a/uapi/apidata.py +++ b/uapi/apidata.py @@ -64,7 +64,13 @@ class UAPIData: self.apidata = {} self.apikeys = {} self.org_users = {} - + + def on_hot_reload(self, data=None): + """Event handler for hot_reload event. Clears all caches.""" + self.apidata.clear() + self.apikeys.clear() + self.org_users.clear() + async def get_userapikey(self, appid, callerid): users = await self.get_apiusers(appid) for u in users: diff --git a/uapi/init.py b/uapi/init.py index 04978ff..8e49e78 100644 --- a/uapi/init.py +++ b/uapi/init.py @@ -32,6 +32,9 @@ def load_uapi(): g.get_my_uptasks = get_my_uptasks g.uptask_feedback = uptask_feedback g.uptask_started = uptask_started + # Bind hot_reload event — instance method, WeakMethod safe (stored on g) + if hasattr(g, 'event_dispatcher'): + g.event_dispatcher.bind('hot_reload', g.uapi_data.on_hot_reload) # USAGE in dspy