diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile deleted file mode 100644 index 2cd1f2e..0000000 --- a/.devcontainer/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -FROM python:3.10 - -# Install Java -RUN apt update && \ - apt install -y sudo && \ - sudo apt install default-jdk -y - -# Add non-root user -ARG USERNAME=nonroot -RUN groupadd --gid 1000 $USERNAME && \ - useradd --uid 1000 --gid 1000 -m $USERNAME -## Make sure to reflect new user in PATH -ENV PATH="/home/${USERNAME}/.local/bin:${PATH}" -USER $USERNAME - -## Pip dependencies -# Upgrade pip -RUN pip install --upgrade pip -# Install production dependencies -COPY --chown=nonroot:1000 requirements.txt /tmp/requirements.txt -RUN pip install -r /tmp/requirements.txt && \ - rm /tmp/requirements.txt -# Install development dependencies -COPY --chown=nonroot:1000 requirements-dev.txt /tmp/requirements-dev.txt -RUN pip install -r /tmp/requirements-dev.txt && \ - rm /tmp/requirements-dev.txt diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json deleted file mode 100644 index 08cec92..0000000 --- a/.devcontainer/devcontainer.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "build": { - "dockerfile": "Dockerfile", - "context": ".." - }, - - "remoteUser": "nonroot", - - "customizations": { - "vscode": { - "extensions": [ - "ms-python.python" - ], - "settings": { - "python.testing.pytestArgs": [ - "." - ], - "python.testing.unittestEnabled": false, - "python.testing.pytestEnabled": true, - "python.formatting.provider": "black", - "python.linting.mypyEnabled": true, - "python.linting.enabled": true - } - } - }, - - "portsAttributes": { - "4040": { - "label": "SparkUI", - "onAutoForward": "notify" - } - }, - - "forwardPorts": [ - 4040 - ] -} \ No newline at end of file diff --git a/.devcontainer/requirements-dev.txt b/.devcontainer/requirements-dev.txt deleted file mode 100644 index 06a5816..0000000 --- a/.devcontainer/requirements-dev.txt +++ /dev/null @@ -1,3 +0,0 @@ -pytest>=7 -black>=22 -mypy>=0.9 \ No newline at end of file diff --git a/.github/workflows/build-image.yml b/.github/workflows/build-image.yml deleted file mode 100644 index b3b8d49..0000000 --- a/.github/workflows/build-image.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Build image - -on: - push: - branches: - - "main" - paths: - - '.devcontainer/**' - - 'requirements.txt' - -jobs: - build_image: - runs-on: ubuntu-latest - - steps: - - name: Checkout (GitHub) - uses: actions/checkout@v4 - - - name: Login to GitHub Container Registry - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Build and run dev container task - uses: devcontainers/ci@v0.3 - with: - imageName: ghcr.io/${{ github.repository }}/devcontainer - runCmd: echo "Success" \ No newline at end of file diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml deleted file mode 100644 index 87dd311..0000000 --- a/.github/workflows/python-app.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: Python app - -on: - pull_request: - push: - branches: - - "**" - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Checkout (GitHub) - uses: actions/checkout@v4 - - - name: Login to GitHub Container Registry - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Build and run dev container task - uses: devcontainers/ci@v0.3 - with: - imageName: ghcr.io/${{ github.repository }}/devcontainer - runCmd: pytest . \ No newline at end of file diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 3b89c95..0000000 --- a/.gitignore +++ /dev/null @@ -1,132 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -pip-wheel-metadata/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# 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/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -.python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# VSCode -.vscode diff --git a/LICENSE b/LICENSE deleted file mode 100644 index f0dee7f..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2024 Xebia Data - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.md b/README.md deleted file mode 100644 index c3310b0..0000000 --- a/README.md +++ /dev/null @@ -1,65 +0,0 @@ -# python-devcontainer-template -An example repo for using a Devcontainer + Python ๐Ÿณ๐Ÿ. - -[Devcontainers](https://containers.dev/) help us: - -- ๐Ÿ”„ Get a reproducible development environment -- โšก๏ธ Instantly onboard new team members onto your project -- ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ Better align the environments between team members -- โฑ Keeping your dev environment up-to-date & reproducible saves your team time going into production later - -(๐Ÿ“ Note: Devcontainers are a relatively new concept. For now, Devcontainers are only properly supported by **VSCode**.) - -## This template -This template demonstrates how you can build a Devcontainer with the following set up: - -- Python 3.10 -- Java (OpenJDK 11.0.16) -- `pyspark`, `mypy`, `pytest` and `black` - -## Usage - -> First, make sure you have the [Remote Development extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack) installed and have [Docker](https://www.docker.com/products/docker-desktop/) running. - -Then, there's 2 options: - -### Using the template - -1. Click _Use this template_ to create a new repo. - - use this template GitHub button - -1. **Clone** the repo and open it in **VSCode**. - -1. You should see the following notification: - - folder contains a dev container config file - - Press _Reopen in Container_ and you the Devcontainer will be loaded. - - -That's it ๐Ÿ™Œ๐Ÿป Enjoy developing. - -### Using the button - -Another option is to open this repo in VSCode using a special _link_. Press the following button: - -[![Open in Remote - Containers](https://img.shields.io/static/v1?label=Remote%20-%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/godatadriven/python-devcontainer-template) - -๐Ÿš€ This clones this repo and opens it in a Devcontainer right away. - -- ๐Ÿ’ก To now have this repo push to your own repo, add a different Git remote using `git remote add`. - -## About - -### Media -This repo was mentioned at the following places: - -- [Talk @ GoDataFest](https://godatafest.com/broadcasts/devcontainers-containerize-your-development-setup/), 26th of October [[talk slides](https://godatadriven.github.io/python-devcontainer-template/#/)] -- [Blogpost @ godatadriven.com](https://godatadriven.com/blog/how-to-create-a-devcontainer-for-your-python-project-%F0%9F%90%B3/), 21st of November -- [Talk @ PyData Eindhoven](https://www.youtube.com/watch?v=SLsaCdRAV0U) - ---- - - -Created by [Jeroen Overschie](https://www.github.com/dunnkers), working at [Xebia Data](https://xebia.com/). A leading Data and AI consultancy company in The Netherlands. diff --git a/images/presentation/animation/1.png b/images/presentation/animation/1.png new file mode 100644 index 0000000..89d9cb5 Binary files /dev/null and b/images/presentation/animation/1.png differ diff --git a/images/presentation/animation/10.png b/images/presentation/animation/10.png new file mode 100644 index 0000000..fc24b47 Binary files /dev/null and b/images/presentation/animation/10.png differ diff --git a/images/presentation/animation/11.png b/images/presentation/animation/11.png new file mode 100644 index 0000000..2482b42 Binary files /dev/null and b/images/presentation/animation/11.png differ diff --git a/images/presentation/animation/12.png b/images/presentation/animation/12.png new file mode 100644 index 0000000..d504b5d Binary files /dev/null and b/images/presentation/animation/12.png differ diff --git a/images/presentation/animation/13.png b/images/presentation/animation/13.png new file mode 100644 index 0000000..1520ff4 Binary files /dev/null and b/images/presentation/animation/13.png differ diff --git a/images/presentation/animation/14.png b/images/presentation/animation/14.png new file mode 100644 index 0000000..3e21a17 Binary files /dev/null and b/images/presentation/animation/14.png differ diff --git a/images/presentation/animation/15.png b/images/presentation/animation/15.png new file mode 100644 index 0000000..0b86e79 Binary files /dev/null and b/images/presentation/animation/15.png differ diff --git a/images/presentation/animation/16.png b/images/presentation/animation/16.png new file mode 100644 index 0000000..272a145 Binary files /dev/null and b/images/presentation/animation/16.png differ diff --git a/images/presentation/animation/17.png b/images/presentation/animation/17.png new file mode 100644 index 0000000..c786db3 Binary files /dev/null and b/images/presentation/animation/17.png differ diff --git a/images/presentation/animation/18.png b/images/presentation/animation/18.png new file mode 100644 index 0000000..44454d7 Binary files /dev/null and b/images/presentation/animation/18.png differ diff --git a/images/presentation/animation/19.png b/images/presentation/animation/19.png new file mode 100644 index 0000000..633ef0b Binary files /dev/null and b/images/presentation/animation/19.png differ diff --git a/images/presentation/animation/2.png b/images/presentation/animation/2.png new file mode 100644 index 0000000..320aa79 Binary files /dev/null and b/images/presentation/animation/2.png differ diff --git a/images/presentation/animation/20.png b/images/presentation/animation/20.png new file mode 100644 index 0000000..9d311e4 Binary files /dev/null and b/images/presentation/animation/20.png differ diff --git a/images/presentation/animation/3.png b/images/presentation/animation/3.png new file mode 100644 index 0000000..731b240 Binary files /dev/null and b/images/presentation/animation/3.png differ diff --git a/images/presentation/animation/4.png b/images/presentation/animation/4.png new file mode 100644 index 0000000..45f9814 Binary files /dev/null and b/images/presentation/animation/4.png differ diff --git a/images/presentation/animation/5.png b/images/presentation/animation/5.png new file mode 100644 index 0000000..67e7866 Binary files /dev/null and b/images/presentation/animation/5.png differ diff --git a/images/presentation/animation/6.png b/images/presentation/animation/6.png new file mode 100644 index 0000000..e2760d3 Binary files /dev/null and b/images/presentation/animation/6.png differ diff --git a/images/presentation/animation/7.png b/images/presentation/animation/7.png new file mode 100644 index 0000000..bd650e4 Binary files /dev/null and b/images/presentation/animation/7.png differ diff --git a/images/presentation/animation/8.png b/images/presentation/animation/8.png new file mode 100644 index 0000000..6283b36 Binary files /dev/null and b/images/presentation/animation/8.png differ diff --git a/images/presentation/animation/9.png b/images/presentation/animation/9.png new file mode 100644 index 0000000..b51aae6 Binary files /dev/null and b/images/presentation/animation/9.png differ diff --git a/images/presentation/application-running-on-port-4040.png b/images/presentation/application-running-on-port-4040.png new file mode 100644 index 0000000..e65bf0a Binary files /dev/null and b/images/presentation/application-running-on-port-4040.png differ diff --git a/images/presentation/cat.gif b/images/presentation/cat.gif new file mode 100644 index 0000000..c2e0313 Binary files /dev/null and b/images/presentation/cat.gif differ diff --git a/images/presentation/cat.webp b/images/presentation/cat.webp new file mode 100644 index 0000000..9ba1e2a Binary files /dev/null and b/images/presentation/cat.webp differ diff --git a/images/presentation/corrupted-venv.png b/images/presentation/corrupted-venv.png new file mode 100644 index 0000000..256a93d Binary files /dev/null and b/images/presentation/corrupted-venv.png differ diff --git a/images/presentation/devcontainer-overview-4.webp b/images/presentation/devcontainer-overview-4.webp new file mode 100644 index 0000000..214cc68 Binary files /dev/null and b/images/presentation/devcontainer-overview-4.webp differ diff --git a/images/presentation/devcontainer-overview-5.png b/images/presentation/devcontainer-overview-5.png new file mode 100644 index 0000000..6ff7c7e Binary files /dev/null and b/images/presentation/devcontainer-overview-5.png differ diff --git a/images/presentation/devcontainer-vscode-rebuild.png b/images/presentation/devcontainer-vscode-rebuild.png new file mode 100644 index 0000000..26bafa3 Binary files /dev/null and b/images/presentation/devcontainer-vscode-rebuild.png differ diff --git a/images/presentation/devcontainers-overview.svg b/images/presentation/devcontainers-overview.svg new file mode 100644 index 0000000..3f67955 --- /dev/null +++ b/images/presentation/devcontainers-overview.svg @@ -0,0 +1,16 @@ + + + + + + + 3. terminalt1. tests2. debugging... inside your Docker containerDevelop in your IDE,but run ...โœ… reproducibilityโœ… isolationโœ… native experience \ No newline at end of file diff --git a/images/presentation/difficulties-dockerizing-and-going-into-production.png b/images/presentation/difficulties-dockerizing-and-going-into-production.png new file mode 100644 index 0000000..3575759 Binary files /dev/null and b/images/presentation/difficulties-dockerizing-and-going-into-production.png differ diff --git a/images/presentation/folder-contains-a-dev-container-config-file.png b/images/presentation/folder-contains-a-dev-container-config-file.png new file mode 100644 index 0000000..babe1b6 Binary files /dev/null and b/images/presentation/folder-contains-a-dev-container-config-file.png differ diff --git a/images/presentation/installation-instructions-devcontainer.png b/images/presentation/installation-instructions-devcontainer.png new file mode 100644 index 0000000..7037a37 Binary files /dev/null and b/images/presentation/installation-instructions-devcontainer.png differ diff --git a/images/presentation/installation-instructions-manual.png b/images/presentation/installation-instructions-manual.png new file mode 100644 index 0000000..140bd51 Binary files /dev/null and b/images/presentation/installation-instructions-manual.png differ diff --git a/images/presentation/jeroen-overschie-intro.png b/images/presentation/jeroen-overschie-intro.png new file mode 100644 index 0000000..21cfd5f Binary files /dev/null and b/images/presentation/jeroen-overschie-intro.png differ diff --git a/images/presentation/logo-godatadriven-white.svg b/images/presentation/logo-godatadriven-white.svg new file mode 100644 index 0000000..0b60420 --- /dev/null +++ b/images/presentation/logo-godatadriven-white.svg @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/presentation/logo-pyspark.png b/images/presentation/logo-pyspark.png new file mode 100644 index 0000000..4ce970b Binary files /dev/null and b/images/presentation/logo-pyspark.png differ diff --git a/images/presentation/logo-python.png b/images/presentation/logo-python.png new file mode 100644 index 0000000..4e29d30 Binary files /dev/null and b/images/presentation/logo-python.png differ diff --git a/images/presentation/logo-spark.png b/images/presentation/logo-spark.png new file mode 100644 index 0000000..6aa5ba7 Binary files /dev/null and b/images/presentation/logo-spark.png differ diff --git a/images/presentation/messed-up-pyenv.png b/images/presentation/messed-up-pyenv.png new file mode 100644 index 0000000..7b9f5e8 Binary files /dev/null and b/images/presentation/messed-up-pyenv.png differ diff --git a/images/presentation/misaligned-environments.png b/images/presentation/misaligned-environments.png new file mode 100644 index 0000000..a945ea4 Binary files /dev/null and b/images/presentation/misaligned-environments.png differ diff --git a/images/presentation/opening-the-devcontainer.gif b/images/presentation/opening-the-devcontainer.gif new file mode 100644 index 0000000..391d96b Binary files /dev/null and b/images/presentation/opening-the-devcontainer.gif differ diff --git a/images/presentation/project-deps-dont-work-on-modern-os.png b/images/presentation/project-deps-dont-work-on-modern-os.png new file mode 100644 index 0000000..59e1267 Binary files /dev/null and b/images/presentation/project-deps-dont-work-on-modern-os.png differ diff --git a/images/presentation/qrcode_github_repo.png b/images/presentation/qrcode_github_repo.png new file mode 100644 index 0000000..3a8b5b4 Binary files /dev/null and b/images/presentation/qrcode_github_repo.png differ diff --git a/images/presentation/reopen-in-devcontainer-notification.png b/images/presentation/reopen-in-devcontainer-notification.png new file mode 100644 index 0000000..fe7c48a Binary files /dev/null and b/images/presentation/reopen-in-devcontainer-notification.png differ diff --git a/images/presentation/running-ci-in-the-devcontainer-github-actions.png b/images/presentation/running-ci-in-the-devcontainer-github-actions.png new file mode 100644 index 0000000..d3a6d5b Binary files /dev/null and b/images/presentation/running-ci-in-the-devcontainer-github-actions.png differ diff --git a/images/presentation/spark-ui-visible-in-localhost-4040.png b/images/presentation/spark-ui-visible-in-localhost-4040.png new file mode 100644 index 0000000..f652dbe Binary files /dev/null and b/images/presentation/spark-ui-visible-in-localhost-4040.png differ diff --git a/images/presentation/teams-logo-32.png b/images/presentation/teams-logo-32.png new file mode 100644 index 0000000..703ea5e Binary files /dev/null and b/images/presentation/teams-logo-32.png differ diff --git a/images/presentation/teams-logo-64.png b/images/presentation/teams-logo-64.png new file mode 100644 index 0000000..6d082f1 Binary files /dev/null and b/images/presentation/teams-logo-64.png differ diff --git a/images/presentation/three-environments.excalidraw b/images/presentation/three-environments.excalidraw new file mode 100644 index 0000000..1d470bf --- /dev/null +++ b/images/presentation/three-environments.excalidraw @@ -0,0 +1,860 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 543, + "versionNonce": 1852619718, + "isDeleted": false, + "id": "wjOrYQkePVir-0nCg7Kiw", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 694.30859375, + "y": 387.2421875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 323.921875, + "height": 144.8671875, + "seed": 520614112, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "FFntBrX6LI9Qje1qeZ3x9", + "type": "arrow" + } + ], + "updated": 1666026326464, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 420, + "versionNonce": 1839108367, + "isDeleted": false, + "id": "6oMw16tQ5dUtqNigPBq2O", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 760.95703125, + "y": 346.80859375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 145, + "height": 35, + "seed": 1171912090, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1666723807909, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Production", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Production" + }, + { + "type": "rectangle", + "version": 574, + "versionNonce": 1780739590, + "isDeleted": false, + "id": "mf7pAjnmzLgbGyBUApDiS", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 351.0234375, + "y": 388.748046875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 323.921875, + "height": 144.78125000000006, + "seed": 1615401414, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1666026335112, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 706, + "versionNonce": 446196890, + "isDeleted": false, + "id": "7yL9GRr7DRxoz28ehPuTM", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 0.61328125, + "y": 389.876953125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 323.921875, + "height": 142.6953125, + "seed": 169744966, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1666026371780, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 225, + "versionNonce": 1737700577, + "isDeleted": false, + "id": "e05gugZjQcLqst_UPwMus", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 740.49902007534, + "y": 401.68689397404506, + "strokeColor": "#495057", + "backgroundColor": "transparent", + "width": 195, + "height": 100, + "seed": 474627654, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1666723803420, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "\n+ Java\n+ prod dependencies\n", + "baseline": 93, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "\n+ Java\n+ prod dependencies\n" + }, + { + "type": "text", + "version": 433, + "versionNonce": 878966593, + "isDeleted": false, + "id": "Karyk3pkjVTi1t2RpiIDf", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 422.84231337488893, + "y": 347.8464949324324, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 35, + "height": 35, + "seed": 1186881478, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1666723807909, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "CI", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "CI" + }, + { + "type": "image", + "version": 496, + "versionNonce": 71881370, + "isDeleted": false, + "id": "Gl5qudxHYLQoj_YlypB65", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5.182002314814781, + "y": 346.6940456081081, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 51.2766203703704, + "height": 37.41807432432435, + "seed": 1355273670, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1666026132403, + "link": null, + "locked": false, + "status": "saved", + "fileId": "c62806208947f15aec2156d61c6276dab3f02b12", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 455, + "versionNonce": 679532399, + "isDeleted": false, + "id": "C3o8DBPKXO8prGRDcX-M9", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 70.61184462488893, + "y": 348.4558699324324, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 178, + "height": 35, + "seed": 1620955546, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1666723807910, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Devcontainer", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Devcontainer" + }, + { + "type": "arrow", + "version": 271, + "versionNonce": 1333503407, + "isDeleted": false, + "id": "FFntBrX6LI9Qje1qeZ3x9", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 845.0241110048423, + "y": 739.4735569471836, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 0.9744486232311829, + "height": 206.19168747990568, + "seed": 392250074, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1666723778887, + "link": null, + "locked": false, + "startBinding": { + "elementId": "qLeivmRJ8D0R7sx92bcjq", + "focus": -0.08484458795919761, + "gap": 11.993133043941725 + }, + "endBinding": { + "elementId": "wjOrYQkePVir-0nCg7Kiw", + "gap": 1.1724944672779005, + "focus": 0.06113934101545902 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 0.9744486232311829, + -206.19168747990568 + ] + ] + }, + { + "type": "text", + "version": 96, + "versionNonce": 868094145, + "isDeleted": false, + "id": "qLeivmRJ8D0R7sx92bcjq", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 756.5402517095297, + "y": 751.4666899911253, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 193, + "height": 50, + "seed": 1499971910, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "FFntBrX6LI9Qje1qeZ3x9", + "type": "arrow" + } + ], + "updated": 1666723780885, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Thinned down image,\nCompiled code", + "baseline": 43, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Thinned down image,\nCompiled code" + }, + { + "type": "text", + "version": 307, + "versionNonce": 2055813071, + "isDeleted": false, + "id": "Yx2shTD9L423QShso0UTp", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 380.5810513253417, + "y": 403.16736272404506, + "strokeColor": "#495057", + "backgroundColor": "transparent", + "width": 195, + "height": 100, + "seed": 1560626310, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1666723803420, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "\n+ Java\n+ prod dependencies\n", + "baseline": 93, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "\n+ Java\n+ prod dependencies\n" + }, + { + "type": "text", + "version": 303, + "versionNonce": 1010136193, + "isDeleted": false, + "id": "rZ22gqQVrx8q89pgl_JOv", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 382.6162075753417, + "y": 563.2806439740441, + "strokeColor": "#495057", + "backgroundColor": "transparent", + "width": 243, + "height": 25, + "seed": 1042666842, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1666723803420, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "+ CI deps: pytest, black", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "+ CI deps: pytest, black" + }, + { + "type": "text", + "version": 329, + "versionNonce": 1892939311, + "isDeleted": false, + "id": "6TpXFTmw_hvz8Mu-mcGJn", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 33.127553381786925, + "y": 407.5237321712288, + "strokeColor": "#495057", + "backgroundColor": "transparent", + "width": 195, + "height": 100, + "seed": 1249608774, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1666723803421, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "\n+ Java\n+ prod dependencies\n", + "baseline": 93, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "\n+ Java\n+ prod dependencies\n" + }, + { + "type": "text", + "version": 384, + "versionNonce": 2001229857, + "isDeleted": false, + "id": "3jq0MeF6tQZEkOtUnP5zF", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 30.76464507534172, + "y": 563.5228314740441, + "strokeColor": "#495057", + "backgroundColor": "transparent", + "width": 243, + "height": 25, + "seed": 1547680602, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1666723803421, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "+ CI deps: pytest, black", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "+ CI deps: pytest, black" + }, + { + "type": "text", + "version": 572, + "versionNonce": 1655099535, + "isDeleted": false, + "id": "3nYIQpb1cmzZFQPvwQ77A", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 35.43652007534172, + "y": 696.0931439740441, + "strokeColor": "#495057", + "backgroundColor": "transparent", + "width": 226, + "height": 100, + "seed": 1572811718, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1666723803421, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "+ a better shell (ZSH)\n+ more CLI's\n+ extensions\n+ personal additions", + "baseline": 93, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "+ a better shell (ZSH)\n+ more CLI's\n+ extensions\n+ personal additions" + }, + { + "type": "image", + "version": 570, + "versionNonce": 1608584538, + "isDeleted": false, + "id": "tymz8Q6FBCyZ3X7yZF4SB", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 358.8148148148148, + "y": 346.1620565878378, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 51.2766203703704, + "height": 37.41807432432435, + "seed": 1981526470, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1666026139971, + "link": null, + "locked": false, + "status": "saved", + "fileId": "c62806208947f15aec2156d61c6276dab3f02b12", + "scale": [ + 1, + 1 + ] + }, + { + "type": "image", + "version": 548, + "versionNonce": 751297946, + "isDeleted": false, + "id": "i1GfJr2rElXwseExldtVB", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 698.4632523148148, + "y": 344.0136190878378, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 51.2766203703704, + "height": 37.41807432432435, + "seed": 1417973062, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1666026143272, + "link": null, + "locked": false, + "status": "saved", + "fileId": "c62806208947f15aec2156d61c6276dab3f02b12", + "scale": [ + 1, + 1 + ] + }, + { + "type": "rectangle", + "version": 701, + "versionNonce": 1201989274, + "isDeleted": false, + "id": "y4biyjJ4rTRWkhMXJ17dk", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 351.18359375, + "y": 534.15625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 323.4140625, + "height": 144.78125000000006, + "seed": 752770394, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "57VpWS81rR9k9JItHijbE", + "type": "arrow" + } + ], + "updated": 1666026408780, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 865, + "versionNonce": 15648262, + "isDeleted": false, + "id": "Veo1MLg0uBE6OI_N2yOvv", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1.07421875, + "y": 531.89453125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 323.921875, + "height": 142.6953125, + "seed": 1256571398, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1666026384316, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 977, + "versionNonce": 337083034, + "isDeleted": false, + "id": "W1UWBZNkLZjVGD0EeBipl", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1.57421875, + "y": 674.74609375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 323.921875, + "height": 142.6953125, + "seed": 1590494554, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "s7WR7mJqf4olyIcXr3wWp", + "type": "arrow" + } + ], + "updated": 1666026473282, + "link": null, + "locked": false + }, + { + "type": "arrow", + "version": 764, + "versionNonce": 170510982, + "isDeleted": false, + "id": "57VpWS81rR9k9JItHijbE", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 502.9129994357677, + "y": 779.304377766361, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 1.2467614108451244, + "height": 99.36687776636097, + "seed": 711362758, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1666026473701, + "link": null, + "locked": false, + "startBinding": { + "elementId": "RaUTBu7AH_QOrzwgNy5Gl", + "focus": -0.1252338917668115, + "gap": 7.906559733639028 + }, + "endBinding": { + "elementId": "y4biyjJ4rTRWkhMXJ17dk", + "focus": 0.04802762823492042, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1.2467614108451244, + -99.36687776636097 + ] + ] + }, + { + "type": "text", + "version": 329, + "versionNonce": 91551087, + "isDeleted": false, + "id": "RaUTBu7AH_QOrzwgNy5Gl", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 396.98828125, + "y": 787.2109375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 241, + "height": 75, + "seed": 440468314, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "57VpWS81rR9k9JItHijbE", + "type": "arrow" + } + ], + "updated": 1666723778152, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Extra tools for testing,\nlinting and other \nQuality checks", + "baseline": 68, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Extra tools for testing,\nlinting and other \nQuality checks" + }, + { + "type": "arrow", + "version": 1973, + "versionNonce": 1014476993, + "isDeleted": false, + "id": "s7WR7mJqf4olyIcXr3wWp", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 159.84427496362025, + "y": 865.8765130542611, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 2.435587474059105, + "height": 28.759605278397885, + "seed": 1970619910, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1666723840716, + "link": null, + "locked": false, + "startBinding": { + "elementId": "nqGYxYvssbOYL6ABQtQZ3", + "focus": -0.053057086010086414, + "gap": 7.224712558905821 + }, + "endBinding": { + "elementId": "W1UWBZNkLZjVGD0EeBipl", + "focus": -0.03841150618154377, + "gap": 19.675501525863183 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 2.435587474059105, + -28.759605278397885 + ] + ] + }, + { + "type": "text", + "version": 808, + "versionNonce": 1887892705, + "isDeleted": false, + "id": "nqGYxYvssbOYL6ABQtQZ3", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 21.876543617862865, + "y": 873.1012256131669, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 288, + "height": 25, + "seed": 1578272986, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "57VpWS81rR9k9JItHijbE", + "type": "arrow" + }, + { + "id": "s7WR7mJqf4olyIcXr3wWp", + "type": "arrow" + } + ], + "updated": 1666723840715, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Useful tools for development", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Useful tools for development" + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": { + "c62806208947f15aec2156d61c6276dab3f02b12": { + "mimeType": "image/png", + "id": "c62806208947f15aec2156d61c6276dab3f02b12", + "dataURL": "data:image/png;base64,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BAZhWqEQAgQIECBAgAABAgQIECAQR0BgEKcXKiFAgAABAgQIECBAgAABAmEEBAZhWqEQAgQIECBAgAABAgQIECAQR0BgEKcXKiFAgAABAgQIECBAgAABAmEEBAZhWqEQAgQIECBAgAABAgQIECAQR0BgEKcXKiFAgAABAgQIECBAgAABAmEEBAZhWqEQAgQIECBAgAABAgQIECAQR0BgEKcXKiFAgAABAgQIECBAgAABAmEEBAZhWqEQAgQIECBAgAABAgQIECAQR0BgEKcXKiFAgAABAgQIECBAgAABAmEEBAZhWqEQAgQIECBAgAABAgQIECAQR0BgEKcXKiFAgAABAgQIECBAgAABAmEEBAZhWqEQAgQIECBAgAABAgQIECAQR0BgEKcXKiFAgAABAgQIECBAgAABAmEEBAZhWqEQAgQIECBAgAABAgQIECAQR0BgEKcXKiFAgAABAgQIECBAgAABAmEEBAZhWqEQAgQIECBAgAABAgQIECAQR0BgEKcXKiFAgAABAgQIECBAgAABAmEEBAZhWqEQAgQIECBAgAABAgQIECAQR0BgEKcXKiFAgAABAgQIECBAgAABAmEEBAZhWqEQAgQIECBAgAABAgQIECAQR0BgEKcXKiFAgAABAgQIECBAgAABAmEEBAZhWqEQAgQIECBAgAABAgQIECAQR0BgEKcXKiFAgAABAgQIECBAgAABAmEEBAZhWqEQAgQIECBAgAABAgQIECAQR0BgEKcXKiFAgAABAgQIECBAgAABAmEEBAZhWqEQAgQIECBAgAABAgQIECAQR0BgEKcXKiFAgAABAgQIECBAgAABAmEE/gd+6CZ5pbImrwAAAABJRU5ErkJggg==", + "created": 1666024890331 + } + } +} \ No newline at end of file diff --git a/images/presentation/three-environments.png b/images/presentation/three-environments.png new file mode 100644 index 0000000..c0d6999 Binary files /dev/null and b/images/presentation/three-environments.png differ diff --git a/images/presentation/without-ship-taller-img.png b/images/presentation/without-ship-taller-img.png new file mode 100644 index 0000000..b380aa9 Binary files /dev/null and b/images/presentation/without-ship-taller-img.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..3acb3f9 --- /dev/null +++ b/index.html @@ -0,0 +1,16836 @@ + + + + + + + + + +How to create a Devcontainer for your Python project ๐Ÿณ slides + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+ + + + + + + + + + + diff --git a/requirements-dev.txt b/requirements-dev.txt deleted file mode 100644 index 06a5816..0000000 --- a/requirements-dev.txt +++ /dev/null @@ -1,3 +0,0 @@ -pytest>=7 -black>=22 -mypy>=0.9 \ No newline at end of file diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 06169cc..0000000 --- a/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -pyspark>=3 \ No newline at end of file diff --git a/sales_analysis.py b/sales_analysis.py deleted file mode 100644 index 1e269cf..0000000 --- a/sales_analysis.py +++ /dev/null @@ -1,9 +0,0 @@ -from pyspark.sql import DataFrame - - -def calculate_sales_per_country(sales: DataFrame): - return ( - sales.groupBy("country") - .sum() - .withColumnRenamed("sum(amount)", "total_sales") - ) diff --git a/test_sales_analysis.py b/test_sales_analysis.py deleted file mode 100644 index 3f3b9d6..0000000 --- a/test_sales_analysis.py +++ /dev/null @@ -1,26 +0,0 @@ -import pytest -from pyspark import Row -from pyspark.sql import DataFrame, SparkSession - -from sales_analysis import calculate_sales_per_country - - -@pytest.fixture -def spark() -> SparkSession: - spark = SparkSession.builder.getOrCreate() - return spark - - -def test_calculate_sales_per_country(spark: SparkSession): - sales: DataFrame = spark.createDataFrame( - [ - Row(country="The Netherlands", amount=30), - Row(country="The Netherlands", amount=50), - Row(country="The Netherlands", amount=20), - ] - ) - sales_per_country: DataFrame = calculate_sales_per_country(sales) - - expected_sales: Row = Row(country="The Netherlands", total_sales=100) - actual_sales: Row = sales_per_country.collect()[0] - assert actual_sales == expected_sales