Developer Notes⚓︎
Local Development⚓︎
git clone https://github.com/kyleking/calcipy.git
cd calcipy
uv sync --all-extras
# See the available tasks
uv run calcipy
# Or use a local 'run' file (so that 'calcipy' can be extended)
./run
# Run the default task list (lint, auto-format, test coverage, etc.)
./run main
# Make code changes and run specific tasks as needed:
./run lint.fix test
# Install globally
uv tool install ".[ddict,doc,experimental,lint,nox,tags,test,types]" --force --editable
Shell Completion⚓︎
Calcipy supports shell completion via Invoke’s built-in completion scripts.
Zsh:
calcipy --print-completion-script zsh > ~/.calcipy-completion.zsh
echo 'source ~/.calcipy-completion.zsh' >> ~/.zshrc
Bash:
calcipy --print-completion-script bash > ~/.calcipy-completion.bash
echo 'source ~/.calcipy-completion.bash' >> ~/.bashrc
Fish:
calcipy --print-completion-script fish > ~/.config/fish/completions/calcipy.fish
For projects using ./run as the entry point, replace calcipy with the appropriate script name.
Maintenance⚓︎
Dependency upgrades can be accomplished with:
uv lock --upgrade
uv sync --all-extras
Publishing⚓︎
Publishing is automated via GitHub Actions using PyPI Trusted Publishing. Tag creation triggers automated publishing.
./run release # Bumps version, creates tag, pushes → triggers publish
./run release --suffix=rc # For pre-releases
Initial Setup⚓︎
One-time setup to enable PyPI Trusted Publishing:
Configure GitHub Environments
Repository Settings → Environments:
- Create testpypi environment (no protection rules)
- Create pypi environment with “Required reviewers” enabled
Register Trusted Publishers
PyPI: https://pypi.org/manage/project/calcipy/settings/publishing/
- Owner: kyleking
- Repository: calcipy
- Workflow: publish.yml
- Environment: pypi
- Or environment testpypi (for TestPyPI)
Manual Publishing⚓︎
For emergency manual publish:
export UV_PUBLISH_TOKEN=pypi-...
uv build
uv publish
Current Status⚓︎
| File | Statements | Missing | Excluded | Coverage |
|---|---|---|---|---|
calcipy/__init__.py |
4 | 0 | 0 | 100.0% |
calcipy/_compat.py |
3 | 0 | 0 | 100.0% |
calcipy/_runtime_type_check_setup.py |
13 | 0 | 37 | 100.0% |
calcipy/can_skip.py |
4 | 0 | 0 | 100.0% |
calcipy/cli.py |
34 | 0 | 78 | 97.4% |
calcipy/code_tag_collector/__init__.py |
5 | 0 | 3 | 100.0% |
calcipy/code_tag_collector/_collector.py |
4 | 0 | 0 | 100.0% |
calcipy/collection.py |
45 | 0 | 65 | 98.0% |
calcipy/dot_dict/__init__.py |
3 | 0 | 2 | 100.0% |
calcipy/dot_dict/_dot_dict.py |
6 | 0 | 0 | 100.0% |
calcipy/experiments/__init__.py |
0 | 0 | 0 | 100.0% |
calcipy/experiments/bump_programmatically.py |
4 | 0 | 25 | 100.0% |
calcipy/experiments/check_duplicate_test_names.py |
33 | 0 | 2 | 98.2% |
calcipy/experiments/sync_package_dependencies.py |
4 | 0 | 0 | 100.0% |
calcipy/file_search.py |
4 | 0 | 0 | 100.0% |
calcipy/invoke_helpers.py |
36 | 0 | 2 | 100.0% |
calcipy/markup_table.py |
4 | 0 | 0 | 100.0% |
calcipy/markup_writer/__init__.py |
3 | 0 | 2 | 100.0% |
calcipy/markup_writer/_writer.py |
107 | 0 | 9 | 96.9% |
calcipy/noxfile/__init__.py |
3 | 0 | 2 | 100.0% |
calcipy/noxfile/_noxfile.py |
12 | 0 | 34 | 100.0% |
calcipy/scripts.py |
6 | 0 | 51 | 100.0% |
calcipy/tasks/__init__.py |
0 | 0 | 0 | 100.0% |
calcipy/tasks/all_tasks.py |
37 | 0 | 0 | 100.0% |
calcipy/tasks/cl.py |
21 | 0 | 0 | 100.0% |
calcipy/tasks/defaults.py |
17 | 0 | 0 | 94.7% |
calcipy/tasks/doc.py |
29 | 0 | 8 | 100.0% |
calcipy/tasks/executable_utils.py |
31 | 0 | 0 | 97.1% |
calcipy/tasks/lint.py |
48 | 0 | 0 | 93.5% |
calcipy/tasks/most_tasks.py |
29 | 0 | 0 | 100.0% |
calcipy/tasks/nox.py |
8 | 0 | 0 | 100.0% |
calcipy/tasks/pack.py |
24 | 0 | 0 | 96.7% |
calcipy/tasks/tags.py |
29 | 0 | 0 | 100.0% |
calcipy/tasks/test.py |
41 | 0 | 2 | 98.0% |
calcipy/tasks/types.py |
16 | 0 | 0 | 100.0% |
| Totals | 667 | 0 | 322 | 98.1% |
Generated on: 2026-03-24