123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467 |
- import asyncio
- import time
-
- import redis
-
- import os
- import copy
- import json
-
- import traceback
- import inspect
- import sys
- import atexit
- from asgiref.sync import async_to_sync,sync_to_async
-
-
- # hot_reload_build = False
- hot_reload_build = True
-
-
- print("QWERTYU")
-
-
-
-
- p=print
-
- async def anop(*a,**kw):pass
- def nop(*a,**kw):pass
- class Edict(dict):pass
- class Eobj():pass
- def connect_redis1():
- return redis.Redis(host='localhost', port=6379, db=1,charset="utf-8", decode_responses=True, encoding_errors="backslashreplace")
- def connect_redis():
- return redis.Redis(host='localhost', port=6379, db=0,charset="utf-8", decode_responses=True, encoding_errors="backslashreplace")
-
-
- def eclass_factory(n):
- ret = []
- for k in range(n):
- class nx:pass
- # _rcls_name
- ret.append(nx)
- return ret
-
-
-
- def callable_helper(fn):
- ret = {
- "is_callable":0,
- "is_coroutine":0,
- }
- ret["is_callable"]= callable(fn)
- ret["is_coroutine"]= inspect.iscoroutinefunction(fn)
- # if (ca)
-
- return ret
-
-
-
- # verbose = print
- verbose=nop
-
- class DbgMixin:
- async def ws_rec(self,text_data,*a,**kw):
- # if "dbg" in
- text_data_json = json.loads(text_data)
- if not 'dbg' in text_data_json:
- return
- p("DBG!")
- exec(text_data_json["dbg"])
- class AconMixin(DbgMixin):
- # class AconMixin:
- async def connect(self):
- p(end="",flush=True)
- await self.accept()
- verbose("<MRO")
-
- verbose(type(self))
- await self.call_all_mro("ws_conn0")
- await self.call_all_mro("ws_conn")
- await self.call_all_mro("ws_conn2")
- verbose("/MRO>")
- await self.ws_conn_once()
- async def ws_conn_once(self, *a,**kw):pass
- async def ws_disconn_once(self, *a,**kw):pass
- async def ws_rec_once(self, *a,**kw):pass
- async def receive(self, *a,**kw):
- await self.call_all_mro("ws_rec",*a,**kw)
- await self.ws_rec_once(*a,**kw)
- print("",end="",flush=True)
-
- async def call_all_mro(self,mthd_name,*args,**kwargs):
- called = set([None])
- for cls_obj in self.__class__.__mro__:
- mthd = getattr(cls_obj,mthd_name,None)
- if not mthd in called:
- called.add(mthd)
- await mthd(self,*args,**kwargs)
- async def disconnect(self, close_code):
- await self.call_all_mro("ws_disconn",close_code)
- await self.ws_disconn_once(close_code)
-
- class AclTaskMixin:
- async def ws_disconn(self,*a,**kw):
- pass
-
- async def ws_conn0(self):
- self.groups_set = set()
- if glob_cl.has_cl:
- return
- glob_cl.has_cl = True
- glob_cl.run_persistent_loop(self)
- glob_cl.acl = self.channel_layer
-
-
-
-
- class DevMixin(*eclass_factory(10)):pass
- class DevMroMixin(*eclass_factory(10)):pass
- class WSStoMixin(*eclass_factory(10)):pass
- class GCLMixin(*eclass_factory(10)):pass
- class RldManMixin(*eclass_factory(10)):pass
-
- class LoneMixinA():pass
- class LoneMixinB():pass
-
- Mixins = Eobj()
- Mixins.DevMixin = DevMixin
- Mixins.DevMroMixin = DevMroMixin
- Mixins.WSStoMixin = WSStoMixin
- Mixins.GCLMixin = GCLMixin
- Mixins.RldManMixin = RldManMixin
-
- Mixins.LoneMixinA = LoneMixinA
- Mixins.LoneMixinB = LoneMixinB
-
-
- Mixins.DbgMixin = DbgMixin
- Mixins.AconMixin = AconMixin
- Mixins.AclTaskMixin = AclTaskMixin
-
-
-
-
-
- class globCL(GCLMixin):
-
- def __init__(self,*a,**kw):
- # for now we are not going to do any weird class stuff
- self.acl = None
- self.has_cl = False
- self.rconn1 = connect_redis1()
- self.rconn = connect_redis()
- self.rman = RldMan()
- self.cbs_once = []
- self.cbs_asap2 = []
- self.cbs_asap = []
- self.cbs_once_set = set()
- if (hot_reload_build):
- self.cbs = {"fn1":fn1,"fn2x":nop}
- else:
- self.cbs = {}
- self.timeout = 1
- self.fast_timeout = .1
- pass
- async def persistent_fast_cb_loop_min_timeout(self,*a,**kw):
-
- while 1:
-
- if len(self.cbs_asap2):
- cbs_once = [*self.cbs_asap2]
- self.cbs_asap2=[]
- k=0
- for v in cbs_once:
- try:
- call_info = callable_helper(v)
- if (call_info["is_callable"]):
- if call_info["is_coroutine"]:
- pass
- await v({k,self})
- else:
- v({k,self})
- else:
- pass
- except Exception as e:
- p("persistent_fast_cb_loop Exception cbs_once:",e)
- p(flush=True)
- else:
- pass
- finally:
- pass
- k += 1
- if len(self.cbs_asap):
- self.cbs_asap2 = self.cbs_asap
- self.cbs_asap=[]
- await asyncio.sleep(self.fast_timeout)
- async def persistent_fast_cb_loop(self,*a,**kw):
- while 1:
- if len(self.cbs_asap):
- cbs_once = [*self.cbs_asap]
- self.cbs_asap=[]
- k=0
- for v in cbs_once:
- try:
- call_info = callable_helper(v)
- if (call_info["is_callable"]):
- if call_info["is_coroutine"]:
- pass
- await v({k,self})
- else:
- v({k,self})
- else:
- pass
- except Exception as e:
- p("persistent_fast_cb_loop Exception cbs_once:",e)
- p(flush=True)
- else:
- pass
- finally:
- pass
- k += 1
- await asyncio.sleep(self.fast_timeout)
- async def persistent_loop(self,*a,**kw):
- while 1:
- for k,v in [*self.cbs.items()]:
- try:
- call_info = callable_helper(v)
- if (call_info["is_callable"]):
- if call_info["is_coroutine"]:
- await v({k,self})
- else:
- v({k,self})
- else:
- pass
- pass
- except Exception as e:
- p("persistent_loop Exception",e)
- p(flush=True)
- else:
- pass
- finally:
- pass
- cbs_once = [*self.cbs_once,*self.cbs_once_set]
- self.cbs_once = []
- self.cbs_once_set = set()
- k=0
- for v in cbs_once:
- try:
- call_info = callable_helper(v)
- if (call_info["is_callable"]):
- if call_info["is_coroutine"]:
- pass
- await v({k,self})
- else:
- v({k,self})
-
- else:
- pass
- except Exception as e:
- p("persistent_loop Exception cbs_once:",e)
- p(flush=True)
- else:
- pass
- finally:
- pass
- k += 1
-
-
-
-
- await asyncio.sleep(self.timeout)
- def _run_persistent_loop(self,*a,**kw):
- p("_run_persistent_loop:")
- loop = asyncio.get_event_loop()
- self.run_persistent_loop = nop
- self.rman.persistent_loop_cb()
- loop.create_task(self.persistent_loop())
- # loop.create_task(self.persistent_fast_cb_loop())
- loop.create_task(self.persistent_fast_cb_loop_min_timeout())
- self.loop = loop
- run_persistent_loop = _run_persistent_loop
-
-
- def sync_dev_group_discard(self,*a,**kw):
- glob_cl.cbs_once.append(self.sync_dev_group_discard(*a,**kw))
- async def dev_group_discard(self,group_name,consumer):
- channel_layer = glob_cl.acl
- if consumer.channel_name in consumer.groups:
- consumer.groups.remove(group_name)
- await channel_layer.group_discard(group_name,consumer.channel_name)
-
- def sync_dev_group_add(self,*a,**kw):
- glob_cl.cbs_once.append(self.group_add(*a,**kw))
- async def dev_group_add(self,group_name,consumer):
- channel_layer = glob_cl.acl
- # if not consumer.channel_name in consumer.groups_set:
- # consumer.groups_set.add(groups)
- if not consumer.channel_name in consumer.groups:
- consumer.groups.append(group_name)
- await channel_layer.group_add(group_name,consumer.channel_name)
-
-
-
- # RldManMixin
- class RldMan(RldManMixin):
- def __init__(self,*a,**kw):
- self.files = {}
- z="ABC"
- self.scopes = {
- "dflt_scope":{"globals":globals(),"locals":locals()},
- "dflt_scope_zloc":{"globals":globals(),"locals":{}},
- "dflt_scope_gscope":{"globals":globals(),"locals":{}},
- "dflt_scope_copy": {"globals":copy.copy(globals()),"locals":copy.copy(locals())},
- # "dflt_scope":{"globals":globals(),"locals":{}}
- }
- self.scopes['current_scope'] = self.scopes['dflt_scope_zloc']
- # self.scope_opt = ""locals
- self.scope_opt = "globals"
- self.print_tb = 0
-
- base_path = "/usr/games/repos/ign4/py_rld/djc/rdir1/"
-
-
- file_list = [
- base_path+"i0.py",
- base_path+"i1.py",
- base_path+"i2.py",
- base_path+"i3.py",
- base_path+"i4.py",
- base_path+"i5.py",
-
- base_path+"v0.py",
- base_path+"v1.py",
- base_path+"v2.py",
- base_path+"v3.py",
- base_path+"v4.py",
- base_path+"v5.py",
-
-
- ]
-
- self.add_files(file_list)
- # self.add_files(file_list,{"run"})
- def persistent_loop_cb(self,*a,**kw):
- base_path = "/usr/games/repos/ign4/py_rld/djc/rdir1/"
-
- file_list = [
- base_path+"r0.py",
- base_path+"r1.py",
- base_path+"r2.py",
- base_path+"r3.py",
- base_path+"r4.py",
- base_path+"r5.py",
-
- base_path+"vr0.py",
- base_path+"vr1.py",
-
- ]
- self.add_files(file_list)
- def add_files(self,files):
- for file in files:
- if type(file)==str:
- self.add_file(file)
- elif type(file)==list:
- self.add_file(*file)
- else:
- p("add files???",file)
- def add_file(self,file_name,fnx={}):
- self.files[file_name] = {"ftxt":"",**fnx}
- def get_scope(self,rfile_obj,file_name):
- return self.scopes["current_scope"]
- return {
- "scope":self.scopes["current_scope"],
- }
-
-
- # rfile_obj.get("scope")
- # if
- def rld_file(self,file_name,ret= {"errs":{},"all":{},"alle":{},},**kw):
- if file_name in self.files:
- rfile_obj = self.files[file_name]
- st = os.stat(file_name)
- st_tuple = (st.st_mtime,st.st_size)
- # if rfile_obj["ftxt"] == "":
- eflag ="nd"
- # rfile_obj["ftxt"] = st_tuple
- if rfile_obj["ftxt"] != st_tuple:
- # p(rfile_obj["ftxt"])
- rfile_obj["ftxt"] = st_tuple
-
- try:
- f = open(file_name,"r")
- ftxt = f.read()
- # scope_key = rfile_obj.get("scope")
- # p(scope_key,rfile_obj)
- f.close()
- scope_obj = self.get_scope(file_name,rfile_obj)
- if self.scope_opt == "locals":
- eflag ="locals"
- exec(ftxt,scope_obj["globals"],scope_obj["locals"])
- elif self.scope_opt == "globals":
- eflag ="globals"
- exec(ftxt,scope_obj["globals"])
- else:
- eflag ="[]"
- exec(ftxt)
-
- except Exception as e:
- p()
- print("file:",file_name)
- print("EXCEPT",eflag,e)
- if self.print_tb:
- traceback.print_tb(e.__traceback__,file=sys.stdout)
- else:
- pass
- finally:
- pass
- print(end="",flush=True)
- return ret
-
-
- def rld_files(self):
- ret = {
- "errs":{},
- "all":{},
- "alle":{},
- }
- for k in [*self.files]:
- self.rld_file(k,ret)
- p("",end="",flush=True)
- return ret
-
- def fn1(*a,**kw):
- glob_cl.rman.rld_files()
- glob_cl = globCL()
-
-
-
- # we are not flushing databases if
- def atexit_fn():
- print("atexit_fn!\n\n")
- rconn = glob_cl.rconn
- # rconn.flushall()
- rconn.flushdb()
- print("",end="",flush=True)
-
-
- if hot_reload_build:
- glob_cl.rman.rld_files()
- atexit.register(atexit_fn)
- else:
- import wsps.hot_reload_temp_staging
- wsps.hot_reload_temp_staging.init_class_edits(Mixins)
-
-
- glob_cl.dev_room_dashboard = "jfi_dash"
-
- # if not hot_reload_build:
- # glob_cl.rman.rld_files()
-
-
-
-
-
- # print("############################ ##############################")
|