From b7942bb26523c56ebe7b901999baceb0ff410680 Mon Sep 17 00:00:00 2001 From: Matteo Savini Date: Fri, 17 Mar 2023 10:46:49 +0100 Subject: [PATCH] choose editor and configure devcontainer --- README.md | 7 ++- cookiecutter.json | 9 ++-- docs/project-generation-options.rst | 17 ++++--- hooks/post_gen_project.py | 50 +++++++------------ .../.devcontainer/devcontainer.json | 8 +-- .../compose/local/django/Dockerfile | 14 +++--- 6 files changed, 50 insertions(+), 55 deletions(-) diff --git a/README.md b/README.md index 2b69f4f60..0987de885 100644 --- a/README.md +++ b/README.md @@ -120,9 +120,12 @@ Answer the prompts with your own desired [options](http://cookiecutter-django.re Choose from 1, 2, 3, 4, 5 [1]: 1 timezone [UTC]: America/Los_Angeles windows [n]: n - use_pycharm [n]: y + Select an editor to use. The choices are: + 1 - None + 2 - PyCharm + 3 - VS Code + Choose from 1, 2, 3 [1]: 1 use_docker [n]: n - use_vscode_devcontainer [n]: n Select postgresql_version: 1 - 14 2 - 13 diff --git a/cookiecutter.json b/cookiecutter.json index b9c6ef6ac..98d2ae268 100644 --- a/cookiecutter.json +++ b/cookiecutter.json @@ -15,9 +15,12 @@ ], "timezone": "UTC", "windows": "n", - "use_pycharm": "n", + "editor": [ + "None", + "PyCharm", + "VS Code" + ], "use_docker": "n", - "use_vscode_devcontainer": "n", "postgresql_version": [ "14", "13", @@ -63,4 +66,4 @@ ], "keep_local_envs_in_vcs": "y", "debug": "n" -} +} \ No newline at end of file diff --git a/docs/project-generation-options.rst b/docs/project-generation-options.rst index c2cb6ec29..b35e42d3f 100644 --- a/docs/project-generation-options.rst +++ b/docs/project-generation-options.rst @@ -46,14 +46,15 @@ timezone: windows: Indicates whether the project should be configured for development on Windows. -use_pycharm: - Indicates whether the project should be configured for development with PyCharm_. +editor: + Select an editor to use. The choices are: + + 1. None + 2. PyCharm_ + 3. `VS Code`_ use_docker: - Indicates whether the project should be configured to use Docker_ and `Docker Compose`_. - -use_vscode_devcontainer: - Indicates whether the project should be configured to use `VS Code Dev Container`_. + Indicates whether the project should be configured to use Docker_, `Docker Compose`_ and `devcontainer`_. postgresql_version: Select a PostgreSQL_ version to use. The choices are: @@ -144,11 +145,11 @@ debug: .. _Apache Software License 2.0: http://www.apache.org/licenses/LICENSE-2.0 .. _PyCharm: https://www.jetbrains.com/pycharm/ +.. _VS Code: https://github.com/microsoft/vscode .. _Docker: https://github.com/docker/docker .. _Docker Compose: https://docs.docker.com/compose/ - -.. _VS Code Dev Container: https://github.com/microsoft/vscode-dev-containers +.. _devcontainer: https://containers.dev/ .. _PostgreSQL: https://www.postgresql.org/docs/ diff --git a/hooks/post_gen_project.py b/hooks/post_gen_project.py index 0658fd3d6..0f97ae4df 100644 --- a/hooks/post_gen_project.py +++ b/hooks/post_gen_project.py @@ -55,29 +55,7 @@ def remove_pycharm_files(): shutil.rmtree(docs_dir_path) -def remove_docker_files(): - if "{{ cookiecutter.use_vscode_devcontainer }}".lower() == "n": - shutil.rmtree("compose") - file_names = ["local.yml", "production.yml", ".dockerignore"] - else: - file_names = ["production.yml"] - - for file_name in file_names: - os.remove(file_name) - - if "{{ cookiecutter.use_pycharm }}".lower() == "y": - file_names = ["docker_compose_up_django.xml", "docker_compose_up_docs.xml"] - for file_name in file_names: - os.remove(os.path.join(".idea", "runConfigurations", file_name)) - - -def remove_vscode_devcontainer_files(): - dir_path = ".devcontainer" - if os.path.exists(dir_path): - shutil.rmtree(dir_path) - - -def create_vscode_devcontainer_bash_history_file(): +def create_devcontainer_bash_history_file(): history_dir_path = ".history" if not os.path.exists(history_dir_path): os.mkdir(history_dir_path) @@ -87,6 +65,19 @@ def create_vscode_devcontainer_bash_history_file(): pass +def remove_docker_files(): + shutil.rmtree(".devcontainer") + shutil.rmtree("compose") + + file_names = ["local.yml", "production.yml", ".dockerignore"] + for file_name in file_names: + os.remove(file_name) + if "{{ cookiecutter.editor }}".lower() == "PyCharm": + file_names = ["docker_compose_up_django.xml", "docker_compose_up_docs.xml"] + for file_name in file_names: + os.remove(os.path.join(".idea", "runConfigurations", file_name)) + + def remove_utility_files(): shutil.rmtree("utility") @@ -461,18 +452,15 @@ def main(): if "{{ cookiecutter.open_source_license}}" != "GPLv3": remove_gplv3_files() - if "{{ cookiecutter.use_pycharm }}".lower() == "n": + if "{{ cookiecutter.editor }}".lower() != "PyCharm": remove_pycharm_files() if "{{ cookiecutter.use_docker }}".lower() == "y": remove_utility_files() + create_devcontainer_bash_history_file() else: remove_docker_files() - if "{{ cookiecutter.use_vscode_devcontainer }}".lower() == "n": - remove_vscode_devcontainer_files() - else: - create_vscode_devcontainer_bash_history_file() if ( "{{ cookiecutter.use_docker }}".lower() == "y" @@ -488,14 +476,12 @@ def main(): if ( "{{ cookiecutter.use_docker }}".lower() == "n" and "{{ cookiecutter.use_heroku }}".lower() == "n" - and "{{ cookiecutter.use_vscode_devcontainer }}".lower() == "n" ): if "{{ cookiecutter.keep_local_envs_in_vcs }}".lower() == "y": print( INFO + ".env(s) are only utilized when Docker Compose and/or " - "Heroku and/or VS Code Dev Container support is enabled so " - "keeping them does not make sense given your current setup." - + TERMINATOR + "Heroku support is enabled so keeping them does not make sense " + "given your current setup." + TERMINATOR ) remove_envs_and_associated_files() else: diff --git a/{{cookiecutter.project_slug}}/.devcontainer/devcontainer.json b/{{cookiecutter.project_slug}}/.devcontainer/devcontainer.json index 0ecdaa22a..38cda8e48 100644 --- a/{{cookiecutter.project_slug}}/.devcontainer/devcontainer.json +++ b/{{cookiecutter.project_slug}}/.devcontainer/devcontainer.json @@ -8,7 +8,7 @@ "mounts": [ { "source": "./.history/bash_history", - "target": "/home/vscode/.bash_history", + "target": "/home/dev-user/.bash_history", "type": "bind" }, { @@ -21,11 +21,12 @@ // /bin/sh -c "while sleep 1000; do :; done" when starting the container instead of the container’s default command "overrideCommand": true, "service": "django", - // "remoteEnv": {"PATH": "/home/vscode/.local/bin:${containerEnv:PATH}"}, - "remoteUser": "vscode", + // "remoteEnv": {"PATH": "/home/dev-user/.local/bin:${containerEnv:PATH}"}, + "remoteUser": "dev-user", "workspaceFolder": "/app", // Set *default* container specific settings.json values on container create. "customizations": { + {% if cookiecutter.editor == "VS Code" %} "vscode": { "settings": { "editor.formatOnSave": true, @@ -73,6 +74,7 @@ "batisteo.vscode-django" ] } + {% endif %} }, // Uncomment the next line if you want start specific services in your Docker Compose config. // "runServices": [], diff --git a/{{cookiecutter.project_slug}}/compose/local/django/Dockerfile b/{{cookiecutter.project_slug}}/compose/local/django/Dockerfile index 0393d7988..62db5ee8a 100644 --- a/{{cookiecutter.project_slug}}/compose/local/django/Dockerfile +++ b/{{cookiecutter.project_slug}}/compose/local/django/Dockerfile @@ -35,16 +35,16 @@ ENV BUILD_ENV ${BUILD_ENVIRONMENT} WORKDIR ${APP_HOME} -{% if cookiecutter.use_vscode_devcontainer == "y" %} -# VS Code devcontainer dependencies and utils +{% if cookiecutter.docker == "y" %} +# devcontainer dependencies and utils RUN apt-get update && apt-get install --no-install-recommends -y \ sudo git bash-completion nano -# Create vscode user and add it to sudoers -RUN groupadd --gid 1000 vscode \ - && useradd --uid 1000 --gid vscode --shell /bin/bash --create-home vscode \ - && echo vscode ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/vscode \ - && chmod 0440 /etc/sudoers.d/vscode +# Create devcontainer user and add it to sudoers +RUN groupadd --gid 1000 dev-user \ + && useradd --uid 1000 --gid dev-user --shell /bin/bash --create-home dev-user \ + && echo dev-user ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/dev-user \ + && chmod 0440 /etc/sudoers.d/dev-user {% endif %} # Install required system dependencies