From 2d63122ebe0fb5fdbefd223da2f744f130b71b0e Mon Sep 17 00:00:00 2001 From: luwol03 Date: Tue, 9 Aug 2022 08:06:32 +0200 Subject: [PATCH] vscode devcontainer (#3474) * Added devcontainer configuration files * Added launch.json and improved devcontainer * Added tasks.json * fix: lint * fix: lint * Applied suggestions from codereview * Added more system dependencies and preserve history * devcontainer updates - Add extra environment variables for InvenTree config - Move venv into dev directory (cleaner structure) - Ensure base package requirements get installed - Handle write-permission error for compiling translations - Install test data inside dev directory * Auto create plugin dir and added gh cli * Refactored postCreateCommand into own file * Applied suggestions from codereview Co-authored-by: Oliver Walters --- .devcontainer/Dockerfile | 47 ++++++++++++++++ .devcontainer/devcontainer.json | 87 ++++++++++++++++++++++++++++++ .devcontainer/postCreateCommand.sh | 14 +++++ .gitignore | 9 +++- .vscode/launch.json | 26 +++++++++ .vscode/tasks.json | 52 ++++++++++++++++++ tasks.py | 5 +- 7 files changed, 238 insertions(+), 2 deletions(-) create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/devcontainer.json create mode 100755 .devcontainer/postCreateCommand.sh create mode 100644 .vscode/launch.json create mode 100644 .vscode/tasks.json diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000000..b252c260bc --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,47 @@ +# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.241.1/containers/python-3/.devcontainer/base.Dockerfile + +# [Choice] Python version (use -bullseye variants on local arm64/Apple Silicon): 3, 3.10, 3.9, 3.8, 3.7, 3.6, 3-bullseye, 3.10-bullseye, 3.9-bullseye, 3.8-bullseye, 3.7-bullseye, 3.6-bullseye, 3-buster, 3.10-buster, 3.9-buster, 3.8-buster, 3.7-buster, 3.6-buster +ARG VARIANT="3.10-bullseye" +FROM mcr.microsoft.com/vscode/devcontainers/python:0-${VARIANT} + +# [Choice] Node.js version: none, lts/*, 16, 14, 12, 10 +ARG NODE_VERSION="none" +RUN if [ "${NODE_VERSION}" != "none" ]; then su vscode -c "umask 0002 && . /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi + +# [Optional] If your pip requirements rarely change, uncomment this section to add them to the image. +# COPY requirements.txt /tmp/pip-tmp/ +# RUN pip3 --disable-pip-version-check --no-cache-dir install -r /tmp/pip-tmp/requirements.txt \ +# && rm -rf /tmp/pip-tmp + +# [Optional] Uncomment this section to install additional OS packages. +RUN apt-get update && export DEBIAN_FRONTEND=noninteractive && \ + apt-get -y install --no-install-recommends \ + git gcc g++ gettext gnupg libffi-dev \ + # Weasyprint requirements : https://doc.courtbouillon.org/weasyprint/stable/first_steps.html#debian-11 + poppler-utils libpango-1.0-0 libpangoft2-1.0-0 \ + # Image format support + libjpeg-dev webp \ + # SQLite support + sqlite3 \ + # PostgreSQL support + libpq-dev \ + # MySQL / MariaDB support + default-libmysqlclient-dev mariadb-client && \ + apt-get autoclean && apt-get autoremove + +# [Optional] Uncomment this line to install global node packages. +# RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && npm install -g " 2>&1 + +# Update pip +RUN pip install --upgrade pip + +# Install required base-level python packages +COPY ./docker/requirements.txt base_requirements.txt +RUN pip install --disable-pip-version-check -U -r base_requirements.txt + +# preserve command history between container starts +# Ref: https://code.visualstudio.com/remote/advancedcontainers/persist-bash-history +# Folder will be created in 'postCreateCommand' in devcontainer.json as it's not preserved due to the bind mount +RUN echo "export PROMPT_COMMAND='history -a' && export HISTFILE=/workspaces/InvenTree/dev/commandhistory/.bash_history" >> "/home/vscode/.bashrc" + +WORKDIR /workspaces/InvenTree diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000000..3d77ab14a2 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,87 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at: +// https://github.com/microsoft/vscode-dev-containers/tree/v0.241.1/containers/python-3 +{ + "name": "InvenTree", + "build": { + "dockerfile": "Dockerfile", + "context": "..", + "args": { + // Update 'VARIANT' to pick a Python version: 3, 3.10, 3.9, 3.8, 3.7, 3.6 + // Append -bullseye or -buster to pin to an OS version. + // Use -bullseye variants on local on arm64/Apple Silicon. + "VARIANT": "3.10-bullseye", + // Options + "NODE_VERSION": "lts/*" + } + }, + + // Configure tool-specific properties. + "customizations": { + // Configure properties specific to VS Code. + "vscode": { + // Set *default* container specific settings.json values on container create. + "settings": { + "python.defaultInterpreterPath": "/workspaces/InvenTree/dev/venv/bin/python", + "python.linting.enabled": true, + "python.linting.pylintEnabled": false, + "python.linting.flake8Enabled": true, + "python.formatting.autopep8Path": "/usr/local/py-utils/bin/autopep8", + "python.formatting.blackPath": "/usr/local/py-utils/bin/black", + "python.formatting.yapfPath": "/usr/local/py-utils/bin/yapf", + "python.linting.banditPath": "/usr/local/py-utils/bin/bandit", + "python.linting.flake8Path": "/usr/local/py-utils/bin/flake8", + "python.linting.mypyPath": "/usr/local/py-utils/bin/mypy", + "python.linting.pycodestylePath": "/usr/local/py-utils/bin/pycodestyle", + "python.linting.pydocstylePath": "/usr/local/py-utils/bin/pydocstyle", + "python.linting.pylintPath": "/usr/local/py-utils/bin/pylint" + }, + + // Add the IDs of extensions you want installed when the container is created. + "extensions": [ + "ms-python.python", + "ms-python.vscode-pylance", + "batisteo.vscode-django" + ] + } + }, + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + "forwardPorts": [8000], + "portsAttributes": { + "8000": { + "label": "InvenTree server" + } + }, + + // Use 'postCreateCommand' to run commands after the container is created. + "postCreateCommand": "./.devcontainer/postCreateCommand.sh", + + // Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. + "remoteUser": "vscode", + "features": { + "git": "os-provided", + "github-cli": "latest" + }, + + "remoteEnv": { + // Inventree config + "INVENTREE_DEBUG": "True", + "INVENTREE_DEBUG_LEVEL": "INFO", + "INVENTREE_DB_ENGINE": "sqlite3", + "INVENTREE_DB_NAME": "/workspaces/InvenTree/dev/database.sqlite3", + "INVENTREE_MEDIA_ROOT": "/workspaces/InvenTree/dev/media", + "INVENTREE_STATIC_ROOT": "/workspaces/InvenTree/dev/static", + "INVENTREE_CONFIG_FILE": "/workspaces/InvenTree/dev/config.yaml", + "INVENTREE_SECRET_KEY_FILE": "/workspaces/InvenTree/dev/secret_key.txt", + "INVENTREE_PLUGIN_DIR": "/workspaces/InvenTree/dev/plugins", + "INVENTREE_PLUGIN_FILE": "/workspaces/InvenTree/dev/plugins.txt", + + // Python config + "PIP_USER": "no", + + // used to load the venv into the PATH and avtivate it + // Ref: https://stackoverflow.com/a/56286534 + "VIRTUAL_ENV": "/workspaces/InvenTree/dev/venv", + "PATH": "/workspaces/InvenTree/dev/venv/bin:${containerEnv:PATH}" + } +} diff --git a/.devcontainer/postCreateCommand.sh b/.devcontainer/postCreateCommand.sh new file mode 100755 index 0000000000..30e506383e --- /dev/null +++ b/.devcontainer/postCreateCommand.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# create folders +mkdir -p /workspaces/InvenTree/dev/{commandhistory,plugins} +cd /workspaces/InvenTree + +# create venv +python3 -m venv dev/venv +. dev/venv/bin/activate + +# setup inventree server +pip install invoke +inv update +inv setup-dev diff --git a/.gitignore b/.gitignore index 693ed10362..be9c91ecb9 100644 --- a/.gitignore +++ b/.gitignore @@ -66,9 +66,16 @@ secret_key.txt # IDE / development files .idea/ *.code-workspace -.vscode/ .bash_history +# https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore +.vscode/* +#!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +#!.vscode/extensions.json +#!.vscode/*.code-snippets + # Coverage reports .coverage htmlcov/ diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000000..55aa17b353 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,26 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "InvenTree Server", + "type": "python", + "request": "launch", + "program": "${workspaceFolder}/InvenTree/manage.py", + "args": ["runserver"], + "django": true, + "justMyCode": true + }, + { + "name": "Python: Django - 3rd party", + "type": "python", + "request": "launch", + "program": "${workspaceFolder}/InvenTree/manage.py", + "args": ["runserver"], + "django": true, + "justMyCode": false + } + ] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000000..951e2af546 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,52 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "clean-settings", + "type": "shell", + "command": "inv clean-settings", + }, + { + "label": "delete-data", + "type": "shell", + "command": "inv delete-data", + }, + { + "label": "migrate", + "type": "shell", + "command": "inv migrate", + }, + { + "label": "server", + "type": "shell", + "command": "inv server", + }, + { + "label": "setup-dev", + "type": "shell", + "command": "inv setup-dev", + }, + { + "label": "setup-test", + "type": "shell", + "command": "inv setup-test --path dev/inventree-demo-dataset", + }, + { + "label": "superuser", + "type": "shell", + "command": "inv superuser", + }, + { + "label": "test", + "type": "shell", + "command": "inv test", + }, + { + "label": "update", + "type": "shell", + "command": "inv update", + }, + ] +} diff --git a/tasks.py b/tasks.py index 86041f63e3..54b9210131 100644 --- a/tasks.py +++ b/tasks.py @@ -230,7 +230,10 @@ def update(c): """ # Recompile the translation files (.mo) # We do not run 'invoke translate' here, as that will touch the source (.po) files too! - manage(c, 'compilemessages', pty=True) + try: + manage(c, 'compilemessages', pty=True) + except Exception: + print("WARNING: Translation files could not be compiled:") # Data tasks