Run cached commands in your modular monorepo.
Project description
Qik (quick) is a cached command runner for modular monorepos. Like make, but with hash-based caching and advanced dependencies such as globs, imports, external packages, and much more.
Qik's command caching ensures you never do redundant work. Parametrize commands across modules, watch and re-run them reactively, or filter commands since a git hash. Qik can dramatically improve CI and local development time.
Although qik has special functionality with Python repos, any git-based project can use qik as a command runner.
Installation
pip install qik
For local development, we recommend installing most optional dependencies with:
pip install "qik[dev]"
Qik is compatible with Python 3.10 - 3.12, Linux, OSX, and WSL.
Quick Start
File and Glob Dependencies
Here we use the pip-compile
executable from pip-tools to lock PyPI distributions. Create qik.toml
with the following:
[commands.lock]
exec = "pip-compile > requirements.txt"
deps = ["requirements.in"]
cache = "repo"
Running qik lock
executes pip-compile > requirements.txt
. Results are cached in your repo until requirements.in
changes.
Distribution Dependencies
Change deps
to re-run this command if we upgrade pip-tools
:
deps = ["requirements.in", {type = "dist", name = "pip-tools"}]
Installing a different version of pip-tools
will break the command cache.
Modular Commands
Parametrize commands over modules, for example, running the ruff code formatter:
modules = ["a_module", "b_module", "c_module"]
[commands.format]
exec = "ruff format {module.path}"
deps = ["{module.path}/**.py"]
cache = "repo"
Running qik format
will parametrize ruff format
in parallel over all available threads and configured modules. Use -n
to adjust the number of threads and -m
to supply modules:
qik format -n 2 -m b_module -m c_module
Import Dependencies
Some commands, such as pyright type checking, should re-run whenever imports change:
modules = ["a_module", "b_module", "c_module"]
plugins = ["qik.graph"]
[commands.check_types]
exec = "pyright {module.path}"
deps = [{type = "module", name = "{module.name}"}]
cache = "repo"
Running qik check_types
will parametrize pyright
over all modules. Modular commands will be cached unless the module's files or dependencies change.
We use the qik.graph
plugin, which provides commands that are automatically used for building and analyzing the import graph.
Command Dependencies
Command dependencies help order execution. For example, change deps
of command.check_types
to run type checking only after code has been successfully formatted:
deps = [
{type = "module", name = "{module.name}"},
{type = "command", name = "format"}
]
Caching
We've shown examples of the repo
cache, which stores metadata of the most recent runs in the repo. Qik offers both local and remote caches to store all command runs and their output.
To use these, first ensure commands have artifacts
configured. For example, the lock
command generates a requirements.txt
file:
[commands.lock]
exec = "pip-compile > requirements.txt"
deps = ["requirements.in"]
artifacts = ["requirements.txt"]
cache = "local"
Above we're using the local
cache. Versions of our requirements.txt
will be stored in the ._qik/cache
folder. Qik supports AWS S3 as a remote caching backend.
Command Line Interface
The core CLI functionality is as follows:
qik
to run all commands.qik <cmd_name> <cmd_name>
to run specific commands.--watch
to reactively run selected commands.-f
to run without the cache.-m
to run against specific modules.-n
to set the number of threads.--ls
to list commands instead of running them.
Some runtime behavior is configurable via the CLI:
--cache
to set the default cache.--cache-when
to configure when to cache. Usefinished
to cache all results. By default onlysuccess
runs are cached.--isolated
to not run dependent commands.
These options are useful for selecting commands:
--since
to select commands based on changes since a git SHA.--cache-type
to select commands by their cache type.--cache-status
to select commands by their cache status (warm
orcold
).--fail
to return a non-zero exit code if any commands are selected.
Finally, use -p
to set the qik context.
Docs
Read the qik docs here for more information on:
- Commands: A cookbook of common commands and creating module-specific commands.
- Dependencies: All dependencies, including global dependencies, constants, and file parts.
- Selectors: Selecting commands based on properties.
- Context: Using environment-based context and runtime profiles.
- Caching: How caching works and how to configure all cache types, including S3.
- Continuous Integration: Patterns for optimizing CI time.
- Plugins: How to create qik plugins, such as custom commands and cache backends.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file qik-0.0.3.tar.gz
.
File metadata
- Download URL: qik-0.0.3.tar.gz
- Upload date:
- Size: 32.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.2 CPython/3.12.3 Linux/5.15.0-1057-aws
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 97654636ef2c526645097c6220429988f6f857b91ca842e2a262ebb5601ba9ad |
|
MD5 | 6afc1c43514de7f3087e66b16ddfc35f |
|
BLAKE2b-256 | c542b5c7241790c2d3661b1ae8e94bcbcf136ef352a198b67450b2bd179bb717 |
File details
Details for the file qik-0.0.3-py3-none-any.whl
.
File metadata
- Download URL: qik-0.0.3-py3-none-any.whl
- Upload date:
- Size: 37.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.2 CPython/3.12.3 Linux/5.15.0-1057-aws
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | aa4804cddbb2d66f109bc6beb123b42c40ad49fda5e733278b3e11b3537b3454 |
|
MD5 | 195b58429c500bdd1fc977ddb394e5c2 |
|
BLAKE2b-256 | fa9760bd81b9b63ace834cfe40cc6a93f080b3d8d83c0ca4830c32b0b4765f4d |