fix: rename root package to beanflows-pipeline to avoid workspace conflict
Some checks failed
CI / test-cli (push) Failing after 11s
CI / test-sqlmesh (push) Failing after 9s
CI / test-web (push) Successful in 15s
CI / tag (push) Has been skipped

The web package is already named 'beanflows'. Renaming the root CLI/infra
package to 'beanflows-pipeline' (src/beanflows_pipeline/) resolves the
uv workspace name conflict and Python namespace collision.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Deeman
2026-02-28 23:32:07 +01:00
parent d14990bb01
commit 79ce3f2913
12 changed files with 19 additions and 19 deletions

View File

@@ -115,6 +115,6 @@ echo "=== Bootstrap complete! ==="
echo "" echo ""
echo "Check status: systemctl status beanflows-supervisor" echo "Check status: systemctl status beanflows-supervisor"
echo "View logs: journalctl -u beanflows-supervisor -f" echo "View logs: journalctl -u beanflows-supervisor -f"
echo "Workflow status: sudo -u ${SERVICE_USER} ${UV} run -p ${REPO_DIR} python src/beanflows/supervisor.py status" echo "Workflow status: sudo -u ${SERVICE_USER} ${UV} run -p ${REPO_DIR} python src/beanflows_pipeline/supervisor.py status"
echo "Backup timer: systemctl list-timers beanflows-backup.timer" echo "Backup timer: systemctl list-timers beanflows-backup.timer"
echo "Tag: $(sudo -u "${SERVICE_USER}" git -C "${REPO_DIR}" describe --tags --always)" echo "Tag: $(sudo -u "${SERVICE_USER}" git -C "${REPO_DIR}" describe --tags --always)"

View File

@@ -7,7 +7,7 @@ Wants=network-online.target
Type=simple Type=simple
User=beanflows_service User=beanflows_service
WorkingDirectory=/opt/beanflows WorkingDirectory=/opt/beanflows
ExecStart=/bin/sh -c 'exec uv run python src/beanflows/supervisor.py' ExecStart=/bin/sh -c 'exec uv run python src/beanflows_pipeline/supervisor.py'
Restart=always Restart=always
RestartSec=10 RestartSec=10
EnvironmentFile=/opt/beanflows/.env EnvironmentFile=/opt/beanflows/.env

View File

@@ -1,5 +1,5 @@
[project] [project]
name = "beanflows" name = "beanflows-pipeline"
version = "0.1.0" version = "0.1.0"
description = "Add your description here" description = "Add your description here"
readme = "readme.md" readme = "readme.md"
@@ -20,7 +20,7 @@ dependencies = [
] ]
[project.scripts] [project.scripts]
beanflows = "beanflows.cli:app" beanflows = "beanflows_pipeline.cli:app"
[dependency-groups] [dependency-groups]

View File

@@ -26,7 +26,7 @@ def worker_list(
provider: Annotated[str, typer.Option("--provider", "-p")] = "hetzner", provider: Annotated[str, typer.Option("--provider", "-p")] = "hetzner",
): ):
"""List all active worker instances.""" """List all active worker instances."""
from beanflows.workers import list_workers from beanflows_pipeline.workers import list_workers
workers = list_workers(provider) workers = list_workers(provider)
if not workers: if not workers:
@@ -47,7 +47,7 @@ def worker_create(
location: Annotated[str | None, typer.Option("--location", "-l")] = None, location: Annotated[str | None, typer.Option("--location", "-l")] = None,
): ):
"""Create a new worker instance.""" """Create a new worker instance."""
from beanflows.workers import create_worker from beanflows_pipeline.workers import create_worker
typer.echo(f"Creating worker '{name}' ({server_type}) on {provider}...") typer.echo(f"Creating worker '{name}' ({server_type}) on {provider}...")
worker = create_worker(name, server_type, provider, location) worker = create_worker(name, server_type, provider, location)
@@ -61,7 +61,7 @@ def worker_destroy(
force: Annotated[bool, typer.Option("--force", "-f")] = False, force: Annotated[bool, typer.Option("--force", "-f")] = False,
): ):
"""Destroy a worker instance.""" """Destroy a worker instance."""
from beanflows.workers import destroy_worker from beanflows_pipeline.workers import destroy_worker
if not force: if not force:
confirm = typer.confirm(f"Destroy worker '{name}'?") confirm = typer.confirm(f"Destroy worker '{name}'?")
@@ -82,7 +82,7 @@ def pipeline_run(
name: Annotated[str, typer.Argument(help="Pipeline name (extract, transform)")], name: Annotated[str, typer.Argument(help="Pipeline name (extract, transform)")],
): ):
"""Run a pipeline locally.""" """Run a pipeline locally."""
from beanflows.pipelines import run_pipeline from beanflows_pipeline.pipelines import run_pipeline
typer.echo(f"Running pipeline '{name}'...") typer.echo(f"Running pipeline '{name}'...")
result = run_pipeline(name) result = run_pipeline(name)
@@ -98,7 +98,7 @@ def pipeline_run(
@pipeline_app.command("list") @pipeline_app.command("list")
def pipeline_list(): def pipeline_list():
"""List available pipelines.""" """List available pipelines."""
from beanflows.pipelines import PIPELINES from beanflows_pipeline.pipelines import PIPELINES
typer.echo("Available pipelines:") typer.echo("Available pipelines:")
for name, config in PIPELINES.items(): for name, config in PIPELINES.items():
@@ -113,7 +113,7 @@ app.add_typer(secrets_app, name="secrets")
@secrets_app.command("list") @secrets_app.command("list")
def secrets_list(): def secrets_list():
"""List available secrets (keys only).""" """List available secrets (keys only)."""
from beanflows.secrets import list_secrets from beanflows_pipeline.secrets import list_secrets
secrets = list_secrets() secrets = list_secrets()
if not secrets: if not secrets:
@@ -130,7 +130,7 @@ def secrets_get(
key: Annotated[str, typer.Argument(help="Secret key")], key: Annotated[str, typer.Argument(help="Secret key")],
): ):
"""Get a secret value.""" """Get a secret value."""
from beanflows.secrets import get_secret from beanflows_pipeline.secrets import get_secret
value = get_secret(key) value = get_secret(key)
if value is None: if value is None:
@@ -143,7 +143,7 @@ def secrets_get(
@secrets_app.command("test") @secrets_app.command("test")
def secrets_test(): def secrets_test():
"""Test sops decryption (verifies sops is installed and age key is present).""" """Test sops decryption (verifies sops is installed and age key is present)."""
from beanflows.secrets import test_connection from beanflows_pipeline.secrets import test_connection
typer.echo("Testing SOPS decryption...") typer.echo("Testing SOPS decryption...")
if test_connection(): if test_connection():

View File

@@ -65,7 +65,7 @@ PIPELINES = {
"export_serving": { "export_serving": {
"command": ["uv", "run", "python", "-c", "command": ["uv", "run", "python", "-c",
"import logging; logging.basicConfig(level=logging.INFO); " "import logging; logging.basicConfig(level=logging.INFO); "
"from beanflows.export_serving import export_serving; export_serving()"], "from beanflows_pipeline.export_serving import export_serving; export_serving()"],
"timeout_seconds": 300, "timeout_seconds": 300,
}, },
} }

View File

@@ -15,7 +15,7 @@ class Instance:
def get_provider(provider_name: str): def get_provider(provider_name: str):
if provider_name == "hetzner": if provider_name == "hetzner":
from beanflows.providers import hetzner from beanflows_pipeline.providers import hetzner
return hetzner return hetzner
else: else:

View File

@@ -7,8 +7,8 @@ from hcloud import Client
from hcloud.images import Image from hcloud.images import Image
from hcloud.server_types import ServerType from hcloud.server_types import ServerType
from beanflows.providers import Instance from beanflows_pipeline.providers import Instance
from beanflows.secrets import get_secret from beanflows_pipeline.secrets import get_secret
def _get_client() -> Client: def _get_client() -> Client:

View File

@@ -58,7 +58,7 @@ logging.basicConfig(
datefmt="%Y-%m-%d %H:%M:%S", datefmt="%Y-%m-%d %H:%M:%S",
handlers=[logging.StreamHandler(sys.stdout)], handlers=[logging.StreamHandler(sys.stdout)],
) )
logger = logging.getLogger("beanflows.supervisor") logger = logging.getLogger("beanflows_pipeline.supervisor")
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------

View File

@@ -1,7 +1,7 @@
"""Worker instance management.""" """Worker instance management."""
from beanflows.providers import Instance, get_provider from beanflows_pipeline.providers import Instance, get_provider
from beanflows.secrets import get_secret from beanflows_pipeline.secrets import get_secret
DEFAULT_PROVIDER = "hetzner" DEFAULT_PROVIDER = "hetzner"