diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5ceca017..2f35ab61 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -205,7 +205,6 @@ jobs: run: | docker build \ -f ${{ matrix.dockerfile }} \ - --build-arg PROJECT_NAME=${{ matrix.project }} \ --build-arg SDK_VERSION=${PROJECT_IMAGE_SDK_VERSION} \ -t ${PROJECT_IMAGE_TAG} . - name: Create Docker network @@ -219,6 +218,8 @@ jobs: --network omes-project-net \ -p 7233:7233 \ ${PROJECT_IMAGE_TAG} \ + run-worker \ + --app ${{ matrix.project }} \ --run-id ${PROJECT_RUN_ID} \ --embedded-server-address 0.0.0.0:7233 & - name: Wait for embedded server @@ -234,7 +235,10 @@ jobs: --run-id ${PROJECT_RUN_ID} \ --server-address ${PROJECT_WORKER_CONTAINER}:7233 \ --iterations 1 \ - --connect-timeout 30s + --connect-timeout 30s \ + --option language=${{ matrix.sdk }} \ + --option project-name=${{ matrix.project }} \ + --option prebuilt-project-dir=/app/workers/python/prepared - name: Print project worker logs if: failure() run: | diff --git a/README.md b/README.md index 11eb2693..cfff2484 100644 --- a/README.md +++ b/README.md @@ -218,9 +218,9 @@ Writing a project should be fairly similar to writing a Temporal sample, and req familiarity with the project harness interface. To get started: -- projects should be written at `workers//projects/tests/`, this is a path convention expected - by Omes when building your project -- use the example `helloworld/` project as a reference to get started +- projects should be written as apps under `workers//apps/` +- register the app in `workers//apps/registry.py` +- use the example `workers/python/apps/helloworld/` app as a reference to get started - take a look at `workers/python/harness/src/harness/__init__.py` as an entrypoint to the harness and how it works @@ -246,7 +246,7 @@ To run a project: ```sh go run ./cmd run-worker \ --language python \ - --project-name helloworld \ + --app helloworld \ --run-id local-project-test \ --server-address ``` @@ -272,7 +272,7 @@ go run ./cmd run-scenario-with-worker \ --scenario project \ --iterations 1 \ --language python \ - --project-name helloworld \ + --app helloworld \ --run-id local-project-test \ --embedded-server \ --option language=python \ @@ -284,34 +284,39 @@ To run a project via Docker: ```sh docker build \ -f dockerfiles/python.Dockerfile \ - --build-arg PROJECT_NAME=helloworld \ --build-arg SDK_VERSION=v1.25.0 \ - -t omes-python-project-helloworld . + -t omes-python . docker network create omes-project-net docker run -d --rm \ --name omes-python-project-worker \ --network omes-project-net \ - omes-python-project-helloworld \ + omes-python \ + run-worker \ + --app helloworld \ --run-id local-project-test \ --embedded-server-address 0.0.0.0:7233 docker run --rm \ --network omes-project-net \ - omes-python-project-helloworld \ + omes-python \ run-scenario \ --scenario project \ --run-id local-project-test \ --server-address omes-python-project-worker:7233 \ --iterations 1 \ - --connect-timeout 30s + --connect-timeout 30s \ + --option language=python \ + --option project-name=helloworld \ + --option prebuilt-project-dir=/app/workers/python/prepared docker stop omes-python-project-worker docker network rm omes-project-net ``` -This docker workflow it is not yet wired into `go run ./cmd/dev build-worker-image`. +The Python image is a single prepared worker package. Select the app at runtime +with `--app` for workers and `--option project-name=...` for project scenarios. ### ThroughputStress diff --git a/dockerfiles/entrypoint.sh b/dockerfiles/entrypoint.sh index 98f114a0..4a738f29 100644 --- a/dockerfiles/entrypoint.sh +++ b/dockerfiles/entrypoint.sh @@ -1,27 +1,17 @@ #!/bin/sh set -eu -if [ "${1:-}" = "run-scenario" ]; then - shift - if [ -n "${OMES_PROJECT_NAME:-}" ] && [ -n "${OMES_PROJECT_PREBUILT_DIR:-}" ]; then - exec /app/temporal-omes run-scenario "$@" \ - --option "language=${OMES_WORKER_LANGUAGE}" \ - --option "prebuilt-project-dir=${OMES_PROJECT_PREBUILT_DIR}" - fi - exec /app/temporal-omes run-scenario "$@" -fi - -if [ "${1:-}" = "run-worker" ]; then - shift -fi - -if [ -n "${OMES_PROJECT_NAME:-}" ]; then - exec /app/temporal-omes run-worker \ - --language "${OMES_WORKER_LANGUAGE}" \ - --project-name "${OMES_PROJECT_NAME}" \ - --dir-name "${OMES_PROJECT_PREPARED_DIR}" \ - "$@" -fi +# This image normally behaves like the other worker images: callers pass worker +# flags and we add run-worker plus the prepared Python package defaults. Explicit +# omes subcommands pass through so the same image can run project scenarios. +case "${1:-}" in + run-scenario|cleanup-scenario|list-scenarios|prepare-worker|run-scenario-with-worker|completion|help) + exec /app/temporal-omes "$@" + ;; + run-worker) + shift + ;; +esac exec /app/temporal-omes run-worker \ --language "${OMES_WORKER_LANGUAGE}" \ diff --git a/dockerfiles/python.Dockerfile b/dockerfiles/python.Dockerfile index d0d90594..eafe185c 100644 --- a/dockerfiles/python.Dockerfile +++ b/dockerfiles/python.Dockerfile @@ -40,7 +40,6 @@ COPY go.mod go.sum ./ RUN CGO_ENABLED=0 /usr/local/go/bin/go build -o temporal-omes ./cmd ARG SDK_VERSION -ARG PROJECT_NAME="" # Optional SDK dir to copy, defaults to unimportant file ARG SDK_DIR=.gitignore @@ -49,18 +48,12 @@ COPY ${SDK_DIR} ./repo # Copy the worker files COPY workers/python ./workers/python -# Build the worker or project runner -RUN if [ -n "$PROJECT_NAME" ]; then \ - CGO_ENABLED=0 ./temporal-omes prepare-worker --language python --project-name "$PROJECT_NAME" --dir-name "project-build-runner-$PROJECT_NAME" --version "$SDK_VERSION" ; \ - else \ - CGO_ENABLED=0 ./temporal-omes prepare-worker --language python --dir-name prepared --version "$SDK_VERSION" ; \ - fi +# Build one prepared package that can run any Python app via --app. +RUN CGO_ENABLED=0 ./temporal-omes prepare-worker --language python --dir-name prepared --version "$SDK_VERSION" -# Copy the CLI and built worker to a distroless "run" container +# Copy the CLI and built worker to a run container FROM --platform=linux/$TARGETARCH python:3.11-slim-bullseye -ARG PROJECT_NAME="" - COPY --from=uv /uv /uvx /bin/ COPY --from=build /app/temporal-omes /app/temporal-omes COPY --from=build /app/workers/python /app/workers/python @@ -70,8 +63,5 @@ RUN chmod +x /app/entrypoint.sh ENV UV_NO_SYNC=1 UV_FROZEN=1 UV_OFFLINE=1 ENV OMES_WORKER_LANGUAGE=python ENV OMES_PREPARED_DIR=prepared -ENV OMES_PROJECT_NAME=$PROJECT_NAME -ENV OMES_PROJECT_PREPARED_DIR=project-build-runner-${PROJECT_NAME} -ENV OMES_PROJECT_PREBUILT_DIR=/app/workers/python/projects/tests/${PROJECT_NAME}/project-build-runner-${PROJECT_NAME} ENTRYPOINT ["/app/entrypoint.sh"] diff --git a/scenarios/project/build.go b/scenarios/project/build.go index c980cc16..55c6e32c 100644 --- a/scenarios/project/build.go +++ b/scenarios/project/build.go @@ -13,10 +13,9 @@ import ( // buildProject builds a project test program for the given language. func buildProject(ctx context.Context, repoRoot string, p projectScenarioOptions, logger *zap.SugaredLogger) (sdkbuild.Program, error) { b := workers.Builder{ - DirName: fmt.Sprintf("project-build-runner-%s", p.projectName), - SdkOptions: p.sdkOpts, - ProjectName: p.projectName, - Logger: logger, + DirName: fmt.Sprintf("project-build-runner-%s", p.projectName), + SdkOptions: p.sdkOpts, + Logger: logger, } baseDir := workers.BaseDir(repoRoot, p.sdkOpts.Language) diff --git a/scenarios/project/project.go b/scenarios/project/project.go index 3dadc876..c152e6f1 100644 --- a/scenarios/project/project.go +++ b/scenarios/project/project.go @@ -22,8 +22,8 @@ func init() { loadgen.MustRegisterScenario(loadgen.Scenario{ Description: `Run a self-contained project test. Builds (or loads) the project program, spawns a project-server, and drives iterations via gRPC. Required: --option language= - One of: --option project-name= (build from source; optional --option version= override) - --option prebuilt-project-dir= (use pre-built project dir) + Required: --option project-name= (app entrypoint; optional --option version= override) + Optional: --option prebuilt-project-dir= (use pre-built root worker package) Optional: --option project-config-file= (project-specific JSON config) Optional: --option project-server-ready-timeout= (timeout to connect to project-server, default 15s) See README.md ("Project" section) for local usage examples and current limitations.`, @@ -71,7 +71,7 @@ func (e *projectScenarioExecutor) Run(ctx context.Context, info loadgen.Scenario serverCtx, serverCancel := context.WithCancel(ctx) defer serverCancel() - serverCmd, err := startProjectProcess(serverCtx, prog, info.Logger, opts.sdkOpts.Language, port) + serverCmd, err := startProjectProcess(serverCtx, prog, info.Logger, opts.sdkOpts.Language, opts.projectName, port) if err != nil { return fmt.Errorf("failed to spawn project server: %w", err) } @@ -119,12 +119,10 @@ func (e *projectScenarioExecutor) validate(info loadgen.ScenarioInfo) (projectSc projectName := info.ScenarioOptions["project-name"] prebuiltDir := info.ScenarioOptions["prebuilt-project-dir"] - if projectName == "" && prebuiltDir == "" { - return opts, fmt.Errorf("either --option project-name or --option prebuilt-project-dir is required") - } - if projectName != "" && prebuiltDir != "" { - return opts, fmt.Errorf("cannot specify both project-name and prebuilt-project-dir") + if projectName == "" { + return opts, fmt.Errorf("--option project-name= is required") } + opts.projectName = projectName if prebuiltDir != "" { abs, err := filepath.Abs(prebuiltDir) @@ -132,12 +130,11 @@ func (e *projectScenarioExecutor) validate(info loadgen.ScenarioInfo) (projectSc return opts, fmt.Errorf("failed to resolve prebuilt-project-dir: %w", err) } opts.prebuiltDir = abs - } else { - opts.projectName = projectName - version := info.ScenarioOptions["version"] - if version != "" { - opts.sdkOpts.Version = version - } + } + + version := info.ScenarioOptions["version"] + if version != "" && opts.prebuiltDir == "" { + opts.sdkOpts.Version = version } if configPath := info.ScenarioOptions["project-config-file"]; configPath != "" { @@ -170,11 +167,11 @@ func findAvailablePort() (int, error) { return port, nil } -func startProjectProcess(ctx context.Context, prog sdkbuild.Program, logger *zap.SugaredLogger, lang clioptions.Language, port int) (*exec.Cmd, error) { +func startProjectProcess(ctx context.Context, prog sdkbuild.Program, logger *zap.SugaredLogger, lang clioptions.Language, appName string, port int) (*exec.Cmd, error) { var args []string // Python needs module name if lang == clioptions.LangPython { - args = append(args, "main") + args = append(args, "apps.registry", "--app", appName) } args = append(args, "project-server", "--port", strconv.Itoa(port)) cmd, err := prog.NewCommand(ctx, args...) diff --git a/scenarios/project/project_test.go b/scenarios/project/project_test.go index 8c89a429..78c728d0 100644 --- a/scenarios/project/project_test.go +++ b/scenarios/project/project_test.go @@ -37,15 +37,14 @@ func TestValidateLimitedPythonSupport(t *testing.T) { require.EqualError(t, err, "project scenario is currently limited to Python, got go") } -func TestValidateRejectsConflictingProjectSources(t *testing.T) { +func TestValidateRequiresProjectNameWithPrebuilt(t *testing.T) { _, err := (&projectScenarioExecutor{}).validate(loadgen.ScenarioInfo{ ScenarioOptions: map[string]string{ "language": "python", - "project-name": "helloworld", - "prebuilt-project-dir": "workers/python/projects/tests/project-build-helloworld", + "prebuilt-project-dir": "workers/python/project-build-runner-helloworld", }, }) - require.EqualError(t, err, "cannot specify both project-name and prebuilt-project-dir") + require.EqualError(t, err, "--option project-name= is required") } func TestPythonHelloWorldSourceBuild(t *testing.T) { @@ -75,7 +74,6 @@ func runProjectScenario( if usePrebuilt { prog, err = buildProject(ctx, info.RootPath, opts, info.Logger) require.NoError(t, err) - info.ScenarioOptions["project-name"] = "" info.ScenarioOptions["prebuilt-project-dir"] = prog.Dir() } @@ -195,9 +193,8 @@ func startProjectWorker( require.NotEmpty(t, opts.projectName) builder := workers.Builder{ - ProjectName: opts.projectName, - SdkOptions: opts.sdkOpts, - Logger: info.Logger.Named(fmt.Sprintf("%s-worker-builder", opts.sdkOpts.Language)), + SdkOptions: opts.sdkOpts, + Logger: info.Logger.Named(fmt.Sprintf("%s-worker-builder", opts.sdkOpts.Language)), } // If we have a prebuilt program, use it @@ -208,6 +205,7 @@ func startProjectWorker( runner := &workers.Runner{ Builder: builder, + AppName: opts.projectName, TaskQueueName: loadgen.TaskQueueForRun(info.RunID), GracefulShutdownDuration: 5 * time.Second, ScenarioID: clioptions.ScenarioID{ diff --git a/workers/python/apps/__init__.py b/workers/python/apps/__init__.py new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/workers/python/apps/__init__.py @@ -0,0 +1 @@ + diff --git a/workers/python/apps/helloworld/__init__.py b/workers/python/apps/helloworld/__init__.py new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/workers/python/apps/helloworld/__init__.py @@ -0,0 +1 @@ + diff --git a/workers/python/projects/tests/helloworld/app.py b/workers/python/apps/helloworld/app.py similarity index 78% rename from workers/python/projects/tests/helloworld/app.py rename to workers/python/apps/helloworld/app.py index 4877b3d5..e37fda6e 100644 --- a/workers/python/projects/tests/helloworld/app.py +++ b/workers/python/apps/helloworld/app.py @@ -2,7 +2,6 @@ from temporalio.client import Client from temporalio.worker import Worker -from workflow import HelloWorldWorkflow from harness import ( App, @@ -12,13 +11,7 @@ default_client_factory, ) - -def app() -> App: - return App( - worker=build_worker, - client_factory=default_client_factory, - project=ProjectHandlers(execute=execute_project_iteration), - ) +from .workflow import HelloWorldWorkflow def build_worker(client: Client, context: WorkerContext) -> Worker: @@ -41,3 +34,10 @@ async def execute_project_iteration( ) result = await handle.result() print(result) + + +app = App( + worker=build_worker, + client_factory=default_client_factory, + project=ProjectHandlers(execute=execute_project_iteration), +) diff --git a/workers/python/projects/tests/helloworld/workflow.py b/workers/python/apps/helloworld/workflow.py similarity index 100% rename from workers/python/projects/tests/helloworld/workflow.py rename to workers/python/apps/helloworld/workflow.py diff --git a/workers/python/apps/registry.py b/workers/python/apps/registry.py new file mode 100644 index 00000000..dbc1859f --- /dev/null +++ b/workers/python/apps/registry.py @@ -0,0 +1,32 @@ +from __future__ import annotations + +import argparse +import sys +from collections.abc import Sequence + +from apps.helloworld.app import app as helloworld_app +from apps.worker.app import app as worker_app +from harness import App, run + +DEFAULT_APP_NAME = "worker" + +registry: dict[str, App] = { + DEFAULT_APP_NAME: worker_app, + "helloworld": helloworld_app, +} + + +def main(argv: Sequence[str] | None = None) -> None: + parser = argparse.ArgumentParser(add_help=False, allow_abbrev=False) + parser.add_argument("--app", default=DEFAULT_APP_NAME) + args, remaining = parser.parse_known_args(sys.argv[1:] if argv is None else argv) + + app = registry.get(args.app) + if app is None: + raise SystemExit(f"unknown Python worker app {args.app!r}") + + run(app, remaining) + + +if __name__ == "__main__": + main() diff --git a/workers/python/apps/worker/__init__.py b/workers/python/apps/worker/__init__.py new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/workers/python/apps/worker/__init__.py @@ -0,0 +1 @@ + diff --git a/workers/python/kitchen_sink_app.py b/workers/python/apps/worker/app.py similarity index 90% rename from workers/python/kitchen_sink_app.py rename to workers/python/apps/worker/app.py index 81eadbf1..ab1a2348 100644 --- a/workers/python/kitchen_sink_app.py +++ b/workers/python/apps/worker/app.py @@ -17,13 +17,6 @@ from nexus_service import KitchenSinkNexusServiceHandler -def app() -> App: - return App( - worker=build_worker, - client_factory=default_client_factory, - ) - - def build_worker(client: Client, context: WorkerContext) -> Worker: return Worker( client, @@ -44,3 +37,9 @@ def build_worker(client: Client, context: WorkerContext) -> Worker: nexus_service_handlers=[KitchenSinkNexusServiceHandler()], **context.worker_kwargs, ) + + +app = App( + worker=build_worker, + client_factory=default_client_factory, +) diff --git a/workers/python/harness/src/harness/__init__.py b/workers/python/harness/src/harness/__init__.py index c7762fc6..ac70cdec 100644 --- a/workers/python/harness/src/harness/__init__.py +++ b/workers/python/harness/src/harness/__init__.py @@ -18,11 +18,10 @@ def build_worker(client: Client, context: WorkerContext) -> Worker: return Worker(client, task_queue=context.task_queue) - def app() -> App: - return App(worker=build_worker, client_factory=default_client_factory) + app = App(worker=build_worker, client_factory=default_client_factory) if __name__ == "__main__": - run(app()) + run(app) Omes will call your provided App in `worker` mode or `project-server` mode directly when running your scenario. @@ -45,12 +44,11 @@ async def init_project(client, context: ProjectInitContext) -> None: async def execute_project(client, context: ProjectExecuteContext) -> None: ... - def app() -> App: - return App( - worker=build_worker, - client_factory=default_client_factory, - project=ProjectHandlers(execute=execute_project, init=init_project), - ) + app = App( + worker=build_worker, + client_factory=default_client_factory, + project=ProjectHandlers(execute=execute_project, init=init_project), + ) Most apps only need a worker factory plus `default_client_factory`. Reach for `ProjectHandlers` only when you need project mode, and customize diff --git a/workers/python/harness/src/harness/main.py b/workers/python/harness/src/harness/main.py index 97a62ae3..5cf56466 100644 --- a/workers/python/harness/src/harness/main.py +++ b/workers/python/harness/src/harness/main.py @@ -1,6 +1,7 @@ from __future__ import annotations import sys +from collections.abc import Sequence from dataclasses import dataclass from harness.client import ClientFactory @@ -15,10 +16,9 @@ class App: project: ProjectHandlers | None = None -def run(app: App) -> None: - argv = sys.argv[1:] - # If no arg provided, fallback to existing worker CLI usage. - # Preserves direct `python main.py` usage. +def run(app: App, argv: Sequence[str] | None = None) -> None: + argv = sys.argv[1:] if argv is None else list(argv) + # If no arg is provided, fall back to existing direct run(app) worker usage. if not argv or argv[:1] == ["worker"]: worker_argv = argv[1:] if argv[:1] == ["worker"] else argv run_worker_cli(app.worker, app.client_factory, worker_argv) diff --git a/workers/python/main.py b/workers/python/main.py deleted file mode 100644 index 3bcf33ad..00000000 --- a/workers/python/main.py +++ /dev/null @@ -1,5 +0,0 @@ -import kitchen_sink_app -from harness.main import run - -if __name__ == "__main__": - run(kitchen_sink_app.app()) diff --git a/workers/python/projects/tests/helloworld/main.py b/workers/python/projects/tests/helloworld/main.py deleted file mode 100644 index b30ac08c..00000000 --- a/workers/python/projects/tests/helloworld/main.py +++ /dev/null @@ -1,6 +0,0 @@ -from app import app - -from harness import run - -if __name__ == "__main__": - run(app()) diff --git a/workers/python/projects/tests/helloworld/pyproject.toml b/workers/python/projects/tests/helloworld/pyproject.toml deleted file mode 100644 index 7f00d448..00000000 --- a/workers/python/projects/tests/helloworld/pyproject.toml +++ /dev/null @@ -1,22 +0,0 @@ -[project] -name = "omes-python-project-helloworld" -version = "0.1.0" -description = "Python project scenario test fixture" -requires-python = "~=3.10" -dependencies = [ - "temporalio>=1.23.0,<2", - "harness", -] - -[tool.hatch.build.targets.sdist] -include = ["*.py"] - -[tool.hatch.build.targets.wheel] -include = ["*.py"] - -[build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" - -[tool.uv.sources] -harness = { path = "../../../harness", editable = true } \ No newline at end of file diff --git a/workers/python/projects/tests/helloworld/uv.lock b/workers/python/projects/tests/helloworld/uv.lock deleted file mode 100644 index e47e47da..00000000 --- a/workers/python/projects/tests/helloworld/uv.lock +++ /dev/null @@ -1,209 +0,0 @@ -version = 1 -revision = 3 -requires-python = ">=3.10, <4" - -[[package]] -name = "grpcio" -version = "1.80.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b7/48/af6173dbca4454f4637a4678b67f52ca7e0c1ed7d5894d89d434fecede05/grpcio-1.80.0.tar.gz", hash = "sha256:29aca15edd0688c22ba01d7cc01cb000d72b2033f4a3c72a81a19b56fd143257", size = 12978905, upload-time = "2026-03-30T08:49:10.502Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9d/cd/bb7b7e54084a344c03d68144450da7ddd5564e51a298ae1662de65f48e2d/grpcio-1.80.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:886457a7768e408cdce226ad1ca67d2958917d306523a0e21e1a2fdaa75c9c9c", size = 6050363, upload-time = "2026-03-30T08:46:20.894Z" }, - { url = "https://files.pythonhosted.org/packages/16/02/1417f5c3460dea65f7a2e3c14e8b31e77f7ffb730e9bfadd89eda7a9f477/grpcio-1.80.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:7b641fc3f1dc647bfd80bd713addc68f6d145956f64677e56d9ebafc0bd72388", size = 12026037, upload-time = "2026-03-30T08:46:25.144Z" }, - { url = "https://files.pythonhosted.org/packages/43/98/c910254eedf2cae368d78336a2de0678e66a7317d27c02522392f949b5c6/grpcio-1.80.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:33eb763f18f006dc7fee1e69831d38d23f5eccd15b2e0f92a13ee1d9242e5e02", size = 6602306, upload-time = "2026-03-30T08:46:27.593Z" }, - { url = "https://files.pythonhosted.org/packages/7c/f8/88ca4e78c077b2b2113d95da1e1ab43efd43d723c9a0397d26529c2c1a56/grpcio-1.80.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:52d143637e3872633fc7dd7c3c6a1c84e396b359f3a72e215f8bf69fd82084fc", size = 7301535, upload-time = "2026-03-30T08:46:29.556Z" }, - { url = "https://files.pythonhosted.org/packages/f9/96/f28660fe2fe0f153288bf4a04e4910b7309d442395135c88ed4f5b3b8b40/grpcio-1.80.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c51bf8ac4575af2e0678bccfb07e47321fc7acb5049b4482832c5c195e04e13a", size = 6808669, upload-time = "2026-03-30T08:46:31.984Z" }, - { url = "https://files.pythonhosted.org/packages/47/eb/3f68a5e955779c00aeef23850e019c1c1d0e032d90633ba49c01ad5a96e0/grpcio-1.80.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:50a9871536d71c4fba24ee856abc03a87764570f0c457dd8db0b4018f379fed9", size = 7409489, upload-time = "2026-03-30T08:46:34.684Z" }, - { url = "https://files.pythonhosted.org/packages/5b/a7/d2f681a4bfb881be40659a309771f3bdfbfdb1190619442816c3f0ffc079/grpcio-1.80.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a72d84ad0514db063e21887fbacd1fd7acb4d494a564cae22227cd45c7fbf199", size = 8423167, upload-time = "2026-03-30T08:46:36.833Z" }, - { url = "https://files.pythonhosted.org/packages/97/8a/29b4589c204959aa35ce5708400a05bba72181807c45c47b3ec000c39333/grpcio-1.80.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f7691a6788ad9196872f95716df5bc643ebba13c97140b7a5ee5c8e75d1dea81", size = 7846761, upload-time = "2026-03-30T08:46:40.091Z" }, - { url = "https://files.pythonhosted.org/packages/6b/d2/ed143e097230ee121ac5848f6ff14372dba91289b10b536d54fb1b7cbae7/grpcio-1.80.0-cp310-cp310-win32.whl", hash = "sha256:46c2390b59d67f84e882694d489f5b45707c657832d7934859ceb8c33f467069", size = 4156534, upload-time = "2026-03-30T08:46:42.026Z" }, - { url = "https://files.pythonhosted.org/packages/d5/c9/df8279bb49b29409995e95efa85b72973d62f8aeff89abee58c91f393710/grpcio-1.80.0-cp310-cp310-win_amd64.whl", hash = "sha256:dc053420fc75749c961e2a4c906398d7c15725d36ccc04ae6d16093167223b58", size = 4889869, upload-time = "2026-03-30T08:46:44.219Z" }, - { url = "https://files.pythonhosted.org/packages/5d/db/1d56e5f5823257b291962d6c0ce106146c6447f405b60b234c4f222a7cde/grpcio-1.80.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:dfab85db094068ff42e2a3563f60ab3dddcc9d6488a35abf0132daec13209c8a", size = 6055009, upload-time = "2026-03-30T08:46:46.265Z" }, - { url = "https://files.pythonhosted.org/packages/6e/18/c83f3cad64c5ca63bca7e91e5e46b0d026afc5af9d0a9972472ceba294b3/grpcio-1.80.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:5c07e82e822e1161354e32da2662f741a4944ea955f9f580ec8fb409dd6f6060", size = 12035295, upload-time = "2026-03-30T08:46:49.099Z" }, - { url = "https://files.pythonhosted.org/packages/0f/8e/e14966b435be2dda99fbe89db9525ea436edc79780431a1c2875a3582644/grpcio-1.80.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba0915d51fd4ced2db5ff719f84e270afe0e2d4c45a7bdb1e8d036e4502928c2", size = 6610297, upload-time = "2026-03-30T08:46:52.123Z" }, - { url = "https://files.pythonhosted.org/packages/cc/26/d5eb38f42ce0e3fdc8174ea4d52036ef8d58cc4426cb800f2610f625dd75/grpcio-1.80.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:3cb8130ba457d2aa09fa6b7c3ed6b6e4e6a2685fce63cb803d479576c4d80e21", size = 7300208, upload-time = "2026-03-30T08:46:54.859Z" }, - { url = "https://files.pythonhosted.org/packages/25/51/bd267c989f85a17a5b3eea65a6feb4ff672af41ca614e5a0279cc0ea381c/grpcio-1.80.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:09e5e478b3d14afd23f12e49e8b44c8684ac3c5f08561c43a5b9691c54d136ab", size = 6813442, upload-time = "2026-03-30T08:46:57.056Z" }, - { url = "https://files.pythonhosted.org/packages/9e/d9/d80eef735b19e9169e30164bbf889b46f9df9127598a83d174eb13a48b26/grpcio-1.80.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:00168469238b022500e486c1c33916acf2f2a9b2c022202cf8a1885d2e3073c1", size = 7414743, upload-time = "2026-03-30T08:46:59.682Z" }, - { url = "https://files.pythonhosted.org/packages/de/f2/567f5bd5054398ed6b0509b9a30900376dcf2786bd936812098808b49d8d/grpcio-1.80.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8502122a3cc1714038e39a0b071acb1207ca7844208d5ea0d091317555ee7106", size = 8426046, upload-time = "2026-03-30T08:47:02.474Z" }, - { url = "https://files.pythonhosted.org/packages/62/29/73ef0141b4732ff5eacd68430ff2512a65c004696997f70476a83e548e7e/grpcio-1.80.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ce1794f4ea6cc3ca29463f42d665c32ba1b964b48958a66497917fe9069f26e6", size = 7851641, upload-time = "2026-03-30T08:47:05.462Z" }, - { url = "https://files.pythonhosted.org/packages/46/69/abbfa360eb229a8623bab5f5a4f8105e445bd38ce81a89514ba55d281ad0/grpcio-1.80.0-cp311-cp311-win32.whl", hash = "sha256:51b4a7189b0bef2aa30adce3c78f09c83526cf3dddb24c6a96555e3b97340440", size = 4154368, upload-time = "2026-03-30T08:47:08.027Z" }, - { url = "https://files.pythonhosted.org/packages/6f/d4/ae92206d01183b08613e846076115f5ac5991bae358d2a749fa864da5699/grpcio-1.80.0-cp311-cp311-win_amd64.whl", hash = "sha256:02e64bb0bb2da14d947a49e6f120a75e947250aebe65f9629b62bb1f5c14e6e9", size = 4894235, upload-time = "2026-03-30T08:47:10.839Z" }, - { url = "https://files.pythonhosted.org/packages/5c/e8/a2b749265eb3415abc94f2e619bbd9e9707bebdda787e61c593004ec927a/grpcio-1.80.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:c624cc9f1008361014378c9d776de7182b11fe8b2e5a81bc69f23a295f2a1ad0", size = 6015616, upload-time = "2026-03-30T08:47:13.428Z" }, - { url = "https://files.pythonhosted.org/packages/3e/97/b1282161a15d699d1e90c360df18d19165a045ce1c343c7f313f5e8a0b77/grpcio-1.80.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:f49eddcac43c3bf350c0385366a58f36bed8cc2c0ec35ef7b74b49e56552c0c2", size = 12014204, upload-time = "2026-03-30T08:47:15.873Z" }, - { url = "https://files.pythonhosted.org/packages/6e/5e/d319c6e997b50c155ac5a8cb12f5173d5b42677510e886d250d50264949d/grpcio-1.80.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d334591df610ab94714048e0d5b4f3dd5ad1bee74dfec11eee344220077a79de", size = 6563866, upload-time = "2026-03-30T08:47:18.588Z" }, - { url = "https://files.pythonhosted.org/packages/ae/f6/fdd975a2cb4d78eb67769a7b3b3830970bfa2e919f1decf724ae4445f42c/grpcio-1.80.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0cb517eb1d0d0aaf1d87af7cc5b801d686557c1d88b2619f5e31fab3c2315921", size = 7273060, upload-time = "2026-03-30T08:47:21.113Z" }, - { url = "https://files.pythonhosted.org/packages/db/f0/a3deb5feba60d9538a962913e37bd2e69a195f1c3376a3dd44fe0427e996/grpcio-1.80.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4e78c4ac0d97dc2e569b2f4bcbbb447491167cb358d1a389fc4af71ab6f70411", size = 6782121, upload-time = "2026-03-30T08:47:23.827Z" }, - { url = "https://files.pythonhosted.org/packages/ca/84/36c6dcfddc093e108141f757c407902a05085e0c328007cb090d56646cdf/grpcio-1.80.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2ed770b4c06984f3b47eb0517b1c69ad0b84ef3f40128f51448433be904634cd", size = 7383811, upload-time = "2026-03-30T08:47:26.517Z" }, - { url = "https://files.pythonhosted.org/packages/7c/ef/f3a77e3dc5b471a0ec86c564c98d6adfa3510d38f8ee99010410858d591e/grpcio-1.80.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:256507e2f524092f1473071a05e65a5b10d84b82e3ff24c5b571513cfaa61e2f", size = 8393860, upload-time = "2026-03-30T08:47:29.439Z" }, - { url = "https://files.pythonhosted.org/packages/9b/8d/9d4d27ed7f33d109c50d6b5ce578a9914aa68edab75d65869a17e630a8d1/grpcio-1.80.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a6284a5d907c37db53350645567c522be314bac859a64a7a5ca63b77bb7958f", size = 7830132, upload-time = "2026-03-30T08:47:33.254Z" }, - { url = "https://files.pythonhosted.org/packages/14/e4/9990b41c6d7a44e1e9dee8ac11d7a9802ba1378b40d77468a7761d1ad288/grpcio-1.80.0-cp312-cp312-win32.whl", hash = "sha256:c71309cfce2f22be26aa4a847357c502db6c621f1a49825ae98aa0907595b193", size = 4140904, upload-time = "2026-03-30T08:47:35.319Z" }, - { url = "https://files.pythonhosted.org/packages/2f/2c/296f6138caca1f4b92a31ace4ae1b87dab692fc16a7a3417af3bb3c805bf/grpcio-1.80.0-cp312-cp312-win_amd64.whl", hash = "sha256:9fe648599c0e37594c4809d81a9e77bd138cc82eb8baa71b6a86af65426723ff", size = 4880944, upload-time = "2026-03-30T08:47:37.831Z" }, - { url = "https://files.pythonhosted.org/packages/2f/3a/7c3c25789e3f069e581dc342e03613c5b1cb012c4e8c7d9d5cf960a75856/grpcio-1.80.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:e9e408fc016dffd20661f0126c53d8a31c2821b5c13c5d67a0f5ed5de93319ad", size = 6017243, upload-time = "2026-03-30T08:47:40.075Z" }, - { url = "https://files.pythonhosted.org/packages/04/19/21a9806eb8240e174fd1ab0cd5b9aa948bb0e05c2f2f55f9d5d7405e6d08/grpcio-1.80.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:92d787312e613754d4d8b9ca6d3297e69994a7912a32fa38c4c4e01c272974b0", size = 12010840, upload-time = "2026-03-30T08:47:43.11Z" }, - { url = "https://files.pythonhosted.org/packages/18/3a/23347d35f76f639e807fb7a36fad3068aed100996849a33809591f26eca6/grpcio-1.80.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8ac393b58aa16991a2f1144ec578084d544038c12242da3a215966b512904d0f", size = 6567644, upload-time = "2026-03-30T08:47:46.806Z" }, - { url = "https://files.pythonhosted.org/packages/ff/40/96e07ecb604a6a67ae6ab151e3e35b132875d98bc68ec65f3e5ab3e781d7/grpcio-1.80.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:68e5851ac4b9afe07e7f84483803ad167852570d65326b34d54ca560bfa53fb6", size = 7277830, upload-time = "2026-03-30T08:47:49.643Z" }, - { url = "https://files.pythonhosted.org/packages/9b/e2/da1506ecea1f34a5e365964644b35edef53803052b763ca214ba3870c856/grpcio-1.80.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:873ff5d17d68992ef6605330127425d2fc4e77e612fa3c3e0ed4e668685e3140", size = 6783216, upload-time = "2026-03-30T08:47:52.817Z" }, - { url = "https://files.pythonhosted.org/packages/44/83/3b20ff58d0c3b7f6caaa3af9a4174d4023701df40a3f39f7f1c8e7c48f9d/grpcio-1.80.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2bea16af2750fd0a899bf1abd9022244418b55d1f37da2202249ba4ba673838d", size = 7385866, upload-time = "2026-03-30T08:47:55.687Z" }, - { url = "https://files.pythonhosted.org/packages/47/45/55c507599c5520416de5eefecc927d6a0d7af55e91cfffb2e410607e5744/grpcio-1.80.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba0db34f7e1d803a878284cd70e4c63cb6ae2510ba51937bf8f45ba997cefcf7", size = 8391602, upload-time = "2026-03-30T08:47:58.303Z" }, - { url = "https://files.pythonhosted.org/packages/10/bb/dd06f4c24c01db9cf11341b547d0a016b2c90ed7dbbb086a5710df7dd1d7/grpcio-1.80.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8eb613f02d34721f1acf3626dfdb3545bd3c8505b0e52bf8b5710a28d02e8aa7", size = 7826752, upload-time = "2026-03-30T08:48:01.311Z" }, - { url = "https://files.pythonhosted.org/packages/f9/1e/9d67992ba23371fd63d4527096eb8c6b76d74d52b500df992a3343fd7251/grpcio-1.80.0-cp313-cp313-win32.whl", hash = "sha256:93b6f823810720912fd131f561f91f5fed0fda372b6b7028a2681b8194d5d294", size = 4142310, upload-time = "2026-03-30T08:48:04.594Z" }, - { url = "https://files.pythonhosted.org/packages/cf/e6/283326a27da9e2c3038bc93eeea36fb118ce0b2d03922a9cda6688f53c5b/grpcio-1.80.0-cp313-cp313-win_amd64.whl", hash = "sha256:e172cf795a3ba5246d3529e4d34c53db70e888fa582a8ffebd2e6e48bc0cba50", size = 4882833, upload-time = "2026-03-30T08:48:07.363Z" }, - { url = "https://files.pythonhosted.org/packages/c5/6d/e65307ce20f5a09244ba9e9d8476e99fb039de7154f37fb85f26978b59c3/grpcio-1.80.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:3d4147a97c8344d065d01bbf8b6acec2cf86fb0400d40696c8bdad34a64ffc0e", size = 6017376, upload-time = "2026-03-30T08:48:10.005Z" }, - { url = "https://files.pythonhosted.org/packages/69/10/9cef5d9650c72625a699c549940f0abb3c4bfdb5ed45a5ce431f92f31806/grpcio-1.80.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:d8e11f167935b3eb089ac9038e1a063e6d7dbe995c0bb4a661e614583352e76f", size = 12018133, upload-time = "2026-03-30T08:48:12.927Z" }, - { url = "https://files.pythonhosted.org/packages/04/82/983aabaad82ba26113caceeb9091706a0696b25da004fe3defb5b346e15b/grpcio-1.80.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f14b618fc30de822681ee986cfdcc2d9327229dc4c98aed16896761cacd468b9", size = 6574748, upload-time = "2026-03-30T08:48:16.386Z" }, - { url = "https://files.pythonhosted.org/packages/07/d7/031666ef155aa0bf399ed7e19439656c38bbd143779ae0861b038ce82abd/grpcio-1.80.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4ed39fbdcf9b87370f6e8df4e39ca7b38b3e5e9d1b0013c7b6be9639d6578d14", size = 7277711, upload-time = "2026-03-30T08:48:19.627Z" }, - { url = "https://files.pythonhosted.org/packages/e8/43/f437a78f7f4f1d311804189e8f11fb311a01049b2e08557c1068d470cb2e/grpcio-1.80.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2dcc70e9f0ba987526e8e8603a610fb4f460e42899e74e7a518bf3c68fe1bf05", size = 6785372, upload-time = "2026-03-30T08:48:22.373Z" }, - { url = "https://files.pythonhosted.org/packages/93/3d/f6558e9c6296cb4227faa5c43c54a34c68d32654b829f53288313d16a86e/grpcio-1.80.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:448c884b668b868562b1bda833c5fce6272d26e1926ec46747cda05741d302c1", size = 7395268, upload-time = "2026-03-30T08:48:25.638Z" }, - { url = "https://files.pythonhosted.org/packages/06/21/0fdd77e84720b08843c371a2efa6f2e19dbebf56adc72df73d891f5506f0/grpcio-1.80.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a1dc80fe55685b4a543555e6eef975303b36c8db1023b1599b094b92aa77965f", size = 8392000, upload-time = "2026-03-30T08:48:28.974Z" }, - { url = "https://files.pythonhosted.org/packages/f5/68/67f4947ed55d2e69f2cc199ab9fd85e0a0034d813bbeef84df6d2ba4d4b7/grpcio-1.80.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:31b9ac4ad1aa28ffee5503821fafd09e4da0a261ce1c1281c6c8da0423c83b6e", size = 7828477, upload-time = "2026-03-30T08:48:32.054Z" }, - { url = "https://files.pythonhosted.org/packages/44/b6/8d4096691b2e385e8271911a0de4f35f0a6c7d05aff7098e296c3de86939/grpcio-1.80.0-cp314-cp314-win32.whl", hash = "sha256:367ce30ba67d05e0592470428f0ec1c31714cab9ef19b8f2e37be1f4c7d32fae", size = 4218563, upload-time = "2026-03-30T08:48:34.538Z" }, - { url = "https://files.pythonhosted.org/packages/e5/8c/bbe6baf2557262834f2070cf668515fa308b2d38a4bbf771f8f7872a7036/grpcio-1.80.0-cp314-cp314-win_amd64.whl", hash = "sha256:3b01e1f5464c583d2f567b2e46ff0d516ef979978f72091fd81f5ab7fa6e2e7f", size = 5019457, upload-time = "2026-03-30T08:48:37.308Z" }, -] - -[[package]] -name = "harness" -version = "0.1.0" -source = { editable = "../../../harness" } -dependencies = [ - { name = "grpcio" }, - { name = "prometheus-client" }, - { name = "python-json-logger" }, - { name = "temporalio" }, -] - -[package.metadata] -requires-dist = [ - { name = "grpcio", specifier = ">=1.60.0,<2" }, - { name = "prometheus-client", specifier = ">=0.16.0,<0.17" }, - { name = "python-json-logger", specifier = ">=2.0.7,<3" }, - { name = "temporalio", specifier = ">=1.23.0,<2" }, -] - -[package.metadata.requires-dev] -dev = [ - { name = "black", specifier = ">=22.3.0,<23" }, - { name = "isort", specifier = ">=5.10.1,<6" }, - { name = "mypy", specifier = ">=1.4,<2" }, -] - -[[package]] -name = "nexus-rpc" -version = "1.4.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/35/d5/cd1ffb202b76ebc1b33c1332a3416e55a39929006982adc2b1eb069aaa9b/nexus_rpc-1.4.0.tar.gz", hash = "sha256:3b8b373d4865671789cc43623e3dc0bcbf192562e40e13727e17f1c149050fba", size = 82367, upload-time = "2026-02-25T22:01:34.053Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/11/52/6327a5f4fda01207205038a106a99848a41c83e933cd23ea2cab3d2ebc6c/nexus_rpc-1.4.0-py3-none-any.whl", hash = "sha256:14c953d3519113f8ccec533a9efdb6b10c28afef75d11cdd6d422640c40b3a49", size = 29645, upload-time = "2026-02-25T22:01:33.122Z" }, -] - -[[package]] -name = "omes-python-project-helloworld" -version = "0.1.0" -source = { editable = "." } -dependencies = [ - { name = "harness" }, - { name = "temporalio" }, -] - -[package.metadata] -requires-dist = [ - { name = "harness", editable = "../../../harness" }, - { name = "temporalio", specifier = ">=1.23.0,<2" }, -] - -[[package]] -name = "prometheus-client" -version = "0.16.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/55/9e34c73e1e490b105b4cd13d08497b1f7cb086a260e4161b7b7c2928b196/prometheus_client-0.16.0.tar.gz", hash = "sha256:a03e35b359f14dd1630898543e2120addfdeacd1a6069c1367ae90fd93ad3f48", size = 117546, upload-time = "2023-01-23T22:09:27.191Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/8e/6a546e439b4366ab9eab0a736876eb1e1916dd93b4a1fa560ef711d24f8c/prometheus_client-0.16.0-py3-none-any.whl", hash = "sha256:0836af6eb2c8f4fed712b2f279f6c0a8bbab29f9f4aa15276b91c7cb0d1616ab", size = 122464, upload-time = "2023-01-23T22:09:24.404Z" }, -] - -[[package]] -name = "protobuf" -version = "6.33.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/66/70/e908e9c5e52ef7c3a6c7902c9dfbb34c7e29c25d2f81ade3856445fd5c94/protobuf-6.33.6.tar.gz", hash = "sha256:a6768d25248312c297558af96a9f9c929e8c4cee0659cb07e780731095f38135", size = 444531, upload-time = "2026-03-18T19:05:00.988Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/9f/2f509339e89cfa6f6a4c4ff50438db9ca488dec341f7e454adad60150b00/protobuf-6.33.6-cp310-abi3-win32.whl", hash = "sha256:7d29d9b65f8afef196f8334e80d6bc1d5d4adedb449971fefd3723824e6e77d3", size = 425739, upload-time = "2026-03-18T19:04:48.373Z" }, - { url = "https://files.pythonhosted.org/packages/76/5d/683efcd4798e0030c1bab27374fd13a89f7c2515fb1f3123efdfaa5eab57/protobuf-6.33.6-cp310-abi3-win_amd64.whl", hash = "sha256:0cd27b587afca21b7cfa59a74dcbd48a50f0a6400cfb59391340ad729d91d326", size = 437089, upload-time = "2026-03-18T19:04:50.381Z" }, - { url = "https://files.pythonhosted.org/packages/5c/01/a3c3ed5cd186f39e7880f8303cc51385a198a81469d53d0fdecf1f64d929/protobuf-6.33.6-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:9720e6961b251bde64edfdab7d500725a2af5280f3f4c87e57c0208376aa8c3a", size = 427737, upload-time = "2026-03-18T19:04:51.866Z" }, - { url = "https://files.pythonhosted.org/packages/ee/90/b3c01fdec7d2f627b3a6884243ba328c1217ed2d978def5c12dc50d328a3/protobuf-6.33.6-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:e2afbae9b8e1825e3529f88d514754e094278bb95eadc0e199751cdd9a2e82a2", size = 324610, upload-time = "2026-03-18T19:04:53.096Z" }, - { url = "https://files.pythonhosted.org/packages/9b/ca/25afc144934014700c52e05103c2421997482d561f3101ff352e1292fb81/protobuf-6.33.6-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:c96c37eec15086b79762ed265d59ab204dabc53056e3443e702d2681f4b39ce3", size = 339381, upload-time = "2026-03-18T19:04:54.616Z" }, - { url = "https://files.pythonhosted.org/packages/16/92/d1e32e3e0d894fe00b15ce28ad4944ab692713f2e7f0a99787405e43533a/protobuf-6.33.6-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:e9db7e292e0ab79dd108d7f1a94fe31601ce1ee3f7b79e0692043423020b0593", size = 323436, upload-time = "2026-03-18T19:04:55.768Z" }, - { url = "https://files.pythonhosted.org/packages/c4/72/02445137af02769918a93807b2b7890047c32bfb9f90371cbc12688819eb/protobuf-6.33.6-py3-none-any.whl", hash = "sha256:77179e006c476e69bf8e8ce866640091ec42e1beb80b213c3900006ecfba6901", size = 170656, upload-time = "2026-03-18T19:04:59.826Z" }, -] - -[[package]] -name = "python-dateutil" -version = "2.9.0.post0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "six" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, -] - -[[package]] -name = "python-json-logger" -version = "2.0.7" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4f/da/95963cebfc578dabd323d7263958dfb68898617912bb09327dd30e9c8d13/python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c", size = 10508, upload-time = "2023-02-21T17:40:06.209Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/35/a6/145655273568ee78a581e734cf35beb9e33a370b29c5d3c8fee3744de29f/python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd", size = 8067, upload-time = "2023-02-21T17:40:05.117Z" }, -] - -[[package]] -name = "six" -version = "1.17.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, -] - -[[package]] -name = "temporalio" -version = "1.25.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "nexus-rpc" }, - { name = "protobuf" }, - { name = "python-dateutil", marker = "python_full_version < '3.11'" }, - { name = "types-protobuf" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/de/9c/3782bab0bf11a40b550147c19a5d1a476c17405391751982408902d9f138/temporalio-1.25.0.tar.gz", hash = "sha256:a3bbec1dcc904f674402cfa4faae480fda490b1c53ea5440c1f1996c562016fb", size = 2152534, upload-time = "2026-04-08T18:53:55.388Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/19/e3/5676dd10d1164b6d6ca8752314054097b89c5da931e936af402a7b15236c/temporalio-1.25.0-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:6dc1bc8e1773b1a833d86a7ede2dd90ef4e031ced5b748b59e7f09a5bf9b327d", size = 13943906, upload-time = "2026-04-08T18:53:30.022Z" }, - { url = "https://files.pythonhosted.org/packages/89/50/7cbf7f845973be986ec165348f72f7a409750842a04d554965a39be5cb4f/temporalio-1.25.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:3c8fdcf79ea5ae8ae2cf6f48072e4a86c3e0f4778f6a8a066c6ff1d336587db4", size = 13298719, upload-time = "2026-04-08T18:53:35.95Z" }, - { url = "https://files.pythonhosted.org/packages/d2/31/d474bab8535552add6ed289911bf1ffae5d7071823ece1069842190fcaed/temporalio-1.25.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:141f37aaafd7d090ba5c8776e4e9bc60df1fbc64b9f50c8f00e905a436588ddc", size = 13555435, upload-time = "2026-04-08T18:53:41.36Z" }, - { url = "https://files.pythonhosted.org/packages/2a/c8/e7dc053d6107bf2a037a3c9fe7b86639a25dcb888bde0e1ca366901ee47f/temporalio-1.25.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff7ca5bb80264976477d4dc7a839b3d22af8577ae92306526a061481db49bf92", size = 14052050, upload-time = "2026-04-08T18:53:46.44Z" }, - { url = "https://files.pythonhosted.org/packages/08/70/9340ed3a578321cbc153041d34834bb1ec3f1f3e3d9cded47cd1b7c3e403/temporalio-1.25.0-cp310-abi3-win_amd64.whl", hash = "sha256:9411534279a2e64847231b6059c214bff4d57cfd1532bd09f333d0b1603daa7f", size = 14299684, upload-time = "2026-04-08T18:53:52.482Z" }, -] - -[[package]] -name = "types-protobuf" -version = "6.32.1.20260221" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5f/e2/9aa4a3b2469508bd7b4e2ae11cbedaf419222a09a1b94daffcd5efca4023/types_protobuf-6.32.1.20260221.tar.gz", hash = "sha256:6d5fb060a616bfb076cbb61b4b3c3969f5fc8bec5810f9a2f7e648ee5cbcbf6e", size = 64408, upload-time = "2026-02-21T03:55:13.916Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2e/e8/1fd38926f9cf031188fbc5a96694203ea6f24b0e34bd64a225ec6f6291ba/types_protobuf-6.32.1.20260221-py3-none-any.whl", hash = "sha256:da7cdd947975964a93c30bfbcc2c6841ee646b318d3816b033adc2c4eb6448e4", size = 77956, upload-time = "2026-02-21T03:55:12.894Z" }, -] - -[[package]] -name = "typing-extensions" -version = "4.15.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, -] diff --git a/workers/python/pyproject.toml b/workers/python/pyproject.toml index 28d7e862..54128fb8 100644 --- a/workers/python/pyproject.toml +++ b/workers/python/pyproject.toml @@ -27,10 +27,10 @@ harness = { workspace = true } members = ["harness"] [tool.hatch.build.targets.sdist] -include = ["*.py", "protos/**/*.py"] +include = ["*.py", "apps/**/*.py", "protos/**/*.py"] [tool.hatch.build.targets.wheel] -include = ["*.py", "protos/**/*.py"] +include = ["*.py", "apps/**/*.py", "protos/**/*.py"] [build-system] requires = ["hatchling"] @@ -43,7 +43,7 @@ lint = [ {cmd = "isort --check-only ."}, {ref = "lint-types"}, ] -lint-types = "mypy activities.py client_action_executor.py kitchen_sink.py kitchen_sink_app.py main.py nexus_service.py" +lint-types = "mypy activities.py client_action_executor.py kitchen_sink.py nexus_service.py apps" [tool.isort] profile = "black" diff --git a/workers/run.go b/workers/run.go index 07257b52..6ff3cdec 100644 --- a/workers/run.go +++ b/workers/run.go @@ -127,7 +127,11 @@ func (r *Runner) Run(ctx context.Context, baseDir string) error { switch r.SdkOptions.Language { case clioptions.LangPython: // Python needs module name and subcommand - args = append(args, "main", "worker") + args = append(args, "apps.registry") + if r.AppName != "" { + args = append(args, "--app", r.AppName) + } + args = append(args, "worker") case clioptions.LangTypeScript: // Node also needs module before the harness subcommand. args = append(args, "./tslib/apps/registry.js")