From e9ed89cbb1a04d95ffaf4bbcfa157d76ff422e47 Mon Sep 17 00:00:00 2001 From: Kim Neunert Date: Wed, 13 Nov 2019 15:56:29 +0100 Subject: [PATCH] Improve testability and file-structure --- .gitignore | 3 +++ DEVELOPMENT.md | 5 ++++ README.md | 10 ++++++++ requirements.txt | 1 + setup.py | 9 +++++++ descriptor.py => src/descriptor.py | 0 helpers.py => src/helpers.py | 0 rpc.py => src/rpc.py | 0 rpctest.py => src/rpctest.py | 0 serializations.py => src/serializations.py | 0 server.py => src/server.py | 4 +-- specter.py => src/specter.py | 0 {views => src/views}/__init__.py | 0 {views => src/views}/hwi.py | 0 tests/test_specter.py | 30 ++++++++++++++++++++++ 15 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 DEVELOPMENT.md create mode 100644 setup.py rename descriptor.py => src/descriptor.py (100%) rename helpers.py => src/helpers.py (100%) rename rpc.py => src/rpc.py (100%) rename rpctest.py => src/rpctest.py (100%) rename serializations.py => src/serializations.py (100%) rename server.py => src/server.py (99%) rename specter.py => src/specter.py (100%) rename {views => src/views}/__init__.py (100%) rename {views => src/views}/hwi.py (100%) create mode 100644 tests/test_specter.py diff --git a/.gitignore b/.gitignore index e21b8e885..6971c87ec 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,6 @@ __pycache__ .env .tor_service_key +build +dist +*.egg-info diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 000000000..3c2dfa00e --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,5 @@ +# General File Layout +Python/flask is not very opinionated and everything is possible. After reading (this)[https://blog.ionelmc.ro/2014/05/25/python-packaging/#the-structure] and (this)[https://blog.ionelmc.ro/2014/05/25/python-packaging/#the-structure] we decided for the "src-approach", at least the most obvious parts of it. + +setup.py is not (yet) as complex as listed there and setup.cfg is not even (yet?!) existing. +If you see this to need some improvements, please make it in small steps and explain what the benefits of all of that. diff --git a/README.md b/README.md index e25d83e8b..5e65a2bc4 100755 --- a/README.md +++ b/README.md @@ -24,6 +24,9 @@ HWI support requires `libusb` (necessary? Or is `pip install libusb1` sufficient ``` git clone https://github.com/cryptoadvance/specter-desktop.git +cd specter-desktop +virtualenv --python=python3 .env +source .env/bin/activate pip3 install -r requirements.txt ``` @@ -34,6 +37,13 @@ cd specter-desktop python3 server.py ``` +Run the tests (still very limited): + +``` +pip3 install -e . +pytest +``` + If your Bitcoin Core is using a default data folder the app should detect it automatically. If not, consider setting `rpcuser` and `rpcpassword` in the `bitcoin.conf` file and in the app settings. ## A few screenshots diff --git a/requirements.txt b/requirements.txt index ca451a6e2..e640347cb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -23,3 +23,4 @@ stem==1.7.1 typing-extensions==3.7.4 urllib3==1.25.6 Werkzeug==0.16.0 +pytest==5.2.2 \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 000000000..e86d46707 --- /dev/null +++ b/setup.py @@ -0,0 +1,9 @@ +from setuptools import setup, find_packages +from glob import glob + + +setup( + name="specter-desktop", + packages=find_packages('src'), + package_dir={'': 'src'} +) \ No newline at end of file diff --git a/descriptor.py b/src/descriptor.py similarity index 100% rename from descriptor.py rename to src/descriptor.py diff --git a/helpers.py b/src/helpers.py similarity index 100% rename from helpers.py rename to src/helpers.py diff --git a/rpc.py b/src/rpc.py similarity index 100% rename from rpc.py rename to src/rpc.py diff --git a/rpctest.py b/src/rpctest.py similarity index 100% rename from rpctest.py rename to src/rpctest.py diff --git a/serializations.py b/src/serializations.py similarity index 100% rename from serializations.py rename to src/serializations.py diff --git a/server.py b/src/server.py similarity index 99% rename from server.py rename to src/server.py index c4937ce3c..5c0842aa8 100644 --- a/server.py +++ b/src/server.py @@ -28,7 +28,7 @@ if getattr(sys, 'frozen', False): static_folder = os.path.join(sys._MEIPASS, 'static') app = Flask(__name__, template_folder=template_folder, static_folder=static_folder) else: - app = Flask(__name__) + app = Flask(__name__, template_folder="../templates", static_folder="../static") QRcode(app) # enable qr codes generation DATA_FOLDER = "~/.specter" @@ -506,7 +506,7 @@ if __name__ == '__main__': app.specter = specter # watch templates folder to reload when something changes - extra_dirs = ['templates'] + extra_dirs = ['../templates'] extra_files = extra_dirs[:] for extra_dir in extra_dirs: for dirname, dirs, files in os.walk(extra_dir): diff --git a/specter.py b/src/specter.py similarity index 100% rename from specter.py rename to src/specter.py diff --git a/views/__init__.py b/src/views/__init__.py similarity index 100% rename from views/__init__.py rename to src/views/__init__.py diff --git a/views/hwi.py b/src/views/hwi.py similarity index 100% rename from views/hwi.py rename to src/views/hwi.py diff --git a/tests/test_specter.py b/tests/test_specter.py new file mode 100644 index 000000000..f703ca7a2 --- /dev/null +++ b/tests/test_specter.py @@ -0,0 +1,30 @@ +''' Tests for lovac.models ''' +import shutil +import pytest +from specter import Specter, alias + +@pytest.fixture +def specter_not_configured(): + # Make sure that this folder never ever gets a reasonable non-testing use-case + data_folder = './test_specter_data_2789334' + shutil.rmtree(data_folder, ignore_errors=True) + yield Specter(data_folder=data_folder) + shutil.rmtree(data_folder, ignore_errors=True) + + +def test_alias(): + assert alias("wurst 1") == "wurst_1" + assert alias("wurst_1") == "wurst_1" + assert alias("Wurst$ 1") == "wurst_1" + +def test_specter_permrights(): + with pytest.raises(Exception): + Specter("/notexisting_directory") + +def test_specter(specter_not_configured): + specter_not_configured.check() + assert specter_not_configured.wallets is not None + assert specter_not_configured.devices is not None + some_json = specter_not_configured.test_rpc() + assert some_json["out"] == "" + assert some_json["err"] == "autodetect failed" \ No newline at end of file