osbot-utils 1.33.0__py3-none-any.whl → 1.35.0__py3-none-any.whl

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.
@@ -1,7 +1,7 @@
1
1
  from pathlib import Path
2
2
  from typing import Dict, List
3
3
  from osbot_utils.helpers.Local_Cache import Local_Cache
4
- from osbot_utils.utils.Files import current_temp_folder, path_combine,folder_exists, folder_delete
4
+ from osbot_utils.utils.Files import current_temp_folder, path_combine, folder_exists, folder_delete, file_extension
5
5
  from osbot_utils.utils.Misc import random_text
6
6
 
7
7
 
@@ -41,8 +41,9 @@ class Local_Caches:
41
41
  cache_names = []
42
42
  for f in self.path_local_caches().iterdir():
43
43
  if f.is_file():
44
- cache_name = f.name.replace('.json', '')
45
- cache_names.append(cache_name)
44
+ if file_extension(f.name) == '.json':
45
+ cache_name = f.name.replace('.json', '')
46
+ cache_names.append(cache_name)
46
47
  return cache_names
47
48
 
48
49
  #@cache_on_self
@@ -1,6 +1,7 @@
1
1
  from osbot_utils.base_classes.Type_Safe import Type_Safe
2
2
  from osbot_utils.utils.Dev import pprint
3
3
  from osbot_utils.utils.Files import files_list, file_create_from_bytes, temp_file, parent_folder, parent_folder_create
4
+ from osbot_utils.utils.Misc import random_text
4
5
  from osbot_utils.utils.Regex import list__match_regex, list__match_regexes
5
6
  from osbot_utils.utils.Zip import zip_bytes_empty, zip_bytes__files, zip_bytes__add_file, zip_bytes__add_files, \
6
7
  zip_bytes__replace_files, zip_bytes__replace_file, zip_bytes__file_list, zip_bytes__file, \
@@ -10,8 +11,8 @@ from osbot_utils.utils.Zip import zip_bytes_empty, zip_bytes__files, zip_bytes__
10
11
  class Zip_Bytes(Type_Safe):
11
12
  zip_bytes : bytes = None
12
13
 
13
- def __init__(self):
14
- super().__init__()
14
+ def __init__(self, **kwargs):
15
+ super().__init__(**kwargs)
15
16
  self.zip_bytes = zip_bytes_empty()
16
17
 
17
18
  def __enter__(self):
@@ -44,6 +45,12 @@ class Zip_Bytes(Type_Safe):
44
45
  files_to_add = list__match_regexes(all_files_in_folder, *patterns)
45
46
  return self.add_files__from_disk(base_path, files_to_add)
46
47
 
48
+ def add_random_file(self):
49
+ random_file_name = random_text('file_name' )
50
+ random_file_contents = random_text('file_contents')
51
+ self.add_file(random_file_name, random_file_contents)
52
+ return self
53
+
47
54
  def add_folder__from_disk__with_prefix(self, folder_to_add, path_prefix, *patterns):
48
55
  base_path = folder_to_add
49
56
  all_files_in_folder = files_list(folder_to_add)
@@ -101,5 +101,8 @@ class Cache__Requests__Data(Type_Safe):
101
101
 
102
102
  def response_data_serialize(self, response_data):
103
103
  if self.config.pickle_response:
104
- return pickle_save_to_bytes(response_data)
104
+ try:
105
+ return pickle_save_to_bytes(response_data)
106
+ except: # todo: look at a better way to handle this and any possible side effects (saw this with a couple boto3 class)
107
+ return None
105
108
  return response_data
@@ -1,3 +1,4 @@
1
+ import threading
1
2
  import types
2
3
 
3
4
  from osbot_utils.base_classes.Type_Safe import Type_Safe
@@ -11,6 +12,14 @@ class Cache__Requests__Invoke(Type_Safe):
11
12
  cache_data : Cache__Requests__Data
12
13
  config : Cache__Requests__Config
13
14
  on_invoke_target : types.FunctionType
15
+ cursor_thread_id : int
16
+
17
+ def __init__(self, **kwargs):
18
+ super().__init__(**kwargs)
19
+ self.cursor_thread_id = threading.get_ident() # we need to capture this to make sure we are operating on the same thread
20
+
21
+ def can_operate_in_this_thread(self):
22
+ return self.cursor_thread_id == threading.get_ident()
14
23
 
15
24
  def invoke(self, target, target_args, target_kwargs):
16
25
  return self.invoke_with_cache(target, target_args, target_kwargs)
@@ -22,7 +31,11 @@ class Cache__Requests__Invoke(Type_Safe):
22
31
  raw_response = target(*target_args, **target_kwargs)
23
32
  return self.transform_raw_response(raw_response)
24
33
 
34
+
35
+
25
36
  def invoke_with_cache(self, target, target_args, target_kwargs, request_data=None):
37
+ if self.can_operate_in_this_thread() is False: # make sure we are in the correct thread
38
+ return self.invoke_target(target, target_args, target_kwargs)
26
39
  if self.config.enabled is False:
27
40
  if self.config.cache_only_mode:
28
41
  return None
@@ -43,7 +56,8 @@ class Cache__Requests__Invoke(Type_Safe):
43
56
  try:
44
57
  response_data_obj = self.invoke_target(target, target_args, target_kwargs)
45
58
  response_data = self.cache_data.response_data_serialize(response_data_obj)
46
- self.cache_actions.cache_add(request_data=request_data, response_data=response_data)
59
+ if response_data:
60
+ self.cache_actions.cache_add(request_data=request_data, response_data=response_data)
47
61
  return response_data_obj
48
62
  except Exception as exception:
49
63
  if self.config.capture_exceptions:
@@ -124,10 +124,12 @@ class Sqlite__Database(Kwargs_To_Self):
124
124
  def tables_raw(self):
125
125
  return self.cursor().tables()
126
126
 
127
- def tables_names(self, include_sqlite_master=False):
127
+ def tables_names(self, include_sqlite_master=False, include_indexes=True):
128
128
  table_names = self.table__sqlite_master().select_field_values('name')
129
129
  if include_sqlite_master:
130
130
  table_names.append('sqlite_master')
131
+ if include_indexes is False:
132
+ return [table_name for table_name in table_names if table_name.startswith('idx') is False]
131
133
  return table_names
132
134
 
133
135
  def purge_database(self): # this fells like a better name than vacuum :)
@@ -0,0 +1,34 @@
1
+ from typing import Dict, Type
2
+
3
+ from osbot_utils.decorators.methods.cache_on_self import cache_on_self
4
+ from osbot_utils.helpers.sqlite.Sqlite__Database import Sqlite__Database
5
+ from osbot_utils.helpers.sqlite.tables.Sqlite__Table__Config import Sqlite__Table__Config, SQLITE__TABLE_NAME__CONFIG, \
6
+ Schema__Table__Config
7
+
8
+
9
+ class Sqlite__DB(Sqlite__Database):
10
+
11
+ # methods to override
12
+ def tables_to_add(self): # use this to define the tables that should be automatically created on setup
13
+ return {}
14
+
15
+ def db_not_configured(self):
16
+ return self.tables_names() == []
17
+
18
+ @cache_on_self
19
+ def table_config(self):
20
+ return Sqlite__Table__Config(database=self)
21
+
22
+
23
+
24
+ def tables_names(self, include_sqlite_master=False, include_indexes=False):
25
+ return super().tables_names(include_sqlite_master=include_sqlite_master, include_indexes=include_indexes)
26
+
27
+ def setup(self):
28
+ if self.db_not_configured():
29
+ self.table_config().setup()
30
+ for table_name, row_schema in self.tables_to_add().items():
31
+ table = self.table(table_name)
32
+ table.row_schema = row_schema
33
+ table.create()
34
+ return self
@@ -21,11 +21,18 @@ class Sqlite__DB__Files(Sqlite__DB__Local):
21
21
  def file(self, path, include_contents=False):
22
22
  return self.table_files().file(path, include_contents=include_contents)
23
23
 
24
+ def file_contents(self, path):
25
+ return self.table_files().file_contents(path)
26
+
27
+ def file__with_content(self, path):
28
+ return self.file(path, include_contents=True)
29
+
24
30
  def file_exists(self, path):
25
31
  return self.table_files().file_exists(path)
26
32
 
27
33
  def file_names(self):
28
34
  return self.table_files().select_field_values('path')
35
+
29
36
  @cache_on_self
30
37
  def table_files(self):
31
38
  return Sqlite__Table__Files(database=self).setup()
@@ -67,6 +67,12 @@ class Sqlite__Table__Files(Sqlite__Table):
67
67
  fields = self.field_names_without_content()
68
68
  return self.row(where=dict(path=path), fields = fields)
69
69
 
70
+ def file_contents(self, path):
71
+ fields = ['contents']
72
+ row = self.row(where=dict(path=path), fields = fields)
73
+ if row:
74
+ return row.get('contents')
75
+
70
76
  def file_without_contents(self, path):
71
77
  return self.file(path, include_contents=False)
72
78
 
@@ -270,7 +270,8 @@ class Files:
270
270
  if isinstance(target, Path):
271
271
  return target.is_file()
272
272
  if type(target) is str:
273
- return os.path.isfile(target)
273
+ if len(target) < 4096: # max file size in Linux (handle the cases when the file contents was used as target)
274
+ return os.path.isfile(target)
274
275
  return False
275
276
 
276
277
  @staticmethod
osbot_utils/utils/Misc.py CHANGED
@@ -174,7 +174,7 @@ def is_guid(value):
174
174
  try:
175
175
  uuid_obj = uuid.UUID(value)
176
176
  return str(uuid_obj) == value.lower()
177
- except ValueError:
177
+ except Exception:
178
178
  return False
179
179
 
180
180
 
osbot_utils/version CHANGED
@@ -1 +1 @@
1
- v1.33.0
1
+ v1.35.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: osbot_utils
3
- Version: 1.33.0
3
+ Version: 1.35.0
4
4
  Summary: OWASP Security Bot - Utils
5
5
  Home-page: https://github.com/owasp-sbot/OSBot-Utils
6
6
  License: MIT
@@ -22,7 +22,7 @@ Description-Content-Type: text/markdown
22
22
 
23
23
  Powerful Python util methods and classes that simplify common apis and tasks.
24
24
 
25
- ![Current Release](https://img.shields.io/badge/release-v1.33.0-blue)
25
+ ![Current Release](https://img.shields.io/badge/release-v1.35.0-blue)
26
26
  [![codecov](https://codecov.io/gh/owasp-sbot/OSBot-Utils/graph/badge.svg?token=GNVW0COX1N)](https://codecov.io/gh/owasp-sbot/OSBot-Utils)
27
27
 
28
28
 
@@ -59,12 +59,12 @@ osbot_utils/helpers/CPrint.py,sha256=ztKPNmT8BGxeyPXSQKRs63PqqbgxKDz_BiZmzFMup9g
59
59
  osbot_utils/helpers/Dict_To_Attr.py,sha256=NdhXl5mJH7-NaBk213amzc5Nfy3tJgW-N_uYIRE4hoc,208
60
60
  osbot_utils/helpers/Hashicorp_Secrets.py,sha256=zjXa_dQvfR9L1uoulWJ8nYYaDvznV6o_QPPS4zmb6mo,4235
61
61
  osbot_utils/helpers/Local_Cache.py,sha256=0JZZX3fFImcwtbBvxAQl-EbBegSNJRhRMYF6ovTH6zY,3141
62
- osbot_utils/helpers/Local_Caches.py,sha256=HvuP5CURyVm_fVvJX-S4dml2bhRauzgA3be237yTaeY,1814
62
+ osbot_utils/helpers/Local_Caches.py,sha256=aQmi1HSM0TH6WQPedG2fbz4KCCJ3DQTU9d18rB1jR0M,1885
63
63
  osbot_utils/helpers/Print_Table.py,sha256=LEXbyqGg_6WSraI4cob4bNNSu18ddqvALp1zGK7bPhs,19126
64
64
  osbot_utils/helpers/Python_Audit.py,sha256=shpZlluJwqJBAlad6xN01FkgC1TsQ48RLvR5ZjmrKa4,1539
65
65
  osbot_utils/helpers/Random_Seed.py,sha256=14btja8LDN9cMGWaz4fCNcMRU_eyx49gas-_PQvHgy4,634
66
66
  osbot_utils/helpers/Type_Registry.py,sha256=Ajk3SyMSKDi2g9SJYUtTgg7PZkAgydaHcpbGuEN3S94,311
67
- osbot_utils/helpers/Zip_Bytes.py,sha256=GQAwNEoMXdG7CU1RDhIJ51vkgfbJZnUxjlMUmFGHL1M,3937
67
+ osbot_utils/helpers/Zip_Bytes.py,sha256=d5hYXNOJkOaYa7h2CJ0Y3ojEuGTOvCxPuSic2quwMY4,4236
68
68
  osbot_utils/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
69
  osbot_utils/helpers/ast/Ast.py,sha256=lcPQOSxXI6zgmMnIVF9WM6ISqViWX-sq4d_UC0CDG8s,1155
70
70
  osbot_utils/helpers/ast/Ast_Base.py,sha256=5rHMupBlN_n6lOC31UnSW_lWqxqxaE31v0gn-t32OgQ,3708
@@ -144,8 +144,8 @@ osbot_utils/helpers/ast/nodes/Ast_Yield.py,sha256=7ATJnOHekV9XquMTYYSJ6xqyDvgwFc
144
144
  osbot_utils/helpers/ast/nodes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
145
145
  osbot_utils/helpers/cache_requests/Cache__Requests__Actions.py,sha256=r1CMR4qHO9is66lexJQ-BNUmBWcEjOSTG_qC0xsoorY,1228
146
146
  osbot_utils/helpers/cache_requests/Cache__Requests__Config.py,sha256=KxBjj56YTjZjKsO9TLsRfkcHYJPIGDXZ6rFskaNnh-4,935
147
- osbot_utils/helpers/cache_requests/Cache__Requests__Data.py,sha256=mx9mVGWwuixPxZmwU49Y4fUTfRaPNZosiX2PStaKBic,5284
148
- osbot_utils/helpers/cache_requests/Cache__Requests__Invoke.py,sha256=8sLJcLvxaHMnvD2gOL3kF3KR1dD2fIJq371SL9WNpRQ,2751
147
+ osbot_utils/helpers/cache_requests/Cache__Requests__Data.py,sha256=W0t4HyRgTTBbykBf_Ui9o84xLPu5ivreB-jSdOct1lc,5504
148
+ osbot_utils/helpers/cache_requests/Cache__Requests__Invoke.py,sha256=i8OiiA8afOnxVo_w9W8ySkMQygLAMMxDf3NAAmPCaE4,3348
149
149
  osbot_utils/helpers/cache_requests/Cache__Requests__Row.py,sha256=h-yc7NkpScbHwwf2km5wwKig-wLi4WuB9P4fVEdFGdM,3182
150
150
  osbot_utils/helpers/cache_requests/Cache__Requests__Table.py,sha256=RgxAYhm-FIrXXteQRtD91pOLq8JXhSzxb51Jb6MTUdY,391
151
151
  osbot_utils/helpers/cache_requests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -184,7 +184,7 @@ osbot_utils/helpers/pubsub/schemas/Schema__PubSub__Client.py,sha256=yOQSn4o1bIsE
184
184
  osbot_utils/helpers/pubsub/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
185
185
  osbot_utils/helpers/sqlite/Capture_Sqlite_Error.py,sha256=GSuRYgs1yKQjxMszPoaI7fsfMfuUqhb64AaIysRE6Cs,1747
186
186
  osbot_utils/helpers/sqlite/Sqlite__Cursor.py,sha256=k5G9Tkk3nx6nHoSanLmpuJG_TceAmN7uRBCt0bo6sIc,3364
187
- osbot_utils/helpers/sqlite/Sqlite__Database.py,sha256=XcyZ7sqXQeV0dAyERiE3kYFeMubfhKidLbrlrZXLzQI,5432
187
+ osbot_utils/helpers/sqlite/Sqlite__Database.py,sha256=AAUaUXABiL1GE7urg20YpwbFGbRvRxqvv4D7IgCgvYw,5594
188
188
  osbot_utils/helpers/sqlite/Sqlite__Field.py,sha256=oBWglAOKN0EWVtaRwiQFxmR1FQ61lQ35yKkWXjSiihs,2911
189
189
  osbot_utils/helpers/sqlite/Sqlite__Globals.py,sha256=aP6uIy_y4xzl2soTUCFIJRjsb8JyfxfL6qIEZKIWy_4,230
190
190
  osbot_utils/helpers/sqlite/Sqlite__Table.py,sha256=FsFSolFN2N5V8DfZPp4gZL9xmCXaOhmG38wQmgRrvp8,15145
@@ -200,7 +200,8 @@ osbot_utils/helpers/sqlite/cache/Sqlite__Cache__Requests__Table.py,sha256=77uO-8
200
200
  osbot_utils/helpers/sqlite/cache/Sqlite__DB__Requests.py,sha256=CWB-hTcgly2T_7HOZM5gUgfdsvgMus5nX2M_wpjVLZs,1643
201
201
  osbot_utils/helpers/sqlite/cache/TestCase__Sqlite__Cache__Requests.py,sha256=TLUdQC6vsf5BcDP15CCeoYkipVG30bzqFcqEJpH4dWg,1645
202
202
  osbot_utils/helpers/sqlite/cache/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
203
- osbot_utils/helpers/sqlite/domains/Sqlite__DB__Files.py,sha256=tirQs4VjnjzGagaT17NigqprMuQiELHm5FwAE5PJT1U,1510
203
+ osbot_utils/helpers/sqlite/domains/Sqlite__DB.py,sha256=xyXnt4-GLYqMEPBZrNPI0dZnkl61KwLEIuYjebO20Jc,1210
204
+ osbot_utils/helpers/sqlite/domains/Sqlite__DB__Files.py,sha256=IyAbtHrpovNkIXaJKQ2vcg3yqF70XLQ-5mdIiN3vSK0,1696
204
205
  osbot_utils/helpers/sqlite/domains/Sqlite__DB__Graph.py,sha256=aGykK4Qll5Rn0xJR4RvF5bN6llNEjx-Vst52XTVSNio,1751
205
206
  osbot_utils/helpers/sqlite/domains/Sqlite__DB__Json.py,sha256=ILx1wOsmwmvV2yb_fMzLzo18uGNub8cxhBrRfYxCCqA,3808
206
207
  osbot_utils/helpers/sqlite/domains/Sqlite__DB__Local.py,sha256=liN_0gyXmQyqnsmiz0RYanSCRI0VoIbwSBf4buM0l-w,1093
@@ -215,7 +216,7 @@ osbot_utils/helpers/sqlite/sql_builder/SQL_Builder__Select.py,sha256=_5fszoWTknE
215
216
  osbot_utils/helpers/sqlite/sql_builder/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
216
217
  osbot_utils/helpers/sqlite/tables/Sqlite__Table__Config.py,sha256=M-h6fYQgmX7Yaq3cSmpePutajLVeVy_IDUrDk97EH6U,2061
217
218
  osbot_utils/helpers/sqlite/tables/Sqlite__Table__Edges.py,sha256=YwlWj9GYBDeotqDFdjMOb6MyuHhPZKasndAtuHiLrkQ,1635
218
- osbot_utils/helpers/sqlite/tables/Sqlite__Table__Files.py,sha256=ZlhTqroHd9T8vqNwYpRv5cYHw7Fi-F6fxANh_Fr0nt4,3613
219
+ osbot_utils/helpers/sqlite/tables/Sqlite__Table__Files.py,sha256=4YguiuqzcfTadPWV67lN4IU_8xJzJF--ZRMqbEyzXqw,3800
219
220
  osbot_utils/helpers/sqlite/tables/Sqlite__Table__Nodes.py,sha256=GT8h3wD4hGvEtqQuBs0sBbcu2ydktRHTi95PEL2ffHQ,1721
220
221
  osbot_utils/helpers/sqlite/tables/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
221
222
  osbot_utils/helpers/ssh/SCP.py,sha256=9PgJbyWKfxJj00Ijaj7o6ffxPXuNoureb6JlHMPbHww,3330
@@ -267,14 +268,14 @@ osbot_utils/utils/Csv.py,sha256=oHLVpjRJqrLMz9lubMCNEoThXWju5rNTprcwHc1zq2c,1012
267
268
  osbot_utils/utils/Dev.py,sha256=HibpQutYy_iG8gGV8g1GztxNN4l29E4Bi7UZaVL6-L8,1203
268
269
  osbot_utils/utils/Env.py,sha256=243O6ENzaRjHXp8DIHUuv4Wfk-zHTE18KZr0cU8uWyo,5474
269
270
  osbot_utils/utils/Exceptions.py,sha256=KyOUHkXQ_6jDTq04Xm261dbEZuRidtsM4dgzNwSG8-8,389
270
- osbot_utils/utils/Files.py,sha256=RHbxq8AVdGT9S-OrxEWhNEOhbIrHDRU1UbGB1O05Ga8,21615
271
+ osbot_utils/utils/Files.py,sha256=7W0FmxPvxOapUchEVOKDgUx4JBRs9TCesu60uKkvrto,21765
271
272
  osbot_utils/utils/Functions.py,sha256=0E6alPJ0fJpBiJgFOWooCOi265wSRyxxXAJ5CELBnso,3498
272
273
  osbot_utils/utils/Http.py,sha256=WlXEfgT_NaiDVD7vCDUxy_nOm5Qf8x_L0A3zd8B5tX8,4706
273
274
  osbot_utils/utils/Int.py,sha256=PmlUdU4lSwf4gJdmTVdqclulkEp7KPCVUDO6AcISMF4,116
274
275
  osbot_utils/utils/Json.py,sha256=UNaBazuH1R40fsHjpjuK8kmAANmUHoK9Q0PUeYmgPeY,6254
275
276
  osbot_utils/utils/Json_Cache.py,sha256=mLPkkDZN-3ZVJiDvV1KBJXILtKkTZ4OepzOsDoBPhWg,2006
276
277
  osbot_utils/utils/Lists.py,sha256=CLEjgZwAixJAFlubWEKjnUUhUN85oqvR7UqExVW7rdY,5502
277
- osbot_utils/utils/Misc.py,sha256=ljscBemI5wOhfkl1BVpsqshacTOCKkOisV4er9xPCWM,16640
278
+ osbot_utils/utils/Misc.py,sha256=AN-JTs9-Em2jVyoQ6Kd7dCA0eiqVQSlXajKjKxRAhyY,16639
278
279
  osbot_utils/utils/Objects.py,sha256=qAWNLISL-gYTl1Ihj4fBSZ9I6n-p-YPUhRZu9YQwqWQ,15235
279
280
  osbot_utils/utils/Png.py,sha256=V1juGp6wkpPigMJ8HcxrPDIP4bSwu51oNkLI8YqP76Y,1172
280
281
  osbot_utils/utils/Process.py,sha256=lr3CTiEkN3EiBx3ZmzYmTKlQoPdkgZBRjPulMxG-zdo,2357
@@ -286,8 +287,8 @@ osbot_utils/utils/Toml.py,sha256=dqiegndCJF7V1YT1Tc-b0-Bl6QWyL5q30urmQwMXfMQ,140
286
287
  osbot_utils/utils/Version.py,sha256=Ww6ChwTxqp1QAcxOnztkTicShlcx6fbNsWX5xausHrg,422
287
288
  osbot_utils/utils/Zip.py,sha256=riPLKkZJxQjVu8lCm19cOTx5uiLPm1HreB9_BzNXi30,12209
288
289
  osbot_utils/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
289
- osbot_utils/version,sha256=LCHXHeXIoHB1IgQDcSOJ29BabvcFBInoVwjSZgNksPM,8
290
- osbot_utils-1.33.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
291
- osbot_utils-1.33.0.dist-info/METADATA,sha256=vumTlsU8JohmHajKceW_AGCamDQTNLgaXf6cjupa21w,1266
292
- osbot_utils-1.33.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
293
- osbot_utils-1.33.0.dist-info/RECORD,,
290
+ osbot_utils/version,sha256=g15kdH8ycbHrZuIBu1hKNt7B2bEznkpLT_dQR-2S77M,8
291
+ osbot_utils-1.35.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
292
+ osbot_utils-1.35.0.dist-info/METADATA,sha256=eW9-c4dTVc2xI7Tf-sqOrYpQOJwHw6hMUAAGRLdbWkQ,1266
293
+ osbot_utils-1.35.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
294
+ osbot_utils-1.35.0.dist-info/RECORD,,