Namespace Development Kit, providing a set of useful utilities for building software (in python namespaces)
Project description
nskit Recipe System
Flexible, client/service architecture for managing code generation recipes with intelligent 3-way merge updates.
Architecture
nskit is organized into focused modules:
client/- Recipe operations (initialization, updates, backends, diff/merge)mixer/- Core templating and component systemrecipes/- Pre-defined recipe implementationscli/- Command-line interface (thin wrapper over client)
Quick Start
For Recipe Users
# Install
pip install nskit
# List recipes
myrecipes list
# Initialize project (Docker mode - default)
myrecipes init --recipe python_package --input-yaml-path config.yaml
# Initialize project (local mode - development)
myrecipes init --recipe python_package --input-yaml-path config.yaml --local
# Update project
myrecipes update
For Recipe Builders
from nskit.mixer.components import Recipe, File, Folder
class MyRecipe(Recipe):
contents = [
File(name="README.md", content="# {{name}}\n"),
]
For Platform Engineers
from nskit.cli.app import create_cli
from nskit.client.backends import GitHubBackend
app = create_cli(
recipe_entrypoint='mycompany.recipes',
backend=GitHubBackend(org='myorg')
)
Features
- Two Execution Modes — Docker (production, recommended) or local (recipe development)
- Reproducible Updates — Docker mode pins each recipe version as an immutable image, enabling deterministic 3-way merges
- Client/Service Architecture — Use programmatically, via CLI, or wrap with web API
- Multiple Backends — Local filesystem, Docker registry, GitHub releases
- 3-Way Merge Updates — Preserves user customisations while applying recipe updates
- Conflict Detection — Intelligent merge with conflict reporting
- Pluggable — Easy to extend with custom backends
Architecture
CLI Layer (Thin Wrapper)
↓
Client Layer (Pure Python)
↓
Engine Layer (Docker or Local)
↓
Backend Layer (Pluggable)
Documentation
Full documentation: https://docs.example.com
Installation
# Basic installation
pip install nskit
# With GitHub support
pip install nskit[github]
# With Docker support
pip install nskit[docker]
# With all extras
pip install nskit[all]
Backend Options
nskit supports multiple backends for recipe distribution:
| Backend | Discovery | Execution | Use Case | Setup |
|---|---|---|---|---|
| LocalBackend | Local files | Local only | Development | None |
| GitHubBackend | GitHub Releases | Docker (ghcr.io) | Production | gh CLI + Docker |
| DockerBackend | Docker registry | Docker | Custom registries | Docker |
Execution Modes:
- Docker Mode (Default) — Recipes run in versioned containers. Each version is a pinned image, enabling deterministic 3-way merge updates. Recommended for production.
- Local Mode (
--local) — Recipes run from locally installed Python packages. Faster, but the output may vary across environments. Best for recipe development only.
See Architecture for the detailed design rationale and Docker vs Local Execution for the execution flow.
Custom Backends — Third-party backends are discovered via the nskit.backends entry-point group. See Platform Integration for details.
Usage Examples
Programmatic Usage
from nskit.client import RecipeClient, UpdateClient
from nskit.client.engines import LocalEngine, DockerEngine
from nskit.client.backends import GitHubBackend
from pathlib import Path
# Initialise backend
backend = GitHubBackend(org='myorg')
# Create client with Docker engine (default, recommended)
client = RecipeClient(backend)
# Or with local engine for recipe development
client = RecipeClient(backend, engine=LocalEngine())
# List recipes
recipes = client.list_recipes()
# Initialize recipe
result = client.initialize_recipe(
recipe='python_package',
version='v1.0.0',
parameters={'name': 'my-project'},
output_dir=Path('./output')
)
# Update project
update_client = UpdateClient(backend)
result = update_client.update_project(
project_path=Path('./my-project'),
target_version='v2.0.0'
)
CLI Usage
# Discover recipes
myrecipes discover --search python
# Initialize project
myrecipes init \
--recipe python_package \
--input-yaml-path input.yaml \
--output-base-path ./output
# Check for updates
myrecipes check
# Update with dry-run
myrecipes update --dry-run
# Update to specific version
myrecipes update --target-version v2.0.0
Web API Usage
from fastapi import FastAPI
from nskit.client import RecipeClient
from nskit.client.backends import GitHubBackend
app = FastAPI()
backend = GitHubBackend(org='myorg')
client = RecipeClient(backend)
@app.get("/recipes")
def list_recipes():
return client.list_recipes()
Backend Configuration
Local Backend
type: local
path: /path/to/recipes
Docker Backend
type: docker
registry_url: ghcr.io
image_prefix: myorg/recipes
auth_token: ${GITHUB_TOKEN}
GitHub Backend
type: github
org: myorg
repo_pattern: recipe-{recipe_name}
token: ${GITHUB_TOKEN}
Development
# Clone repository
git clone https://github.com/yourorg/nskit.git
cd nskit
# Install dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Build docs
mkdocs serve
Contributing
See CONTRIBUTING.md for development guidelines.
License
MIT License - see LICENSE for details.
Support
- Documentation: https://docs.example.com
- Issues: GitHub Issues
- Discussions: GitHub Discussions
Project details
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
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nskit-1.1.0.tar.gz.
File metadata
- Download URL: nskit-1.1.0.tar.gz
- Upload date:
- Size: 159.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cdf828271295594b83dff7d2970f8b3bb6696e3a9f65257df3cc5e4ebd8408a0
|
|
| MD5 |
42997e2e6a13a8d87b5f27c7f870b46d
|
|
| BLAKE2b-256 |
533966714689cc998acefc7c32c866d1ddaf1f836f62c95d9a8b0459b52206d6
|
Provenance
The following attestation bundles were made for nskit-1.1.0.tar.gz:
Publisher:
pipeline.yaml on djpugh/nskit
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nskit-1.1.0.tar.gz -
Subject digest:
cdf828271295594b83dff7d2970f8b3bb6696e3a9f65257df3cc5e4ebd8408a0 - Sigstore transparency entry: 1820422757
- Sigstore integration time:
-
Permalink:
djpugh/nskit@5716607f267377feee73b39f4fc45f197ec85383 -
Branch / Tag:
refs/tags/1.1.0 - Owner: https://github.com/djpugh
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pipeline.yaml@5716607f267377feee73b39f4fc45f197ec85383 -
Trigger Event:
release
-
Statement type:
File details
Details for the file nskit-1.1.0-py3-none-any.whl.
File metadata
- Download URL: nskit-1.1.0-py3-none-any.whl
- Upload date:
- Size: 145.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ee3cca272fa6cb6752548ca5f7e7e81c487d40260a83c50a017b8a9e0d8f051d
|
|
| MD5 |
ac5c668edcf1a819273d4674763be637
|
|
| BLAKE2b-256 |
40872bac621b89952d493df450bf0bf3c884d70b85b67528efebff371da40c62
|
Provenance
The following attestation bundles were made for nskit-1.1.0-py3-none-any.whl:
Publisher:
pipeline.yaml on djpugh/nskit
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nskit-1.1.0-py3-none-any.whl -
Subject digest:
ee3cca272fa6cb6752548ca5f7e7e81c487d40260a83c50a017b8a9e0d8f051d - Sigstore transparency entry: 1820422771
- Sigstore integration time:
-
Permalink:
djpugh/nskit@5716607f267377feee73b39f4fc45f197ec85383 -
Branch / Tag:
refs/tags/1.1.0 - Owner: https://github.com/djpugh
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pipeline.yaml@5716607f267377feee73b39f4fc45f197ec85383 -
Trigger Event:
release
-
Statement type: