inline-core 1.2.1__tar.gz → 1.2.2__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.
- {inline_core-1.2.1 → inline_core-1.2.2}/.gitignore +4 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/PKG-INFO +1 -1
- {inline_core-1.2.1 → inline_core-1.2.2}/pyproject.toml +1 -1
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/fetch.py +11 -4
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_extension_install.py +19 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/.python-version +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/CLAUDE.md +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/README.md +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/main.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/scripts/reference.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/__init__.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/components/__init__.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/components/conditioning.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/components/interfaces.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/config.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/device/__init__.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/device/auto.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/device/detect.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/device/memory.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/device/policy.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/device/types.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/errors.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/__init__.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/api.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/constraints.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/handlers.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/importer.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/install.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/loader.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/manifest.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/models.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/paths.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/resolve.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/scanner.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/state.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/extensions/tools.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/graph/__init__.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/graph/cache.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/graph/descriptor.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/graph/executor.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/graph/loader_runners.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/graph/primitives.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/graph/registry.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/graph/runners.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/graph/schema.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/graph/topo.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/graph/validate.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/importer/__init__.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/importer/comfy.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/media.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/models/__init__.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/models/catalog.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/models/loaders.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/models/requirements.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/models/sampling.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/models/zimage/__init__.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/models/zimage/primitives.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/models/zimage/provider.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/models/zimage/requirements.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/models/zimage/runner.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/parallel/__init__.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/parallel/config.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/parallel/group.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/parallel/launch.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/parallel/protocol.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/parallel/registry.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/parallel/worker.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/runtime/__init__.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/runtime/context.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/runtime/file_store.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/runtime/progress.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/runtime/run.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/runtime/store.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/sampling/__init__.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/sampling/batch.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/server/__init__.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/server/__main__.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/server/app.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/server/assets.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/server/bootstrap.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/server/frontend.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/server/manager.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/server/rpc.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/server/run_store.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/server/serialize.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/__init__.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/assets.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/config.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/fal.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/frames.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/generation.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/graph_build.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/handlers.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/models.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/moodboard.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/peaks.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/schema.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/store.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/timeline/__init__.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/timeline/compose.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/timeline/ffmpeg.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/timeline/render.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/studio/timeline/resolve.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/src/inline_core/takes.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/helpers.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_cache.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_catalog.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_comfy_import.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_config.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_device_detect.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_executor.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_extension_api.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_extension_manifest.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_extension_resolve.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_extension_scanner.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_extension_spine.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_extension_state.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_file_store.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_frontend_serving.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_hidden_nodes.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_loader_runners.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_loaders.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_memory_policy.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_model_requirements.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_parallel_group.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_primitives.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_rpc_bridge.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_run_store.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_sampling.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_schema.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_server.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_studio_assets.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_studio_fal.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_studio_frames.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_studio_generation.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_studio_models.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_studio_moodboard.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_studio_peaks.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_studio_rpc.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_studio_schema.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_studio_store.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_studio_timeline.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_take_bytes.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_topo.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_validate.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_xfuser_sampler.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_zimage_primitives.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_zimage_resolve.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/tests/test_zimage_runner.py +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/uv.lock +0 -0
- {inline_core-1.2.1 → inline_core-1.2.2}/webui.sh +0 -0
|
@@ -6,6 +6,10 @@
|
|
|
6
6
|
# Engine working data: the run DB and generated takes (also grows to gigabytes).
|
|
7
7
|
/.inline/
|
|
8
8
|
|
|
9
|
+
# Installed community extensions - `extensions_dir()` defaults to ./extensions (state.json, the
|
|
10
|
+
# per-extension source/venv, and the .cache/git mirrors). Runtime data, never committed.
|
|
11
|
+
/extensions/
|
|
12
|
+
|
|
9
13
|
# Studio app data + project workspace (when created under the repo) and local server logs.
|
|
10
14
|
/.inline-studio-server/
|
|
11
15
|
/InlineStudioProjects/
|
|
@@ -9,6 +9,7 @@ from __future__ import annotations
|
|
|
9
9
|
|
|
10
10
|
import io
|
|
11
11
|
import re
|
|
12
|
+
import shutil
|
|
12
13
|
import subprocess
|
|
13
14
|
import tarfile
|
|
14
15
|
from dataclasses import dataclass
|
|
@@ -66,11 +67,17 @@ def _validate(url: str, ref: str) -> None:
|
|
|
66
67
|
|
|
67
68
|
|
|
68
69
|
def _sync_mirror(url: str, mirror: Path) -> None:
|
|
70
|
+
# A valid bare mirror has HEAD at its top; a clone interrupted mid-write leaves objects/refs but
|
|
71
|
+
# no HEAD, and `git clone` would then refuse the non-empty directory ("already exists").
|
|
69
72
|
if (mirror / "HEAD").is_file():
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
73
|
+
try:
|
|
74
|
+
# Re-point at the URL in case a registry entry moved the repo.
|
|
75
|
+
_git("remote", "set-url", "origin", url, cwd=mirror)
|
|
76
|
+
_git("fetch", "--prune", "--tags", "origin", "+refs/heads/*:refs/heads/*", cwd=mirror)
|
|
77
|
+
return
|
|
78
|
+
except FetchError:
|
|
79
|
+
pass # A wedged mirror must not strand reinstall; drop it and re-clone below.
|
|
80
|
+
shutil.rmtree(mirror, ignore_errors=True)
|
|
74
81
|
mirror.parent.mkdir(parents=True, exist_ok=True)
|
|
75
82
|
_git("clone", "--bare", "--quiet", url, str(mirror))
|
|
76
83
|
|
|
@@ -369,6 +369,25 @@ def test_uninstall_removes_the_extension_from_disk_and_state(
|
|
|
369
369
|
assert not installer._registry.has("demo/invert")
|
|
370
370
|
|
|
371
371
|
|
|
372
|
+
def test_reinstall_recovers_from_a_corrupt_cached_mirror(
|
|
373
|
+
installer: Installer, tmp_path: Path
|
|
374
|
+
) -> None:
|
|
375
|
+
"""A clone interrupted mid-write leaves a mirror with objects/refs but no HEAD. Uninstall never
|
|
376
|
+
touches the cache, so a plain re-clone would hit "destination already exists". Reinstall must
|
|
377
|
+
heal it instead of failing at fetch."""
|
|
378
|
+
repo = _make_repo(tmp_path, MANIFEST)
|
|
379
|
+
_install(installer, repo)
|
|
380
|
+
installer.uninstall("demo-extension")
|
|
381
|
+
|
|
382
|
+
mirror = next((installer.paths.cache / "git").glob("*.git"))
|
|
383
|
+
(mirror / "HEAD").unlink() # wedge the mirror the way an aborted clone would
|
|
384
|
+
|
|
385
|
+
result = _install(installer, repo)
|
|
386
|
+
|
|
387
|
+
assert result.name == "Demo Extension"
|
|
388
|
+
assert (mirror / "HEAD").is_file()
|
|
389
|
+
|
|
390
|
+
|
|
372
391
|
def test_switching_to_an_uninstalled_version_is_refused(
|
|
373
392
|
installer: Installer, tmp_path: Path
|
|
374
393
|
) -> None:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|