naeural-client 2.5.25__py3-none-any.whl → 2.5.26__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
naeural_client/_ver.py CHANGED
@@ -1,4 +1,4 @@
1
- __VER__ = "2.5.25"
1
+ __VER__ = "2.5.26"
2
2
 
3
3
  if __name__ == "__main__":
4
4
  with open("pyproject.toml", "rt") as fd:
@@ -179,7 +179,7 @@ class GenericSession(BaseDecentrAIObject):
179
179
  self._dct_online_nodes_pipelines: dict[str, Pipeline] = {}
180
180
  self._dct_online_nodes_last_heartbeat: dict[str, dict] = {}
181
181
  self._dct_can_send_to_node: dict[str, bool] = {}
182
- self._dct_node_last_seen_time = {}
182
+ self._dct_node_last_seen_time = {} # key is node address
183
183
  self._dct_node_addr_name = {}
184
184
  self.online_timeout = 60
185
185
  self.filter_workers = filter_workers
@@ -209,9 +209,14 @@ class GenericSession(BaseDecentrAIObject):
209
209
  self.sdk_main_loop_thread = Thread(target=self.__main_loop, daemon=True)
210
210
  self.__formatter_plugins_locations = formatter_plugins_locations
211
211
 
212
- self.__bc_engine = bc_engine
213
212
  self.__blockchain_config = blockchain_config
214
213
 
214
+ # TODO: needs refactoring - suboptimal design
215
+ self.__bc_engine : DefaultBlockEngine = bc_engine
216
+ self.bc_engine : DefaultBlockEngine = None
217
+ # END TODO
218
+
219
+
215
220
  self.__open_transactions: list[Transaction] = []
216
221
  self.__open_transactions_lock = Lock()
217
222
 
@@ -1033,10 +1038,19 @@ class GenericSession(BaseDecentrAIObject):
1033
1038
  self._config[comm_ct.SECURED] = secured
1034
1039
 
1035
1040
  return
1041
+
1042
+ def __aliases_to_addresses(self):
1043
+ """
1044
+ Convert the aliases to addresses.
1045
+ """
1046
+ dct_aliases = {v: k for k, v in self._dct_node_addr_name.items()}
1047
+ return dct_aliases
1036
1048
 
1037
1049
  def __get_node_address(self, node):
1038
1050
  """
1039
1051
  Get the address of a node. If node is an address, return it. Else, return the address of the node.
1052
+ This method is used to convert the alias of a node to its address if needed however it is
1053
+ not recommended to use it as it was created for backward compatibility reasons.
1040
1054
 
1041
1055
  Parameters
1042
1056
  ----------
@@ -1048,11 +1062,19 @@ class GenericSession(BaseDecentrAIObject):
1048
1062
  str
1049
1063
  The address of the node.
1050
1064
  """
1051
- if node not in self.get_active_nodes():
1052
- node = next((key for key, value in self._dct_node_addr_name.items() if value == node), node)
1053
- return node
1065
+ # if node not in self.get_active_nodes():
1066
+ # node = next((key for key, value in self._dct_node_addr_name.items() if value == node), node)
1067
+ result = None
1068
+ if node in self.get_active_nodes():
1069
+ # node seems to be already an address
1070
+ result = node
1071
+ else:
1072
+ # maybe node is a name
1073
+ aliases = self.__aliases_to_addresses()
1074
+ result = aliases.get(node, None)
1075
+ return result
1054
1076
 
1055
- def _send_command_to_box(self, command, worker, payload, show_command=False, session_id=None, **kwargs):
1077
+ def _send_command_to_box(self, command, worker, payload, show_command=True, session_id=None, **kwargs):
1056
1078
  """
1057
1079
  Send a command to a node.
1058
1080
 
@@ -1062,10 +1084,16 @@ class GenericSession(BaseDecentrAIObject):
1062
1084
  The command to send.
1063
1085
  worker : str
1064
1086
  The name of the Naeural Edge Protocol edge node that will receive the command.
1087
+
1088
+ Observation: this approach will be deprecated soon in favor of the direct use of the address that
1089
+ will not require the node to be already "seend" by the session.
1090
+
1065
1091
  payload : dict
1066
1092
  The payload to send.
1067
1093
  show_command : bool, optional
1068
1094
  If True, will print the complete command that is being sent, by default False
1095
+
1096
+
1069
1097
  """
1070
1098
 
1071
1099
  show_command = show_command or self.__show_commands
@@ -1080,10 +1108,17 @@ class GenericSession(BaseDecentrAIObject):
1080
1108
 
1081
1109
  # This part is duplicated with the creation of payloads
1082
1110
  encrypt_payload = self.encrypt_comms
1083
- if encrypt_payload and worker is not None:
1084
- # TODO: use safe_json_dumps
1111
+ if encrypt_payload and worker is not None:
1085
1112
  str_data = json.dumps(critical_data)
1086
- str_enc_data = self.bc_engine.encrypt(str_data, worker)
1113
+
1114
+ # Initial code `str_enc_data = self.bc_engine.encrypt(str_data, worker)` could not work under any
1115
+ # circumstances due to the fact that encrypt requires the public key of the receiver not the alias
1116
+ # of the receiver. The code below is a workaround to encrypt the message
1117
+ # TODO: furthermore the code will be migrated to the use of the address of the worker
1118
+ worker_addr = self.get_addr_by_name(worker)
1119
+ assert worker_addr is not None, f"Unknown worker address: {worker} - {worker_addr}"
1120
+
1121
+ str_enc_data = self.bc_engine.encrypt(str_data, worker_addr)
1087
1122
  critical_data = {
1088
1123
  comm_ct.COMM_SEND_MESSAGE.K_EE_IS_ENCRYPTED: True,
1089
1124
  comm_ct.COMM_SEND_MESSAGE.K_EE_ENCRYPTED_DATA: str_enc_data,
@@ -1104,10 +1139,11 @@ class GenericSession(BaseDecentrAIObject):
1104
1139
  }
1105
1140
  self.bc_engine.sign(msg_to_send, use_digest=True)
1106
1141
  if show_command:
1107
- self.P("Sending command '{}' to '{}':\n{}".format(command, worker, json.dumps(msg_to_send, indent=2)),
1108
- color='y',
1109
- verbosity=1
1110
- )
1142
+ self.P(
1143
+ "Sending command '{}' to '{}':\n{}".format(command, worker, json.dumps(msg_to_send, indent=2)),
1144
+ color='y',
1145
+ verbosity=1
1146
+ )
1111
1147
  self._send_payload(worker, msg_to_send)
1112
1148
  return
1113
1149
 
@@ -1357,6 +1393,25 @@ class GenericSession(BaseDecentrAIObject):
1357
1393
  )
1358
1394
  self.own_pipelines.append(pipeline)
1359
1395
  return pipeline
1396
+
1397
+ def get_addr_by_name(self, name):
1398
+ """
1399
+ Get the address of a node by its name.
1400
+ This function should be used with caution and it was created for backward compatibility reasons.
1401
+
1402
+ Parameters
1403
+ ----------
1404
+
1405
+ name : str
1406
+ The name of the node.
1407
+
1408
+ Returns
1409
+ -------
1410
+ str
1411
+ The address of the node.
1412
+ """
1413
+ return self.__get_node_address(name)
1414
+
1360
1415
 
1361
1416
  def get_node_name(self, node_addr):
1362
1417
  """
@@ -1376,12 +1431,13 @@ class GenericSession(BaseDecentrAIObject):
1376
1431
 
1377
1432
  def get_active_nodes(self):
1378
1433
  """
1379
- Get the list of all Naeural Edge Protocol edge nodes that sent a message since this session was created, and that are considered online
1434
+ Get the list of all Naeural Edge Protocol edge nodes addresses that sent a message since this
1435
+ session was created, and that are considered online.
1380
1436
 
1381
1437
  Returns
1382
1438
  -------
1383
1439
  list
1384
- List of names of all the Naeural Edge Protocol edge nodes that are considered online
1440
+ List of addresses of all the Naeural Edge Protocol edge nodes that are considered online
1385
1441
 
1386
1442
  """
1387
1443
  return [k for k, v in self._dct_node_last_seen_time.items() if tm() - v < self.online_timeout]
naeural_client/bc/base.py CHANGED
@@ -14,42 +14,7 @@ from cryptography.hazmat.primitives import serialization
14
14
 
15
15
  from ..utils.config import get_user_folder
16
16
 
17
- class BCctbase:
18
- SIGN = 'EE_SIGN'
19
- SENDER = 'EE_SENDER'
20
- HASH = 'EE_HASH'
21
-
22
- ETH_SIGN = 'EE_ETH_SIGN'
23
- ETH_SENDER= 'EE_ETH_SENDER'
24
-
25
-
26
- class BCct:
27
- SIGN = BCctbase.SIGN
28
- SENDER = BCctbase.SENDER
29
- HASH = BCctbase.HASH
30
- ETH_SIGN = BCctbase.ETH_SIGN
31
- ETH_SENDER = BCctbase.ETH_SENDER
32
-
33
- ADDR_PREFIX_OLD = "aixp_"
34
- ADDR_PREFIX = "0xai_"
35
-
36
- K_USER_CONFIG_PEM_FILE = 'NAEURAL_PEM_FILE'
37
- K_PEM_FILE = 'PEM_FILE'
38
- K_PASSWORD = 'PASSWORD'
39
- K_PEM_LOCATION = 'PEM_LOCATION'
40
-
41
- ERR_UNAVL_MSG = "Missing signature/sender data"
42
- ERR_UNAVL = 1
43
-
44
- ERR_SIGN_MSG = "Bad hash"
45
- ERR_UNAVL = 1000
46
-
47
- ERR_SIGN_MSG = "Bad signature"
48
- ERR_UNAVL = 1001
49
-
50
- AUTHORISED_ADDRS = 'authorized_addrs'
51
-
52
- DEFAULT_INFO = '0xai handshake data'
17
+ from ..const.base import BCctbase, BCct
53
18
 
54
19
 
55
20
 
@@ -342,10 +307,10 @@ class BaseBlockEngine:
342
307
 
343
308
  if user_config:
344
309
  user_folder = get_user_folder()
345
- pem_fn = str(user_folder / '_naeural.pem')
310
+ pem_fn = str(user_folder / BCct.USER_PEM_FILE)
346
311
  else:
347
- pem_name = config.get(BCct.K_PEM_FILE, '_pk.pem')
348
- pem_folder = config.get(BCct.K_PEM_LOCATION, 'data')
312
+ pem_name = config.get(BCct.K_PEM_FILE, BCct.DEFAULT_PEM_FILE)
313
+ pem_folder = config.get(BCct.K_PEM_LOCATION, BCct.DEFAULT_PEM_LOCATION)
349
314
  pem_fn = os.path.join(log.get_target_folder(pem_folder), pem_name)
350
315
  #endif pem is defined in ~/.naeural/ or in the data folder of the _local_cache
351
316
  self.__pem_file = pem_fn
@@ -1,6 +1,6 @@
1
1
  from time import time
2
2
  from naeural_client.utils.config import log_with_color
3
- from naeural_client.const import SESSION_CT
3
+ from naeural_client.const import SESSION_CT, COMMANDS
4
4
 
5
5
 
6
6
  def _get_netstats(
@@ -9,6 +9,7 @@ def _get_netstats(
9
9
  allowed_only=False,
10
10
  supervisor=None,
11
11
  supervisors_only=False,
12
+ return_session=False,
12
13
  ):
13
14
  t1 = time()
14
15
  from naeural_client import Session
@@ -23,8 +24,11 @@ def _get_netstats(
23
24
  nr_supers = dct_info[SESSION_CT.NETSTATS_NR_SUPERVISORS]
24
25
  _elapsed = dct_info[SESSION_CT.NETSTATS_ELAPSED] # computed on call
25
26
  elapsed = time() - t1 # elapsed=_elapsed
27
+ if return_session:
28
+ return df, supervisor, super_alias, nr_supers, elapsed, sess
26
29
  return df, supervisor, super_alias, nr_supers, elapsed
27
30
 
31
+
28
32
  def get_nodes(args):
29
33
  """
30
34
  This function is used to get the information about the nodes and it will perform the following:
@@ -76,6 +80,40 @@ def get_supervisors(args):
76
80
  log_with_color(f"{df}")
77
81
  return
78
82
 
83
+ def _send_command_to_node(args, command):
84
+ node = args.node
85
+ silent = not args.verbose
86
+
87
+ t1 = time()
88
+ df, _, _, _, _, sess = _get_netstats(
89
+ silent=silent, online_only=True, return_session=True
90
+ )
91
+ peered = None
92
+ selection = df.Alias == node
93
+ found = selection.any()
94
+ node_addr = None
95
+ df_found = df[selection]
96
+ if found:
97
+ peered = df_found.Peered.values[0]
98
+ node_addr = df_found.Address.values[0]
99
+ log_with_color(f"{df_found}")
100
+ if not found:
101
+ log_with_color(f"Node '{node}' <{node_addr}> not found in network.", color='r')
102
+ return
103
+ if not peered:
104
+ log_with_color(f"Node '{node}' <{node_addr}> does not accept commands from this SDK.", color='r')
105
+ return
106
+ # TODO: currently this is based on node alias, but we should be based on node address
107
+ # and maybe even node alias
108
+ if command == COMMANDS.RESTART:
109
+ sess._send_command_restart_node(node)
110
+ elif command == COMMANDS.SHUTDOWN:
111
+ sess._send_command_stop_node(node)
112
+ else:
113
+ log_with_color(f"Command '{command}' not supported.", color='r')
114
+ return
115
+ elapsed = time() - t1
116
+ return
79
117
 
80
118
  def restart_node(args):
81
119
  """
@@ -86,7 +124,9 @@ def restart_node(args):
86
124
  args : argparse.Namespace
87
125
  Arguments passed to the function.
88
126
  """
89
- log_with_color(f"Restarting node {args.node} NOT IMPLEMENTED", color='r')
127
+ node = args.node
128
+ log_with_color(f"Attempting to restart node <{node}>", color='b')
129
+ _send_command_to_node(args, COMMANDS.RESTART)
90
130
  return
91
131
 
92
132
 
@@ -99,5 +139,7 @@ def shutdown_node(args):
99
139
  args : argparse.Namespace
100
140
  Arguments passed to the function.
101
141
  """
102
- log_with_color(f"Shutting down node {args.node} NOT IMPLEMENTED", color='r')
142
+ node = args.node
143
+ log_with_color(f"Attempting to shutdown node <{node}>", color='b')
144
+ _send_command_to_node(args, COMMANDS.SHUTDOWN)
103
145
  return
@@ -1,11 +1,54 @@
1
1
  EE_ID = 'EE_ID'
2
2
  SB_ID = 'SB_ID' # change to SB_ID = EE_ID post mod from sb to ee
3
3
 
4
+
5
+ class BCctbase:
6
+ SIGN = 'EE_SIGN'
7
+ SENDER = 'EE_SENDER'
8
+ HASH = 'EE_HASH'
9
+
10
+ ETH_SIGN = 'EE_ETH_SIGN'
11
+ ETH_SENDER= 'EE_ETH_SENDER'
12
+
13
+
14
+ class BCct:
15
+ SIGN = BCctbase.SIGN
16
+ SENDER = BCctbase.SENDER
17
+ HASH = BCctbase.HASH
18
+ ETH_SIGN = BCctbase.ETH_SIGN
19
+ ETH_SENDER = BCctbase.ETH_SENDER
20
+
21
+ ADDR_PREFIX_OLD = "aixp_"
22
+ ADDR_PREFIX = "0xai_"
23
+
24
+ K_USER_CONFIG_PEM_FILE = 'NAEURAL_PEM_FILE'
25
+ K_PEM_FILE = 'PEM_FILE'
26
+ K_PASSWORD = 'PASSWORD'
27
+ K_PEM_LOCATION = 'PEM_LOCATION'
28
+
29
+ ERR_UNAVL_MSG = "Missing signature/sender data"
30
+ ERR_UNAVL = 1
31
+
32
+ ERR_SIGN_MSG = "Bad hash"
33
+ ERR_UNAVL = 1000
34
+
35
+ ERR_SIGN_MSG = "Bad signature"
36
+ ERR_UNAVL = 1001
37
+
38
+ AUTHORISED_ADDRS = 'authorized_addrs'
39
+
40
+ DEFAULT_INFO = '0xai handshake data'
41
+
42
+ USER_PEM_FILE = '_naeural.pem'
43
+ DEFAULT_PEM_FILE = '_pk.pem'
44
+ DEFAULT_PEM_LOCATION = 'data'
45
+
4
46
  BLOCKCHAIN_CONFIG = {
5
- "PEM_FILE": "_pk_sdk.pem",
47
+ "PEM_FILE": BCct.DEFAULT_PEM_FILE,
6
48
  "PASSWORD": None,
7
- "PEM_LOCATION": "data"
49
+ "PEM_LOCATION": BCct.DEFAULT_PEM_LOCATION
8
50
  }
51
+
9
52
 
10
53
  class DCT_TYPES:
11
54
  VOID_PIPELINE = 'Void'
@@ -2,6 +2,13 @@ import os
2
2
  from pathlib import Path
3
3
  import shutil
4
4
 
5
+ from naeural_client.const.base import BCct
6
+
7
+
8
+ CONFIG_FILE = "config"
9
+ SDK_HOME = ".naeural"
10
+ LOCAL_PEM_PATH = "./_local_cache/_data/" + BCct.DEFAULT_PEM_FILE
11
+
5
12
  ENV_TEMPLATE = """
6
13
 
7
14
  EE_MQTT_HOST=r9092118.ala.eu-central-1.emqxsl.com
@@ -75,13 +82,13 @@ def get_user_folder():
75
82
  """
76
83
  Returns the user folder.
77
84
  """
78
- return Path.home() / ".naeural"
85
+ return Path.home() / SDK_HOME
79
86
 
80
87
  def get_user_config_file():
81
88
  """
82
89
  Returns the user configuration file.
83
90
  """
84
- return get_user_folder() / "config"
91
+ return get_user_folder() / CONFIG_FILE
85
92
 
86
93
  def reset_config(*larg, **kwargs):
87
94
  """
@@ -93,6 +100,9 @@ def reset_config(*larg, **kwargs):
93
100
  config_dir = get_user_folder()
94
101
  config_file = get_user_config_file()
95
102
 
103
+ local_pem = Path(LOCAL_PEM_PATH)
104
+ target_pem = config_dir / BCct.USER_PEM_FILE
105
+
96
106
  # Create the ~/.naeural folder if it doesn't exist
97
107
  config_dir.mkdir(parents=True, exist_ok=True)
98
108
 
@@ -115,6 +125,12 @@ def reset_config(*larg, **kwargs):
115
125
  color='y'
116
126
  )
117
127
  log_with_color(f"Please UPDATE the configuration in the file {config_file}", color='b')
128
+
129
+ if local_pem.exists():
130
+ log_with_color(f"Copying local PEM file {local_pem} to {target_pem}", color='y')
131
+ shutil.copy(local_pem, target_pem)
132
+ else:
133
+ log_with_color(f"No local PEM file found at {local_pem}. A default private key will be generated.", color='r')
118
134
  return
119
135
 
120
136
  def show_address(args):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: naeural_client
3
- Version: 2.5.25
3
+ Version: 2.5.26
4
4
  Summary: `naeural_client` is the Python SDK required for client app development for the Naeural Edge Protocol Edge Protocol framework
5
5
  Project-URL: Homepage, https://github.com/NaeuralEdgeProtocol/naeural_client
6
6
  Project-URL: Bug Tracker, https://github.com/NaeuralEdgeProtocol/naeural_client/issues
@@ -1,10 +1,10 @@
1
1
  naeural_client/__init__.py,sha256=YimqgDbjLuywsf8zCWE0EaUXH4MBUrqLxt0TDV558hQ,632
2
- naeural_client/_ver.py,sha256=6QtP9dMRiht8zahEPh2LyBsQbGXHEmKaPyPjY1Y1Te4,331
2
+ naeural_client/_ver.py,sha256=8hHk58mquJxWggJKicLlNUEf81FcB_OM-4VuQOLyG8E,331
3
3
  naeural_client/base_decentra_object.py,sha256=C4iwZTkhKNBS4VHlJs5DfElRYLo4Q9l1V1DNVSk1fyQ,4412
4
4
  naeural_client/plugins_manager_mixin.py,sha256=X1JdGLDz0gN1rPnTN_5mJXR8JmqoBFQISJXmPR9yvCo,11106
5
5
  naeural_client/base/__init__.py,sha256=hACh83_cIv7-PwYMM3bQm2IBmNqiHw-3PAfDfAEKz9A,259
6
6
  naeural_client/base/distributed_custom_code_presets.py,sha256=cvz5R88P6Z5V61Ce1vHVVh8bOkgXd6gve_vdESDNAsg,2544
7
- naeural_client/base/generic_session.py,sha256=Yo65LwSS3R3-ahQlAtXoNsnQHMAEYCFtPGrvYumwgHs,89524
7
+ naeural_client/base/generic_session.py,sha256=TAfLadFrvSO_IPsrY4vRm8qLHtDNzW0Nq7pux32Wch4,91555
8
8
  naeural_client/base/instance.py,sha256=kcZJmjLBtx8Bjj_ysIOx1JmLA-qSpG7E28j5rq6IYus,20444
9
9
  naeural_client/base/pipeline.py,sha256=b4uNHrEIOlAtw4PGUx20dxwBhDck5__SrVXaHcSi8ZA,58251
10
10
  naeural_client/base/plugin_template.py,sha256=qGaXByd_JZFpjvH9GXNbT7KaitRxIJB6-1IhbKrZjq4,138123
@@ -14,7 +14,7 @@ naeural_client/base/webapp_pipeline.py,sha256=QmPLVmhP0CPdi0YuvbZEH4APYz2Amtw3gy
14
14
  naeural_client/base/payload/__init__.py,sha256=y8fBI8tG2ObNfaXFWjyWZXwu878FRYj_I8GIbHT4GKE,29
15
15
  naeural_client/base/payload/payload.py,sha256=x-au7l67Z_vfn_4R2C_pjZCaFuUVXHngJiGOfIAYVdE,2690
16
16
  naeural_client/bc/__init__.py,sha256=FQj23D1PrY06NUOARiKQi4cdj0-VxnoYgYDEht8lpr8,158
17
- naeural_client/bc/base.py,sha256=G-NYWhQaFHlHrKF01M7hOgXOKRsOtjcjJYjoxamYLbQ,32990
17
+ naeural_client/bc/base.py,sha256=Nd0THGidmlLZOD8k8vwldQqIZ_LnvMgAE6l5U5OA45E,32286
18
18
  naeural_client/bc/chain.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  naeural_client/bc/ec.py,sha256=mWjodWCRgC3omVXOA9jtNdtPVNn2kMKV3Dcjt9oFUCQ,22974
20
20
  naeural_client/certs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -22,7 +22,7 @@ naeural_client/certs/r9092118.ala.eu-central-1.emqxsl.com.crt,sha256=y-6io0tseyx
22
22
  naeural_client/cli/README.md,sha256=WPdI_EjzAbUW1aPyj1sSR8rLydcJKZtoiaEtklQrjHo,74
23
23
  naeural_client/cli/cli.py,sha256=Lo5qsANtjvWP0CG2BxIdYF8QLSpUQoLmYIgCGCVZp9Y,3808
24
24
  naeural_client/cli/cli_commands.py,sha256=Y81oKz5Rx8qxYgzEzCwI9eB8iVL6iET7dETLVygs_VE,1686
25
- naeural_client/cli/nodes.py,sha256=lC6M2ODPyt_ciGIAqz0IJOm9s5PpGWy-gpFdRYlvNuI,3248
25
+ naeural_client/cli/nodes.py,sha256=Oq7bh7kkU79doBLEa8ANU6OiWv83mJvyjFyZqwpKx1s,4595
26
26
  naeural_client/code_cheker/__init__.py,sha256=pwkdeZGVL16ZA4Qf2mRahEhoOvKhL7FyuQbMFLr1E5M,33
27
27
  naeural_client/code_cheker/base.py,sha256=lT5DRIFO5rqzsMNCmdMRfkAeevmezozehyfgmhnKpuI,19074
28
28
  naeural_client/code_cheker/checker.py,sha256=QWupeM7ToancVIq1tRUxRNUrI8B5l5eoY0kDU4-O5aE,7365
@@ -32,7 +32,7 @@ naeural_client/comm/mqtt_wrapper.py,sha256=Ig3bFZkCbWd4y_Whn2PPa91Z3aLgNbNPau6Tn
32
32
  naeural_client/const/README.md,sha256=6OHesr-f5NBuuJGryEoi_TCu2XdlhfQYlDKx_IJoXeg,177
33
33
  naeural_client/const/__init__.py,sha256=MM6Zib6i7M2qWcMkLtLx14zqU-lE-u2uPHjNvbh2jAM,478
34
34
  naeural_client/const/apps.py,sha256=gIONTZUkqPveu3DwelyJWpbFMeIR9l6DlaNg-xEfK1A,611
35
- naeural_client/const/base.py,sha256=-NeZPwE0JrbTHmlI9BOmgzaGu5jUZHl9vOZ4hhh_QQo,3100
35
+ naeural_client/const/base.py,sha256=oO7FIdk7Q56xFDWNLlayPFGXmwpB2pDIU-r8VI5cGmM,4012
36
36
  naeural_client/const/comms.py,sha256=La6JXWHexH8CfcBCKyT4fCIoeaoZlcm7KtZ57ab4ZgU,2201
37
37
  naeural_client/const/environment.py,sha256=iytmTDgbOjvORPwHQmc0K0r-xJx7dnnzNnqAJJiFCDA,870
38
38
  naeural_client/const/formatter.py,sha256=AW3bWlqf39uaqV4BBUuW95qKYfF2OkkU4f9hy3kSVhM,200
@@ -79,10 +79,10 @@ naeural_client/logging/tzlocal/win32.py,sha256=zBoj0vFVrGhnCm_f7xmYzGym4-fV-4Ij2
79
79
  naeural_client/logging/tzlocal/windows_tz.py,sha256=Sv9okktjZJfRGGUOOppsvQuX_eXyXUxkSKCAFmWT9Hw,34203
80
80
  naeural_client/utils/__init__.py,sha256=mAnke3-MeRzz3nhQvhuHqLnpaaCSmDxicd7Ck9uwpmI,77
81
81
  naeural_client/utils/comm_utils.py,sha256=4cS9llRr_pK_3rNgDcRMCQwYPO0kcNU7AdWy_LtMyCY,1072
82
- naeural_client/utils/config.py,sha256=m1O6D7jE_vVpWM7kd2ZEs9JOKlM9yMDy5YDcf8vElWo,5357
82
+ naeural_client/utils/config.py,sha256=JfW2gMQMYx9NzF2M4mJpioXawDHcOQ3deJprpCRtdOI,5874
83
83
  naeural_client/utils/dotenv.py,sha256=_AgSo35n7EnQv5yDyu7C7i0kHragLJoCGydHjvOkrYY,2008
84
- naeural_client-2.5.25.dist-info/METADATA,sha256=BMinzTJ7I9xgtc2--6qM2fkxNjiUxUQg7MyE1C_fjT4,14619
85
- naeural_client-2.5.25.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
86
- naeural_client-2.5.25.dist-info/entry_points.txt,sha256=PNdyotDaQBAslZREx5luVyj0kqpQnwNACwkFNTPIHU4,55
87
- naeural_client-2.5.25.dist-info/licenses/LICENSE,sha256=cvOsJVslde4oIaTCadabXnPqZmzcBO2f2zwXZRmJEbE,11311
88
- naeural_client-2.5.25.dist-info/RECORD,,
84
+ naeural_client-2.5.26.dist-info/METADATA,sha256=_KG-9kNCy1R0hjdpfHNBG2PnnSh6i73ICp3N-Pz-hvQ,14619
85
+ naeural_client-2.5.26.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
86
+ naeural_client-2.5.26.dist-info/entry_points.txt,sha256=PNdyotDaQBAslZREx5luVyj0kqpQnwNACwkFNTPIHU4,55
87
+ naeural_client-2.5.26.dist-info/licenses/LICENSE,sha256=cvOsJVslde4oIaTCadabXnPqZmzcBO2f2zwXZRmJEbE,11311
88
+ naeural_client-2.5.26.dist-info/RECORD,,