t2v: projects carry generation_mode ("i2v" default). In t2v nothing checks or
reports a missing anchor, and a new scene starts empty rather than from an
image. Images stay wireable either way — the mode decides what is expected, not
what is allowed. Switchable any time in Project settings; the wizard writes it.
Scaling: one type scale (Apple's macOS text styles) replaces ~64 off-grid sizes
like 11.5px, body drops 14 → 13, and buttons/fields/menu items take their height
from shared control tokens instead of per-component padding. Fixes the timeline
zone head overlapping the panel above it: its status block wraps, and a fixed
34px height let it spill both ways.
Node cards carry their name and destination ON the tile instead of captioning it
from below, and no longer print the class twice. The add-node list flips above
the card when it would run off the bottom.
Fonts: Inter (open, Helvetica/SF-alike) with system-ui behind it, Inter Tight
for display, Roboto Mono for mono. Apple ships SF free but licenses it for work
on Apple platforms only, so it cannot be bundled.
Also: "Continue with <project>" on the wizard splash, and About reads
FunPack 4 "Blinding Blackout" 4.0.0.
57 lines
2.4 KiB
Python
57 lines
2.4 KiB
Python
"""Version and release codename, as shown in Settings ▸ About.
|
|
|
|
The codename is cosmetic, so the only things worth pinning are the ones that would make it
|
|
look broken: a major with no name must render as ABSENCE (the panel omits the line), never
|
|
as an empty pair of quotes, and the pyproject version must stay parseable — About reads it
|
|
through the same helper the update check does.
|
|
"""
|
|
import pytest
|
|
|
|
from movie_editor.backend import git_update
|
|
|
|
|
|
def test_installed_version_is_parseable():
|
|
version = git_update.funpack_version()
|
|
assert version, "About and the update check both read this"
|
|
parts = version.split(".")
|
|
assert len(parts) >= 2 and all(p.isdigit() for p in parts[:2]), version
|
|
|
|
|
|
def test_current_major_has_a_codename():
|
|
assert git_update.funpack_codename() == "Blinding Blackout"
|
|
|
|
|
|
def test_codename_is_keyed_by_major_not_by_release():
|
|
"""Every 4.x release ships under one name; only a new major earns a new letter."""
|
|
for version in ("4.0.0", "4.5.1", "4.99.12"):
|
|
assert git_update.funpack_codename(version) == "Blinding Blackout"
|
|
for version in ("3.0.0", "3.5.1", "3.99.12"):
|
|
assert git_update.funpack_codename(version) == "Auspicious Asparagus"
|
|
|
|
|
|
def test_unknown_major_has_no_codename():
|
|
"""Absence, not an empty string in quotes — the panel omits the line entirely."""
|
|
assert git_update.funpack_codename("9.0.0") == ""
|
|
assert git_update.funpack_codename("") != None # noqa: E711 - never None, always str
|
|
|
|
|
|
@pytest.mark.parametrize("version", ["4", "4.0", "4.0.0", " 4.0.0 "])
|
|
def test_codename_tolerates_short_and_padded_versions(version):
|
|
assert git_update.funpack_codename(version) == "Blinding Blackout"
|
|
|
|
|
|
def test_codenames_advance_alphabetically():
|
|
"""Adjective and vegetable share an initial; initials advance with the major."""
|
|
for major, name in sorted(git_update.CODENAMES.items()):
|
|
adjective, _, noun = name.partition(" ")
|
|
assert noun, f"{name!r} should be two words"
|
|
assert adjective[0].lower() == noun[0].lower(), f"{name!r} initials differ"
|
|
majors = sorted(git_update.CODENAMES, key=int)
|
|
initials = [git_update.CODENAMES[m][0].lower() for m in majors]
|
|
assert initials == sorted(initials), f"codename initials must ascend: {initials}"
|
|
|
|
|
|
def test_status_carries_the_codename():
|
|
"""The About panel reads it off the git status payload, not a separate call."""
|
|
assert "codename" in git_update.status()
|