mllm-streamlit/lib/helpers.py

177 lines
4.4 KiB
Python

import sys
import os
import re
import random
import json
import datetime
from pathlib import Path
def sort_by_key(arr, key):
output = None
if key in arr.keys():
output = arr[key]
if output == True: output = 1
if output == False: output = 0
if output is not None:
return output
return 0
def mkdir(dir_path):
path_object = Path(dir_path)
path_object.mkdir(parents=True, exist_ok=True)
def touch(file_path, default_content=""):
path_object = Path(file_path)
path_object.parent.mkdir(parents=True, exist_ok=True)
if not os.path.exists(file_path):
with open(file_path, "w") as file_handle:
file_handle.write(default_content)
def generate_token():
character_set = "0123456789abcdefghijklmnopqrstuvwxyz"
output_token = ""
for i in range(32):
output_token = output_token + random.choice(character_set)
timestamp = datetime.datetime.now().strftime("y%Ym%md%dh%Hm%Ms%Sms%f")
output_token = timestamp + output_token
return output_token
class JsonFile:
def __init__(self, path, defaults={}):
self.path = path
self.contents = {}
self.defaults = defaults
self.load()
def load(self):
touch(self.path, default_content="{}")
with open(self.path) as f:
f.seek(0)
self.contents = json.loads(f.read())
for k in self.defaults:
if k not in self.contents.keys():
self.contents[k] = self.defaults[k]
self.save()
def save(self):
with open(self.path, "w") as f:
f.write(json.dumps(self.contents, indent=4))
def get(self, key, default_value=None, save=False):
if key in self.contents.keys():
return self.contents[key]
else:
if save:
self.contents[key] = default_value
self.save()
return default_value
def __getitem__(self, key):
return self.get(key)
def __setitem__(self, key, value):
print(f"{self.path} setting {key} to {value}")
self.contents[key] = value
self.save()
def keys(self):
return self.contents.keys()
def widget(self, st, kind, name, key, **kwargs):
setting_key = f"setting_{key}"
value_to_render = self[key]
def on_change_internal():
val = st.session_state[setting_key]
print(f"Set {key} to {val}")
if kind == st.text_area:
if "array_separator" in extra_options.keys():
sep = extra_options["array_separator"]
val = val.strip().split(sep)
self.load()
self[key] = val
self.save()
if "on_change" in kwargs:
kwargs.get("on_change")()
if kind == st.selectbox:
options = extra_options["options"]
selected_index = 0
try:
selected_index = options.index(self[key])
except:
pass
del extra_options["options"]
kind(
name,
options=options,
index=selected_index,
key=setting_key,
on_change=on_change_internal,
**extra_options)
return
if kind == st.text_area:
if "array_separator" in extra_options.keys():
sep = extra_options["array_separator"]
value_to_render = sep.join(value_to_render)
del extra_options["array_separator"]
kind(name, value=value_to_render, key=setting_key, on_change=on_change_internal, **kwargs)
def get_next_filename(path):
if not os.path.exists(path):
return path
extension_pat = r"\.[A-Za-z0-9]{1,}$"
extension = ""
without_ext = path
if re.search(extension_pat, path):
extension = re.findall(extension_pat, without_ext)[0]
without_ext = re.sub(extension_pat, "", without_ext)
number_pat = r" [0-9]{1,}$"
number = 1
if re.search(number_pat, without_ext):
number = re.findall(number_pat, without_ext)[0]
without_ext = re.sub(number_pat, "", without_ext)
number = int(number)
number = number + 1
without_ext = f"{without_ext} {number}"
with_ext = without_ext + extension
return with_ext