easy-utils-dev 2.164__tar.gz → 2.166__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/PKG-INFO +1 -1
  2. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/ne1830PSS.py +38 -32
  3. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/uiserver.py +69 -23
  4. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev.egg-info/PKG-INFO +1 -1
  5. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/setup.py +1 -1
  6. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/MANIFEST.in +0 -0
  7. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/EasySsh.py +0 -0
  8. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/Events.py +0 -0
  9. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/FastQueue.py +0 -0
  10. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/NameObject.py +0 -0
  11. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/__init__.py +0 -0
  12. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/abortable.py +0 -0
  13. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/brevosmtp.py +0 -0
  14. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/check_license.py +0 -0
  15. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/cplib.py +0 -0
  16. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/custom_env.py +0 -0
  17. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/debugger.py +0 -0
  18. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/easy_oracle.py +0 -0
  19. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/encryptor.py +0 -0
  20. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/ept.py +0 -0
  21. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/ept_sql/create_dirs.sql +0 -0
  22. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/ept_sql/create_ept_tables.sql +0 -0
  23. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/exceptions.py +0 -0
  24. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/filescompressor.py +0 -0
  25. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/generate_license.py +0 -0
  26. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/keycloakapi.py +0 -0
  27. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/lralib.py +0 -0
  28. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/nsp_kafka.py +0 -0
  29. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/openid_server.py +0 -0
  30. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/optics_utils.py +0 -0
  31. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/require_auth.py +0 -0
  32. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/simple_sqlite.py +0 -0
  33. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/temp_memory.py +0 -0
  34. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/utils.py +0 -0
  35. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/winserviceapi.py +0 -0
  36. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/wsnoclib.py +0 -0
  37. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev/wsselib.py +0 -0
  38. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev.egg-info/SOURCES.txt +0 -0
  39. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev.egg-info/dependency_links.txt +0 -0
  40. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev.egg-info/requires.txt +0 -0
  41. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/easy_utils_dev.egg-info/top_level.txt +0 -0
  42. {easy_utils_dev-2.164 → easy_utils_dev-2.166}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: easy_utils_dev
3
- Version: 2.164
3
+ Version: 2.166
4
4
  Keywords: python3
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Requires-Dist: psutil
@@ -10,6 +10,7 @@ from easy_utils_dev.encryptor import initCryptor
10
10
  from easy_utils_dev.utils import pingAddress , lget , getTimestamp
11
11
  from easy_utils_dev import exceptions
12
12
  from typing import Optional
13
+ import re
13
14
 
14
15
  class PSS1830 :
15
16
  def __init__(self ,
@@ -19,6 +20,7 @@ class PSS1830 :
19
20
  file_name=None,
20
21
  debug_home_path=None,
21
22
  trust_env_log_path=True,
23
+ connect_to_standby_ec=False,
22
24
  debugger_kwargs: Optional[DEBUGGER] = {}
23
25
  ) -> None:
24
26
  self.port = None
@@ -54,7 +56,9 @@ class PSS1830 :
54
56
  self.full_buffer=''
55
57
  self.pssRelease = None
56
58
  self.maxConnectAttempt=3
57
- self.connect_to_standby_ec=False
59
+
60
+ self.connect_to_standby_ec = connect_to_standby_ec
61
+
58
62
  self.currentConnectAttempt=0
59
63
  self.auto_enable_tcp_forward=auto_enable_tcp_forward
60
64
  self.tcpForwardStatus=None
@@ -1004,40 +1008,42 @@ class PSS1830 :
1004
1008
  self.logger.debug(f"get_allcards : final return {cards_return}")
1005
1009
  return cards_return
1006
1010
 
1007
-
1011
+
1008
1012
  def get_xcs(self) :
1009
- xcs = self.cli_execute('show xc *')
1010
- xcs = xcs.splitlines()
1013
+ xcs = self.cli_execute("show xc *")
1011
1014
  xcsList = []
1012
- for line in xcs.splitlines():
1013
- line = line.rstrip()
1014
- # Skip ONLY clear header/separator lines
1015
- if not line.strip():
1016
- continue
1017
- if line.strip().startswith("A-End"):
1018
- continue
1019
- if line.strip().startswith("---"):
1020
- continue
1021
- if "entries" in line:
1022
- continue
1023
- # Split by 2+ spaces
1024
- details = re.split(r"\s{2,}", line.strip())
1025
- if len(details) < 10:
1026
- print("SKIPPED:", details)
1015
+
1016
+ row_regex = re.compile(
1017
+ r"^(?P<aEnd>\S+)\s+"
1018
+ r"(?P<zEnd>\S+)\s+"
1019
+ r"(?P<freq>\d+\.\d+)\s+"
1020
+ r"(?P<id>\d+)\s+"
1021
+ r"(?:(?P<label>\S.*?~)\s+)?"
1022
+ r"(?P<width>\d+\.\d+)\s+"
1023
+ r"(?P<type>\S+)\s+"
1024
+ r"(?P<admin>Up|Down)\s+"
1025
+ r"(?P<oper>Up|Down)\s+"
1026
+ r"(?P<dir>Uni|Bi)"
1027
+ )
1028
+
1029
+ for ln in xcs.splitlines():
1030
+ ln = ln.strip()
1031
+ if not ln:
1027
1032
  continue
1028
- aEnd, zEnd, channel, connectionId, label, width, type_, adminState, oper, direction = details[:10]
1029
- xcsList.append({
1030
- "aEnd": aEnd,
1031
- "zEnd": zEnd,
1032
- "channel": channel,
1033
- "id": connectionId,
1034
- "label": label,
1035
- "width": width,
1036
- "type": type_,
1037
- "admin": adminState,
1038
- "operation": oper,
1039
- "dir": direction,
1040
- })
1033
+
1034
+ m = row_regex.search(ln)
1035
+ if not m:
1036
+ continue # skip header/separators automatically
1037
+
1038
+ data = m.groupdict()
1039
+ # normalize missing label to empty string instead of None
1040
+ if data.get("label") is None:
1041
+ data["label"] = ""
1042
+
1043
+ xcsList.append(data)
1044
+
1045
+ return xcsList
1046
+
1041
1047
 
1042
1048
  def showShelf(self , shelfId=1) :
1043
1049
  self.logger.debug(f'show shelf for shelfId={shelfId}')
@@ -83,29 +83,74 @@ class Stream :
83
83
  } , to=sid )
84
84
 
85
85
  class Response :
86
- def __init__(self) :
86
+ def __init__(self, socket : SocketIO , request : request ) :
87
87
  self.success = self.ok
88
88
  self.failure = self.error
89
-
90
- def ok(self , result=[] , message=None , **kwargs) :
89
+ self.socket = socket
90
+ self.request = request
91
+
92
+ def _emit(self , data, role , options={} ) :
93
+ self.socket.emit('/stream/notify' , { **data , '_role' : role , '_options' : options } , to=self.request.sid)
94
+
95
+ def ok(self , result=[] , message=None , alert=False, toast=False , options={} , **kwargs) :
96
+ role = None
97
+ if alert :
98
+ role = 'alert'
99
+ elif toast :
100
+ role = 'toast'
91
101
  timestamp = getTimestamp()
92
- return {'status' : 200 , 'message' : message , 'result' : result , **kwargs, 'timestamp' : timestamp}
93
-
94
- def error(self , message=None , **kwargs) :
102
+ r = {'status' : 200 , 'message' : message , 'result' : result , **kwargs, 'timestamp' : timestamp}
103
+ if role :
104
+ self._emit( r , role, options)
105
+ return r
106
+
107
+ def error(self , message=None , alert=False, toast=False , options={} , **kwargs) :
108
+ role = None
109
+ if alert :
110
+ role = 'alert'
111
+ elif toast :
112
+ role = 'toast'
95
113
  timestamp = getTimestamp()
96
- return {'status' : 400 , 'message' : message , **kwargs , 'timestamp' : timestamp}
114
+ r = {'status' : 400 , 'message' : message , **kwargs , 'timestamp' : timestamp}
115
+ if role :
116
+ self._emit( r , role , options)
117
+ return r
97
118
 
98
- def internal_error(self , message=None , **kwargs ) :
119
+ def internal_error(self , message=None , alert=False, toast=False , options={} , **kwargs ) :
120
+ role = None
121
+ if alert :
122
+ role = 'alert'
123
+ elif toast :
124
+ role = 'toast'
99
125
  timestamp = getTimestamp()
100
- return {'status' : 500 , 'message' : message , **kwargs , 'timestamp' : timestamp}
101
-
102
- def not_found(self , message=None , **kwargs) :
126
+ r = {'status' : 500 , 'message' : message , **kwargs , 'timestamp' : timestamp}
127
+ if role :
128
+ self._emit( r , role , options)
129
+ return r
130
+
131
+ def not_found(self , message=None , alert=False, toast=False , options={} , **kwargs) :
132
+ role = None
133
+ if alert :
134
+ role = 'alert'
135
+ elif toast :
136
+ role = 'toast'
103
137
  timestamp = getTimestamp()
104
- return {'status' : 404 , 'message' : message , **kwargs , 'timestamp' : timestamp}
138
+ r = {'status' : 404 , 'message' : message , **kwargs , 'timestamp' : timestamp}
139
+ if role :
140
+ self._emit( r , role , options )
141
+ return r
105
142
 
106
- def unauthorized(self , message=None , **kwargs) :
143
+ def unauthorized(self , message=None , alert=False, toast=False , options={} , **kwargs) :
144
+ role = None
145
+ if alert :
146
+ role = 'alert'
147
+ elif toast :
148
+ role = 'toast'
107
149
  timestamp = getTimestamp()
108
- return {'status' : 401 , 'message' : message , **kwargs , 'timestamp' : timestamp}
150
+ r = {'status' : 401 , 'message' : message , **kwargs , 'timestamp' : timestamp}
151
+ if role :
152
+ self._emit( r , role , options)
153
+ return r
109
154
 
110
155
  class AbortRequest :
111
156
  def __init__(self, request ) :
@@ -203,6 +248,7 @@ class UISERVER :
203
248
  self.logger = logger
204
249
  self.stream = Stream()
205
250
  self.simulate_network_delay = False
251
+ self.Response = Response(self.socketio , request )
206
252
  if not self.logger :
207
253
  self.logger = DEBUGGER(
208
254
  name='easy_utils_dev_uiserver',
@@ -267,24 +313,24 @@ class UISERVER :
267
313
  if not alive :
268
314
  break
269
315
  time.sleep(.25)
270
- return Response().ok(message='Request aborted' , abort_timestamp=timestamp , abort_id=id , alive=alive , url=abort.request.get('path'))
316
+ return self.Response.ok(message='Request aborted' , abort_timestamp=timestamp , abort_id=id , alive=alive , url=abort.request.get('path'))
271
317
 
272
318
  else :
273
- return Response().not_found(message='Request not found or request is not abortable. Check request headers for abortable flag.')
319
+ return self.Response.not_found(message='Request not found or request is not abortable. Check request headers for abortable flag.')
274
320
 
275
321
  @self.app.route(f"/request/traceback/<key>" , methods=['GET'])
276
322
  def get_traceback(key : str ) :
277
323
  traceback = self.cache.get(key)
278
324
  if traceback :
279
- return Response().ok(message='Traceback found' , traceback=traceback.get('traceback'))
325
+ return self.Response.ok(message='Traceback found' , traceback=traceback.get('traceback'))
280
326
  else :
281
- return Response().not_found(message='Traceback not found or expired')
327
+ return self.Response.not_found(message='Traceback not found or expired')
282
328
 
283
329
  @self.app.route(f'{self.request_reply_base_url}/<id>' , methods=['GET'])
284
330
  def get_result_of_async_request(id : str ) :
285
331
  request : AbortRequest = self.bg_requests.get(id)
286
332
  if request :
287
- return Response().ok(
333
+ return self.Response.ok(
288
334
  message='Result of async request found' ,
289
335
  result=request.result ,
290
336
  in_progress=request.in_progress ,
@@ -305,7 +351,7 @@ class UISERVER :
305
351
 
306
352
 
307
353
  if (self.serve_with_secret_key) and (request.path not in self.secret_key_execlude_urls) and (request.headers.get('secretkey') != self.secretkey):
308
- return Response().unauthorized(message='Secret key is invalid')
354
+ return self.Response.unauthorized(message='Secret key is invalid')
309
355
 
310
356
  @copy_current_request_context
311
357
  def run_async_job_results( target_func , abort : AbortRequest ) :
@@ -349,11 +395,11 @@ class UISERVER :
349
395
  if request.headers.get('async') == 'false' :
350
396
  target_func = current_app.view_functions.get(request.endpoint)
351
397
  if not target_func:
352
- return Response().not_found(message='Route not found')
398
+ return self.Response.not_found(message='Route not found')
353
399
  th = start_thread(target=run_async_job_results, args=[target_func , abort ])
354
400
  abort.thread = th
355
401
  self.bg_requests[requestId] = abort
356
- return Response().ok(message='Request now in running bg' , abort_id=abort.abort_id)
402
+ return self.Response.ok(message='Request now in running bg' , abort_id=abort.abort_id)
357
403
 
358
404
  if self.return_exception_as_code_400 :
359
405
  @self.app.errorhandler(Exception)
@@ -392,7 +438,7 @@ class UISERVER :
392
438
  }
393
439
  self.logger.error(f'error: {json.dumps(response , indent=4)}')
394
440
  self.cache.set( custom_key=key , item={**response , 'traceback' : str(traceback.format_exc())} , auto_destroy_period=1800 , store_deleted_key=False )
395
- return Response().error( **response )
441
+ return self.Response.error( **response )
396
442
 
397
443
  @self.app.after_request
398
444
  def after_request(response) :
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: easy_utils_dev
3
- Version: 2.164
3
+ Version: 2.166
4
4
  Keywords: python3
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Requires-Dist: psutil
@@ -1,6 +1,6 @@
1
1
  from setuptools import setup, find_packages
2
2
 
3
- VERSION = '2.164'
3
+ VERSION = '2.166'
4
4
 
5
5
  # Setting up
6
6
  setup(
File without changes