Rename the import package app to fluksio

A wheel whose top-level module is `app` collides with anything else in a
user's venv, so the package that is about to be published takes the name
it is published under. Only the Python package moves; the repo, the
Docker WORKDIR and the compose project keep theirs.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-21 21:48:05 +02:00
co-authored by Claude Opus 5
parent df05e3a62a
commit 640654bd66
170 changed files with 629 additions and 619 deletions
+2 -2
View File
@@ -6,7 +6,7 @@ from pathlib import Path
import pytest
from app.flow.alerts import (
from fluksio.flow.alerts import (
ALERTING_EVENTS,
FLAP_THRESHOLD,
RATE_LIMIT,
@@ -17,7 +17,7 @@ from app.flow.alerts import (
Rule,
describe,
)
from app.flow.events import EventBus
from fluksio.flow.events import EventBus
class Clock:
+6 -6
View File
@@ -9,12 +9,12 @@ from pathlib import Path
import pytest
from app.flow.controller import FlowController
from app.flow.messages import DType, MessageSpec
from app.flow.nodes import MqttNode
from app.flow.pipeline import ValidationIssue
from app.flow.schemas import FlowDef, NodeDef
from app.flow.store import FlowStore
from fluksio.flow.controller import FlowController
from fluksio.flow.messages import DType, MessageSpec
from fluksio.flow.nodes import MqttNode
from fluksio.flow.pipeline import ValidationIssue
from fluksio.flow.schemas import FlowDef, NodeDef
from fluksio.flow.store import FlowStore
BROKER = {"broker_host": "mosquitto", "broker_port": 1883, "topic": "sensors/temp"}
+9 -9
View File
@@ -3,12 +3,12 @@
import asyncio
from typing import Any
from app.flow.connector import CONTRACT_VERSION, ConnectorNode
from app.flow.controller import NODE_TYPES
from app.flow.messages import DType, MessageSpec
from app.flow.nodes import Node
from app.flow.pipeline import Pipeline
from app.flow.plugins import load_plugins
from fluksio.flow.connector import CONTRACT_VERSION, ConnectorNode
from fluksio.flow.controller import NODE_TYPES
from fluksio.flow.messages import DType, MessageSpec
from fluksio.flow.nodes import Node
from fluksio.flow.pipeline import Pipeline
from fluksio.flow.plugins import load_plugins
class Sensor(ConnectorNode):
@@ -146,7 +146,7 @@ def test_a_connector_is_discovered_from_its_entry_point(monkeypatch):
def load(self):
return Sensor
monkeypatch.setattr("app.flow.plugins.entry_points", lambda group: [FakeEntry()])
monkeypatch.setattr("fluksio.flow.plugins.entry_points", lambda group: [FakeEntry()])
try:
assert load_plugins() == ["test_sensor"]
assert NODE_TYPES["test_sensor"].plugin == "fluksio-connector-test 0.1.0"
@@ -166,7 +166,7 @@ def test_a_connector_written_for_another_contract_is_refused(monkeypatch):
def load(self):
return Outdated
monkeypatch.setattr("app.flow.plugins.entry_points", lambda group: [FakeEntry()])
monkeypatch.setattr("fluksio.flow.plugins.entry_points", lambda group: [FakeEntry()])
assert load_plugins() == []
assert "outdated" not in NODE_TYPES
@@ -179,6 +179,6 @@ def test_a_connector_may_not_take_over_a_built_in_type(monkeypatch):
def load(self): # pragma: no cover - never reached
raise AssertionError("should not be loaded")
monkeypatch.setattr("app.flow.plugins.entry_points", lambda group: [FakeEntry()])
monkeypatch.setattr("fluksio.flow.plugins.entry_points", lambda group: [FakeEntry()])
assert load_plugins() == []
assert NODE_TYPES["mqtt"].plugin is None
+6 -6
View File
@@ -2,7 +2,7 @@
import pytest
from app.flow.dashboards import (
from fluksio.flow.dashboards import (
DashboardDef,
DashboardNotFound,
DashboardStore,
@@ -11,11 +11,11 @@ from app.flow.dashboards import (
WidgetDef,
default_dashboard,
)
from app.flow.messages import DType, MessageSpec
from app.flow.nodes import Node
from app.flow.pipeline import Pipeline
from app.flow.state import MemoryState
from app.flow.store import FlowStore, StaleVersion
from fluksio.flow.messages import DType, MessageSpec
from fluksio.flow.nodes import Node
from fluksio.flow.pipeline import Pipeline
from fluksio.flow.state import MemoryState
from fluksio.flow.store import FlowStore, StaleVersion
@pytest.fixture
+5 -5
View File
@@ -2,11 +2,11 @@
import time
from app.flow.executor import ExecutionService
from app.flow.messages import DType, MessageSpec
from app.flow.nodes import Node
from app.flow.pipeline import Pipeline
from app.flow.queue import MemoryWorkQueue
from fluksio.flow.executor import ExecutionService
from fluksio.flow.messages import DType, MessageSpec
from fluksio.flow.nodes import Node
from fluksio.flow.pipeline import Pipeline
from fluksio.flow.queue import MemoryWorkQueue
# Short enough to wait out in a test, long enough not to race the engine.
WINDOW = 0.05
+3 -3
View File
@@ -4,9 +4,9 @@ from pathlib import Path
import pytest
from app.flow.messages import MessageSpec
from app.flow.schemas import FlowDef, NodeDef
from app.flow.store import FlowStore, StaleVersion
from fluksio.flow.messages import MessageSpec
from fluksio.flow.schemas import FlowDef, NodeDef
from fluksio.flow.store import FlowStore, StaleVersion
SOURCE = "def process():\n return {}\n"
EDITED = "def process():\n return {'temp': 1}\n"
+7 -7
View File
@@ -9,13 +9,13 @@ from pathlib import Path
import pytest
from app.api.routes.flows import snapshot_payload
from app.flow.controller import FlowController
from app.flow.events import EventBus, event_bus
from app.flow.messages import DType, MessageSpec
from app.flow.nodes import Node
from app.flow.pipeline import Pipeline
from app.flow.store import FlowStore
from fluksio.api.routes.flows import snapshot_payload
from fluksio.flow.controller import FlowController
from fluksio.flow.events import EventBus, event_bus
from fluksio.flow.messages import DType, MessageSpec
from fluksio.flow.nodes import Node
from fluksio.flow.pipeline import Pipeline
from fluksio.flow.store import FlowStore
def make_node(node_id: str, f, provides=()) -> Node:
+4 -4
View File
@@ -1,9 +1,9 @@
"""Message history: the series a node panel draws as a sparkline."""
from app.flow.messages import MessageSpec
from app.flow.nodes import Node
from app.flow.pipeline import Pipeline
from app.flow.state import HISTORY_LIMIT, MemoryState
from fluksio.flow.messages import MessageSpec
from fluksio.flow.nodes import Node
from fluksio.flow.pipeline import Pipeline
from fluksio.flow.state import HISTORY_LIMIT, MemoryState
def emitter(values) -> Node:
+7 -7
View File
@@ -11,13 +11,13 @@ import pytest
from fastapi import FastAPI
from fastapi.testclient import TestClient
from app.flow.controller import HOOK_PREFIX, FlowController
from app.flow.messages import DType, MessageSpec
from app.flow.nodes import HttpNode
from app.flow.pipeline import Pipeline
from app.flow.schemas import FlowDef, NodeDef
from app.flow.secrets import init_secrets, resolve_params
from app.flow.store import FlowStore
from fluksio.flow.controller import HOOK_PREFIX, FlowController
from fluksio.flow.messages import DType, MessageSpec
from fluksio.flow.nodes import HttpNode
from fluksio.flow.pipeline import Pipeline
from fluksio.flow.schemas import FlowDef, NodeDef
from fluksio.flow.secrets import init_secrets, resolve_params
from fluksio.flow.store import FlowStore
SECRET = "d3vice-key"
HOOK = f"{HOOK_PREFIX}/house/sensor"
+3 -3
View File
@@ -4,9 +4,9 @@ from pathlib import Path
import pytest
from app.flow.messages import MessageSpec
from app.flow.schemas import FlowDef, NodeDef
from app.flow.store import FlowStore, LibExists, LibNotFound
from fluksio.flow.messages import MessageSpec
from fluksio.flow.schemas import FlowDef, NodeDef
from fluksio.flow.store import FlowStore, LibExists, LibNotFound
SOURCE = "def process():\n return {'temp': 1}\n"
+5 -5
View File
@@ -3,11 +3,11 @@
import sys
from typing import Any
from app.flow import logs
from app.flow.controller import with_settings
from app.flow.messages import DType, MessageSpec
from app.flow.nodes import Node
from app.flow.pipeline import Pipeline
from fluksio.flow import logs
from fluksio.flow.controller import with_settings
from fluksio.flow.messages import DType, MessageSpec
from fluksio.flow.nodes import Node
from fluksio.flow.pipeline import Pipeline
def run_with_capture(nodes: list[Node], bus: "RecordingBus") -> None:
+1 -1
View File
@@ -2,7 +2,7 @@ import json
import pytest
from app.flow.messages import DType, MessageSpec, flow_of, qualify
from fluksio.flow.messages import DType, MessageSpec, flow_of, qualify
def test_port_defaults_to_last_name_segment():
+2 -2
View File
@@ -6,8 +6,8 @@ from pathlib import Path
import pytest
from app.flow import modules
from app.flow.store import FlowStore
from fluksio.flow import modules
from fluksio.flow.store import FlowStore
pytestmark = pytest.mark.skipif(
shutil.which("uv") is None, reason="module management needs uv"
+6 -6
View File
@@ -9,12 +9,12 @@ from pathlib import Path
import pytest
from app.flow.controller import FlowController
from app.flow.messages import DType, MessageSpec
from app.flow.pipeline import Pipeline
from app.flow.schemas import FlowDef, NodeDef
from app.flow.state import MemoryState
from app.flow.store import FlowStore
from fluksio.flow.controller import FlowController
from fluksio.flow.messages import DType, MessageSpec
from fluksio.flow.pipeline import Pipeline
from fluksio.flow.schemas import FlowDef, NodeDef
from fluksio.flow.state import MemoryState
from fluksio.flow.store import FlowStore
SOURCE = "def process(reading, factor):\n return {'scaled': reading * factor}\n"
+5 -5
View File
@@ -6,8 +6,8 @@ only fails when someone places that node. Building one of each catches it.
import pytest
from app.flow.controller import NODE_TYPES, node_type_info
from app.flow.messages import DType, MessageSpec
from fluksio.flow.controller import NODE_TYPES, node_type_info
from fluksio.flow.messages import DType, MessageSpec
# Enough configuration for each type to construct; the ports decide the
# direction, so every type gets both an input and an output where it allows it.
@@ -160,7 +160,7 @@ def test_every_offered_type_has_a_fixture():
def test_a_flux_request_is_run_rather_than_written(monkeypatch):
"""A query passing through is not a point to store."""
from app.flow.nodes import InfluxDbNode
from fluksio.flow.nodes import InfluxDbNode
node = InfluxDbNode(
requires=[
@@ -199,8 +199,8 @@ def test_a_flux_request_is_run_rather_than_written(monkeypatch):
def test_a_falsy_return_is_a_mistake_not_silence():
"""Only None means "nothing to publish"."""
from app.flow.nodes import Node
from app.flow.nodes.base import NodeOutputError
from fluksio.flow.nodes import Node
from fluksio.flow.nodes.base import NodeOutputError
def make(retval):
return Node(
+4 -4
View File
@@ -1,9 +1,9 @@
"""The wiring fundamentals: name binding, fan-in, namespaces, validation."""
from app.flow.events import EventBus
from app.flow.messages import DType, MessageSpec
from app.flow.nodes import Node
from app.flow.pipeline import Pipeline
from fluksio.flow.events import EventBus
from fluksio.flow.messages import DType, MessageSpec
from fluksio.flow.nodes import Node
from fluksio.flow.pipeline import Pipeline
def spec(name: str, dtype: DType = DType.FLOAT, port: str = "") -> MessageSpec:
+7 -7
View File
@@ -5,19 +5,19 @@ actually published, it pulses all of them — and when the cause is a dashboard
control or another flow, it pulses a node that did nothing at all.
"""
from app.flow.dashboards import (
from fluksio.flow.dashboards import (
DashboardDef,
DashboardStore,
PageDef,
SectionDef,
WidgetDef,
)
from app.flow.events import EventBus
from app.flow.messages import DType, MessageSpec
from app.flow.nodes import Node
from app.flow.pipeline import Pipeline, ValueSource
from app.flow.state import MemoryState
from app.flow.store import FlowStore
from fluksio.flow.events import EventBus
from fluksio.flow.messages import DType, MessageSpec
from fluksio.flow.nodes import Node
from fluksio.flow.pipeline import Pipeline, ValueSource
from fluksio.flow.state import MemoryState
from fluksio.flow.store import FlowStore
def collect(bus: EventBus) -> list[dict]:
+6 -6
View File
@@ -2,12 +2,12 @@
import time
from app.flow.executor import ExecutionService
from app.flow.messages import DType, MessageSpec
from app.flow.nodes import Node
from app.flow.pipeline import Pipeline
from app.flow.queue import MemoryWorkQueue, WorkItem
from app.flow.state import MemoryState
from fluksio.flow.executor import ExecutionService
from fluksio.flow.messages import DType, MessageSpec
from fluksio.flow.nodes import Node
from fluksio.flow.pipeline import Pipeline
from fluksio.flow.queue import MemoryWorkQueue, WorkItem
from fluksio.flow.state import MemoryState
def test_items_come_back_in_the_order_they_went_in():
+2 -2
View File
@@ -13,8 +13,8 @@ from collections.abc import Iterator
import pytest
from app.flow.remote import NoWorker, RemoteWorker, RemoteWorkerHub
from app.flow.workers import NodeTimeout, RemoteError
from fluksio.flow.remote import NoWorker, RemoteWorker, RemoteWorkerHub
from fluksio.flow.workers import NodeTimeout, RemoteError
@pytest.fixture
+6 -6
View File
@@ -8,10 +8,10 @@ parameters a caller sends are refused before anything runs if they are wrong.
import pytest
from app.flow.messages import DType, MessageSpec
from app.flow.nodes import Node
from app.flow.pipeline import NodeOutcome, Pipeline
from app.flow.runs import (
from fluksio.flow.messages import DType, MessageSpec
from fluksio.flow.nodes import Node
from fluksio.flow.pipeline import NodeOutcome, Pipeline
from fluksio.flow.runs import (
MetricSink,
RunRejected,
batch_issues,
@@ -20,8 +20,8 @@ from app.flow.runs import (
required_labels,
seed_values,
)
from app.flow.schemas import FlowDef, FlowInput, NodeDef
from app.flow.state import MemoryState
from fluksio.flow.schemas import FlowDef, FlowInput, NodeDef
from fluksio.flow.state import MemoryState
def spec(name: str, dtype: DType = DType.FLOAT, **kwargs) -> MessageSpec:
+7 -7
View File
@@ -6,13 +6,13 @@ from typing import Any
from fastapi import FastAPI
from fastapi.testclient import TestClient
from app.api.deps import get_current_user
from app.api.routes.flows import router
from app.flow.messages import DType, MessageSpec
from app.flow.nodes import Node
from app.flow.pipeline import Pipeline
from app.flow.schemas import FlowDef
from app.flow.store import FlowStore
from fluksio.api.deps import get_current_user
from fluksio.api.routes.flows import router
from fluksio.flow.messages import DType, MessageSpec
from fluksio.flow.nodes import Node
from fluksio.flow.pipeline import Pipeline
from fluksio.flow.schemas import FlowDef
from fluksio.flow.store import FlowStore
def spec(name: str) -> MessageSpec:
+3 -3
View File
@@ -2,9 +2,9 @@
import asyncio
from app.flow.messages import DType, MessageSpec
from app.flow.nodes import MqttNode
from app.flow.nodes.http import close_shared_client, shared_client
from fluksio.flow.messages import DType, MessageSpec
from fluksio.flow.nodes import MqttNode
from fluksio.flow.nodes.http import close_shared_client, shared_client
def test_http_senders_share_one_pooled_client():
+4 -4
View File
@@ -5,10 +5,10 @@ running value in a message it both reads and writes. That is the sanctioned
shape, and these tests pin what it means.
"""
from app.flow.messages import DType, MessageSpec
from app.flow.nodes import Node
from app.flow.pipeline import Pipeline
from app.flow.state import MemoryState
from fluksio.flow.messages import DType, MessageSpec
from fluksio.flow.nodes import Node
from fluksio.flow.pipeline import Pipeline
from fluksio.flow.state import MemoryState
def counter() -> Node:
+3 -3
View File
@@ -3,9 +3,9 @@ from pathlib import Path
import pytest
from app.flow.messages import MessageSpec
from app.flow.schemas import FlowDef, NodeDef
from app.flow.store import FlowExists, FlowNotFound, FlowStore
from fluksio.flow.messages import MessageSpec
from fluksio.flow.schemas import FlowDef, NodeDef
from fluksio.flow.store import FlowExists, FlowNotFound, FlowStore
@pytest.fixture
+3 -3
View File
@@ -4,9 +4,9 @@ import asyncio
import pytest
from app.flow import supervision
from app.flow.events import EventBus
from app.flow.supervision import FAILURE_BUDGET, Supervisor
from fluksio.flow import supervision
from fluksio.flow.events import EventBus
from fluksio.flow.supervision import FAILURE_BUDGET, Supervisor
@pytest.fixture(autouse=True)
+4 -4
View File
@@ -6,10 +6,10 @@ atomic operations, so those are covered here too.
from concurrent.futures import ThreadPoolExecutor
from app.flow.messages import DType, MessageSpec
from app.flow.nodes import Node
from app.flow.pipeline import Pipeline
from app.flow.state import MemoryState
from fluksio.flow.messages import DType, MessageSpec
from fluksio.flow.nodes import Node
from fluksio.flow.pipeline import Pipeline
from fluksio.flow.state import MemoryState
def spec(name: str) -> MessageSpec:
+12 -5
View File
@@ -4,10 +4,17 @@ These are the shapes a Node-RED installation is mostly made of, so their
behaviour is worth pinning rather than just their construction.
"""
from app.flow.messages import DType, MessageSpec
from app.flow.nodes import ChangeNode, ExecNode, FileNode, JoinNode, RbeNode, SwitchNode
from app.flow.pipeline import Pipeline
from app.flow.state import MemoryState
from fluksio.flow.messages import DType, MessageSpec
from fluksio.flow.nodes import (
ChangeNode,
ExecNode,
FileNode,
JoinNode,
RbeNode,
SwitchNode,
)
from fluksio.flow.pipeline import Pipeline
from fluksio.flow.state import MemoryState
def spec(name: str, dtype: DType = DType.FLOAT) -> MessageSpec:
@@ -233,7 +240,7 @@ def test_a_file_node_refuses_to_leave_its_directory():
def test_a_file_round_trips_through_the_sandbox(tmp_path, monkeypatch):
from app.core.config import settings
from fluksio.core.config import settings
monkeypatch.setattr(settings, "FLOWS_DIR", tmp_path / "flows")
+3 -3
View File
@@ -2,9 +2,9 @@
from fastapi.testclient import TestClient
from app.flow.events import EventBus
from app.flow.watchdog import DEGRADED_STRIKES, LoopWatchdog
from app.main import app
from fluksio.flow.events import EventBus
from fluksio.flow.watchdog import DEGRADED_STRIKES, LoopWatchdog
from fluksio.main import app
def test_a_responsive_loop_stays_healthy():
+4 -4
View File
@@ -7,10 +7,10 @@ from collections.abc import Iterator
import pytest
from app.flow.artifacts import ArtifactStore
from app.flow.messages import DType, MessageSpec
from app.flow.worker_main import ARTIFACT_DIR_ENV
from app.flow.workers import NodeCancelled, NodeTimeout, PythonWorkerPool
from fluksio.flow.artifacts import ArtifactStore
from fluksio.flow.messages import DType, MessageSpec
from fluksio.flow.worker_main import ARTIFACT_DIR_ENV
from fluksio.flow.workers import NodeCancelled, NodeTimeout, PythonWorkerPool
@pytest.fixture