Plugin for twat that provides package initialization functionality
Project description
twat-hatch
(work in progress)
A powerful Python package initializer that supports both standalone packages and plugin-based architectures. Built with modern Python practices and robust configuration management.
Features
- ๐ฏ Flexible package creation: Create standalone packages or plugin-based architectures
- ๐ง Modern configuration: Type-safe configuration using Pydantic
- ๐ฆ Multiple package types: Support for core packages and plugins
- ๐จ Templating system: Jinja2-based templating with multiple themes
- ๐ Documentation support: Optional MkDocs integration
- ๐ Version control: Git integration and semantic versioning support
- โจ Best practices: Enforces Python packaging best practices
Why twat-hatch?
twat-hatch helps you create modern Python packages with a focus on plugin systems. It implements best practices for:
Modern python packaging
- PEP 621-style configuration via
pyproject.toml src/layout pattern for better packaging practices- Type hints and runtime type checking with Pydantic
- Automated dependency management
Plugin system architecture
- Namespace packages: Create plugin host packages that dynamically expose plugins
- Dynamic discovery: Automatic plugin registration via entry points
- Flexible usage: Support both direct imports and namespace-based imports
- Clean dependencies: Proper handling of optional plugin dependencies
Best practices implementation
- Code organization: Enforced
src/layout and modern project structure - Error handling: Built-in validation and error checking
- Documentation: Automated documentation setup with MkDocs
- Testing: Pre-configured test structure with pytest
- Type safety: MyPy configuration and Pydantic validation
Installation
uv pip install twat-hatch
Or with pip:
pip install twat-hatch
Quick start
- Create a configuration file
twat-hatch.toml:
[project]
packages = ["my-package"]
output_dir = "packages"
[author]
name = "Your Name"
email = "your.email@example.com"
github_username = "yourusername"
[package]
min_python = "3.8"
license = "MIT"
development_status = "4 - Beta"
- Run the package initializer:
twat-hatch --config twat-hatch.toml
Creating plugin-based packages
Plugin system overview
When creating a plugin-based architecture, twat-hatch generates:
- Plugin host package: The core package that provides plugin discovery and management
- Plugin packages: Individual plugins that integrate with the host package
Example configuration:
[project]
packages = ["my-plugin-a", "my-plugin-b"]
plugin_host = "my-core-package"
output_dir = "packages"
# ... other configuration ...
Plugin system usage
Once packages are created, they can be used in several ways:
# Direct import of a plugin
import my_plugin_a
instance = my_plugin_a.SomeClass()
# Via namespace package (if configured)
from my_core_package import plugin_a
instance = plugin_a.SomeClass()
Installation options:
# Install a plugin directly
pip install my-plugin-a
# Install via the host package with extras
pip install my-core-package[plugin-a]
# Install multiple plugins
pip install my-core-package[plugin-a,plugin-b]
# Install all available plugins
pip install my-core-package[all]
Configuration reference
The configuration file ( twat-hatch.toml ) supports the following sections:
Project configuration
[project]
packages = ["package-name"] # List of packages to create
plugin_host = "host-package" # Optional plugin host package
output_dir = "path/to/output" # Output directory (optional)
Author information
[author]
name = "Author Name"
email = "author@example.com"
github_username = "username"
Package settings
[package]
min_python = "3.8" # Minimum Python version
license = "MIT" # Package license
development_status = "4 - Beta" # PyPI development status
Dependencies
[dependencies]
dependencies = [ # Regular dependencies
"package>=1.0.0"
]
plugin_dependencies = [ # Plugin-specific dependencies
"plugin-package>=1.0.0"
]
dev_dependencies = [ # Development dependencies
"pytest>=7.0.0"
]
Features
[features]
mkdocs = false # Enable MkDocs documentation
semver = true # Use semantic versioning
vcs = true # Initialize Git repository
Generated package structure
Standalone package
my-package/
โโโ README.md
โโโ pyproject.toml # Project configuration
โโโ src/
โ โโโ my_package/ # Package source
โ โโโ __init__.py
โ โโโ core.py
โโโ tests/ # Test directory
โโโ conftest.py
โโโ test_my_package.py
Plugin host package
my-core-package/
โโโ README.md
โโโ pyproject.toml
โโโ src/
โ โโโ my_core_package/
โ โโโ __init__.py # Plugin discovery logic
โ โโโ core.py # Core functionality
โโโ tests/
โโโ conftest.py
โโโ test_my_core_package.py
Plugin package
my-plugin/
โโโ README.md
โโโ pyproject.toml # Includes plugin entry points
โโโ src/
โ โโโ my_plugin/
โ โโโ __init__.py
โ โโโ plugin.py # Plugin implementation
โโโ tests/
โโโ conftest.py
โโโ test_my_plugin.py
Development
To set up the development environment:
git clone https://github.com/twardoch/twat-hatch.git
cd twat-hatch
uv venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
uv pip install -e ".[dev]"
Run tests:
pytest
Run linting:
ruff check .
mypy src/
Technical details
Package naming convention
- Distribution names use hyphens:
my-plugin - Import names use underscores:
my_plugin - Plugin host packages follow the same convention
Plugin discovery
- Plugins register via entry points under
{host}.plugins - Plugin host packages support both direct imports and entry point discovery
- Dynamic loading ensures plugins are only imported when needed
Dependencies management
- Plugin packages can depend on their host package
- Host packages define optional dependencies via extras
- Version compatibility is managed through dependency specifications
Building and publishing
- Build and publish the plugin host package first
- Build and publish plugin packages separately
- Use consistent versioning across packages
License
MIT License, see for details.
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
.
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
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 twat_hatch-2.5.1.tar.gz.
File metadata
- Download URL: twat_hatch-2.5.1.tar.gz
- Upload date:
- Size: 34.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.6.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
12f8e829bed0e469572a719d70bae5f4741f8893cc5d51cb65395118ff18c4eb
|
|
| MD5 |
96f85abb9f2fb193a0b63daa51a08fee
|
|
| BLAKE2b-256 |
cc955796e3e4768fc45b96da8e51e2acb027309a9a1dde33e6e276856c090177
|
File details
Details for the file twat_hatch-2.5.1-py3-none-any.whl.
File metadata
- Download URL: twat_hatch-2.5.1-py3-none-any.whl
- Upload date:
- Size: 35.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.6.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
17e5ee6eacd1d052ea6ac87f35c4def4939206f9d2015ea9b52667ff04d33077
|
|
| MD5 |
d1b7995cff63f666a4abcaed081adb5e
|
|
| BLAKE2b-256 |
dc8a68a8d5362372577ec2aef782820b026b9b2a46b19fa43c04d710ab8ce484
|