Bugfix: Release procedure fix (#1988)

* fix data-loading code for pyinstaller binary

* more info at buildtime

* more info

* bugfix: str used wrong

* black

Co-authored-by: k9ert <kim@swanbitcoin.com>
Co-authored-by: Manolis Mandrapilias <70536101+moneymanolis@users.noreply.github.com>
This commit is contained in:
k9ert 2022-11-29 08:49:35 -08:00 committed by GitHub
parent 65c45281c7
commit bf4413587a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 58 additions and 16 deletions

View file

@ -10,7 +10,7 @@ from typing import Dict, List
from cryptoadvance.specter.config import ProductionConfig
from cryptoadvance.specter.device import Device
from cryptoadvance.specter.specter_error import SpecterError
from cryptoadvance.specter.specter_error import SpecterError, SpecterInternalException
from cryptoadvance.specter.user import User
from cryptoadvance.specter.util.reflection import get_template_static_folder
from flask import current_app as app
@ -393,18 +393,25 @@ class ServiceManager:
Path(Path(_get_module_from_class(clazz).__file__).parent, x)
for clazz in get_subclasses_for_clazz(Service)
]
logger.debug(f"Initial arr:")
logger.info(f"Initial arr:")
for element in arr:
logger.debug(element)
logger.info(element)
# /home/kim/src/specter-desktop/.buildenv/lib/python3.8/site-packages/cryptoadvance/specter/services/bitcoinreserve/templates
# /home/kim/src/specter-desktop/.buildenv/lib/python3.8/site-packages/cryptoadvance/specter/services/swan/templates
# filter only directories
arr = [path for path in arr if path.is_dir()]
# Those pathes are absolute. Let's make them relative:
arr = [Path(*path.parts[-6:]) for path in arr]
arr = [cls._make_path_relative(path) for path in arr]
# result:
# site-package/cryptoadvance/specterext/devhelp/templates
logger.info(f"After making the pathes relative, example: {arr[0]}")
virtuelenv_path = os.path.relpath(os.environ["VIRTUAL_ENV"], ".")
logger.info(f"virtuelenv_path: {virtuelenv_path}")
if os.name == "nt":
virtualenv_search_path = Path(virtuelenv_path, "Lib")
else:
@ -421,10 +428,13 @@ class ServiceManager:
src_org_specterext_exts = search_dirs_in_path(
virtualenv_search_path, return_without_extid=False
)
logger.info(f"src_org_specterext_exts[0]: {src_org_specterext_exts[0]}")
src_org_specterext_exts = [Path(path, x) for path in src_org_specterext_exts]
arr.extend(src_org_specterext_exts)
logger.debug(f"Returning example: {arr[0]}")
return arr
@classmethod
@ -489,3 +499,22 @@ class ServiceManager:
except ModuleNotFoundError as e:
pass
return arr
@classmethod
def _make_path_relative(cls, path: Path) -> Path:
"""make out of something like '# /home/kim/src/specter-desktop/.buildenv/lib/python3.8/site-packages/cryptoadvance/specter/services/swan/templates
somethink like: cryptoadvance/specter/services/swan/templates
The first part might be completely random. The marker is something like .*env
"""
index = 0
sep_index = 0
for part in path.parts:
if part.endswith("site-packages"):
sep_index = index
index += 1
if sep_index == 0:
raise SpecterInternalException(
f"Path {path} does not contain an environment directory!"
)
return Path(*path.parts[sep_index:index])

View file

@ -175,7 +175,7 @@ def get_subclasses_for_clazz(clazz, package_dirs: List[str] = None):
# skip known redherrings
if module_name in ["callbacks"]:
continue
logger.debug(
logger.info(
f"Iterating on importer={importer} , module_name={module_name} is_pkg={is_pkg}"
)
if clazz.__name__ == "Service":
@ -186,16 +186,16 @@ def get_subclasses_for_clazz(clazz, package_dirs: List[str] = None):
continue
try:
module = import_module(f"{module_name}.service")
logger.debug(f" Imported {module_name}.service")
logger.info(f" Imported {module_name}.service")
except ModuleNotFoundError as e:
try:
# Another style is orgname.specterext.extensionid, for that we have to guess the orgname:
orgname = str(importer).split(os.path.sep)[-2]
logger.debug(f"guessing orgname: {orgname}")
orgname = importer.path.split(os.path.sep)[-2]
logger.info(f"guessing orgname: {orgname}")
module = import_module(
f"{orgname}.specterext.{module_name}.service"
)
logger.debug(
logger.info(
f" Imported {orgname}.specterext.{module_name}.service"
)
except ModuleNotFoundError as e:

View file

@ -1,6 +1,7 @@
import logging
import sys
import pytest
from pathlib import PosixPath, Path
import os
from unittest.mock import MagicMock
from flask import Flask
@ -36,22 +37,19 @@ def test_ServiceManager_get_service_x_dirs(caplog):
)
# however, in the real build, you get something like:
# ../.buildenv/lib/python3.8/site-packages/cryptoadvance/specter/services/swan/templates
assert f"{expected_folder}/cryptoadvance/specter/services/swan/templates" in [
assert f"{expected_folder}/cryptoadvance/specterext/swan/templates" in [
str(dir) for dir in dirs
]
for path in dirs:
assert str(path).endswith("templates")
dirs = ServiceManager.get_service_x_dirs("static")
assert f"{expected_folder}/cryptoadvance/specter/services/swan/static" in [
assert f"{expected_folder}/cryptoadvance/specterext/swan/static" in [
str(dir) for dir in dirs
]
assert (
f"{expected_folder}/cryptoadvance/specter/services/bitcoinreserve/static"
in [str(dir) for dir in dirs]
)
print(dirs)
assert len(dirs) >= 2
assert len(dirs) >= 2000
assert False
finally:
os.chdir("../")
@ -64,6 +62,21 @@ def test_ServiceManager_get_service_packages(caplog):
assert "cryptoadvance.specterext.electrum.devices.electrum" in packages
def test_ServiceManager_make_path_relative(caplog):
caplog.set_level(logging.DEBUG)
arr = [
Path(
"/home/kim/src/specter-desktop/.buildenv/lib/python3.8/site-packages/cryptoadvance/specter/services/swan/templates"
),
Path("wurstbrot/something/.env/site-packages/the_rest"),
]
arr = [ServiceManager._make_path_relative(path) for path in arr]
assert arr[0] == PosixPath(
"site-packages/cryptoadvance/specter/services/swan/templates"
)
assert arr[1] == PosixPath("site-packages/the_rest")
@pytest.fixture
def mock_specter():
specter_mock = MagicMock()