framemill 0.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- framemill-0.1.1/.github/workflows/build.yml +38 -0
- framemill-0.1.1/.github/workflows/release.yml +77 -0
- framemill-0.1.1/.gitignore +54 -0
- framemill-0.1.1/CONTRIBUTING.md +37 -0
- framemill-0.1.1/LICENSE +674 -0
- framemill-0.1.1/PKG-INFO +816 -0
- framemill-0.1.1/README.md +116 -0
- framemill-0.1.1/docs/README.md +33 -0
- framemill-0.1.1/docs/architecture.md +65 -0
- framemill-0.1.1/docs/cli.md +69 -0
- framemill-0.1.1/docs/images/.gitkeep +0 -0
- framemill-0.1.1/docs/images/preview.png +0 -0
- framemill-0.1.1/docs/images/screenshot.png +0 -0
- framemill-0.1.1/docs/installation.md +151 -0
- framemill-0.1.1/docs/orientation.md +51 -0
- framemill-0.1.1/docs/recipes-and-metadata.md +54 -0
- framemill-0.1.1/docs/settings-reference.md +105 -0
- framemill-0.1.1/docs/troubleshooting.md +61 -0
- framemill-0.1.1/docs/workflow.md +67 -0
- framemill-0.1.1/framemill/__init__.py +3 -0
- framemill-0.1.1/framemill/app.py +1441 -0
- framemill-0.1.1/framemill/appconfig.py +45 -0
- framemill-0.1.1/framemill/assets/checker.png +0 -0
- framemill-0.1.1/framemill/assets/icon.svg +7 -0
- framemill-0.1.1/framemill/blender/__init__.py +4 -0
- framemill-0.1.1/framemill/blender/locate.py +53 -0
- framemill-0.1.1/framemill/blender/render_sprites.py +385 -0
- framemill-0.1.1/framemill/blender/runner.py +118 -0
- framemill-0.1.1/framemill/cli.py +143 -0
- framemill-0.1.1/framemill/compositor.py +130 -0
- framemill-0.1.1/framemill/export.py +352 -0
- framemill-0.1.1/framemill/guide.py +186 -0
- framemill-0.1.1/framemill/help_content.py +1320 -0
- framemill-0.1.1/framemill/preview_schedule.py +32 -0
- framemill-0.1.1/framemill/recipe.py +250 -0
- framemill-0.1.1/framemill/settings.py +428 -0
- framemill-0.1.1/main.py +9 -0
- framemill-0.1.1/packaging/build_appimage.sh +60 -0
- framemill-0.1.1/pyproject.toml +50 -0
- framemill-0.1.1/tests/test_compositor.py +93 -0
- framemill-0.1.1/tests/test_direction_layout.py +28 -0
- framemill-0.1.1/tests/test_export.py +135 -0
- framemill-0.1.1/tests/test_help_content.py +45 -0
- framemill-0.1.1/tests/test_integration_regressions.py +73 -0
- framemill-0.1.1/tests/test_packaging.py +46 -0
- framemill-0.1.1/tests/test_preview_schedule.py +36 -0
- framemill-0.1.1/tests/test_preview_settings.py +33 -0
- framemill-0.1.1/tests/test_recipe.py +130 -0
- framemill-0.1.1/tests/test_render_sampling.py +166 -0
- framemill-0.1.1/tests/test_sampling.py +92 -0
- framemill-0.1.1/tests/test_validation.py +102 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
name: test
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v4
|
|
14
|
+
- uses: actions/setup-python@v5
|
|
15
|
+
with:
|
|
16
|
+
python-version: "3.12"
|
|
17
|
+
- run: pip install -e ".[dev]"
|
|
18
|
+
- run: ruff check .
|
|
19
|
+
- run: pytest -q
|
|
20
|
+
|
|
21
|
+
# Build the from-source distribution artifacts (wheel + sdist) on every push so
|
|
22
|
+
# regressions in packaging metadata surface early. These are the primary release
|
|
23
|
+
# artifacts; platform binaries are built best-effort in release.yml on a tag.
|
|
24
|
+
dist:
|
|
25
|
+
needs: test
|
|
26
|
+
runs-on: ubuntu-latest
|
|
27
|
+
steps:
|
|
28
|
+
- uses: actions/checkout@v4
|
|
29
|
+
- uses: actions/setup-python@v5
|
|
30
|
+
with:
|
|
31
|
+
python-version: "3.12"
|
|
32
|
+
- run: pip install build
|
|
33
|
+
- run: python -m build
|
|
34
|
+
- run: python -m pip install dist/*.whl && framemill --help
|
|
35
|
+
- uses: actions/upload-artifact@v4
|
|
36
|
+
with:
|
|
37
|
+
name: framemill-dist
|
|
38
|
+
path: dist/*
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
name: release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags: ["v*"]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: write
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
# Build the wheel + sdist once and hand them to the later jobs.
|
|
13
|
+
build:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
- uses: actions/setup-python@v5
|
|
18
|
+
with:
|
|
19
|
+
python-version: "3.12"
|
|
20
|
+
- run: pip install build
|
|
21
|
+
- run: python -m build
|
|
22
|
+
- run: python -m pip install dist/*.whl && framemill --help
|
|
23
|
+
- uses: actions/upload-artifact@v4
|
|
24
|
+
with:
|
|
25
|
+
name: dist
|
|
26
|
+
path: dist/*
|
|
27
|
+
|
|
28
|
+
# Attach the wheel + sdist to the GitHub release with generated notes.
|
|
29
|
+
github-release:
|
|
30
|
+
needs: build
|
|
31
|
+
runs-on: ubuntu-latest
|
|
32
|
+
steps:
|
|
33
|
+
- uses: actions/download-artifact@v4
|
|
34
|
+
with:
|
|
35
|
+
name: dist
|
|
36
|
+
path: dist
|
|
37
|
+
- uses: softprops/action-gh-release@v2
|
|
38
|
+
with:
|
|
39
|
+
files: dist/*
|
|
40
|
+
generate_release_notes: true
|
|
41
|
+
fail_on_unmatched_files: true
|
|
42
|
+
|
|
43
|
+
# Publish to PyPI via Trusted Publishing (OIDC). No stored token.
|
|
44
|
+
# Requires a PyPI "pending publisher" pointing at this repo, this workflow
|
|
45
|
+
# file (release.yml), and the "pypi" environment before the first tag.
|
|
46
|
+
pypi:
|
|
47
|
+
needs: build
|
|
48
|
+
runs-on: ubuntu-latest
|
|
49
|
+
environment: pypi
|
|
50
|
+
permissions:
|
|
51
|
+
id-token: write
|
|
52
|
+
steps:
|
|
53
|
+
- uses: actions/download-artifact@v4
|
|
54
|
+
with:
|
|
55
|
+
name: dist
|
|
56
|
+
path: dist
|
|
57
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
58
|
+
|
|
59
|
+
# Self-contained Linux AppImage: bundles a manylinux Python plus framemill.
|
|
60
|
+
# Best-effort: a failure here does not block the wheel/sdist/PyPI release.
|
|
61
|
+
appimage:
|
|
62
|
+
needs: github-release
|
|
63
|
+
runs-on: ubuntu-latest
|
|
64
|
+
continue-on-error: true
|
|
65
|
+
steps:
|
|
66
|
+
- uses: actions/checkout@v4
|
|
67
|
+
- uses: actions/setup-python@v5
|
|
68
|
+
with:
|
|
69
|
+
python-version: "3.12"
|
|
70
|
+
- name: Build AppImage
|
|
71
|
+
id: build
|
|
72
|
+
run: bash packaging/build_appimage.sh
|
|
73
|
+
- name: Attach AppImage to the release
|
|
74
|
+
if: steps.build.outcome == 'success'
|
|
75
|
+
uses: softprops/action-gh-release@v2
|
|
76
|
+
with:
|
|
77
|
+
files: dist/*.AppImage
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.egg-info/
|
|
5
|
+
.eggs/
|
|
6
|
+
build/
|
|
7
|
+
dist/
|
|
8
|
+
.venv/
|
|
9
|
+
venv/
|
|
10
|
+
env/
|
|
11
|
+
|
|
12
|
+
# Flet / Flutter build output
|
|
13
|
+
build/
|
|
14
|
+
*.app/
|
|
15
|
+
*.AppImage
|
|
16
|
+
*.dmg
|
|
17
|
+
*.msi
|
|
18
|
+
|
|
19
|
+
# Test / coverage
|
|
20
|
+
.pytest_cache/
|
|
21
|
+
.coverage
|
|
22
|
+
htmlcov/
|
|
23
|
+
|
|
24
|
+
# OS / editor
|
|
25
|
+
.DS_Store
|
|
26
|
+
Thumbs.db
|
|
27
|
+
.idea/
|
|
28
|
+
.vscode/
|
|
29
|
+
|
|
30
|
+
# Local runtime data (never commit user paths / config)
|
|
31
|
+
*.log
|
|
32
|
+
/tmp_render/
|
|
33
|
+
scratch/
|
|
34
|
+
sample_models/
|
|
35
|
+
|
|
36
|
+
# Source models (inputs only, never repo content) and rendered/demo output.
|
|
37
|
+
# Guards against committing game assets or generated sprite sheets.
|
|
38
|
+
*.fbx
|
|
39
|
+
*.glb
|
|
40
|
+
*.gltf
|
|
41
|
+
*.obj
|
|
42
|
+
*.tga
|
|
43
|
+
*.bmp
|
|
44
|
+
/*.png
|
|
45
|
+
/renders/
|
|
46
|
+
/out/
|
|
47
|
+
|
|
48
|
+
# Private local orchestration and environment data
|
|
49
|
+
.archon/
|
|
50
|
+
.env
|
|
51
|
+
.env.*
|
|
52
|
+
!.env.example
|
|
53
|
+
.ruff_cache/
|
|
54
|
+
*.recipe.json
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Thanks for your interest in framemill!
|
|
4
|
+
|
|
5
|
+
## Dev setup (project-local virtualenv)
|
|
6
|
+
|
|
7
|
+
framemill's Python dependencies live in a **per-project virtualenv**. They are
|
|
8
|
+
not installed system-wide. Nothing here needs to be registered with your OS
|
|
9
|
+
package manager; `pyproject.toml` is the source of truth for dependencies.
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
python3 -m venv .venv
|
|
13
|
+
. .venv/bin/activate # Windows: .venv\Scripts\activate
|
|
14
|
+
pip install -e ".[dev]" # framemill + Flet, Pillow, NumPy, pytest, ruff
|
|
15
|
+
|
|
16
|
+
framemill # launch the GUI
|
|
17
|
+
pytest -q # unit tests (no Blender needed)
|
|
18
|
+
ruff check .
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Blender is **not** a pip dependency. Install it separately from
|
|
22
|
+
[blender.org](https://www.blender.org/download/). framemill auto-detects it.
|
|
23
|
+
|
|
24
|
+
## Testing changes that touch rendering
|
|
25
|
+
|
|
26
|
+
Compositing, export, direction layout, preview settings, sampling, recipes,
|
|
27
|
+
validation and framing helpers have Blender-free tests. Sampling tests use
|
|
28
|
+
doubles; they do not validate Blender's actual mesh deformation, materials or
|
|
29
|
+
camera output. Changes to `framemill/blender/render_sprites.py` need a manual
|
|
30
|
+
check against a real model. Please note in your PR which Blender version and
|
|
31
|
+
model you tested with.
|
|
32
|
+
|
|
33
|
+
## Scope
|
|
34
|
+
|
|
35
|
+
framemill aims to stay a focused "model -> directional sprite sheet" tool.
|
|
36
|
+
Engine-specific export quirks are welcome as optional formats; please keep
|
|
37
|
+
defaults neutral so the tool works for any model out of the box.
|