Split Loader.py 3

This commit is contained in:
Nourepide
2023-12-16 04:59:53 +03:00
parent d94cebcc1b
commit 2dcd401955
5 changed files with 101 additions and 85 deletions
+2 -2
View File
@@ -11,7 +11,7 @@ config = Config(logger).initiate()
backends = Backends(logger).initiate()
Update(logger, config, backends).initiate()
Paths(logger, config).initiate()
Override(logger, config).initiate()
Paths(logger, config, backends).initiate()
Override(logger, config, backends).initiate()
NODE_CLASS_MAPPINGS = Modules(logger, config, backends).initiate()
+4 -3
View File
@@ -1,7 +1,8 @@
import importlib
from importlib import import_module
class Backends:
COMFY_UI = "main"
TORCH = "torch"
NUMPY = "numpy"
CV2 = "cv2"
@@ -11,14 +12,14 @@ class Backends:
def __init__(self, logger):
self.__logger = logger
self.__backends = [Backends.TORCH, Backends.NUMPY, Backends.CV2, Backends.PIL, Backends.REMBG, Backends.GIT]
self.__backends = [Backends.COMFY_UI, Backends.TORCH, Backends.NUMPY, Backends.CV2, Backends.PIL, Backends.REMBG, Backends.GIT]
def initiate(self):
dependencies = {}
for backend in self.__backends:
try:
importlib.import_module(backend)
import_module(backend)
dependencies[backend] = True
except ImportError:
self.__logger.error(f"Loading {backend} library ended with an error.")
+2 -2
View File
@@ -1,11 +1,11 @@
import nodes
from .Logger import Logger
class Override:
def __init__(self, logger, config):
def __init__(self, logger, config, backends):
self.__logger = logger
self.__config = config
self.__backends = backends
def initiate(self):
override_nodes_len = 0
+29 -33
View File
@@ -1,56 +1,52 @@
import os
import platform
from datetime import datetime
from importlib import import_module
from pathlib import Path
import folder_paths
from .Backends import Backends
class Paths:
ROOT_PATH = Path(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
TEMPLATE_PATH = ROOT_PATH / "resources/template.json"
TIMESTAMP_PATH = ROOT_PATH / "resources/timestamp.json"
INFO_PATH = ROOT_PATH / "resources/info.json"
ROOT_PATH = Path(__file__).resolve().parent.parent
RESOURCE_PATH = ROOT_PATH / "resources"
TEMPLATE_PATH = RESOURCE_PATH / "template.json"
TIMESTAMP_PATH = RESOURCE_PATH / "timestamp.json"
INFO_PATH = RESOURCE_PATH / "info.json"
LOG_PATH = RESOURCE_PATH / f"logs/log_{datetime.now().strftime('%Y_%m_%d_%H_%M_%S')}.log"
CONFIG_PATH = ROOT_PATH / "config.json"
GIT_PATH = ROOT_PATH / ".git"
LOG_PATH = ROOT_PATH / f"resources/logs/log_{datetime.now().strftime('%Y_%m_%d_%H_%M_%S')}.log"
def __init__(self, logger, config):
def __init__(self, logger, config, backends):
self.__logger = logger
self.__config = config
self.__backends = backends
def initiate(self):
fonts_folder_path = self.__get_fonts_folder_path()
if self.__backends[Backends.COMFY_UI]:
folder_paths = import_module("folder_paths")
fonts_folder_path = self.__get_font_paths(folder_paths)
os.environ["U2NET_HOME"] = folder_paths.models_dir + "/onnx"
os.environ["U2NET_HOME"] = str(Path(folder_paths.models_dir) / "onnx")
folder_paths.folder_names_and_paths["onnx"] = ([os.path.join(folder_paths.models_dir, "onnx")], {".onnx"})
folder_paths.folder_names_and_paths["fonts"] = (fonts_folder_path, {".otf", ".ttf"})
folder_paths.folder_names_and_paths.update({
"onnx": ([Path(folder_paths.models_dir) / "onnx"], {".onnx"}),
"fonts": (fonts_folder_path, {".otf", ".ttf"})
})
def __get_fonts_folder_path(self):
def __get_font_paths(self, folder_paths):
system = platform.system()
user_home = os.path.expanduser('~')
user_home = Path.home()
config_font_path = os.path.join(folder_paths.base_path, *self.__config["fonts"]["folder_path"].replace("\\", "/").split("/"))
config_font_path = Path(folder_paths.base_path) / Path(self.__config["fonts"]["folder_path"].replace("\\", "/"))
config_font_path.mkdir(parents=True, exist_ok=True)
if not os.path.exists(config_font_path):
os.makedirs(config_font_path, exist_ok=True)
system_fonts_paths = {
"Windows": [Path(os.environ.get("WINDIR", "")) / "Fonts"],
"Darwin": [Path("/Library") / "Fonts", user_home / "Library" / "Fonts"],
"Linux": [Path("/usr") / "share" / "fonts", Path("/usr") / "local" / "share" / "fonts", user_home / ".fonts"]
}
paths = [config_font_path]
paths = [config_font_path] + system_fonts_paths.get(system, [])
if self.__config["fonts"]["system_fonts"]:
if system == "Windows":
paths.append(os.path.join(os.environ["WINDIR"], "Fonts"))
elif system == "Darwin":
paths.append(os.path.join("/Library", "Fonts"))
elif system == "Linux":
paths.append(os.path.join("/usr", "share", "fonts"))
paths.append(os.path.join("/usr", "local", "share", "fonts"))
if self.__config["fonts"]["user_fonts"]:
if system == "Darwin":
paths.append(os.path.join(user_home, "Library", "Fonts"))
elif system == "Linux":
paths.append(os.path.join(user_home, ".fonts"))
return [path for path in paths if os.path.exists(path)]
return [str(path) for path in paths if path.exists()]
+64 -45
View File
@@ -1,5 +1,6 @@
import json
import time
from importlib import import_module
from .Backends import Backends
from .Paths import Paths
@@ -15,14 +16,14 @@ class Update:
self.__config = config
self.__backends = backends
if not Paths.CONFIG_PATH.exists():
if not Paths.TIMESTAMP_PATH.exists():
self.__logger.info("Creating timestamp file.")
self.__create_timestamp()
self.__timestamp = self.__get_timestamp()
def initiate(self):
confirm_unstable_agreement = self.__config["logger"]["confirm_unstable"]
confirm_unstable = self.__config["logger"]["confirm_unstable"]
branch_name = self.__config["updates"]["branch_name"]
search_frequency = self.__config["updates"]["search_frequency"].lower()
time_difference = time.time() - self.__timestamp["timestamp"]
@@ -35,23 +36,26 @@ class Update:
"never": False
}
try:
it_is_time_for_update = valid_frequencies[search_frequency]
except KeyError:
self.__logger.error(f"Unknown update frequency - {search_frequency}, available: {list(valid_frequencies.keys())}")
return
if not confirm_unstable_agreement and branch_name == "main" and search_frequency != "never":
if not confirm_unstable and branch_name == "main" and search_frequency != "never":
self.__logger.warning_unstable_branch(branch_name)
if it_is_time_for_update:
if not (Paths.GIT_PATH.exists() and Paths.GIT_PATH.is_dir()):
self.__logger.error("Root directory of Allor is not a git repository. Update canceled.")
if self.__backends[Backends.GIT]:
if Paths.GIT_PATH.exists() and Paths.GIT_PATH.is_dir():
repo = self.__repo()
return
self.__checkout(repo, branch_name)
self.__update_allor(branch_name)
try:
update_scheduled = valid_frequencies[search_frequency]
if update_scheduled:
self.__pull(repo, branch_name)
except KeyError:
self.__logger.error(f"Unknown update frequency - {search_frequency}, available: {list(valid_frequencies.keys())}")
else:
self.__logger.error("Update canceled because Allor is not a git repository.")
else:
self.__logger.error("Update canceled because GitPython is not installed.")
def __get_timestamp(self):
with open(Paths.TIMESTAMP_PATH, "r") as f:
@@ -65,46 +69,60 @@ class Update:
with open(Paths.TIMESTAMP_PATH, "w", encoding="utf-8") as f:
json.dump({"timestamp": time.time()}, f, ensure_ascii=False, indent=4)
def __update_allor(self, branch_name):
if self.__backends[Backends.GIT]:
import git
def __repo(self):
git = import_module("git")
repo = git.Repo
from git import Repo
from git import GitCommandError
return repo(Paths.ROOT_PATH, odbt=git.db.GitDB)
# noinspection PyTypeChecker, PyUnboundLocalVariable
repo = Repo(Paths.ROOT_PATH, odbt=git.db.GitDB)
current_commit = repo.head.commit.hexsha
def __checkout(self, repo, branch_name):
from git import GitCommandError
if repo.active_branch.name != branch_name:
if any([branch.name == branch_name for branch in repo.branches]):
try:
update_mode = self.__config["updates"]["update_mode"].lower()
valid_modes = ["soft", "hard"]
if update_mode == "soft":
repo.git.checkout(branch_name)
elif update_mode == "hard":
repo.git.checkout(branch_name, force=True)
else:
self.__logger.error(f"Unknown update mode - {update_mode}, available: {valid_modes}")
except GitCommandError:
self.__logger.error(f"An error occurred while switching to the branch {branch_name}.")
else:
self.__logger.error(f"Branch with name {branch_name} not exist.")
def __pull(self, repo, branch_name):
from git import GitCommandError
try:
repo.remotes.origin.fetch()
latest_commit = getattr(repo.remotes.origin.refs, branch_name).commit.hexsha
local_commits = list(repo.iter_commits(branch_name))[::-1]
remote_commits = list(repo.iter_commits(f"origin/{branch_name}"))[::-1]
if current_commit == latest_commit:
self.__logger.info("New updates not found.", self.__config["logger"]["updates_search"])
incorrect_hex = any(lc != rc for lc, rc in zip(local_commits, remote_commits))
if incorrect_hex:
new_remote_commits = []
else:
self.__logger.info("New updates are available.", self.__config["logger"]["updates_search"])
last_hex = next((i for i, (lc, rc) in enumerate(zip(local_commits, remote_commits)) if lc != rc), len(local_commits))
new_remote_commits = remote_commits[last_hex:] if len(remote_commits) > len(local_commits) else []
if incorrect_hex or new_remote_commits:
if self.__config["updates"]["install_update"]:
update_mode = self.__config["updates"]["update_mode"].lower()
valid_modes = ["soft", "hard"]
if repo.active_branch.name != branch_name:
try:
repo.git.checkout(branch_name)
except GitCommandError:
self.__logger.error(f"An error occurred while switching to the branch {branch_name}.")
return
if update_mode == "soft":
try:
repo.git.pull()
except GitCommandError:
self.__logger.error("An error occurred during the update. \n"
"It is recommended to use \"hard\" update mode. \n"
"But be careful, it erases all personal changes from Allor repository.")
if incorrect_hex:
self.__logger.warn("Incorrect hex of commits found in commits repository history.\n"
"Updating using \"soft\" update mode is unlikely to complete successfully.")
repo.git.pull()
elif update_mode == "hard":
repo.git.reset('--hard', 'origin/' + branch_name)
else:
@@ -112,8 +130,9 @@ class Update:
return
self.__update_timestamp()
self.__logger.info("Updates installed successfully.", self.__config["logger"]["install_complete"])
self.__update_timestamp()
else:
self.__logger.error("Update canceled because GitPython is not installed.")
except GitCommandError:
self.__logger.error("An error occurred during the updating.\n"
"It is recommended to use \"hard\" update mode.\n"
"But be careful, it erases all personal changes from Allor repository.")