Three fewer things to remember
**The portal link puts itself back up.** It already retried a connection that raised, but a session that ended *cleanly* — a portal restarting, a proxy closing an idle socket — returned normally and went straight back round the loop with no wait at all, so an engine could spin against a portal that was merely saying goodbye politely. Every ending now reconnects on a delay, and the delay turns on whether the attempt got as far as attaching: one that stood up and dropped is a network event and retries at once, one that never stood up waits longer each time. Jittered, so a portal coming back is not met by every installation it serves in the same instant. Ping timeouts are named rather than defaulted, since they are what bounds how long a suspended laptop's dead socket looks alive, and the keepalive task is awaited so the reason a link went reaches the log instead of the garbage collector. **`fluksio enroll <code>`** is the whole command now; hub.fluksio.com is the default and `--portal` names another. The one command run before anything works should not need two flags. **`fluksio run` syncs first.** The reason a run exists is usually the edit before it, so remembering to sync was remembering to do something the computer could do — including the worker refresh, which is what makes an edit to your own package take effect at all. `--no-sync` opts out for a tight loop. That last one needed discovery fixed: it only ever looked at top-level `*.py`, so a repository whose code is in a package — the ordinary shape — found nothing from its own root. It now descends into the packages it holds. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012ue1tkFWB1bcGy3aWhCKpU
This commit is contained in:
@@ -89,3 +89,40 @@ def test_ignoring_itself_leaves_an_existing_gitignore_alone(elsewhere: Path):
|
||||
client.ignore_self(directory)
|
||||
|
||||
assert (directory / ".gitignore").read_text() == "mine\n"
|
||||
|
||||
|
||||
def test_a_repository_whose_code_is_in_a_package_is_discovered(
|
||||
elsewhere: Path, monkeypatch: pytest.MonkeyPatch
|
||||
):
|
||||
"""`fluksio sync` in a repo root has to find `myresearch/`, not just *.py.
|
||||
|
||||
This is the ordinary layout, and it is what `run` leans on to sync without
|
||||
being told where to look.
|
||||
"""
|
||||
from fluksio.sdk import FLOWS
|
||||
from fluksio.sdk.cli import discover
|
||||
|
||||
package = elsewhere / "mystudy"
|
||||
package.mkdir()
|
||||
(package / "__init__.py").write_text("")
|
||||
(package / "pipeline.py").write_text(
|
||||
"from fluksio import Flow, Port, node\n"
|
||||
"\n"
|
||||
"@node(provides=[Port('score', 'float')])\n"
|
||||
"def scoring():\n"
|
||||
" return {'score': 1.0}\n"
|
||||
"\n"
|
||||
"study = Flow('study', nodes=[scoring], outputs=['score'])\n"
|
||||
)
|
||||
# The things a repository root also holds, none of which is importable.
|
||||
(elsewhere / ".venv").mkdir()
|
||||
(elsewhere / ".fluksio").mkdir()
|
||||
(elsewhere / "data").mkdir()
|
||||
|
||||
FLOWS.clear()
|
||||
try:
|
||||
found = discover(["."])
|
||||
finally:
|
||||
FLOWS.clear()
|
||||
|
||||
assert [flow.name for flow in found] == ["study"]
|
||||
|
||||
Reference in New Issue
Block a user