diff --git a/.gitattributes b/.gitattributes index 5f08879f..e69de29b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +0,0 @@ -openflexure_microscope/api/static/** filter=lfs diff=lfs merge=lfs -text diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e69de29b..bd947a73 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -0,0 +1,73 @@ +stages: + - build + - deploy + + +# Cache modules in between jobs +cache: + key: ${CI_COMMIT_REF_SLUG} + paths: + - node_modules/ + + +# Electron app build +build: + stage: build + image: nikolaik/python-nodejs:python3.7-nodejs14 + + variables: + GIT_SUBMODULE_STRATEGY: recursive + + before_script: + - git submodule sync --recursive + - git submodule update --init --recursive + - curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python + + script: + # Install server + - $HOME/.poetry/bin/poetry install + # Run static build script + - $HOME/.poetry/bin/poetry run build_static + # Build distribution archive + - mkdir -p dist + - tar -c --exclude-vcs --exclude-from .tarignore -vzf dist/openflexure-microscope-server-${CI_COMMIT_REF_NAME}.tar.gz . + + artifacts: + name: "dist" + expire_in: 1 week + paths: + - "./dist/*" + + only: + - merge_requests + - tags + - web + + +# Deploy to builds.openflexure.org +deploy: + stage: deploy + dependencies: + - build + image: ubuntu:latest + + before_script: + - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' + - eval $(ssh-agent -s) + - ssh-add <(echo "$SSH_PRIVATE_KEY_BATH_OPENFLEXURE_BASE64" | base64 --decode) + - mkdir -p ~/.ssh + - echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config + + script: + # Install rsync if not already installed + - 'which rsync || ( apt-get update -y && apt-get install rsync -y )' + + # Upload the builds folder to openflexure-microscope builds + - rsync -hrvz -e ssh dist/ ci-user@openflexure.bath.ac.uk:/var/www/build/openflexure-microscope-server + + # Run update-latest.py on the build server + - ssh -t ci-user@openflexure.bath.ac.uk "/var/www/build/update-latest.py" + + only: + - tags + - web diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..57b6d2dd --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "openflexure_microscope/api/static"] + path = openflexure_microscope/api/static + url = https://gitlab.com/openflexure/openflexure-microscope-jsclient.git + branch = frame diff --git a/.tarignore b/.tarignore new file mode 100644 index 00000000..708114f4 --- /dev/null +++ b/.tarignore @@ -0,0 +1,80 @@ +Distribution archive rules +node_modules +.gitlab-ci.yml +./dist +!openflexure_microscope/api/static/dist +.tarignore + +# Pyenv files +.python-version +.venv* +.env* + +# Byte-compiled / optimized / DLL files +__pycache__ +*.py[cod] + +# C extensions +*.so + +# Distribution / packaging +.Pytho +env/ +build +develop-eggs +downloads +eggs +lib +lib64 +parts +sdist +var +*.egg-info +.installed.cfg +*.egg +pip-wheel-metadata + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov +.tox +.coverage +.cache +nosetests.xml +coverage.xml + +# Translations +*.mo +*.pot + +# Django stuff: +*.log + +# Sphinx documentation +docs/_build + +# PyBuilder +target + +#Big-o files +capture +record +*.data + +#IDE files +.vscode +.idea +activate + +# UML diagrams +classes.png +packages.png diff --git a/README.md b/README.md index acb4fd60..6982d860 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,15 @@ This includes basic installation instructions suitable for most users. Full developer documentation can be found on [**ReadTheDocs**](https://openflexure-microscope-software.readthedocs.io/en/stable/). This includes installing the server in a mode better suited for active development. +## Installation +* `git clone --recurse-submodules https://gitlab.com/openflexure/openflexure-microscope-server.git` +* `poetry install` +* `poetry run build_static` + +### Distributing +* `mkdir -p dist` +* `tar -c --exclude-vcs --exclude-from .tarignore -vzf dist/openflexure-microscope-server.tar.gz .` + ## Build-system As of 1.0.0b0, we're using [Poetry](https://github.com/sdispater/poetry) to manage dependencies, build, and distribute the package. All package information and dependencies are found in `pyproject.toml`, in line with [PEP 518](https://www.python.org/dev/peps/pep-0518/). If you're developing this package, make use of `poetry.lock` to ensure you're using the latest locked dependency list. diff --git a/openflexure_microscope/api/app.py b/openflexure_microscope/api/app.py index af862b2b..fbd2b042 100644 --- a/openflexure_microscope/api/app.py +++ b/openflexure_microscope/api/app.py @@ -65,8 +65,8 @@ app, labthing = create_app( title=f"OpenFlexure Microscope {api_microscope.name}", description="Test LabThing-based API for OpenFlexure Microscope", types=["org.openflexure.microscope"], - version=pkg_resources.get_distribution("openflexure_microscope").version, - flask_kwargs={"static_url_path": ""}, + version=pkg_resources.get_distribution("openflexure-microscope-server").version, + flask_kwargs={"static_url_path": "", "static_folder": "static/dist"}, ) # Enable CORS for some routes outside of LabThings diff --git a/openflexure_microscope/api/static b/openflexure_microscope/api/static new file mode 160000 index 00000000..df7169ba --- /dev/null +++ b/openflexure_microscope/api/static @@ -0,0 +1 @@ +Subproject commit df7169ba6833fa213f497ff71594dc4330af0792 diff --git a/openflexure_microscope/api/static/css/chunk-vendors.1800c649.css b/openflexure_microscope/api/static/css/chunk-vendors.1800c649.css deleted file mode 100644 index c967969b..00000000 --- a/openflexure_microscope/api/static/css/chunk-vendors.1800c649.css +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8605f70737729f74f48d3183b30b4a2f50706f4f750cd208aeb8c136253f7d01 -size 772 diff --git a/openflexure_microscope/api/static/css/main.24f9722e.css b/openflexure_microscope/api/static/css/main.24f9722e.css deleted file mode 100644 index b8cd1050..00000000 --- a/openflexure_microscope/api/static/css/main.24f9722e.css +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e68506e72389393d35cc47e5184459fff9a23bedea8c9ee96491f66c88e71954 -size 1375875 diff --git a/openflexure_microscope/api/static/favicon-16x16.png b/openflexure_microscope/api/static/favicon-16x16.png deleted file mode 100644 index 6f9b9751..00000000 --- a/openflexure_microscope/api/static/favicon-16x16.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee944cc13be0a52ce48a81a09c179dac70729bd7580a516ccc8ac10b4cfa3f98 -size 1310 diff --git a/openflexure_microscope/api/static/favicon-32x32.png b/openflexure_microscope/api/static/favicon-32x32.png deleted file mode 100644 index 21fb950d..00000000 --- a/openflexure_microscope/api/static/favicon-32x32.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:710327f8b3d83c83019ed2c4b27de8caf8e4e923c9148f93c1c0a2662f683f26 -size 1659 diff --git a/openflexure_microscope/api/static/favicon.ico b/openflexure_microscope/api/static/favicon.ico deleted file mode 100644 index d55c92be..00000000 --- a/openflexure_microscope/api/static/favicon.ico +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0405ef60ab42df1c2e8721bf1f500c8c7d9e1afae130307101b8f77925ffdac1 -size 1150 diff --git a/openflexure_microscope/api/static/fonts/MaterialIcons-Regular.012cf6a1.woff b/openflexure_microscope/api/static/fonts/MaterialIcons-Regular.012cf6a1.woff deleted file mode 100644 index ebaebe27..00000000 --- a/openflexure_microscope/api/static/fonts/MaterialIcons-Regular.012cf6a1.woff +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c4a1baec300d09e03a8380b85918267ee80faae8e00c6c56b48e2e74b1d9b38d -size 57620 diff --git a/openflexure_microscope/api/static/fonts/MaterialIcons-Regular.570eb838.woff2 b/openflexure_microscope/api/static/fonts/MaterialIcons-Regular.570eb838.woff2 deleted file mode 100644 index ed48a958..00000000 --- a/openflexure_microscope/api/static/fonts/MaterialIcons-Regular.570eb838.woff2 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a87d66c91b2e7dc5530aef76c03bd6a3d25ea5826110bf4803b561b811cc8726 -size 44300 diff --git a/openflexure_microscope/api/static/fonts/MaterialIcons-Regular.a37b0c01.ttf b/openflexure_microscope/api/static/fonts/MaterialIcons-Regular.a37b0c01.ttf deleted file mode 100644 index acdfd2e6..00000000 --- a/openflexure_microscope/api/static/fonts/MaterialIcons-Regular.a37b0c01.ttf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b7f4a3ab562048f28dd1fa691601bc43363a61d0f876d16d8316c52e4f32d696 -size 128180 diff --git a/openflexure_microscope/api/static/fonts/MaterialIcons-Regular.e79bfd88.eot b/openflexure_microscope/api/static/fonts/MaterialIcons-Regular.e79bfd88.eot deleted file mode 100644 index e3f70a00..00000000 --- a/openflexure_microscope/api/static/fonts/MaterialIcons-Regular.e79bfd88.eot +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c998b4a9c0acbb9fe5dd572c206a5a33fdd5ca2b58db87fc3b893beac85068d -size 143258 diff --git a/openflexure_microscope/api/static/index.html b/openflexure_microscope/api/static/index.html deleted file mode 100644 index f9009ab2..00000000 --- a/openflexure_microscope/api/static/index.html +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:463bfdbd635ddff1d00df38b1149ffd3947b492d71cfb546549dffebd311b090 -size 843 diff --git a/openflexure_microscope/api/static/js/chunk-vendors.3b7762c4.js b/openflexure_microscope/api/static/js/chunk-vendors.3b7762c4.js deleted file mode 100644 index 47dda2fd..00000000 --- a/openflexure_microscope/api/static/js/chunk-vendors.3b7762c4.js +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a536bfa88fd1bf69284804285c5cf1da33cf05f164f175eb4085f7d057ff4f17 -size 378133 diff --git a/openflexure_microscope/api/static/js/chunk-vendors.3b7762c4.js.map b/openflexure_microscope/api/static/js/chunk-vendors.3b7762c4.js.map deleted file mode 100644 index 834b0baf..00000000 --- a/openflexure_microscope/api/static/js/chunk-vendors.3b7762c4.js.map +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:996b19391845b7cf1810f1181d935aad524897763da4c36847c7715f762b63fa -size 1597950 diff --git a/openflexure_microscope/api/static/js/main.eaa8787b.js b/openflexure_microscope/api/static/js/main.eaa8787b.js deleted file mode 100644 index 4826f329..00000000 --- a/openflexure_microscope/api/static/js/main.eaa8787b.js +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0a77d7d2e5e4220883bc1491a627435cc80d0b2574d51972bcd6b12add7a4a94 -size 116850 diff --git a/openflexure_microscope/api/static/js/main.eaa8787b.js.map b/openflexure_microscope/api/static/js/main.eaa8787b.js.map deleted file mode 100644 index 72e98b54..00000000 --- a/openflexure_microscope/api/static/js/main.eaa8787b.js.map +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1404c938e8f60b1694dd48357d486d919f5b1e32c9f226ca26fc0ee399019542 -size 395811 diff --git a/openflexure_microscope/api/static/titleicon.svg b/openflexure_microscope/api/static/titleicon.svg deleted file mode 100644 index 5307728d..00000000 --- a/openflexure_microscope/api/static/titleicon.svg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:187e61d8f6171eebf611502412556c707fab1d837f8763b2b60ce3915303f0ad -size 1734 diff --git a/openflexure_microscope/install.py b/openflexure_microscope/install.py new file mode 100644 index 00000000..e73037cc --- /dev/null +++ b/openflexure_microscope/install.py @@ -0,0 +1,14 @@ +from pynpm import NPMPackage +import os + +dir_path = os.path.dirname(os.path.realpath(__file__)) +pkg_path = os.path.join(dir_path, "api", "static", "package.json") + +pkg = NPMPackage(pkg_path) + +def install(): + pkg.install() + +def build(): + pkg.install() + pkg.run_script('build') \ No newline at end of file diff --git a/openflexure_microscope/microscope.py b/openflexure_microscope/microscope.py index 8a401b86..55097088 100644 --- a/openflexure_microscope/microscope.py +++ b/openflexure_microscope/microscope.py @@ -15,7 +15,8 @@ from openflexure_microscope.stage.sanga import SangaStage try: from openflexure_microscope.camera.pi import PiCameraStreamer -except ImportError: +except Exception as e: + logging.error(e) logging.warning("Unable to import PiCameraStreamer") from openflexure_microscope.camera.mock import MissingCamera diff --git a/poetry.lock b/poetry.lock index 916e6278..20340fca 100644 --- a/poetry.lock +++ b/poetry.lock @@ -389,19 +389,19 @@ six = "*" category = "main" description = "A pure Python interface for the Raspberry Pi camera module." name = "picamera" -optional = true +optional = false python-versions = "*" version = "1.13.2b0" [package.extras] array = ["numpy"] doc = ["sphinx"] -test = ["pillow", "coverage", "mock", "numpy", "pytest"] +test = ["coverage", "pytest", "mock", "pillow", "numpy"] [package.source] -reference = "e50a34826fc8691e9f8554c529a1700662724ade" -type = "git" -url = "https://github.com/rwb27/picamera.git" +reference = "" +type = "url" +url = "https://github.com/rwb27/picamera/releases/download/v1.13.2b0/picamera-1.13.2b0-py3-none-any.whl" [[package]] category = "main" description = "Python Imaging Library (Fork)" @@ -453,6 +453,19 @@ isort = ">=4.2.5,<5" mccabe = ">=0.6,<0.7" toml = ">=0.7.1" +[[package]] +category = "main" +description = "Python interface to your NPM and package.json." +name = "pynpm" +optional = false +python-versions = "*" +version = "0.1.2" + +[package.extras] +all = ["Sphinx (>=1.5.1)", "check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.2.2)", "pydocstyle (>=1.0.0)", "pytest-cache (>=1.0)", "pytest-cov (>=1.8.0)", "pytest-pep8 (>=1.0.6)", "pytest (>=2.8.0)"] +docs = ["Sphinx (>=1.5.1)"] +tests = ["check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.2.2)", "pydocstyle (>=1.0.0)", "pytest-cache (>=1.0)", "pytest-cov (>=1.8.0)", "pytest-pep8 (>=1.0.6)", "pytest (>=2.8.0)"] + [[package]] category = "dev" description = "Python parsing module" @@ -744,10 +757,10 @@ version = "0.26.1" ifaddr = "*" [extras] -rpi = ["picamera", "RPi.GPIO"] +rpi = ["RPi.GPIO"] [metadata] -content-hash = "7fbc27aa162c3acb7f1775b974ed87d3261e4038e0999904e9d1cf0f80ec98a2" +content-hash = "e62efd90867a69b3385fb417a0cd0a9124fb4d23a36177ebef27903b4e78eb77" python-versions = "^3.6" [metadata.files] @@ -1140,6 +1153,10 @@ pylint = [ {file = "pylint-2.5.2-py3-none-any.whl", hash = "sha256:dd506acce0427e9e08fb87274bcaa953d38b50a58207170dbf5b36cf3e16957b"}, {file = "pylint-2.5.2.tar.gz", hash = "sha256:b95e31850f3af163c2283ed40432f053acbc8fc6eba6a069cb518d9dbf71848c"}, ] +pynpm = [ + {file = "pynpm-0.1.2-py2.py3-none-any.whl", hash = "sha256:3f03fbf667549f8b8b7e0419eef88d1b21833ce288f96de66fbb761b9f4c4061"}, + {file = "pynpm-0.1.2.tar.gz", hash = "sha256:8a6d3f9423760cf3c142db3bf9bda5a075e8a91837e7d2e2b0a3de5be5e26da2"}, +] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, diff --git a/pyproject.toml b/pyproject.toml index 6b665705..d9d6e9b1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,8 +3,8 @@ requires = ["poetry>=0.12"] build-backend = "poetry.masonry.api" [tool.poetry] -name = "openflexure_microscope" -version = "2.1.0-dev" +name = "openflexure-microscope-server" +version = "2.1.0-beta" description = "Python module, and Flask-based web API, to run the OpenFlexure Microscope." authors = [ @@ -22,6 +22,12 @@ keywords = ['raspberry pi', 'arduino', 'microscope'] license = "GPL-3.0" +exclude = ["**/node_modules/"] + +packages = [ + { include = "openflexure_microscope" }, +] + [tool.poetry.dependencies] python = "^3.6" Flask = "^1.0" @@ -29,8 +35,9 @@ numpy = "1.18.2" Pillow = "^5.4" scipy = "1.4.1" # Exact version so we can guarantee a wheel -picamera = { git = "https://github.com/rwb27/picamera.git", branch = "master", optional = true } # Lens shading requires >1.14 or RWB fork, lens-shading branch. "RPi.GPIO" = { version = "^0.6.5", optional = true } +picamera = {url = "https://github.com/rwb27/picamera/releases/download/v1.13.2b0/picamera-1.13.2b0-py3-none-any.whl" } + pyserial = "^3.4" # Used for sangaboard (basic_serial_instrument) until we move to sangaboard pip library python-dateutil = "^2.8" @@ -40,9 +47,13 @@ opencv-python-headless = [ {version = "4.2.0.34", python = "^3.8"} # Latest for Py38 systems ] labthings = "0.6.1" +pynpm = "^0.1.2" [tool.poetry.extras] -rpi = ["picamera", "RPi.GPIO"] +rpi = ["RPi.GPIO"] + +[tool.poetry.scripts] +build_static = 'openflexure_microscope.install:build' [tool.poetry.dev-dependencies] sphinxcontrib-httpdomain = "^1.7"