fix: rename root package to beanflows-pipeline to avoid workspace conflict
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:
@@ -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)"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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():
|
||||||
@@ -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,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@@ -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:
|
||||||
@@ -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:
|
||||||
@@ -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")
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
@@ -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"
|
||||||
|
|
||||||
Reference in New Issue
Block a user