<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Developer-Tools | Bas Nijholt</title><link>https://www.nijho.lt/tag/developer-tools/</link><atom:link href="https://www.nijho.lt/tag/developer-tools/index.xml" rel="self" type="application/rss+xml"/><description>Developer-Tools</description><generator>Hugo</generator><language>en-us</language><copyright>© 2026</copyright><lastBuildDate>Fri, 03 Jan 2025 00:00:00 +0000</lastBuildDate><image><url>https://www.nijho.lt/media/icon_hu_408a8f6cef43e327.png</url><title>Developer-Tools</title><link>https://www.nijho.lt/tag/developer-tools/</link></image><item><title>Python environments that stuck: micromamba and uv 🐍</title><link>https://www.nijho.lt/post/python-environments/</link><pubDate>Fri, 03 Jan 2025 00:00:00 +0000</pubDate><guid isPermaLink="false">/post/python-environments/</guid><description>&lt;h2 id="1-introduction-"&gt;1. Introduction 🚀 &lt;a class="anchor" href="#1-introduction-" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Like many Python developers, I&amp;rsquo;ve spent considerable time trying different environment management tools to find what works best for me.&lt;/p&gt;&#10;&lt;p&gt;After exploring various options from virtualenv to Conda, I found that Conda-based solutions fit my needs well - mainly because they handle non-Python dependencies without much hassle.&lt;/p&gt;&#10;&lt;p&gt;While Conda itself can be slow when setting up environments, tools like Mamba and Pixi provide the same functionality with better performance.&lt;/p&gt;&#10;&lt;p&gt;In this post, I&amp;rsquo;ll share my experience with different Python environment tools and provide practical commands for setting up Python environments.&lt;/p&gt;&#10;&lt;aside class="callout callout-note"&gt;&lt;svg class="ico" viewBox="0 0 256 256" aria-hidden="true"&gt;&lt;path d="M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm16-40a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176ZM112,84a12,12,0,1,1,12,12A12,12,0,0,1,112,84Z"/&gt;&lt;/svg&gt;&lt;div&gt;TL;DR, I use &lt;code&gt;micromamba&lt;/code&gt; for projects with non-Python dependencies and &lt;code&gt;uv&lt;/code&gt; for projects without them.&#10;This approach works well for me, you own mileage may vary.&lt;/div&gt;&lt;/aside&gt;&#10;&lt;details class="toc" open&gt;&lt;summary&gt;Table of contents&lt;/summary&gt;&lt;nav id="TableOfContents"&gt;&#10; &lt;ul&gt;&#10; &lt;li&gt;&lt;a href="#1-introduction-"&gt;1. Introduction 🚀&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#2-the-alternatives-"&gt;2. The Alternatives 🌟&lt;/a&gt;&#10; &lt;ul&gt;&#10; &lt;li&gt;&lt;a href="#-pyenv"&gt;🐍 Pyenv&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#-pipenv"&gt;📦 Pipenv&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#-conda"&gt;🌐 Conda&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#-mamba"&gt;🚀 Mamba&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#-micromamba"&gt;🌌 Micromamba&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#-docker"&gt;🐳 Docker&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#-venv"&gt;🏞️ Venv&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#-virtualenv"&gt;🌐 Virtualenv&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#-homebrew"&gt;🍺 Homebrew&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#-system-package-managers"&gt;💻 System package managers&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#-pixi"&gt;🌟 Pixi&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#-uv"&gt;⚡ uv&lt;/a&gt;&lt;/li&gt;&#10; &lt;/ul&gt;&#10; &lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#3-conclusion-"&gt;3. Conclusion 🏁&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#4-further-reading-"&gt;4. Further Reading 📚&lt;/a&gt;&lt;/li&gt;&#10; &lt;/ul&gt;&#10;&lt;/nav&gt;&lt;/details&gt;&#10;&#10;&lt;h2 id="2-the-alternatives-"&gt;2. The Alternatives 🌟 &lt;a class="anchor" href="#2-the-alternatives-" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Before we start look at this comparison tables for the most popular Python environment management tools.&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;I had to split the tables into two because of the number of columns.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Table 1: Python Environment Management Tools&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="table-wrap"&gt;&#10;&lt;table&gt;&#10;&lt;thead&gt;&#10;&lt;tr&gt;&#10;&lt;th&gt;Tool&lt;/th&gt;&#10;&lt;th&gt;Key Features&lt;/th&gt;&#10;&lt;th&gt;Native/3rd Party&lt;/th&gt;&#10;&lt;th&gt;Non-Python Deps&lt;/th&gt;&#10;&lt;/tr&gt;&#10;&lt;/thead&gt;&#10;&lt;tbody&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;a href="https://github.com/pyenv/pyenv" target="_blank" rel="noopener"&gt;Pyenv&lt;/a&gt;&lt;/td&gt;&#10;&lt;td&gt;Python version management&lt;/td&gt;&#10;&lt;td&gt;3rd Party&lt;/td&gt;&#10;&lt;td&gt;❌&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;a href="https://pipenv.pypa.io/en/latest/" target="_blank" rel="noopener"&gt;Pipenv&lt;/a&gt;&lt;/td&gt;&#10;&lt;td&gt;Package &amp;amp; env management&lt;/td&gt;&#10;&lt;td&gt;3rd Party&lt;/td&gt;&#10;&lt;td&gt;❌&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;a href="https://docs.conda.io/en/latest/" target="_blank" rel="noopener"&gt;Conda&lt;/a&gt;&lt;/td&gt;&#10;&lt;td&gt;Package &amp;amp; env management&lt;/td&gt;&#10;&lt;td&gt;3rd Party&lt;/td&gt;&#10;&lt;td&gt;✅&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;a href="https://mamba.readthedocs.io/en/latest/" target="_blank" rel="noopener"&gt;Mamba&lt;/a&gt;&lt;/td&gt;&#10;&lt;td&gt;Fast Conda replacement&lt;/td&gt;&#10;&lt;td&gt;3rd Party&lt;/td&gt;&#10;&lt;td&gt;✅&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;a href="https://mamba.readthedocs.io/en/latest/user_guide/micromamba.html" target="_blank" rel="noopener"&gt;Micromamba&lt;/a&gt;&lt;/td&gt;&#10;&lt;td&gt;Lightweight Mamba&lt;/td&gt;&#10;&lt;td&gt;3rd Party&lt;/td&gt;&#10;&lt;td&gt;✅&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;a href="https://www.docker.com/" target="_blank" rel="noopener"&gt;Docker&lt;/a&gt;&lt;/td&gt;&#10;&lt;td&gt;Containerization&lt;/td&gt;&#10;&lt;td&gt;3rd Party&lt;/td&gt;&#10;&lt;td&gt;✅&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;a href="https://docs.python.org/3/library/venv.html" target="_blank" rel="noopener"&gt;Venv&lt;/a&gt;&lt;/td&gt;&#10;&lt;td&gt;Built-in env management&lt;/td&gt;&#10;&lt;td&gt;Native&lt;/td&gt;&#10;&lt;td&gt;❌&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;a href="https://virtualenv.pypa.io/en/latest/" target="_blank" rel="noopener"&gt;Virtualenv&lt;/a&gt;&lt;/td&gt;&#10;&lt;td&gt;Env management (pre-3.3)&lt;/td&gt;&#10;&lt;td&gt;3rd Party&lt;/td&gt;&#10;&lt;td&gt;❌&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;a href="https://brew.sh/" target="_blank" rel="noopener"&gt;Homebrew&lt;/a&gt;&lt;/td&gt;&#10;&lt;td&gt;macOS/Linux package manager&lt;/td&gt;&#10;&lt;td&gt;3rd Party&lt;/td&gt;&#10;&lt;td&gt;✅&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;a href="https://prefix.dev/docs/pixi/overview" target="_blank" rel="noopener"&gt;Pixi&lt;/a&gt;&lt;/td&gt;&#10;&lt;td&gt;Fast Conda alternative&lt;/td&gt;&#10;&lt;td&gt;3rd Party&lt;/td&gt;&#10;&lt;td&gt;✅&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;a href="https://github.com/astral-sh/uv" target="_blank" rel="noopener"&gt;uv&lt;/a&gt;&lt;/td&gt;&#10;&lt;td&gt;Fast pip and venv replacement&lt;/td&gt;&#10;&lt;td&gt;3rd Party&lt;/td&gt;&#10;&lt;td&gt;❌&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;System Package Managers&lt;/td&gt;&#10;&lt;td&gt;OS-based package management&lt;/td&gt;&#10;&lt;td&gt;Native&lt;/td&gt;&#10;&lt;td&gt;✅&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Table 2: Python Environment Management Tools&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="table-wrap"&gt;&#10;&lt;table&gt;&#10;&lt;thead&gt;&#10;&lt;tr&gt;&#10;&lt;th&gt;Tool&lt;/th&gt;&#10;&lt;th&gt;Ease of Use&lt;/th&gt;&#10;&lt;th&gt;Isolation&lt;/th&gt;&#10;&lt;th&gt;Cross-Platform Support&lt;/th&gt;&#10;&lt;th&gt;Community &amp;amp; Support&lt;/th&gt;&#10;&lt;th&gt;Performance&lt;/th&gt;&#10;&lt;/tr&gt;&#10;&lt;/thead&gt;&#10;&lt;tbody&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;a href="https://github.com/pyenv/pyenv" target="_blank" rel="noopener"&gt;Pyenv&lt;/a&gt;&lt;/td&gt;&#10;&lt;td&gt;Medium&lt;/td&gt;&#10;&lt;td&gt;✅&lt;/td&gt;&#10;&lt;td&gt;Windows, macOS, Linux&lt;/td&gt;&#10;&lt;td&gt;Good&lt;/td&gt;&#10;&lt;td&gt;Good&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;a href="https://pipenv.pypa.io/en/latest/" target="_blank" rel="noopener"&gt;Pipenv&lt;/a&gt;&lt;/td&gt;&#10;&lt;td&gt;Easy&lt;/td&gt;&#10;&lt;td&gt;✅&lt;/td&gt;&#10;&lt;td&gt;Windows, macOS, Linux&lt;/td&gt;&#10;&lt;td&gt;Good&lt;/td&gt;&#10;&lt;td&gt;Good&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;a href="https://docs.conda.io/en/latest/" target="_blank" rel="noopener"&gt;Conda&lt;/a&gt;&lt;/td&gt;&#10;&lt;td&gt;Easy&lt;/td&gt;&#10;&lt;td&gt;✅&lt;/td&gt;&#10;&lt;td&gt;Windows, macOS, Linux&lt;/td&gt;&#10;&lt;td&gt;Excellent&lt;/td&gt;&#10;&lt;td&gt;Average&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;a href="https://mamba.readthedocs.io/en/latest/" target="_blank" rel="noopener"&gt;Mamba&lt;/a&gt;&lt;/td&gt;&#10;&lt;td&gt;Easy&lt;/td&gt;&#10;&lt;td&gt;✅&lt;/td&gt;&#10;&lt;td&gt;Windows, macOS, Linux&lt;/td&gt;&#10;&lt;td&gt;Growing&lt;/td&gt;&#10;&lt;td&gt;Fast&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;a href="https://mamba.readthedocs.io/en/latest/user_guide/micromamba.html" target="_blank" rel="noopener"&gt;Micromamba&lt;/a&gt;&lt;/td&gt;&#10;&lt;td&gt;Medium&lt;/td&gt;&#10;&lt;td&gt;✅&lt;/td&gt;&#10;&lt;td&gt;Windows, macOS, Linux&lt;/td&gt;&#10;&lt;td&gt;Growing&lt;/td&gt;&#10;&lt;td&gt;Fast&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;a href="https://www.docker.com/" target="_blank" rel="noopener"&gt;Docker&lt;/a&gt;&lt;/td&gt;&#10;&lt;td&gt;Hard&lt;/td&gt;&#10;&lt;td&gt;✅&lt;/td&gt;&#10;&lt;td&gt;Windows, macOS, Linux&lt;/td&gt;&#10;&lt;td&gt;Excellent&lt;/td&gt;&#10;&lt;td&gt;Good&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;a href="https://docs.python.org/3/library/venv.html" target="_blank" rel="noopener"&gt;Venv&lt;/a&gt;&lt;/td&gt;&#10;&lt;td&gt;Easy&lt;/td&gt;&#10;&lt;td&gt;✅&lt;/td&gt;&#10;&lt;td&gt;Windows, macOS, Linux&lt;/td&gt;&#10;&lt;td&gt;Excellent&lt;/td&gt;&#10;&lt;td&gt;Good&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;a href="https://virtualenv.pypa.io/en/latest/" target="_blank" rel="noopener"&gt;Virtualenv&lt;/a&gt;&lt;/td&gt;&#10;&lt;td&gt;Medium&lt;/td&gt;&#10;&lt;td&gt;✅&lt;/td&gt;&#10;&lt;td&gt;Windows, macOS, Linux&lt;/td&gt;&#10;&lt;td&gt;Good&lt;/td&gt;&#10;&lt;td&gt;Good&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;a href="https://brew.sh/" target="_blank" rel="noopener"&gt;Homebrew&lt;/a&gt;&lt;/td&gt;&#10;&lt;td&gt;Easy&lt;/td&gt;&#10;&lt;td&gt;❌&lt;/td&gt;&#10;&lt;td&gt;macOS, Linux&lt;/td&gt;&#10;&lt;td&gt;Excellent&lt;/td&gt;&#10;&lt;td&gt;Good&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;a href="https://prefix.dev/docs/pixi/overview" target="_blank" rel="noopener"&gt;Pixi&lt;/a&gt;&lt;/td&gt;&#10;&lt;td&gt;Easy&lt;/td&gt;&#10;&lt;td&gt;✅&lt;/td&gt;&#10;&lt;td&gt;Windows, macOS, Linux&lt;/td&gt;&#10;&lt;td&gt;Growing&lt;/td&gt;&#10;&lt;td&gt;Fast&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;a href="https://github.com/astral-sh/uv" target="_blank" rel="noopener"&gt;uv&lt;/a&gt;&lt;/td&gt;&#10;&lt;td&gt;Easy&lt;/td&gt;&#10;&lt;td&gt;✅&lt;/td&gt;&#10;&lt;td&gt;Windows, macOS, Linux&lt;/td&gt;&#10;&lt;td&gt;Growing&lt;/td&gt;&#10;&lt;td&gt;Very Fast&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;System Package Managers&lt;/td&gt;&#10;&lt;td&gt;Easy&lt;/td&gt;&#10;&lt;td&gt;❌&lt;/td&gt;&#10;&lt;td&gt;Depends on OS&lt;/td&gt;&#10;&lt;td&gt;Depends on OS&lt;/td&gt;&#10;&lt;td&gt;Good&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Now that we&amp;rsquo;ve seen the alternatives, let&amp;rsquo;s dive into setting up environments with the help of Conda and Mamba.&lt;/p&gt;&#10;&lt;h3 id="-pyenv"&gt;🐍 Pyenv &lt;a class="anchor" href="#-pyenv" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;A popular tool that enables you to easily manage multiple Python versions on a single system.&#10;It allows you to switch between different Python versions without interfering with system-level installations.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Setup Instructions&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Install pyenv:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;macOS: &lt;code&gt;brew install pyenv&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Ubuntu: &lt;code&gt;curl https://pyenv.run | bash&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Add the following lines to your shell configuration file (e.g., &lt;code&gt;~/.bashrc&lt;/code&gt;, &lt;code&gt;~/.zshrc&lt;/code&gt;):&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.pyenv/bin:&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;pyenv init -&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Restart your shell or run &lt;code&gt;source ~/.bashrc&lt;/code&gt; (or &lt;code&gt;source ~/.zshrc&lt;/code&gt;)&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Install a specific Python version: &lt;code&gt;pyenv install 3.8.5&lt;/code&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Set the Python version for your project: &lt;code&gt;pyenv local 3.8.5&lt;/code&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="-pipenv"&gt;📦 Pipenv &lt;a class="anchor" href="#-pipenv" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;A package management and virtual environment management tool that combines the functionality of pip and virtualenv.&#10;It streamlines the process of installing and managing packages within isolated environments.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Setup Instructions&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Install pipenv: &lt;code&gt;pip install --user pipenv&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Change to your project directory: &lt;code&gt;cd my_project&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Initialize a new virtual environment: &lt;code&gt;pipenv --python 3.8&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Install packages: &lt;code&gt;pipenv install &amp;lt;package_name&amp;gt;&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Activate the environment: &lt;code&gt;pipenv shell&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="-conda"&gt;🌐 Conda &lt;a class="anchor" href="#-conda" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;A cross-platform package manager and environment management tool, often used in conjunction with Anaconda and Miniconda.&#10;Conda simplifies the installation and management of packages and dependencies, especially for data science and machine learning projects.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Setup Instructions&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Download and install Miniconda: &lt;a href="https://github.com/conda-forge/miniforge#miniforge3" target="_blank" rel="noopener"&gt;https://github.com/conda-forge/miniforge#miniforge3&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Create a new environment: &lt;code&gt;conda create --name my_env python=3.8&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Activate the environment: &lt;code&gt;conda activate my_env&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Install packages: &lt;code&gt;conda install &amp;lt;package_name&amp;gt;&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="-mamba"&gt;🚀 Mamba &lt;a class="anchor" href="#-mamba" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Mamba is a fast, drop-in replacement for Conda, designed to resolve and install packages more quickly.&#10;It uses the same Conda repositories and environment files, making it easy to switch between the two.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Setup Instructions&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Install Mambaforge with Mamba pre-installed:&lt;/p&gt;&#10;&lt;p&gt;Download and install Mambaforge with Mamba for your platform: &lt;a href="https://github.com/conda-forge/miniforge#mambaforge" target="_blank" rel="noopener"&gt;https://github.com/conda-forge/miniforge#mambaforge&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Alternatively, you can install Mamba within an existing Conda environment:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;conda install -c conda-forge mamba&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Create a new environment with Mamba:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mamba create --name my_env &lt;span class="nv"&gt;python&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3.8&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Activate the environment:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mamba activate my_env&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Install packages using Mamba:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mamba install &amp;lt;package_name&amp;gt; -c conda-forge&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;By using Mamba instead of Conda, you can significantly speed up environment resolution and package installation while still benefiting from the Conda ecosystem.&lt;/p&gt;&#10;&lt;h3 id="-micromamba"&gt;🌌 Micromamba &lt;a class="anchor" href="#-micromamba" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Micromamba is a lightweight and fast alternative to the Mamba package manager.&#10;It is a statically linked C++ executable that doesn&amp;rsquo;t require a base environment or come with a default Python version.&#10;It supports a subset of Mamba and Conda commands and is designed to resolve and install packages quickly.&#10;For those who need Conda features, you can install Conda using Micromamba with &lt;code&gt;micromamba install conda&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Setup Instructions&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Download the appropriate Micromamba binary for your platform from &lt;a href="https://github.com/mamba-org/mamba/releases" target="_blank" rel="noopener"&gt;the official repository&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Make the binary executable and move it to a directory in your &lt;code&gt;PATH&lt;/code&gt;:&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x micromamba mv micromamba /usr/local/bin/&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;Create a new environment with Micromamba:&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;micromamba create -n my_env python -c conda-forge&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;Activate the environment:&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;micromamba activate my_env&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;Install packages using Micromamba:&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;micromamba install &amp;lt;package_name&amp;gt; -c conda-forge&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;If you need Conda&amp;rsquo;s features, you can install Conda within your Micromamba environment:&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;micromamba install conda&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;For example, if you need nb_conda_kernels to use your Micromamba environment in JupyterLab:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;micromamba install conda nb_conda_kernels&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And you are set up!&lt;/p&gt;&#10;&lt;p&gt;Micromamba is the perfect solution for those who want a fast and lightweight package manager while still being able to access Conda&amp;rsquo;s features when needed.&lt;/p&gt;&#10;&lt;h3 id="-docker"&gt;🐳 Docker &lt;a class="anchor" href="#-docker" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;A containerization platform that allows you to create lightweight, portable environments called containers.&#10;With Docker, you can package your Python application along with its dependencies, ensuring consistent execution across different systems.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Setup Instructions&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Install Docker: &lt;a href="https://docs.docker.com/get-docker/" target="_blank" rel="noopener"&gt;https://docs.docker.com/get-docker/&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Create a &lt;code&gt;Dockerfile&lt;/code&gt; in your project directory with the following contents:&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FROM python:3.11&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WORKDIR /app&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;COPY requirements.txt .&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RUN pip install --no-cache-dir -r requirements.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;COPY . .&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CMD &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;python&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;your_script.py&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;Build the Docker image: &lt;code&gt;docker build -t my_project .&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Run the Docker container: &lt;code&gt;docker run my_project&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="-venv"&gt;🏞️ Venv &lt;a class="anchor" href="#-venv" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;A built-in Python module available since Python 3.3, which allows you to create lightweight virtual environments.&#10;Venv simplifies the process of creating isolated environments for different projects, ensuring that package dependencies don&amp;rsquo;t conflict with each other.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Setup Instructions&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Create a new virtual environment: &lt;code&gt;python3 -m venv my_env&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Activate the environment:&#10;&lt;ul&gt;&#10;&lt;li&gt;macOS/Linux: &lt;code&gt;source my_env/bin/activate&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Windows: &lt;code&gt;my_envScriptsactivate&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Install packages: &lt;code&gt;pip install &amp;lt;package_name&amp;gt;&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="-virtualenv"&gt;🌐 Virtualenv &lt;a class="anchor" href="#-virtualenv" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Virtualenv is a third-party Python environment management tool that predates the built-in &lt;code&gt;venv&lt;/code&gt; module. It allows you to create isolated environments for different projects, ensuring that package dependencies don&amp;rsquo;t conflict with each other. Virtualenv is compatible with Python 2.7 and later versions, whereas &lt;code&gt;venv&lt;/code&gt; is only available since Python 3.3.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Setup Instructions&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Install virtualenv: &lt;code&gt;pip install virtualenv&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Create a new virtual environment: &lt;code&gt;virtualenv my_env&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Activate the environment:&#10;&lt;ul&gt;&#10;&lt;li&gt;macOS/Linux: &lt;code&gt;source my_env/bin/activate&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Windows: &lt;code&gt;my_env\Scripts\activate&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Install packages: &lt;code&gt;pip install &amp;lt;package_name&amp;gt;&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="-homebrew"&gt;🍺 Homebrew &lt;a class="anchor" href="#-homebrew" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Homebrew is a popular package manager for macOS and Linux that simplifies the installation and management of software. Though it is not a dedicated Python environment management tool, it does offer support for installing and managing multiple Python versions alongside other software.&lt;/p&gt;&#10;&lt;p&gt;Homebrew can be useful for installing and managing Python versions for system-level usage, but it&amp;rsquo;s not the best choice for managing isolated project-specific dependencies. For project-specific dependency management, it&amp;rsquo;s recommended to use other tools like venv, virtualenv, or Conda in conjunction with Homebrew-installed Python.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Setup Instructions&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Install Homebrew (if not already installed):&#10;&lt;ul&gt;&#10;&lt;li&gt;macOS: Follow the instructions at &lt;a href="https://brew.sh/" target="_blank" rel="noopener"&gt;https://brew.sh&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Linux: Follow the instructions at &lt;a href="https://docs.brew.sh/Homebrew-on-Linux" target="_blank" rel="noopener"&gt;https://docs.brew.sh/Homebrew-on-Linux&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Install a specific Python version:&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install python@3.11&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;Add the installed Python version to your &lt;code&gt;PATH&lt;/code&gt; by adding the following line to your shell configuration file (e.g., &lt;code&gt;~/.bashrc&lt;/code&gt;, &lt;code&gt;~/.zshrc&lt;/code&gt;):&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/usr/local/opt/python@3.11/bin:&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;Restart your shell or run &lt;code&gt;source ~/.bashrc&lt;/code&gt; (or &lt;code&gt;source ~/.zshrc&lt;/code&gt;) to apply the changes.&lt;/li&gt;&#10;&lt;li&gt;Verify the Python version: &lt;code&gt;python3.11 --version&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Keep in mind that Homebrew is mainly for installing and managing software at the system level. To manage project-specific dependencies and create isolated environments, combine Homebrew with other tools like venv or virtualenv for better dependency management.&lt;/p&gt;&#10;&lt;h3 id="-system-package-managers"&gt;💻 System package managers &lt;a class="anchor" href="#-system-package-managers" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Some operating systems have their own package managers (e.g., apt for Ubuntu, pacman for Arch Linux, or Homebrew for macOS) that can be used to install and manage Python environments.&#10;However, using system package managers may lead to conflicts with other system packages and is generally not recommended for managing project-specific dependencies.&lt;/p&gt;&#10;&lt;p&gt;I will skip the setup instructions for this one, as it is just not recommended to do this!&lt;/p&gt;&#10;&lt;h3 id="-pixi"&gt;🌟 Pixi &lt;a class="anchor" href="#-pixi" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Pixi is a new package manager built in Rust that uses Conda-forge packages but aims to be significantly faster and simpler than Conda.&#10;It&amp;rsquo;s developed by prefix.dev (the team behind Mamba) and focuses on providing a more streamlined experience.&#10;It is inspired by tools like Cargo, nix, and npm and aims to provide a modern package management experience for Python developers.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Setup Instructions&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Install pixi following instructions at &lt;a href="https://prefix.dev/docs/pixi/installation" target="_blank" rel="noopener"&gt;prefix.dev&lt;/a&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Initialize a new project:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pixi init my-project&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; my-project&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Add dependencies:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pixi add python numpy pandas&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Run Python in the environment:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pixi run python&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Create and run tasks (defined in pixi.toml):&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Add a task&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pixi task add hello &lt;span class="s2"&gt;&amp;#34;python hello_world.py&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Run the task&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pixi run hello&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Start an interactive shell in the environment:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pixi shell&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Pixi can also be used as a global installation tool:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Install tools globally&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pixi global install starship&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pixi global install fish&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Create a named environment with multiple packages&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pixi global install --environment data-science-env &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --expose python --expose jupyter &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; python jupyter numpy pandas&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Key features:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Fast package resolution and installation&lt;/li&gt;&#10;&lt;li&gt;Uses Conda-forge packages&lt;/li&gt;&#10;&lt;li&gt;Built-in task runner&lt;/li&gt;&#10;&lt;li&gt;Global package installation support&lt;/li&gt;&#10;&lt;li&gt;GitHub Actions integration with automatic caching&lt;/li&gt;&#10;&lt;li&gt;Simple and intuitive CLI&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="-uv"&gt;⚡ uv &lt;a class="anchor" href="#-uv" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;uv is an extremely fast Python package installer and resolver written in Rust.&#10;It can be used as a drop-in replacement for pip and can generate virtual environments.&#10;While it is quite new it is already being used by many developers due to its speed and ease of use.&#10;Besides being fast, it is awesome because it is a single binary that can be used to also bootstrap Python itself.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Setup Instructions&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;a href="https://docs.astral.sh/uv/getting-started/installation/" target="_blank" rel="noopener"&gt;Install uv&lt;/a&gt;:&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -LsSf https://astral.sh/uv/install.sh &lt;span class="p"&gt;|&lt;/span&gt; sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;Create a new virtual environment:&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uv venv&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;Activate the environment:&#10;&lt;ul&gt;&#10;&lt;li&gt;Unix/macOS: &lt;code&gt;source .venv/bin/activate&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Windows: &lt;code&gt;.venv\Scripts\activate&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Install packages (much faster than pip):&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uv pip install numpy pandas&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;It will automatically maintain a &lt;code&gt;uv.lock&lt;/code&gt; file to ensure deterministic builds.&#10;Install this lock file with &lt;code&gt;uv sync&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;Key features of uv:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Up to 10x faster than pip&lt;/li&gt;&#10;&lt;li&gt;Built-in virtual environment support&lt;/li&gt;&#10;&lt;li&gt;Compatible with pip&amp;rsquo;s CLI interface&lt;/li&gt;&#10;&lt;li&gt;Global package caching&lt;/li&gt;&#10;&lt;li&gt;Deterministic builds&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;There is much more to uv, so check out the &lt;a href="https://docs.astral.sh/uv/" target="_blank" rel="noopener"&gt;documentation&lt;/a&gt; for more details.&lt;/p&gt;&#10;&lt;h2 id="3-conclusion-"&gt;3. Conclusion 🏁 &lt;a class="anchor" href="#3-conclusion-" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;The choice you make for managing your Python environments ultimately depends on your use case.&#10;If you don&amp;rsquo;t have to frequently deal with non-Python dependencies, I would recommend using &lt;code&gt;uv&lt;/code&gt; for its speed and simplicity.&#10;However, because I often work with projects that require non-Python dependencies, I&amp;rsquo;ve found that Micromamba is the perfect fit for me.&lt;/p&gt;&#10;&lt;p&gt;That being said, each tool has its own strengths and weaknesses, and it&amp;rsquo;s important to choose the one that works best for your specific needs.&#10;I hope this journey through Python environment management has been helpful and informative.&#10;Good luck in finding your perfect Python environment workflow! 🐍&lt;/p&gt;&#10;&lt;h2 id="4-further-reading-"&gt;4. Further Reading 📚 &lt;a class="anchor" href="#4-further-reading-" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Here are some resources for further exploration:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/pyenv/pyenv" target="_blank" rel="noopener"&gt;&lt;strong&gt;Pyenv&lt;/strong&gt;&lt;/a&gt;: Pyenv GitHub repository and documentation&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://pipenv.pypa.io/en/latest/" target="_blank" rel="noopener"&gt;&lt;strong&gt;Pipenv&lt;/strong&gt;&lt;/a&gt;: Pipenv documentation&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://docs.conda.io/en/latest/" target="_blank" rel="noopener"&gt;&lt;strong&gt;Conda&lt;/strong&gt;&lt;/a&gt;: Conda documentation&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://mamba.readthedocs.io/en/latest/" target="_blank" rel="noopener"&gt;&lt;strong&gt;Mamba&lt;/strong&gt;&lt;/a&gt;: Mamba documentation&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://mamba.readthedocs.io/en/latest/user_guide/micromamba.html" target="_blank" rel="noopener"&gt;&lt;strong&gt;Micromamba&lt;/strong&gt;&lt;/a&gt;: Micromamba documentation&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://docs.python.org/3/library/venv.html" target="_blank" rel="noopener"&gt;&lt;strong&gt;venv&lt;/strong&gt;&lt;/a&gt;: venv documentation&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://virtualenv.pypa.io/en/latest/" target="_blank" rel="noopener"&gt;&lt;strong&gt;virtualenv&lt;/strong&gt;&lt;/a&gt;: virtualenv documentation&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://www.anaconda.com/" target="_blank" rel="noopener"&gt;&lt;strong&gt;Anaconda&lt;/strong&gt;&lt;/a&gt;: Anaconda homepage&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://docs.conda.io/en/latest/miniconda.html" target="_blank" rel="noopener"&gt;&lt;strong&gt;Miniconda&lt;/strong&gt;&lt;/a&gt;: Miniconda documentation&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://brew.sh/" target="_blank" rel="noopener"&gt;&lt;strong&gt;Homebrew&lt;/strong&gt;&lt;/a&gt;: Homebrew homepage&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://prefix.dev/docs/pixi/overview" target="_blank" rel="noopener"&gt;&lt;strong&gt;Pixi&lt;/strong&gt;&lt;/a&gt;: Pixi documentation&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://docs.astral.sh/uv/" target="_blank" rel="noopener"&gt;&lt;strong&gt;uv&lt;/strong&gt;&lt;/a&gt;: uv documentation&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>fileup 📤</title><link>https://www.nijho.lt/post/advent-of-open-source/19-fileup/</link><pubDate>Thu, 19 Dec 2024 00:00:00 +0000</pubDate><guid isPermaLink="false">/post/advent-of-open-source/19-fileup/</guid><description>&lt;p&gt;(See my &lt;a href="../"&gt;intro post&lt;/a&gt;)&lt;/p&gt;&#10;&lt;p&gt;Sometimes the best tools are the ones you build for yourself and keep using for years. Today&amp;rsquo;s project is &lt;a href="https://github.com/basnijholt/fileup" target="_blank" rel="noopener"&gt;&lt;code&gt;fileup&lt;/code&gt;&lt;/a&gt;, a tiny command-line utility that&amp;rsquo;s been making my life easier for 7 years - because sharing files shouldn&amp;rsquo;t require leaving the terminal!&lt;/p&gt;&#10;&lt;h2 id="-origin-story"&gt;📖 Origin Story &lt;a class="anchor" href="#-origin-story" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Back in 2017, I found myself repeatedly going through the same tedious process: needing to share a file, opening a browser, navigating to a file sharing service, waiting for uploads, and copying URLs. As someone who lives in the terminal, this felt inefficient. I wanted something as simple as &lt;code&gt;fu filename&lt;/code&gt; that would handle everything and put the URL in my clipboard. Seven years and countless file shares later, it&amp;rsquo;s still one of my most-used tools.&lt;/p&gt;&#10;&lt;h2 id="-technical-highlights"&gt;🔧 Technical Highlights &lt;a class="anchor" href="#-technical-highlights" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Supports both FTP and SCP uploads&lt;/li&gt;&#10;&lt;li&gt;Smart URL generation:&#10;&lt;ul&gt;&#10;&lt;li&gt;Jupyter notebooks → nbviewer links&lt;/li&gt;&#10;&lt;li&gt;Images → markdown-formatted links&lt;/li&gt;&#10;&lt;li&gt;Regular files → direct URLs&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Automatic file expiration and cleanup&lt;/li&gt;&#10;&lt;li&gt;Zero dependencies - uses only Python standard library&lt;/li&gt;&#10;&lt;li&gt;Clipboard integration (macOS)&lt;/li&gt;&#10;&lt;li&gt;Simple INI configuration&lt;/li&gt;&#10;&lt;li&gt;Works as both a standalone script or installed package&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="-impact"&gt;📊 Impact &lt;a class="anchor" href="#-impact" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;This is one of those tools where GitHub stars (currently 0!) don&amp;rsquo;t tell the whole story:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Used almost daily for 7 years&lt;/li&gt;&#10;&lt;li&gt;Shared thousands of files&lt;/li&gt;&#10;&lt;li&gt;Saved countless minutes of browser interactions&lt;/li&gt;&#10;&lt;li&gt;Proves that utility trumps popularity in open source&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="-lessons-learned"&gt;💡 Lessons Learned &lt;a class="anchor" href="#-lessons-learned" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Longevity comes from solving a real, persistent need&lt;/li&gt;&#10;&lt;li&gt;A tool doesn&amp;rsquo;t need to be revolutionary to be useful&lt;/li&gt;&#10;&lt;li&gt;Zero dependencies mean zero maintenance headaches&lt;/li&gt;&#10;&lt;li&gt;Sometimes the impact of a tool isn&amp;rsquo;t measured in stars&lt;/li&gt;&#10;&lt;li&gt;Simple tools that remove friction are worth maintaining&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Want to share files from your terminal? Check out &lt;a href="https://github.com/basnijholt/fileup" target="_blank" rel="noopener"&gt;fileup on GitHub&lt;/a&gt;!&lt;/p&gt;&#10;&lt;p&gt;#OpenSource #Python #DevTools #CommandLine #Programming&lt;/p&gt;&#10;</description></item><item><title>clip-files 📋</title><link>https://www.nijho.lt/post/advent-of-open-source/15-clip-files/</link><pubDate>Sun, 15 Dec 2024 00:00:00 +0000</pubDate><guid isPermaLink="false">/post/advent-of-open-source/15-clip-files/</guid><description>&lt;p&gt;(See my &lt;a href="../"&gt;intro post&lt;/a&gt;)&lt;/p&gt;&#10;&lt;p&gt;Sometimes the most useful tools are born from daily frustrations.&#10;When working with AI assistants like ChatGPT or Claude, I found myself constantly copying files to share context.&#10;After doing this manually dozens of times, I created a tool to automate it.&lt;/p&gt;&#10;&lt;h2 id="-origin-story"&gt;📖 Origin Story &lt;a class="anchor" href="#-origin-story" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;While contributing to open source, I frequently like to share entire (or large parts of) codebases with AI assistants for context or code review.&#10;Since the code is open source anyway, there&amp;rsquo;s no reason not to share the full context! But manually copying files, adding their paths for context, and ensuring I didn&amp;rsquo;t exceed token limits was tedious.&#10;Instead of continuing this manual process, I spent an evening creating &lt;a href="https://github.com/basnijholt/clip-files" target="_blank" rel="noopener"&gt;&lt;code&gt;clip-files&lt;/code&gt;&lt;/a&gt; - and have used it multiple times daily ever since.&lt;/p&gt;&#10;&lt;p&gt;In fact, I&amp;rsquo;m using it right now! The command (shown below) lets me share this entire advent calendar series with AI assistants for proofreading.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;clip-files --initial-file ai.md --files introduction.md day*.md&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="-technical-highlights"&gt;🔧 Technical Highlights &lt;a class="anchor" href="#-technical-highlights" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Uses &lt;code&gt;tiktoken&lt;/code&gt; for accurate GPT token counting&lt;/li&gt;&#10;&lt;li&gt;Supports both directory traversal and specific file selection&lt;/li&gt;&#10;&lt;li&gt;Automatically generates a file index for reference&lt;/li&gt;&#10;&lt;li&gt;Allows custom initial instructions via file&lt;/li&gt;&#10;&lt;li&gt;Preserves file paths in output for context&lt;/li&gt;&#10;&lt;li&gt;Clean, typed, and documented codebase&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="-impact"&gt;📊 Impact &lt;a class="anchor" href="#-impact" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;While this tool has no GitHub stars (I haven&amp;rsquo;t promoted it), its real impact is personal - I use it multiple times daily for:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Sharing entire open source codebases with AI assistants&lt;/li&gt;&#10;&lt;li&gt;Getting comprehensive code reviews&lt;/li&gt;&#10;&lt;li&gt;Discussing bug fixes with full context&lt;/li&gt;&#10;&lt;li&gt;Documentation improvements&lt;/li&gt;&#10;&lt;li&gt;Open source contributions&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;The tool&amp;rsquo;s real value isn&amp;rsquo;t in its complexity (it&amp;rsquo;s just ~250 lines of code) but in how it removes friction from open source development.&#10;When working with open code, we might as well share all the context we can - and this tool makes that effortless.&lt;/p&gt;&#10;&lt;h2 id="-challenges-and-solutions"&gt;🎯 Challenges and Solutions &lt;a class="anchor" href="#-challenges-and-solutions" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Maintaining consistent formatting across different input methods&lt;/li&gt;&#10;&lt;li&gt;Calculating accurate token counts for different components&lt;/li&gt;&#10;&lt;li&gt;Providing meaningful error messages for invalid inputs&lt;/li&gt;&#10;&lt;li&gt;Structuring output to be AI-assistant friendly&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="-lessons-learned"&gt;💡 Lessons Learned &lt;a class="anchor" href="#-lessons-learned" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;When working with open source code, sharing full context is valuable&lt;/li&gt;&#10;&lt;li&gt;Simple command-line tools can significantly improve daily workflows&lt;/li&gt;&#10;&lt;li&gt;Consistent formatting matters when working with AI assistants&lt;/li&gt;&#10;&lt;li&gt;Sometimes a 250-line tool can save hours of manual work&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Want to make sharing code with AI assistants easier? Check out &lt;a href="https://github.com/basnijholt/clip-files" target="_blank" rel="noopener"&gt;clip-files on GitHub&lt;/a&gt;!&lt;/p&gt;&#10;&lt;p&gt;#OpenSource #Python #DevTools #AI #Programming&lt;/p&gt;&#10;</description></item><item><title>markdown-code-runner 📝</title><link>https://www.nijho.lt/post/advent-of-open-source/05-markdown-code-runner/</link><pubDate>Thu, 05 Dec 2024 00:00:00 +0000</pubDate><guid isPermaLink="false">/post/advent-of-open-source/05-markdown-code-runner/</guid><description>&lt;p&gt;(See my &lt;a href="../"&gt;intro post&lt;/a&gt;)&lt;/p&gt;&#10;&lt;p&gt;Documentation should be as close to the code as possible - that&amp;rsquo;s the principle of &amp;ldquo;information locality.&amp;rdquo; But how do you keep code examples and their outputs in sync? Enter markdown-code-runner, a tool that executes code blocks within Markdown files and updates their output in-place!&lt;/p&gt;&#10;&lt;h2 id="-origin-story"&gt;📖 Origin Story &lt;a class="anchor" href="#-origin-story" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;While maintaining various open source and work projects, I found myself constantly updating README or Wiki files with new command outputs, updated tables, and fresh examples. This manual process was error-prone and tedious. Instead of using external templating files or more advanced documentation generators like Sphinx and Quarto (which are often overkill for single-page projects), I wanted something simpler: code and its output living together in the same Markdown file, always in sync.&lt;/p&gt;&#10;&lt;h2 id="-technical-highlights"&gt;🔧 Technical Highlights &lt;a class="anchor" href="#-technical-highlights" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Executes code blocks (Python and Bash) within Markdown files&lt;/li&gt;&#10;&lt;li&gt;Updates outputs in-place while preserving the original file structure&lt;/li&gt;&#10;&lt;li&gt;Supports hidden code blocks for generating content without showing the code&lt;/li&gt;&#10;&lt;li&gt;Works with any language by using file code blocks and bash execution&lt;/li&gt;&#10;&lt;li&gt;Zero external dependencies&lt;/li&gt;&#10;&lt;li&gt;GitHub Actions integration for automatic README updates&lt;/li&gt;&#10;&lt;li&gt;Preserves Markdown spec compatibility by hiding code in HTML comments (&lt;code&gt;&amp;lt;!-- CODE HERE --&amp;gt;&lt;/code&gt;)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="-impact"&gt;📊 Impact &lt;a class="anchor" href="#-impact" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;97 GitHub stars&lt;/li&gt;&#10;&lt;li&gt;Used in many of my other projects for auto-generating:&#10;&lt;ul&gt;&#10;&lt;li&gt;Command-line help texts&lt;/li&gt;&#10;&lt;li&gt;API documentation&lt;/li&gt;&#10;&lt;li&gt;Example outputs&lt;/li&gt;&#10;&lt;li&gt;Data tables&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Helps maintain &amp;ldquo;information locality&amp;rdquo; - everything needed is in one file&lt;/li&gt;&#10;&lt;li&gt;Enables dynamic documentation that stays up-to-date automatically&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="-challenges-and-solutions"&gt;🎯 Challenges and Solutions &lt;a class="anchor" href="#-challenges-and-solutions" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Parsing Markdown without breaking its structure&lt;/li&gt;&#10;&lt;li&gt;Supporting multiple programming languages&lt;/li&gt;&#10;&lt;li&gt;Making it work seamlessly with GitHub Actions&lt;/li&gt;&#10;&lt;li&gt;Handling complex outputs (tables, images, etc.)&lt;/li&gt;&#10;&lt;li&gt;Maintaining backward compatibility with existing Markdown files&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="-lessons-learned"&gt;💡 Lessons Learned &lt;a class="anchor" href="#-lessons-learned" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Documentation is best when it&amp;rsquo;s close to what it documents&lt;/li&gt;&#10;&lt;li&gt;Automation should be invisible - the tool shouldn&amp;rsquo;t change how you write Markdown&lt;/li&gt;&#10;&lt;li&gt;Sometimes the simplest solution (using HTML comments) is the best&lt;/li&gt;&#10;&lt;li&gt;Good documentation tools should make maintaining docs easier, not harder&lt;/li&gt;&#10;&lt;li&gt;Auto-generated content should be clearly marked as such&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Want to keep your documentation always in sync? Check out &lt;a href="https://github.com/basnijholt/markdown-code-runner" target="_blank" rel="noopener"&gt;markdown-code-runner on GitHub&lt;/a&gt;!&lt;/p&gt;&#10;&lt;p&gt;#OpenSource #Python #Documentation #DevTools #Programming&lt;/p&gt;&#10;</description></item><item><title>Discovering Git worktrees: a handy tool for multitasking 📚</title><link>https://www.nijho.lt/post/git-worktree/</link><pubDate>Thu, 19 Sep 2024 00:00:00 +0000</pubDate><guid isPermaLink="false">/post/git-worktree/</guid><description>&lt;p&gt;Recently, I discovered a game-changer in Git that has streamlined my workflow: &lt;strong&gt;worktrees&lt;/strong&gt;.&#10;This feature allows developers to handle multiple branches of a single repository simultaneously, eliminating the need for constant branch-switching or multiple clones.&#10;For example, I typically want to keep the &lt;code&gt;main&lt;/code&gt; branch in one editor window and the &lt;code&gt;feature&lt;/code&gt; branch in another to easily test changes.&#10;With Git worktrees, I essentially have two separate working directories for each branch, making it easier to manage changes and switch between tasks.&lt;/p&gt;&#10;&lt;h4 id="what-is-a-git-worktree"&gt;What is a Git Worktree?&lt;/h4&gt;&#10;&lt;p&gt;A Git worktree provides additional working directories linked to the same repository.&#10;This means you can easily work on different branches in parallel without duplicating repositories, saving both space and effort.&lt;/p&gt;&#10;&lt;h4 id="benefits-of-git-worktrees"&gt;Benefits of Git Worktrees&lt;/h4&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Parallel Development&lt;/strong&gt;: Effortlessly switch between branches for urgent bug fixes or new feature developments.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Efficiency&lt;/strong&gt;: It&amp;rsquo;s lightweight, sharing the Git directory, and integrates smoothly with existing workflows.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h4 id="quick-commands"&gt;Quick Commands&lt;/h4&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Create a Worktree&lt;/strong&gt;:&lt;br&gt;&#10;&lt;code&gt;git worktree add &amp;lt;path-to-new-worktree&amp;gt; &amp;lt;branch-name&amp;gt;&lt;/code&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;List Worktrees&lt;/strong&gt;:&lt;br&gt;&#10;&lt;code&gt;git worktree list&lt;/code&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Remove a Worktree&lt;/strong&gt;:&lt;br&gt;&#10;&lt;code&gt;git worktree remove &amp;lt;path-to-worktree&amp;gt;&lt;/code&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="conclusion"&gt;Conclusion&lt;/h4&gt;&#10;&lt;p&gt;Incorporating Git worktrees into your workflow enhances productivity and organization.&#10;Whether dealing with bug fixes or new features, worktrees help maintain a cleaner environment.&lt;/p&gt;&#10;</description></item><item><title>My favorite tools that keep my Python projects sane 🧰</title><link>https://www.nijho.lt/post/best-python-dev-tooling/</link><pubDate>Sat, 22 Apr 2023 00:00:00 +0000</pubDate><guid isPermaLink="false">/post/best-python-dev-tooling/</guid><description>&lt;h2 id="-1-introduction"&gt;🌟 1. Introduction &lt;a class="anchor" href="#-1-introduction" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;As a passionate Python developer, I am always on the hunt for the best tools to streamline my development process and enhance the quality of my projects. Over time, I have discovered a set of tools that have become indispensable in my workflow, making my coding experience more efficient and enjoyable. Using the right developer tools for Python projects is crucial for maximizing productivity, ensuring code consistency, and maintaining high-quality code.&lt;/p&gt;&#10;&lt;p&gt;In this blog post, I will share these essential tools that I now use for every single new project. We will explore the benefits of each tool and discuss how they can help you supercharge your Python development. The tools covered in this post include &lt;a href="https://pre-commit.com/" target="_blank" rel="noopener"&gt;pre-commit&lt;/a&gt;, &lt;a href="https://black.readthedocs.io/en/stable/" target="_blank" rel="noopener"&gt;Black&lt;/a&gt;, &lt;a href="https://beta.ruff.rs/docs/rules/" target="_blank" rel="noopener"&gt;Ruff&lt;/a&gt;, &lt;a href="https://mypy.readthedocs.io/en/stable/" target="_blank" rel="noopener"&gt;Mypy&lt;/a&gt;, &lt;a href="https://versioningit.readthedocs.io/en/latest/" target="_blank" rel="noopener"&gt;Versioningit&lt;/a&gt;, &lt;a href="https://www.python.org/dev/peps/pep-0621/" target="_blank" rel="noopener"&gt;Pyproject.toml with PEP 621&lt;/a&gt;, &lt;a href="https://nox.thea.codes/en/stable/" target="_blank" rel="noopener"&gt;Nox&lt;/a&gt;, &lt;a href="https://docs.pytest.org/en/7.3.x/" target="_blank" rel="noopener"&gt;pytest&lt;/a&gt;, &lt;a href="https://docs.github.com/en/actions/learn-github-actions" target="_blank" rel="noopener"&gt;GitHub Actions CI matrix&lt;/a&gt;, and &lt;a href="https://readthedocs.org/" target="_blank" rel="noopener"&gt;Read the Docs&lt;/a&gt;, &lt;a href="https://www.sphinx-doc.org/" target="_blank" rel="noopener"&gt;Sphinx&lt;/a&gt;, &lt;a href="https://myst-nb.readthedocs.io/en/latest/" target="_blank" rel="noopener"&gt;MyST-NB&lt;/a&gt;, and &lt;a href="https://jupytext.readthedocs.io/en/latest/" target="_blank" rel="noopener"&gt;Jupytext notebooks&lt;/a&gt; for documentation. Let&amp;rsquo;s dive in and learn how to enhance your Python projects with these powerful tools!&lt;/p&gt;&#10;&lt;details class="toc" open&gt;&lt;summary&gt;Table of contents&lt;/summary&gt;&lt;nav id="TableOfContents"&gt;&#10; &lt;ul&gt;&#10; &lt;li&gt;&lt;a href="#-1-introduction"&gt;🌟 1. Introduction&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#-2-pre-commit"&gt;🛠️ 2. Pre-commit&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#-3-black-auto-formatting-for-python"&gt;🎨 3. Black: auto-formatting for Python&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#-4-ruff-the-fastest-python-linter-and-auto-formatter"&gt;🚀 4. Ruff: the fastest Python linter and auto-formatter&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#-5-mypy-static-type-checking-for-python-find-bugs-before-they-happen"&gt;🔍 5. Mypy: static type checking for Python (find bugs before they happen)&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#-6-nox-and-pytest-for-testing-a-powerful-combination"&gt;🧪 6. Nox and pytest for testing: a powerful combination&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#-7-versioningit-version-management-with-git-tags"&gt;🏷️ 7. Versioningit: version management with Git tags&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#-8-pyprojecttoml-and-pep-621-configuration-consolidation"&gt;📝 8. Pyproject.toml and PEP 621: Configuration Consolidation&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#-9-github-actions-ci-matrix-testing-on-multiple-platforms-and-auto-publishing-to-pypi"&gt;🌐 9. GitHub Actions CI Matrix: Testing on Multiple Platforms and Auto Publishing to PyPI&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#-10-read-the-docs-sphinx-myst-nb-and-jupytext-notebooks-for-documentation"&gt;📚 10. Read the Docs, Sphinx, MyST-NB, and Jupytext notebooks for documentation&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#-11-conclusion"&gt;🎉 11. Conclusion&lt;/a&gt;&lt;/li&gt;&#10; &lt;/ul&gt;&#10;&lt;/nav&gt;&lt;/details&gt;&#10;&#10;&lt;aside class="callout callout-note"&gt;&lt;svg class="ico" viewBox="0 0 256 256" aria-hidden="true"&gt;&lt;path d="M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm16-40a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176ZM112,84a12,12,0,1,1,12,12A12,12,0,0,1,112,84Z"/&gt;&lt;/svg&gt;&lt;div&gt;This post is based the way I develop Python projects. For full examples see &lt;a href="https://github.com/basnijholt/adaptive-scheduler/" target="_blank" rel="noopener"&gt;Adaptive Scheduler&lt;/a&gt; (full project), &lt;a href="https://github.com/basnijholt/markdown-code-runner" target="_blank" rel="noopener"&gt;&lt;code&gt;markdown-code-runner&lt;/code&gt;&lt;/a&gt; (for a single module package), and &lt;a href="https://github.com/python-adaptive/adaptive/" target="_blank" rel="noopener"&gt;Adaptive&lt;/a&gt; (for cool documentation and nox).&#10;Over time I might change my mind about some of the tools, but I will try to keep this post up-to-date.&lt;/div&gt;&lt;/aside&gt;&#10;&lt;h2 id="-2-pre-commit"&gt;🛠️ 2. Pre-commit &lt;a class="anchor" href="#-2-pre-commit" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;One of the most common challenges developers face when working on a project, whether alone or in a team, is maintaining code quality and consistency. As projects grow, it becomes increasingly difficult to enforce coding standards and catch issues before they make their way into the codebase. This is where pre-commit comes in.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://pre-commit.com/" target="_blank" rel="noopener"&gt;Pre-commit&lt;/a&gt; is a powerful tool that helps you manage and maintain code quality by automating checks before commits. It achieves this by setting up a series of hooks that run before each commit, ensuring that only code that meets your predefined standards is committed to the repository. By catching issues early, pre-commit helps you keep your code clean and consistent, making it easier to review and maintain.&lt;/p&gt;&#10;&lt;p&gt;One of the reasons pre-commit has gained widespread adoption is its flexibility and extensibility. You can choose from a vast range of built-in hooks, such as code formatters, linters, and security checkers, or even create your own custom hooks. This allows you to tailor pre-commit to the specific needs of your project, ensuring that it enforces the exact coding standards you require.&lt;/p&gt;&#10;&lt;p&gt;Using pre-commit is beneficial for both individual developers and teams. For solo developers, it helps maintain discipline and enforces coding standards, making it easier to onboard collaborators in the future. For teams, it streamlines the review process by catching issues before they are submitted for review, reducing the time spent on addressing code inconsistencies and style violations.&lt;/p&gt;&#10;&lt;p&gt;Let&amp;rsquo;s take a look at an example. Suppose your project follows the PEP 8 coding standard, and you want to ensure that all code committed to the repository adheres to these guidelines. You can configure pre-commit to run a PEP 8 linter, such as Flake8, before each commit. This way, any code that does not meet the PEP 8 standard will be flagged, and the commit will be blocked until the issues are resolved.&lt;/p&gt;&#10;&lt;p&gt;In summary, pre-commit is an invaluable tool for maintaining code quality and consistency in your Python projects. By automating checks before commits, it ensures that your codebase remains clean and adheres to your chosen standards, making your development process more efficient and enjoyable.&lt;/p&gt;&#10;&lt;p&gt;Adding pre-commit to your Python project is simple and straightforward. To get started, you&amp;rsquo;ll first need to install the pre-commit package using pip:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install pre-commit&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, create a configuration file named &lt;code&gt;.pre-commit-config.yaml&lt;/code&gt; in your project&amp;rsquo;s root directory. This file will define the hooks you want to run before each commit. For example, to use Black for code formatting and Flake8 for linting, your configuration file might look like this:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;repos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://github.com/psf/black&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;rev&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;stable&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hooks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;black&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://github.com/pycqa/flake8&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;rev&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;master&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hooks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;flake8&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once you have set up the configuration file, run the following command to install the pre-commit hooks:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pre-commit install&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, every time you attempt to make a commit, pre-commit will run the specified hooks. If any issues are found, the commit will be blocked, and you&amp;rsquo;ll be prompted to fix the problems before trying again. To run pre-commit manually on all files in your repository, use the following command:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pre-commit run --all-files&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;By incorporating pre-commit into your development process, you&amp;rsquo;ll be able to catch and fix issues before they make their way into your codebase, ensuring a consistent and high-quality Python project.&lt;/p&gt;&#10;&lt;h2 id="-3-black-auto-formatting-for-python"&gt;🎨 3. Black: auto-formatting for Python &lt;a class="anchor" href="#-3-black-auto-formatting-for-python" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;As a developer who has always been particular about coding style, I&amp;rsquo;ve had my fair share of discussions on the proper way to indent multiline statements and other formatting nuances. These conversations, although sometimes necessary, can take up valuable time that could be better spent on actual development. That&amp;rsquo;s where Black, the uncompromising code formatter, comes in and saves the day.&lt;/p&gt;&#10;&lt;p&gt;Adopting &lt;a href="https://black.readthedocs.io/en/stable/" target="_blank" rel="noopener"&gt;Black&lt;/a&gt; has made a significant impact on my development workflow. No more unnecessary discussions about formatting preferences; everyone on the team simply follows the rules set forth by Black. This consistency across the codebase not only makes the code more readable but also reduces the time spent on formatting debates.&lt;/p&gt;&#10;&lt;p&gt;One of the best aspects of Black is that you don&amp;rsquo;t need to worry about writing perfectly formatted code initially. You can write your code as quickly as you want, even if it&amp;rsquo;s poorly formatted, and then simply run Black to transform it into a beautifully formatted masterpiece. This can be a real time-saver, especially when working on large projects with many contributors.&lt;/p&gt;&#10;&lt;p&gt;To install Black, run the following command:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install black&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can then format your code by running Black in the terminal:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;black your_file.py&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Alternatively, you can use the VS Code command palette to run Black on the currently open file. However, the most efficient way to use Black is in combination with pre-commit, as mentioned in the previous section. This way, your code is automatically formatted every time you commit, ensuring a consistent codebase without any extra effort.&lt;/p&gt;&#10;&lt;p&gt;In summary, Black is an invaluable tool for enforcing consistent code formatting throughout your Python projects. By adopting it and integrating it with pre-commit, you can save time and focus on what truly matters: writing great code.&lt;/p&gt;&#10;&lt;h2 id="-4-ruff-the-fastest-python-linter-and-auto-formatter"&gt;🚀 4. Ruff: the fastest Python linter and auto-formatter &lt;a class="anchor" href="#-4-ruff-the-fastest-python-linter-and-auto-formatter" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;In the past, I&amp;rsquo;ve used several tools to maintain code quality, such as isort, pyupgrade, flake8, and pydocstyle. However, I&amp;rsquo;ve recently discovered a powerful new tool called &lt;a href="https://beta.ruff.rs/docs/rules/" target="_blank" rel="noopener"&gt;Ruff&lt;/a&gt;), an extremely fast Python linter written in Rust. Ruff is not only capable of replacing all these tools but also executes much faster, which significantly improves the development workflow.&lt;/p&gt;&#10;&lt;p&gt;Ruff offers an impressive range of features and performance enhancements. Some of its standout features include:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;10-100x faster than existing linters&lt;/li&gt;&#10;&lt;li&gt;Over 500 built-in rules&lt;/li&gt;&#10;&lt;li&gt;Autofix support for automatic error correction&lt;/li&gt;&#10;&lt;li&gt;Built-in caching to avoid re-analyzing unchanged files&lt;/li&gt;&#10;&lt;li&gt;First-party editor integrations for VS Code and more&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Moreover, Ruff has gained widespread adoption in the Python community and is used in major open-source projects like Apache Airflow, FastAPI, Hugging Face, Pandas, and SciPy. The tool is backed by Astral, which provides active development and support.&lt;/p&gt;&#10;&lt;p&gt;One of the best aspects of Ruff is the native VS Code extension, which continuously scans your code and can fix problems as you write. This seamless integration makes it an indispensable part of any Python development workflow.&lt;/p&gt;&#10;&lt;p&gt;To install Ruff, simply run the following command:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install ruff&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To use Ruff in your project, run the following command in the terminal:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ruff your_file.py&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For the best experience, I highly recommend using Ruff in conjunction with pre-commit, as mentioned earlier. This ensures that your code is always linted and formatted before committing, maintaining a consistent and high-quality codebase.&lt;/p&gt;&#10;&lt;p&gt;In conclusion, Ruff is an incredibly fast and powerful Python linter that streamlines the development process by consolidating multiple tools into a single, efficient package. By adopting Ruff and integrating it with pre-commit, you can enjoy a more productive and enjoyable Python development experience.&lt;/p&gt;&#10;&lt;aside class="callout callout-note"&gt;&lt;svg class="ico" viewBox="0 0 256 256" aria-hidden="true"&gt;&lt;path d="M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm16-40a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176ZM112,84a12,12,0,1,1,12,12A12,12,0,0,1,112,84Z"/&gt;&lt;/svg&gt;&lt;div&gt;Pro tip: Go extreme, and use &lt;code&gt;--select ALL&lt;/code&gt; to enable all (&amp;gt;500) rules. This will ensure that your code is always in top shape.&lt;/div&gt;&lt;/aside&gt;&#10;&lt;h2 id="-5-mypy-static-type-checking-for-python-find-bugs-before-they-happen"&gt;🔍 5. Mypy: static type checking for Python (find bugs before they happen) &lt;a class="anchor" href="#-5-mypy-static-type-checking-for-python-find-bugs-before-they-happen" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;As developers, we&amp;rsquo;re always looking for ways to improve the quality of our code and minimize the time spent on debugging. This is where &lt;a href="https://mypy.readthedocs.io/en/stable/" target="_blank" rel="noopener"&gt;Mypy&lt;/a&gt; comes in. Mypy is a powerful static type checker for Python, designed to catch potential runtime errors before they occur. By using Mypy, you can ensure that your code adheres to type hints and that it runs smoothly without unexpected issues.&lt;/p&gt;&#10;&lt;p&gt;Mypy offers several advantages to Python developers, including:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Early detection of potential type errors, preventing many common bugs&lt;/li&gt;&#10;&lt;li&gt;Improved code readability and self-documentation through type annotations&lt;/li&gt;&#10;&lt;li&gt;Easier refactoring and code maintenance, as type annotations provide clear contracts between functions and modules&lt;/li&gt;&#10;&lt;li&gt;Better collaboration and communication within teams, since type annotations make the code&amp;rsquo;s intent and expectations more explicit&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Adding Mypy to an existing project may initially seem time-consuming and frustrating, as it might flag numerous issues that require attention. However, once you&amp;rsquo;ve addressed these concerns and properly set up Mypy, the benefits far outweigh the initial effort. In fact, the time you invest in fixing type-related issues will quickly be recovered as Mypy helps you prevent bugs and reduce debugging time.&lt;/p&gt;&#10;&lt;p&gt;For a long time, I too ignored Mypy and only typed my code without actually checking it with the tool. But after truly embracing Mypy and integrating it into my development process, I can confidently say that I will never go back. The value it brings to the table in terms of code quality, readability, and reliability is simply too great to ignore.&lt;/p&gt;&#10;&lt;p&gt;By proactively identifying and resolving type-related issues, Mypy not only saves you precious debugging time but also enhances the overall quality of your codebase. As you continue to rely on Mypy, you&amp;rsquo;ll find that it becomes an indispensable part of your Python development toolkit, ensuring that your projects remain robust and maintainable.&lt;/p&gt;&#10;&lt;p&gt;To start using Mypy in your project, first install it with the following command:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install mypy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then, you can run Mypy on your Python files by executing the following command in your terminal:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mypy your_file.py&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For even better integration, you can add Mypy as a pre-commit hook, ensuring that your code is always checked for type consistency before being committed. This further strengthens the code quality and helps prevent potential runtime errors.&lt;/p&gt;&#10;&lt;p&gt;In summary, incorporating Mypy into your Python development workflow adds an extra layer of safety and clarity, making it easier to write high-quality, reliable code. By combining Mypy with other tools like Ruff and pre-commit, you can create a robust development environment that promotes productivity and code quality.&lt;/p&gt;&#10;&lt;h2 id="-6-nox-and-pytest-for-testing-a-powerful-combination"&gt;🧪 6. Nox and pytest for testing: a powerful combination &lt;a class="anchor" href="#-6-nox-and-pytest-for-testing-a-powerful-combination" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;When developing software, it&amp;rsquo;s essential to ensure that your code is reliable and functions as expected. The key to achieving this goal is writing thorough tests, which not only help you identify issues early on but also prevent regressions in the future. While it&amp;rsquo;s often tempting to dive headfirst into coding, taking a step back and first writing tests for your solution can lead to more efficient and effective development. Even if this approach doesn&amp;rsquo;t come naturally, it&amp;rsquo;s crucial to write tests for every problem you encounter to keep your codebase stable and reliable.&lt;/p&gt;&#10;&lt;p&gt;In the realm of Python testing, &lt;a href="https://nox.thea.codes/en/stable/" target="_blank" rel="noopener"&gt;Nox&lt;/a&gt; and &lt;a href="https://docs.pytest.org" target="_blank" rel="noopener"&gt;pytest&lt;/a&gt; stand out as powerful tools that can greatly enhance your testing process. Nox is a versatile automation tool that simplifies running tests in multiple virtual environments, while pytest is a popular and feature-rich testing framework for Python. Together, these tools provide a formidable testing environment that simplifies test management and execution.&lt;/p&gt;&#10;&lt;p&gt;In the past, you may have used &lt;a href="https://tox.wiki/en/latest/" target="_blank" rel="noopener"&gt;Tox&lt;/a&gt;, a tool that manages test environments with a text-based configuration file (e.g., in &lt;code&gt;setup.cfg&lt;/code&gt; or &lt;code&gt;pyproject.toml&lt;/code&gt;). While Tox has served developers well for many years, including myself, Nox offers a more flexible alternative. Instead of relying on a text-based configuration, Nox takes advantage of a Python configuration file, providing virtually limitless configurability. This added flexibility makes it easy to create complex test matrices with different versions and dependencies, and even accommodate special conditions using simple if statements. After happily using Tox for years, I discovered Nox and found that it elevated my testing workflow to a whole new level.&lt;/p&gt;&#10;&lt;p&gt;To get started with Nox and pytest, create a basic &lt;code&gt;nox.py&lt;/code&gt; file and a sample test file for pytest. Here&amp;rsquo;s an example &lt;code&gt;nox.py&lt;/code&gt; configuration:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;nox&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@nox.session&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;3.7&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;3.8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;3.9&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;tests&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-r&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;requirements.txt&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-r&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;test-requirements.txt&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;pytest&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And an example test file for pytest:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pytest&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_addition&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_subtraction&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Beyond basic testing functionality, pytest boasts powerful features such as fixtures, mocking and patching, and parameterization. Pytest fixtures enable you to create reusable resources for your tests, while mocking and patching allow you to replace parts of your system with fake objects, isolating your tests from external dependencies. Parameterization, implemented using &lt;code&gt;pytest.mark.parametrize&lt;/code&gt;, enables running the same test with multiple sets of inputs and expected outputs.&lt;/p&gt;&#10;&lt;p&gt;In conclusion, leveraging Nox and pytest for testing offers numerous advantages for developers who strive to improve code reliability and automate their testing workflows. By harnessing Nox&amp;rsquo;s exceptional configurability and pytest&amp;rsquo;s extensive testing features, you&amp;rsquo;ll establish a robust testing environment that bolsters code quality and ensures optimal performance.&lt;/p&gt;&#10;&lt;h2 id="-7-versioningit-version-management-with-git-tags"&gt;🏷️ 7. Versioningit: version management with Git tags &lt;a class="anchor" href="#-7-versioningit-version-management-with-git-tags" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;(Optional, only related when making a Python package)&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;For developers seeking an automated and customizable package versioning solution, &lt;a href="https://versioningit.readthedocs.io/en/latest/" target="_blank" rel="noopener"&gt;Versioningit&lt;/a&gt; offers a powerful yet flexible approach. It is a setuptools plugin that automatically determines your package&amp;rsquo;s version based on your version control repository&amp;rsquo;s tags. The real advantage of Versioningit lies in its ability to customize the version format and even override separate functions used for version extraction and calculation.&lt;/p&gt;&#10;&lt;p&gt;Versioningit makes your release workflow extremely simple, especially if you have set up an automated build and twine PyPI upload pipeline. To create a new release, you only need to tag a version, and then click on the &amp;ldquo;Release&amp;rdquo; button in GitHub.&lt;/p&gt;&#10;&lt;p&gt;One of the major advantages of Versioningit is its minimal boilerplate code compared to other tools like &lt;a href="https://github.com/python-versioneer/python-versioneer" target="_blank" rel="noopener"&gt;Versioneer&lt;/a&gt;. Additionally, the Python &lt;code&gt;__version__&lt;/code&gt; string works seamlessly with editable installs (&lt;code&gt;pip install -e .&lt;/code&gt;), unlike &lt;a href="https://github.com/pypa/setuptools_scm" target="_blank" rel="noopener"&gt;setuptools_scm&lt;/a&gt;, which is a common issue faced by developers.&lt;/p&gt;&#10;&lt;p&gt;Over the years, I have explored many options for package versioning, including &lt;a href="https://github.com/python-versioneer/python-versioneer" target="_blank" rel="noopener"&gt;Versioneer&lt;/a&gt;, &lt;a href="https://github.com/jbweston/miniver" target="_blank" rel="noopener"&gt;Miniver&lt;/a&gt;, &lt;a href="https://github.com/pypa/setuptools_scm" target="_blank" rel="noopener"&gt;setuptools_scm&lt;/a&gt;, &lt;a href="https://github.com/peritus/bumpversion" target="_blank" rel="noopener"&gt;bumpversion&lt;/a&gt; (or &lt;a href="https://github.com/c4urself/bump2version" target="_blank" rel="noopener"&gt;bump2version&lt;/a&gt;), and manually setting everything. Versioningit stands out due to its simplicity, customization options, and compatibility with various workflows.&lt;/p&gt;&#10;&lt;p&gt;Some key features of Versioningit include:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Support for Git, modern Git archives, and Mercurial&lt;/li&gt;&#10;&lt;li&gt;Customizable version formatting using template strings&lt;/li&gt;&#10;&lt;li&gt;Optional writing of the final version and other details to a file for loading at runtime&lt;/li&gt;&#10;&lt;li&gt;Custom setuptools commands for inserting the final version and other details into a source file at build time&lt;/li&gt;&#10;&lt;li&gt;Customizable functions for VCS querying, tag-to-version calculation, version bumping, version formatting, and writing the version to a file&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;To use Versioningit in your project, simply add it to your project&amp;rsquo;s &lt;code&gt;pyproject.toml&lt;/code&gt; file in the &lt;code&gt;build-system.requires&lt;/code&gt; key. Then, create a &lt;code&gt;[tool.versioningit]&lt;/code&gt; table in your &lt;code&gt;pyproject.toml&lt;/code&gt; file. You can get up and running with just the minimal configuration - an empty table.&lt;/p&gt;&#10;&lt;p&gt;Once you have a &lt;code&gt;[tool.versioningit]&lt;/code&gt; table in your &lt;code&gt;pyproject.toml&lt;/code&gt; and your repository has at least one tag, building your project with &lt;code&gt;setuptools&lt;/code&gt; will automatically set your project&amp;rsquo;s version based on the latest tag in your Git repository. With Versioningit, you can customize the version format using placeholder strings, making it adaptable to your project&amp;rsquo;s specific needs.&lt;/p&gt;&#10;&lt;p&gt;In summary, Versioningit streamlines the package versioning process and simplifies the release workflow. By automating package versioning based on version control repository tags and providing extensive customization options, it helps make the management of package versions more efficient and less error-prone.&lt;/p&gt;&#10;&lt;h2 id="-8-pyprojecttoml-and-pep-621-configuration-consolidation"&gt;📝 8. Pyproject.toml and PEP 621: Configuration Consolidation &lt;a class="anchor" href="#-8-pyprojecttoml-and-pep-621-configuration-consolidation" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;The &lt;code&gt;pyproject.toml&lt;/code&gt; file plays a crucial role in consolidating configurations and setup for various tools in a Python project, such as Black, Ruff, Mypy, Versioningit, Nox, and pytest. This adherence to &lt;a href="https://www.python.org/dev/peps/pep-0621/" target="_blank" rel="noopener"&gt;PEP 621&lt;/a&gt; standards streamlines the development process by providing a single source of truth for multiple tools, eliminating the need for additional configuration files like &lt;code&gt;setup.cfg&lt;/code&gt; or &lt;code&gt;setup.py&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;By specifying packaging details directly in the &lt;code&gt;pyproject.toml&lt;/code&gt; file, you can efficiently manage your project&amp;rsquo;s dependencies and metadata. For example, the Adaptive Scheduler package demonstrates this approach with a comprehensive &lt;code&gt;pyproject.toml&lt;/code&gt; file containing all the necessary configurations.&lt;/p&gt;&#10;&lt;details&gt;&#10;&lt;summary&gt;(click to unfold):&lt;/summary&gt;&#10;&lt;!-- CODE:START --&gt;&#10;&lt;!-- import urllib.request --&gt;&#10;&lt;!-- url = 'https://raw.githubusercontent.com/basnijholt/adaptive-scheduler/main/pyproject.toml' --&gt;&#10;&lt;!-- print("```toml") --&gt;&#10;&lt;!-- with urllib.request.urlopen(url) as response: --&gt;&#10;&lt;!-- content = response.read() --&gt;&#10;&lt;!-- print(content.decode('utf-8')) --&gt;&#10;&lt;!-- print("```") --&gt;&#10;&lt;!-- CODE:END --&gt;&#10;&lt;!-- OUTPUT:START --&gt;&#10;&lt;!-- ⚠️ This content is auto-generated by `markdown-code-runner`. --&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;build-system&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;build-backend&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;setuptools.build_meta&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;requires&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;setuptools&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;wheel&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;versioningit&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;project&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;adaptive_scheduler&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Run many `adaptive.Learner`s on many cores (&amp;gt;10k) using `mpi4py.futures`, `ipyparallel`, `dask-mpi`, or `process-pool`.&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;requires-python&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;gt;=3.8&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;dynamic&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;maintainers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Bas Nijholt&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bas@nijho.lt&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;license&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;BSD-3&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;classifiers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Development Status :: 2 - Pre-Alpha&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Intended Audience :: Developers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Intended Audience :: Science/Research&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;License :: OSI Approved :: BSD License&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Operating System :: OS Independent&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Programming Language :: Python&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Programming Language :: Python :: 3&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Programming Language :: Python :: 3.8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Programming Language :: Python :: 3.9&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Programming Language :: Python :: 3.10&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Programming Language :: Python :: 3.11&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Topic :: Scientific/Engineering&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Topic :: System :: Distributed Computing&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;dependencies&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;adaptive &amp;gt;= 0.14.1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;cloudpickle&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;dill&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;ipyparallel&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;ipywidgets&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;itables&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;jinja2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;loky&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;numpy&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;pandas&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;psutil&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;pyarrow&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;pyzmq&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;rich&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;structlog&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;tinydb&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;toolz&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;tqdm&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;versioningit&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;project&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;optional-dependencies&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;all&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dask-mpi&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;mpi4py&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;test&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;pytest&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;pytest-asyncio&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;coverage&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;pytest-cov&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;docs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;myst-nb&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;sphinx_fontawesome&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;sphinx&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;furo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;myst-parser&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;emoji&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;project&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;urls&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;homepage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://adaptive-scheduler.readthedocs.io/&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;documentation&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://adaptive-scheduler.readthedocs.io/&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;repository&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://github.com/basnijholt/adaptive-scheduler&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;project&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readme&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;content-type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;text/x-rst&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;file&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;README.rst&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;project&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scripts&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;adaptive-scheduler-launcher&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;adaptive_scheduler._server_support.launcher:main&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;versioningit&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;versioningit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onbuild&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;build-file&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;adaptive_scheduler/_version.py&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;source-file&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;adaptive_scheduler/_version.py&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setuptools&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;include&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;adaptive_scheduler.*&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;adaptive_scheduler&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pytest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ini_options&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;addopts&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; -vvv&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; --cov=adaptive_scheduler&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; --cov-report term&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; --cov-report html&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; --cov-report xml&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; --cov-fail-under=35&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; --asyncio-mode=auto&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;coverage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;report&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;exclude_lines&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;pragma: no cover&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;raise NotImplementedError&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;if TYPE_CHECKING:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;if __name__ == .__main__.:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;black&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;line_length&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;88&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ruff&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;line-length&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;target-version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;py38&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;select&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ALL&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;ignore&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;T20&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c"&gt;# flake8-print&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;ANN101&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c"&gt;# Missing type annotation for {name} in method&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;S101&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c"&gt;# Use of assert detected&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;PD901&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c"&gt;# df is a bad variable name. Be kinder to your future self.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;ANN401&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c"&gt;# Dynamically typed expressions (typing.Any) are disallowed in {name}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;D402&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c"&gt;# First line should not be the function&amp;#39;s signature&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;PLW0603&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c"&gt;# Using the global statement to update `X` is discouraged&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;D401&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c"&gt;# First line of docstring should be in imperative mood&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;SLF001&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c"&gt;# Private member accessed&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ruff&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;per-file-ignores&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;tests/*&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;SLF001&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;tests/test_examples.py&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;E501&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;.github/*&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;INP001&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ruff&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mccabe&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;max-complexity&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mypy&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;python_version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;3.8&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;!-- OUTPUT:END --&gt;&#10;&lt;/details&gt;&#10;&lt;p&gt;(from &lt;a href="https://github.com/basnijholt/adaptive-scheduler/blob/main/pyproject.toml" target="_blank" rel="noopener"&gt;here&lt;/a&gt;)&lt;/p&gt;&#10;&lt;p&gt;As seen in the example, the &lt;code&gt;pyproject.toml&lt;/code&gt; file includes details about the build system, project metadata, dependencies, optional dependencies, URLs, and configurations for various tools such as Versioningit, setuptools, pytest, coverage, Black, Ruff, and Mypy. By consolidating these configurations, you can maintain a more organized and maintainable project, making it easier to understand and update settings for different tools.&lt;/p&gt;&#10;&lt;p&gt;In summary, the &lt;code&gt;pyproject.toml&lt;/code&gt; file and adherence to PEP 621 provide a unified approach to configuring and setting up your Python project, making it easier to manage dependencies, metadata, and tool-specific settings. This streamlined process ultimately leads to a more efficient and maintainable development workflow.&lt;/p&gt;&#10;&lt;h2 id="-9-github-actions-ci-matrix-testing-on-multiple-platforms-and-auto-publishing-to-pypi"&gt;🌐 9. GitHub Actions CI Matrix: Testing on Multiple Platforms and Auto Publishing to PyPI &lt;a class="anchor" href="#-9-github-actions-ci-matrix-testing-on-multiple-platforms-and-auto-publishing-to-pypi" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://docs.github.com/en/actions/learn-github-actions" target="_blank" rel="noopener"&gt;GitHub Actions&lt;/a&gt; is an excellent tool for automating workflows and improving code quality through continuous integration (CI). By using a CI matrix, you can test your code on multiple platforms and Python versions, ensuring that your package remains compatible and stable across different environments.&lt;/p&gt;&#10;&lt;p&gt;To set up a &lt;code&gt;.github/workflows/nox.yaml&lt;/code&gt; file for GitHub Actions, you can use the following simplified example:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nox&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;pull_request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;push&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;branches&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;main]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;runs-on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${{ matrix.platform }}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;fail-fast&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;matrix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;ubuntu-latest, macos-latest, windows-latest]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;python-version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;3.8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;3.9&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;3.10&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;3.11&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;actions/checkout@v2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Set up Python ${{ matrix.python-version }}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;actions/setup-python@v2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;with&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;python-version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${{ matrix.python-version }}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Install dependencies&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;pip install nox&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Test with nox&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;nox -e py${{ matrix.python-version }}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This configuration file specifies the platforms and Python versions for testing, as well as the steps to set up the environment, install dependencies, and run tests using nox.&#10;With this simple configuration, you set up tests on MacOS, Windows, Linux, and multiple Python versions, ensuring that your package remains compatible across different environments.&lt;/p&gt;&#10;&lt;p&gt;Another essential part of the CI/CD process is deploying your Python package. You can use the &lt;code&gt;.github/workflows/publish-package.yaml&lt;/code&gt; file to automate the package deployment to PyPI whenever a new release is published:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Upload Python Package&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;release&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;types&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;published]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;deploy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;runs-on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ubuntu-latest&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;actions/checkout@v2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Set up Python&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;actions/setup-python@v2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;with&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;python-version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3.x&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Install dependencies&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; python -m pip install --upgrade pip&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; pip install setuptools wheel twine build&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Build and publish&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;TWINE_USERNAME&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;__token__&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;TWINE_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;${{ secrets.PYPI_TOKEN }}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; python -m build&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; twine upload dist/*&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This workflow sets up Python, installs necessary dependencies, builds the package, and publishes it to PyPI using Twine. The process integrates seamlessly with versioningit, ensuring that the published package has the correct version number based on the git history.&lt;/p&gt;&#10;&lt;p&gt;In summary, leveraging GitHub Actions for continuous integration and automated workflows enhances code quality and reliability, while also simplifying the development and deployment processes. By testing across various platforms and Python versions, and automating package deployment, you can be confident that your package is well-maintained and accessible to users.&lt;/p&gt;&#10;&lt;h2 id="-10-read-the-docs-sphinx-myst-nb-and-jupytext-notebooks-for-documentation"&gt;📚 10. Read the Docs, Sphinx, MyST-NB, and Jupytext notebooks for documentation &lt;a class="anchor" href="#-10-read-the-docs-sphinx-myst-nb-and-jupytext-notebooks-for-documentation" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Documentation is crucial for any software project, as it helps users understand how to use the package and provides guidance for contributors. &lt;a href="https://readthedocs.org/" target="_blank" rel="noopener"&gt;Read the Docs&lt;/a&gt;, &lt;a href="https://www.sphinx-doc.org/" target="_blank" rel="noopener"&gt;Sphinx&lt;/a&gt;, &lt;a href="https://myst-nb.readthedocs.io/en/latest/" target="_blank" rel="noopener"&gt;MyST-NB&lt;/a&gt;, and &lt;a href="https://jupytext.readthedocs.io/en/latest/" target="_blank" rel="noopener"&gt;Jupytext notebooks&lt;/a&gt; are powerful tools that, when combined, facilitate the creation and maintenance of high-quality documentation.&lt;/p&gt;&#10;&lt;p&gt;tl;dr: check out the &lt;a href="https://adaptive.readthedocs.io/" target="_blank" rel="noopener"&gt;Adaptive documentation&lt;/a&gt; for an example of how to use these tools to create a comprehensive documentation website.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://readthedocs.org/" target="_blank" rel="noopener"&gt;&lt;strong&gt;Read the Docs&lt;/strong&gt;&lt;/a&gt; is a documentation hosting platform that automatically builds, version controls, and hosts your documentation for free. It integrates well with Sphinx and GitHub, allowing your documentation to be updated whenever you push changes to your repository.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://www.sphinx-doc.org/" target="_blank" rel="noopener"&gt;&lt;strong&gt;Sphinx&lt;/strong&gt;&lt;/a&gt; is a documentation generator that can transform reStructuredText files, MyST files, or Jupyter notebooks into various output formats, such as HTML, LaTeX, or PDF. It is highly extensible, supporting custom themes and plugins, and can automatically generate API documentation from your Python code.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://myst-nb.readthedocs.io/en/latest/" target="_blank" rel="noopener"&gt;&lt;strong&gt;MyST-NB&lt;/strong&gt;&lt;/a&gt; is an extension to Sphinx that enables it to parse Jupyter notebooks and execute the code cells during the build process. It uses the MyST (short for Markedly Structured Text) markdown parser, which adds support for Sphinx roles and directives, making it a powerful alternative to reStructuredText.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://jupytext.readthedocs.io/en/latest/" target="_blank" rel="noopener"&gt;&lt;strong&gt;Jupytext notebooks&lt;/strong&gt;&lt;/a&gt; is a Jupyter extension that enables you to save Jupyter notebooks in Markdown format (or other text-based formats) instead of the default JSON format. By using Jupytext notebooks, you can store your code, explanations, and visualizations as plain text, which is easier to version control and can be seamlessly integrated with MyST-NB and Sphinx.&lt;/p&gt;&#10;&lt;p&gt;With &lt;a href="https://myst-nb.readthedocs.io/en/latest/" target="_blank" rel="noopener"&gt;MyST-NB&lt;/a&gt; and &lt;a href="https://jupytext.readthedocs.io/en/latest/" target="_blank" rel="noopener"&gt;Jupytext&lt;/a&gt;, you can write your documentation using Jupyter notebooks in Markdown format. This approach combines the benefits of Jupyter notebooks, such as interactive code execution and rich output, with the simplicity of Markdown and the powerful features of Sphinx. The result is a highly readable, user-friendly, and maintainable documentation that caters to both users and developers.&lt;/p&gt;&#10;&lt;p&gt;To get started with MyST-NB, you&amp;rsquo;ll need to install it using pip:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install myst-nb&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, configure your Sphinx project to use MyST-NB by adding the following lines to your &lt;code&gt;conf.py&lt;/code&gt; file:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;extensions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;myst_nb&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, Sphinx will be able to parse and execute your Jupyter notebooks during the documentation build process, integrating them seamlessly with your existing documentation.&lt;/p&gt;&#10;&lt;p&gt;In summary, using Read the Docs, Sphinx, MyST-NB, and Jupytext notebooks for your documentation enables you to create high-quality, interactive, and easily maintainable documentation that benefits your project&amp;rsquo;s users and contributors. This combination of tools ensures that your documentation remains up-to-date, easily navigable, and engaging, ultimately enhancing the overall experience for your project&amp;rsquo;s audience.&lt;/p&gt;&#10;&lt;p&gt;For a full example, see how I setup &lt;a href="https://adaptive.readthedocs.io/en/latest/" target="_blank" rel="noopener"&gt;Adaptive&amp;rsquo;s documentation&lt;/a&gt; using Sphinx, MyST-NB, and Jupytext notebooks. &lt;a href="https://github.com/python-adaptive/adaptive/blob/1b0f15e44235643731c56d335f6711c5584d4828/readthedocs.yml" target="_blank" rel="noopener"&gt;&lt;code&gt;readthedocs.yaml&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://github.com/python-adaptive/adaptive/blob/1b0f15e44235643731c56d335f6711c5584d4828/docs/source/conf.py" target="_blank" rel="noopener"&gt;&lt;code&gt;docs/source/conf.py&lt;/code&gt;&lt;/a&gt;, and here is an example notebook that is used in the &lt;a href="https://adaptive.readthedocs.io/en/latest/tutorial/tutorial.Learner1D.html" target="_blank" rel="noopener"&gt;documentation&lt;/a&gt;: &lt;a href="https://github.com/python-adaptive/adaptive/blob/main/docs/source/tutorial/tutorial.Learner1D.md" target="_blank" rel="noopener"&gt;&lt;code&gt;docs/source/tutorial/tutorial.Learner1D.md&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="-11-conclusion"&gt;🎉 11. Conclusion &lt;a class="anchor" href="#-11-conclusion" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;In conclusion, incorporating these powerful tools into your Python development workflow can significantly enhance your productivity and code quality. By adopting &lt;a href="https://pre-commit.com/" target="_blank" rel="noopener"&gt;pre-commit&lt;/a&gt;, &lt;a href="https://black.readthedocs.io/en/stable/" target="_blank" rel="noopener"&gt;Black&lt;/a&gt;, &lt;a href="https://beta.ruff.rs/docs/rules/" target="_blank" rel="noopener"&gt;Ruff&lt;/a&gt;, &lt;a href="https://mypy.readthedocs.io/en/stable/" target="_blank" rel="noopener"&gt;Mypy&lt;/a&gt;, &lt;a href="https://versioningit.readthedocs.io/en/latest/" target="_blank" rel="noopener"&gt;Versioningit&lt;/a&gt;, &lt;a href="https://www.python.org/dev/peps/pep-0621/" target="_blank" rel="noopener"&gt;Pyproject.toml with PEP 621&lt;/a&gt;, &lt;a href="https://nox.thea.codes/en/stable/" target="_blank" rel="noopener"&gt;Nox&lt;/a&gt;, &lt;a href="https://docs.pytest.org/" target="_blank" rel="noopener"&gt;pytest&lt;/a&gt;, &lt;a href="https://docs.github.com/en/actions/learn-github-actions" target="_blank" rel="noopener"&gt;GitHub Actions CI matrix&lt;/a&gt;, and &lt;a href="https://readthedocs.org/" target="_blank" rel="noopener"&gt;Read the Docs&lt;/a&gt;, &lt;a href="https://www.sphinx-doc.org/" target="_blank" rel="noopener"&gt;Sphinx&lt;/a&gt;, &lt;a href="https://myst-nb.readthedocs.io/en/latest/" target="_blank" rel="noopener"&gt;MyST-NB&lt;/a&gt;, and &lt;a href="https://jupytext.readthedocs.io/en/latest/" target="_blank" rel="noopener"&gt;Jupytext notebooks&lt;/a&gt; for documentation, you create a streamlined, efficient, and reliable development environment.&lt;/p&gt;&#10;&lt;p&gt;These tools help maintain code consistency, catch issues early, automate package versioning, simplify testing, consolidate configurations, and create high-quality documentation. By integrating them into your projects, you can focus on writing great code while ensuring that your work remains robust, maintainable, and accessible to users and contributors alike.&lt;/p&gt;&#10;&lt;p&gt;Don&amp;rsquo;t hesitate to explore these tools and incorporate them into your Python development toolkit. They can transform your development experience, making it more enjoyable and efficient, ultimately leading to higher-quality projects and happier developers. Happy coding!&lt;/p&gt;&#10;</description></item><item><title>My VS Code setup: extensions and shortcuts ⚡</title><link>https://www.nijho.lt/post/vscode-extensions-and-shortcuts/</link><pubDate>Sun, 16 Apr 2023 00:00:00 +0000</pubDate><guid isPermaLink="false">/post/vscode-extensions-and-shortcuts/</guid><description>&lt;p&gt;Visual Studio Code, or VSCode, has rapidly become one of the most popular code editors available today, and for good reason. With a vast amount of development activity behind it, VSCode is a powerful and extensible platform that allows users to customize it to their needs through a wide variety of extensions. As a long-time Sublime Text user, I was initially skeptical about making the switch due to concerns about performance. However, as I spent more time using VSCode, I became convinced of its many benefits and have since made it my go-to editor for all my development needs, particularly for Python.&lt;/p&gt;&#10;&lt;p&gt;In this blog post, I will share my personal setup for turbocharging Python development in VSCode, including my favorite extensions and most-used keystrokes. By tailoring your editor to your specific requirements and preferences, you can maximize productivity and minimize keystrokes, making your development experience as smooth and efficient as possible.&lt;/p&gt;&#10;&lt;details class="toc" open&gt;&lt;summary&gt;Table of contents&lt;/summary&gt;&lt;nav id="TableOfContents"&gt;&#10; &lt;ul&gt;&#10; &lt;li&gt;&lt;a href="#my-most-common-shortcuts"&gt;My most common Shortcuts&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#my-favorite-extensions"&gt;My favorite extensions&lt;/a&gt;&#10; &lt;ul&gt;&#10; &lt;li&gt;&lt;a href="#1-github-copilot"&gt;1. GitHub Copilot&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#2-gitlens"&gt;2. GitLens&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#3-python-and-pylance"&gt;3. Python and Pylance&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#4-jupyter"&gt;4. Jupyter&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#5-sublime-keybindings"&gt;5. Sublime Keybindings&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#6-remote-containers-ssh-and-remote-extension-pack"&gt;6. Remote Containers, SSH, and Remote Extension Pack&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#7-indent-rainbow"&gt;7. Indent Rainbow&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#8-code-spell-checker"&gt;8. Code Spell Checker&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#ruff"&gt;Ruff&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#github-codespaces-remotehub-and-pull-request"&gt;GitHub Codespaces, RemoteHub, and Pull Request&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#rainbow-csv"&gt;Rainbow CSV&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#better-comments"&gt;Better Comments&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#markdown-preview-enhanced"&gt;Markdown Preview Enhanced&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#markdown-all-in-one"&gt;Markdown All in One&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#wakatime"&gt;WakaTime&lt;/a&gt;&lt;/li&gt;&#10; &lt;/ul&gt;&#10; &lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#other-extensions-i-use"&gt;Other extensions I use&lt;/a&gt;&#10; &lt;ul&gt;&#10; &lt;li&gt;&lt;a href="#latex-workshop"&gt;LaTeX Workshop&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#live-share"&gt;Live Share&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#azure-account-and-repos"&gt;Azure Account and Repos&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#codesnap"&gt;CodeSnap&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#micromamba"&gt;Micromamba&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#markdownlint"&gt;Markdownlint&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#prettier"&gt;Prettier&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#code-runner"&gt;Code Runner&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#go"&gt;Go&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#home-assistant"&gt;Home Assistant&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#azure-pipelines-resource-groups-storage-and-terraform"&gt;Azure Pipelines, Resource Groups, Storage, and Terraform&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#docker"&gt;Docker&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#autodocstring"&gt;AutoDocstring&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#xml-and-yaml"&gt;XML and YAML&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#rust-analyzer"&gt;Rust Analyzer&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#even-better-toml"&gt;Even Better TOML&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#terrastruct"&gt;Terrastruct&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#pdf"&gt;PDF&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#ltex"&gt;LTeX&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#intellicode-api-usage-examples-and-intellicode"&gt;IntelliCode API Usage Examples and IntelliCode&lt;/a&gt;&lt;/li&gt;&#10; &lt;li&gt;&lt;a href="#vscode-icons"&gt;vscode-icons&lt;/a&gt;&lt;/li&gt;&#10; &lt;/ul&gt;&#10; &lt;/li&gt;&#10; &lt;/ul&gt;&#10;&lt;/nav&gt;&lt;/details&gt;&#10;&#10;&lt;h2 id="my-most-common-shortcuts"&gt;My most common Shortcuts &lt;a class="anchor" href="#my-most-common-shortcuts" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Personally, I use the Sublime Keymap extension to add Sublime Text keybindings to VSCode.&lt;/p&gt;&#10;&lt;p&gt;It is a valuable extension for those who are transitioning from Sublime Text to Visual Studio Code or simply prefer Sublime Text&amp;rsquo;s keybindings.&#10;This extension replicates Sublime Text&amp;rsquo;s keyboard shortcuts in VSCode, allowing you to maintain your productivity and muscle memory.&lt;/p&gt;&#10;&lt;p&gt;Here are &lt;em&gt;&lt;strong&gt;my&lt;/strong&gt;&lt;/em&gt; commonly used shortcuts when using the Sublime Keymap extension and the default VSCode keybindings (if missing both are the same):&lt;/p&gt;&#10;&lt;div class="table-wrap"&gt;&#10;&lt;table&gt;&#10;&lt;thead&gt;&#10;&lt;tr&gt;&#10;&lt;th&gt;Keybinding (Sublime)&lt;/th&gt;&#10;&lt;th&gt;Keybinding (VS Code)&lt;/th&gt;&#10;&lt;th&gt;Description&lt;/th&gt;&#10;&lt;/tr&gt;&#10;&lt;/thead&gt;&#10;&lt;tbody&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;strong&gt;Command + Shift + P (Mac) / Ctrl + Shift + P (Windows)&lt;/strong&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;em&gt;same&lt;/em&gt;&lt;/td&gt;&#10;&lt;td&gt;Open the command palette&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;strong&gt;Command + P (Mac) / Ctrl + P (Windows)&lt;/strong&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;em&gt;same&lt;/em&gt;&lt;/td&gt;&#10;&lt;td&gt;Quick file navigation&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;strong&gt;Command + D (Mac) / Ctrl + D (Windows)&lt;/strong&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;em&gt;same&lt;/em&gt;&lt;/td&gt;&#10;&lt;td&gt;Select the next occurrence of the current word&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;strong&gt;Command + U (Mac) / Ctrl + U (Windows)&lt;/strong&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;em&gt;same&lt;/em&gt;&lt;/td&gt;&#10;&lt;td&gt;Undo the last &amp;ldquo;select next word&amp;rdquo; operation&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;strong&gt;Alt + up/down arrow&lt;/strong&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;em&gt;same&lt;/em&gt;&lt;/td&gt;&#10;&lt;td&gt;Move the selected lines up or down&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;strong&gt;Alt + Shift + up/down arrows&lt;/strong&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;em&gt;same&lt;/em&gt;&lt;/td&gt;&#10;&lt;td&gt;Duplicate the selected lines above or below&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;strong&gt;Command + Shift + L (Mac) / Ctrl + Shift + L (Windows)&lt;/strong&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;strong&gt;Shift + Alt + L&lt;/strong&gt;&lt;/td&gt;&#10;&lt;td&gt;Place a cursor at the end of all selected lines&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;strong&gt;Control + - (minus)&lt;/strong&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;em&gt;same&lt;/em&gt;&lt;/td&gt;&#10;&lt;td&gt;Navigate to the previous location in the editor&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;strong&gt;Command + T (Mac) / Ctrl + T (Windows)&lt;/strong&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;strong&gt;Command + P (Mac) / Control + P (Windows)&lt;/strong&gt;&lt;/td&gt;&#10;&lt;td&gt;Browse files in the workspace&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;strong&gt;Command + R (Mac) / Ctrl + R (Windows)&lt;/strong&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;strong&gt;Command + Shift + O (Mac) / Ctrl + Shift + O (Windows)&lt;/strong&gt;&lt;/td&gt;&#10;&lt;td&gt;Open the command palette and search for definitions in the file (bonus, add a &lt;code&gt;:&lt;/code&gt;, to get &lt;code&gt;@:&lt;/code&gt; to group by functions, methods, variables, etc.)&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;strong&gt;Command + B (Mac) / Ctrl + B (Windows)&lt;/strong&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;em&gt;same&lt;/em&gt;&lt;/td&gt;&#10;&lt;td&gt;Toggle the visibility of the sidebar (explorer, search, etc.)&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;strong&gt;Command + Shift + F (Mac) / Ctrl + Shift + F (Windows)&lt;/strong&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;em&gt;same&lt;/em&gt;&lt;/td&gt;&#10;&lt;td&gt;Search across all files in your workspace&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;strong&gt;Command + Shift + E (Mac) / Ctrl + Shift + E (Windows)&lt;/strong&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;em&gt;same&lt;/em&gt;&lt;/td&gt;&#10;&lt;td&gt;Open the file explorer&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;strong&gt;Control + Space&lt;/strong&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;em&gt;same&lt;/em&gt;&lt;/td&gt;&#10;&lt;td&gt;Open the autocomplete menu&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;strong&gt;Command + Mouse click&lt;/strong&gt; or &lt;strong&gt;F12&lt;/strong&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;em&gt;same&lt;/em&gt;&lt;/td&gt;&#10;&lt;td&gt;Go to the definition of the selected word&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;strong&gt;Command + I&lt;/strong&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;em&gt;same&lt;/em&gt;&lt;/td&gt;&#10;&lt;td&gt;Open GitHub Copilot prompt inline&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;strong&gt;Command + Shift + I&lt;/strong&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;em&gt;same&lt;/em&gt;&lt;/td&gt;&#10;&lt;td&gt;Open GitHub Copilot prompt in sidebar&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;strong&gt;Shift + Alt + F&lt;/strong&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;em&gt;same&lt;/em&gt;&lt;/td&gt;&#10;&lt;td&gt;Autoformat&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;strong&gt;Command + Control + G&lt;/strong&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;strong&gt;Command + Shift + L (Mac) / Ctrl + Shift + L (Windows)&lt;/strong&gt;&lt;/td&gt;&#10;&lt;td&gt;Select all occurrences of current word&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;strong&gt;F2&lt;/strong&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;em&gt;same&lt;/em&gt;&lt;/td&gt;&#10;&lt;td&gt;Rename symbol&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;strong&gt;Ctrl + `&lt;/strong&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;em&gt;same&lt;/em&gt;&lt;/td&gt;&#10;&lt;td&gt;Open the integrated terminal&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;&lt;strong&gt;Alt + Z&lt;/strong&gt;&lt;/td&gt;&#10;&lt;td&gt;&lt;em&gt;same&lt;/em&gt;&lt;/td&gt;&#10;&lt;td&gt;Toggle word wrap&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="my-favorite-extensions"&gt;My favorite extensions &lt;a class="anchor" href="#my-favorite-extensions" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;I have ranked my top 8 extensions, which I would recommend to anyone who is looking to improve their productivity and efficiency in VSCode.&lt;/p&gt;&#10;&lt;h3 id="1-github-copilot"&gt;1. GitHub Copilot &lt;a class="anchor" href="#1-github-copilot" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;GitHub Copilot is an AI-powered code completion extension that provides seamless integration with the Copilot service, helping you write code faster and smarter.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension GitHub.copilot&lt;/code&gt; to install the GitHub Copilot extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=GitHub.copilot" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;figure&gt;&lt;img src="https://user-images.githubusercontent.com/37570492/212964557-8d832278-61bb-4288-a8a7-47f35859e868.gif" alt="" loading="lazy" data-zoomable&gt;&lt;/figure&gt;&lt;h3 id="2-gitlens"&gt;2. GitLens &lt;a class="anchor" href="#2-gitlens" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;GitLens supercharges the built-in Git support in VSCode, providing useful insights into your code history and changes, including advanced blame annotations, code lens, and more.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension eamodio.gitlens&lt;/code&gt; to install the GitLens extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;figure&gt;&lt;img src="https://raw.githubusercontent.com/gitkraken/vscode-gitlens/633fc030f6f6b372d6d487c2bd35a8346507f0b2/images/docs/revision-navigation.gif" alt="" loading="lazy" data-zoomable&gt;&lt;/figure&gt;&lt;h3 id="3-python-and-pylance"&gt;3. Python and Pylance &lt;a class="anchor" href="#3-python-and-pylance" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;These extensions offer comprehensive support for Python development, with features like IntelliSense, linting, debugging, and code navigation. Pylance enhances Python support with improved code completion, type checking, and language features.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension ms-python.python&lt;/code&gt; to install the Python extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-python.python" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension ms-python.vscode-pylance&lt;/code&gt; to install the Pylance extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;img src="https://raw.githubusercontent.com/microsoft/vscode-python/d905cf0555e0032cfe10a2af2b925e686246e30e/images/InterpreterSelectionZoom.gif" alt="" loading="lazy" data-zoomable&gt;&#10;&lt;img src="https://github.com/microsoft/pylance-release/raw/77c8d25c51376faa488e69b8fb670ddc64c5bb3e/images/all-features.gif" alt="" loading="lazy" data-zoomable&gt;&lt;/p&gt;&#10;&lt;h3 id="4-jupyter"&gt;4. Jupyter &lt;a class="anchor" href="#4-jupyter" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;The Jupyter extensions enable you to work with Jupyter Notebooks in VSCode, with support for running cells, debugging, and more. Jupyter Keymap adds customizable keyboard shortcuts for Jupyter commands.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension ms-toolsai.jupyter&lt;/code&gt; to install the Jupyter extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&#10;&lt;img src="https://github.com/Microsoft/vscode-jupyter/raw/e3eee370c97505ce390858a4645f73bc1b3912fc/images/Jupyter%20README/notebookui.png" alt="" loading="lazy" data-zoomable&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="5-sublime-keybindings"&gt;5. Sublime Keybindings &lt;a class="anchor" href="#5-sublime-keybindings" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Sublime Keybindings adds keybindings from Sublime Text to VSCode, making it easier for developers familiar with Sublime Text to transition to VSCode.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension ms-vscode.sublime-keybindings&lt;/code&gt; to install the Sublime Keybindings extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.sublime-keybindings" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="6-remote-containers-ssh-and-remote-extension-pack"&gt;6. Remote Containers, SSH, and Remote Extension Pack &lt;a class="anchor" href="#6-remote-containers-ssh-and-remote-extension-pack" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;These extensions provide support for working with remote development environments in VSCode, such as developing inside a container or connecting to remote machines via SSH. The Extension Pack bundles all the remote development extensions for convenience.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension ms-vscode-remote.remote-ssh-edit&lt;/code&gt; to install the Remote SSH Edit extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh-edit" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension ms-vscode-remote.vscode-remote-extensionpack&lt;/code&gt; to install the Remote Extension Pack &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension ms-vscode.remote-explorer&lt;/code&gt; to install the Remote Explorer extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.remote-explorer" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension ms-vscode.remote-repositories&lt;/code&gt; to install the Remote Repositories extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.remote-repositories" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;figure&gt;&lt;img src="https://microsoft.github.io/vscode-remote-release/images/remote-containers-readme.gif" alt="" loading="lazy" data-zoomable&gt;&lt;/figure&gt;&lt;h3 id="7-indent-rainbow"&gt;7. Indent Rainbow &lt;a class="anchor" href="#7-indent-rainbow" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Indent Rainbow is a VSCode extension that colorizes indentation levels in your code, making it easier to visualize and navigate complex code structures.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension oderwat.indent-rainbow&lt;/code&gt; to install the Indent Rainbow extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;figure&gt;&lt;img src="https://raw.githubusercontent.com/oderwat/vscode-indent-rainbow/913f5a704b54730a5cea5a4de97e245fcd8c8596/assets/example.png" alt="" loading="lazy" data-zoomable&gt;&lt;/figure&gt;&lt;h3 id="8-code-spell-checker"&gt;8. Code Spell Checker &lt;a class="anchor" href="#8-code-spell-checker" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Code Spell Checker is a helpful extension that checks your code and comments for spelling errors, helping you maintain clean and professional code.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension streetsidesoftware.code-spell-checker&lt;/code&gt; to install the Code Spell Checker extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;figure&gt;&lt;img src="https://raw.githubusercontent.com/streetsidesoftware/vscode-spell-checker/main/images/example.gif" alt="" loading="lazy" data-zoomable&gt;&lt;/figure&gt;&lt;h3 id="ruff"&gt;Ruff &lt;a class="anchor" href="#ruff" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Ruff is a Visual Studio Code extension that provides support for the Ruff linter, an extremely fast Python linter written in Rust. It offers numerous features such as built-in caching, autofix support, and a comprehensive set of built-in rules. Ruff aims to replace multiple tools like Flake8, isort, pydocstyle, yesqa, eradicate, pyupgrade, and autoflake, while executing much faster than any individual tool.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension charliermarsh.ruff&lt;/code&gt; to install the Ruff extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=charliermarsh.ruff" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;img src="https://user-images.githubusercontent.com/1309177/205176932-44cfc03a-120f-4bad-b710-612bdd7765d6.gif" alt="" loading="lazy" data-zoomable&gt;&#10;&lt;img src="https://user-images.githubusercontent.com/1309177/205175987-82e23e21-14bb-467d-9ef0-027f24b75865.gif" alt="" loading="lazy" data-zoomable&gt;&lt;/p&gt;&#10;&lt;h3 id="github-codespaces-remotehub-and-pull-request"&gt;GitHub Codespaces, RemoteHub, and Pull Request &lt;a class="anchor" href="#github-codespaces-remotehub-and-pull-request" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;These GitHub extensions provide seamless integration with various GitHub services, including Codespaces (cloud-based development environments), RemoteHub (browse remote repositories), and Pull Request management.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension GitHub.codespaces&lt;/code&gt; to install the GitHub Codespaces extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=GitHub.codespaces" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension GitHub.remotehub&lt;/code&gt; to install the GitHub RemoteHub extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=GitHub.remotehub" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension GitHub.vscode-pull-request-github&lt;/code&gt; to install the GitHub Pull Request extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-pull-request-github" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;figure&gt;&lt;img src="https://github.com/Microsoft/vscode-pull-request-github/raw/HEAD/.readme/demo.gif" alt="" loading="lazy" data-zoomable&gt;&lt;/figure&gt;&lt;h3 id="rainbow-csv"&gt;Rainbow CSV &lt;a class="anchor" href="#rainbow-csv" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Rainbow CSV adds syntax highlighting for CSV and TSV files in VSCode, making it easier to read and analyze data by color-coding columns.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension mechatroner.rainbow-csv&lt;/code&gt; to install the Rainbow CSV extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=mechatroner.rainbow-csv" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;figure&gt;&lt;img src="https://i.imgur.com/ryjBI1R.png" alt="" loading="lazy" data-zoomable&gt;&lt;/figure&gt;&lt;h3 id="better-comments"&gt;Better Comments &lt;a class="anchor" href="#better-comments" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Better Comments is a VSCode extension that helps improve the readability of your code comments by adding color and style to different types of comments, such as TODOs, highlights, questions, and alerts.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension aaron-bond.better-comments&lt;/code&gt; to install the Better Comments extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=aaron-bond.better-comments" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;figure&gt;&lt;img src="https://github.com/aaron-bond/better-comments/raw/084a906e73a3ca96d5319441714be8e3a2a8c385/images/better-comments.PNG" alt="" loading="lazy" data-zoomable&gt;&lt;/figure&gt;&lt;h3 id="markdown-preview-enhanced"&gt;Markdown Preview Enhanced &lt;a class="anchor" href="#markdown-preview-enhanced" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Markdown Preview Enhanced is a feature-rich extension that provides a real-time preview of your Markdown files, supporting various Markdown flavors, interactive diagrams, and more.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension shd101wyy.markdown-preview-enhanced&lt;/code&gt; to install the Markdown Preview Enhanced extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=shd101wyy.markdown-preview-enhanced" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;figure&gt;&lt;img src="https://user-images.githubusercontent.com/1908863/28495106-30b3b15e-6f09-11e7-8eb6-ca4ca001ab15.png" alt="" loading="lazy" data-zoomable&gt;&lt;/figure&gt;&lt;h3 id="markdown-all-in-one"&gt;Markdown All in One &lt;a class="anchor" href="#markdown-all-in-one" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Markdown All in One is a comprehensive extension that provides a range of features for working with Markdown files in VSCode, including syntax highlighting, auto-completion, table of contents, and more.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension yzhang.markdown-all-in-one&lt;/code&gt; to install the Markdown All in One extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;figure&gt;&lt;img src="https://raw.githubusercontent.com/yzhang-gh/vscode-markdown/78775f6caeb353bee905d7f72702364467b10ef1/images/gifs/toggle-bold.gif" alt="" loading="lazy" data-zoomable&gt;&lt;/figure&gt;&lt;h3 id="wakatime"&gt;WakaTime &lt;a class="anchor" href="#wakatime" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;WakaTime is an open source VS Code plugin for metrics, insights, and time tracking automatically generated from your programming activity. This service will keep a summary of how much time you spend in which project and which programming language.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension WakaTime.vscode-wakatime&lt;/code&gt; to install the WakaTime extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=WakaTime.vscode-wakatime" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;figure&gt;&lt;img src="https://wakatime.com/static/img/ScreenShots/Screen-Shot-2016-03-21.png" alt="" loading="lazy" data-zoomable&gt;&lt;/figure&gt;&lt;h2 id="other-extensions-i-use"&gt;Other extensions I use &lt;a class="anchor" href="#other-extensions-i-use" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;The following extensions are not as essential as the ones listed above, but I still find them useful for various tasks.&lt;/p&gt;&#10;&lt;h3 id="latex-workshop"&gt;LaTeX Workshop &lt;a class="anchor" href="#latex-workshop" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;LaTeX Workshop is a comprehensive extension for working with LaTeX documents in VSCode, featuring syntax highlighting, building and previewing, IntelliSense, and more.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension James-Yu.latex-workshop&lt;/code&gt; to install the LaTeX Workshop extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=James-Yu.latex-workshop" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;figure&gt;&lt;img src="https://github.com/James-Yu/LaTeX-Workshop/raw/2a843a258002f05807203c078715dd6836faeeb8/demo_media/preview.gif" alt="" loading="lazy" data-zoomable&gt;&lt;/figure&gt;&lt;h3 id="live-share"&gt;Live Share &lt;a class="anchor" href="#live-share" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Visual Studio Live Share is a real-time collaboration extension that allows you to share your workspace with others, enabling pair programming, code reviews, and collaborative debugging.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension ms-vsliveshare.vsliveshare&lt;/code&gt; to install the Live Share extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-vsliveshare.vsliveshare" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;figure&gt;&lt;img src="https://aka.ms/vsls/quickstart/invite" alt="" loading="lazy" data-zoomable&gt;&lt;/figure&gt;&lt;h3 id="azure-account-and-repos"&gt;Azure Account and Repos &lt;a class="anchor" href="#azure-account-and-repos" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;These extensions offer a range of Azure-related functionality, including managing your Azure account, working with Azure Repos, exploring remote resources, and browsing remote Git repositories.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension ms-vscode.azure-account&lt;/code&gt; to install the Azure Account extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.azure-account" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension ms-vscode.azure-repos&lt;/code&gt; to install the Azure Repos extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.azure-repos" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="codesnap"&gt;CodeSnap &lt;a class="anchor" href="#codesnap" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;CodeSnap is a handy extension for creating beautiful code screenshots directly from your editor, making it easier to share code snippets on social media, blog posts, or documentation.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension adpyke.codesnap&lt;/code&gt; to install the CodeSnap extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=adpyke.codesnap" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;figure&gt;&lt;img src="https://user-images.githubusercontent.com/6897215/233820944-bfb1f980-4eb6-4bbd-8118-a960888b2d32.png" alt="" loading="lazy" data-zoomable&gt;&lt;/figure&gt;&lt;h3 id="micromamba"&gt;Micromamba &lt;a class="anchor" href="#micromamba" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;The Micromamba extension for VSCode integrates the Micromamba package manager, making it easier to manage Conda environments and packages within the editor.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension corker.vscode-micromamba&lt;/code&gt; to install the Micromamba extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=corker.vscode-micromamba" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="markdownlint"&gt;Markdownlint &lt;a class="anchor" href="#markdownlint" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Markdownlint is a VSCode extension that provides linting and style-checking for Markdown files, ensuring consistent and clean Markdown content.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension DavidAnson.vscode-markdownlint&lt;/code&gt; to install the Markdownlint extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="prettier"&gt;Prettier &lt;a class="anchor" href="#prettier" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Prettier is a powerful code formatter that supports multiple languages, including JavaScript, TypeScript, HTML, CSS, and more. It enforces a consistent code style across your project.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension esbenp.prettier-vscode&lt;/code&gt; to install the Prettier extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="code-runner"&gt;Code Runner &lt;a class="anchor" href="#code-runner" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Code Runner is a versatile extension that enables you to quickly run code snippets or whole files for multiple programming languages within VSCode, without the need to switch to an external terminal.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension formulahendry.code-runner&lt;/code&gt; to install the Code Runner extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=formulahendry.code-runner" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="go"&gt;Go &lt;a class="anchor" href="#go" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;The Go extension by the Go team provides rich language support for the Go programming language, with features like IntelliSense, debugging, linting, and code navigation.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension golang.go&lt;/code&gt; to install the Go extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=golang.go" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="home-assistant"&gt;Home Assistant &lt;a class="anchor" href="#home-assistant" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;The Home Assistant extension for VSCode provides integration with Home Assistant configuration files, offering syntax highlighting, auto-completion, and validation.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension keesschollaart.vscode-home-assistant&lt;/code&gt; to install the Home Assistant extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=keesschollaart.vscode-home-assistant" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="azure-pipelines-resource-groups-storage-and-terraform"&gt;Azure Pipelines, Resource Groups, Storage, and Terraform &lt;a class="anchor" href="#azure-pipelines-resource-groups-storage-and-terraform" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;These Microsoft Azure extensions provide powerful integrations with various Azure services, allowing you to manage pipelines, resource groups, storage, and Terraform configurations directly within VSCode.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension ms-azure-devops.azure-pipelines&lt;/code&gt; to install the Azure Pipelines extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-azure-devops.azure-pipelines" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension ms-azuretools.vscode-azureresourcegroups&lt;/code&gt; to install the Azure Resource Groups extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azureresourcegroups" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension ms-azuretools.vscode-azurestorage&lt;/code&gt; to install the Azure Storage extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurestorage" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension ms-azuretools.vscode-azureterraform&lt;/code&gt; to install the Azure Terraform extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azureterraform" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="docker"&gt;Docker &lt;a class="anchor" href="#docker" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;The Docker extension adds rich support for working with Docker containers and images in VSCode, including building, managing, and deploying containerized applications.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension ms-azuretools.vscode-docker&lt;/code&gt; to install the Docker extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="autodocstring"&gt;AutoDocstring &lt;a class="anchor" href="#autodocstring" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;AutoDocstring is a helpful extension that automatically generates docstrings for Python functions and classes, following popular docstring formats like Google, NumPy, and reStructuredText.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension njpwerner.autodocstring&lt;/code&gt; to install the AutoDocstring extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=njpwerner.autodocstring" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="xml-and-yaml"&gt;XML and YAML &lt;a class="anchor" href="#xml-and-yaml" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;These extensions by Red Hat provide rich language support for XML and YAML, including syntax highlighting, validation, code navigation, and more.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension redhat.vscode-xml&lt;/code&gt; to install the XML extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=redhat.vscode-xml" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension redhat.vscode-yaml&lt;/code&gt; to install the YAML extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="rust-analyzer"&gt;Rust Analyzer &lt;a class="anchor" href="#rust-analyzer" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Rust Analyzer is a powerful language server for the Rust programming language, offering features like syntax highlighting, code navigation, and auto-completion.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension rust-lang.rust-analyzer&lt;/code&gt; to install the Rust Analyzer extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="even-better-toml"&gt;Even Better TOML &lt;a class="anchor" href="#even-better-toml" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Even Better TOML is a VSCode extension that provides syntax highlighting, validation, and auto-completion for TOML (Tom&amp;rsquo;s Obvious, Minimal Language) configuration files.&lt;/p&gt;&#10;&lt;h3 id="terrastruct"&gt;Terrastruct &lt;a class="anchor" href="#terrastruct" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Terrastruct is a VSCode extension that helps you visualize your Terraform dependency graphs as interactive diagrams, making it easier to understand complex infrastructure-as-code projects.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension Terrastruct.d2&lt;/code&gt; to install the Terrastruct extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=Terrastruct.d2" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="pdf"&gt;PDF &lt;a class="anchor" href="#pdf" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;The PDF extension allows you to view and manage PDF files directly within VSCode, with support for zooming, rotating, and searching text.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension tomoki1207.pdf&lt;/code&gt; to install the PDF extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=tomoki1207.pdf" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="ltex"&gt;LTeX &lt;a class="anchor" href="#ltex" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;LTeX is a grammar and spell checker extension for LaTeX, Markdown, and other markup languages, with support for multiple languages and customizable rules.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension valentjn.vscode-ltex&lt;/code&gt; to install the LTeX extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=valentjn.vscode-ltex" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="intellicode-api-usage-examples-and-intellicode"&gt;IntelliCode API Usage Examples and IntelliCode &lt;a class="anchor" href="#intellicode-api-usage-examples-and-intellicode" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;These extensions by the Visual Studio Expt Team provide AI-powered code completion and code examples, helping you write code faster and with fewer errors.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension VisualStudioExptTeam.intellicode-api-usage-examples&lt;/code&gt; to install the IntelliCode API Usage Examples extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.intellicode-api-usage-examples" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension VisualStudioExptTeam.vscodeintellicode&lt;/code&gt; to install the IntelliCode extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.vscodeintellicode" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="vscode-icons"&gt;vscode-icons &lt;a class="anchor" href="#vscode-icons" aria-label="Link to this section"&gt;#&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;vscode-icons is a popular extension that adds file icons to VSCode, making it easier to identify file types in the file explorer.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Use &lt;code&gt;code --install-extension vscode-icons-team.vscode-icons&lt;/code&gt; to install the vscode-icons extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=vscode-icons-team.vscode-icons" target="_blank" rel="noopener"&gt;(docs)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item></channel></rss>