cadence-python-client 0.2.1__tar.gz → 0.2.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/.cursorrules +5 -5
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/.github/workflows/ci_checks.yml +7 -2
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/Makefile +15 -9
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/PKG-INFO +50 -48
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/README.md +47 -47
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/_internal/fn_signature.py +31 -1
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/_internal/rpc/error.py +24 -24
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/_internal/rpc/retry.py +18 -9
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/_internal/rpc/yarpc.py +6 -4
- cadence_python_client-0.2.3/cadence/_internal/workflow/active_cluster_selection_policy.py +32 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/_internal/workflow/context.py +28 -16
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/_internal/workflow/deterministic_event_loop.py +25 -2
- cadence_python_client-0.2.3/cadence/_internal/workflow/retry_policy.py +62 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/_internal/workflow/statemachine/event_dispatcher.py +3 -2
- cadence_python_client-0.2.3/cadence/_internal/workflow/waiter.py +37 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/_internal/workflow/workflow_engine.py +56 -27
- cadence_python_client-0.2.3/cadence/_internal/workflow/workflow_instance.py +138 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/__init__.py +12 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/common_pb2.py +30 -12
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/common_pb2.pyi +29 -2
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/domain_pb2.py +22 -10
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/domain_pb2.pyi +24 -2
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/error_pb2.py +3 -1
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/error_pb2.pyi +4 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/history_pb2.py +44 -44
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/history_pb2.pyi +6 -2
- cadence_python_client-0.2.3/cadence/api/v1/schedule_pb2.py +61 -0
- cadence_python_client-0.2.3/cadence/api/v1/schedule_pb2.pyi +154 -0
- cadence_python_client-0.2.3/cadence/api/v1/schedule_pb2_grpc.py +24 -0
- cadence_python_client-0.2.3/cadence/api/v1/service_domain_pb2.py +94 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/service_domain_pb2.pyi +68 -2
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/service_domain_pb2_grpc.py +88 -0
- cadence_python_client-0.2.3/cadence/api/v1/service_schedule_pb2.py +72 -0
- cadence_python_client-0.2.3/cadence/api/v1/service_schedule_pb2.pyi +163 -0
- cadence_python_client-0.2.3/cadence/api/v1/service_schedule_pb2_grpc.py +409 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/service_workflow_pb2.py +9 -9
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/service_workflow_pb2.pyi +4 -2
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/service_workflow_pb2_grpc.py +2 -2
- cadence_python_client-0.2.3/cadence/api/v1/workflow_pb2.py +91 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/workflow_pb2.pyi +29 -2
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/client.py +366 -10
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/contrib/openai/cadence_tool.py +6 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/contrib/openai/pydantic_data_converter.py +33 -9
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/data_converter.py +18 -6
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/error.py +26 -8
- cadence_python_client-0.2.3/cadence/query.py +103 -0
- cadence_python_client-0.2.3/cadence/signal.py +102 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/worker/_decision_task_handler.py +93 -15
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/workflow.py +147 -7
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence_python_client.egg-info/PKG-INFO +50 -48
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence_python_client.egg-info/SOURCES.txt +20 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence_python_client.egg-info/requires.txt +2 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/pyproject.toml +5 -1
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/cadence/_internal/rpc/test_error.py +6 -3
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/cadence/_internal/rpc/test_retry.py +8 -6
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/cadence/_internal/test_fn_signature.py +41 -1
- cadence_python_client-0.2.3/tests/cadence/_internal/workflow/test_context_retry_policy.py +53 -0
- cadence_python_client-0.2.3/tests/cadence/_internal/workflow/test_deterministic_event_loop.py +190 -0
- cadence_python_client-0.2.3/tests/cadence/_internal/workflow/test_query_handling.py +545 -0
- cadence_python_client-0.2.3/tests/cadence/_internal/workflow/test_retry_policy.py +86 -0
- cadence_python_client-0.2.3/tests/cadence/_internal/workflow/test_signal_handling.py +1387 -0
- cadence_python_client-0.2.3/tests/cadence/_internal/workflow/test_waiter.py +123 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/cadence/data_converter_test.py +8 -1
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/cadence/test_client.py +26 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/cadence/test_client_workflow.py +282 -1
- cadence_python_client-0.2.3/tests/cadence/test_schedule.py +321 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/cadence/worker/test_decision_task_handler.py +8 -3
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/cadence/worker/test_decision_task_handler_integration.py +5 -5
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/cadence/worker/test_registry.py +6 -9
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/cadence/worker/test_task_handler_integration.py +17 -10
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/integration_tests/docker-compose.yml +1 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/integration_tests/test_client.py +87 -1
- cadence_python_client-0.2.3/tests/integration_tests/test_schedule.py +165 -0
- cadence_python_client-0.2.3/tests/integration_tests/workflow/test_query.py +435 -0
- cadence_python_client-0.2.3/tests/integration_tests/workflow/test_retry_policy.py +335 -0
- cadence_python_client-0.2.3/tests/integration_tests/workflow/test_signals.py +349 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/uv.lock +25 -0
- cadence_python_client-0.2.1/cadence/_internal/workflow/workflow_instance.py +0 -53
- cadence_python_client-0.2.1/cadence/api/v1/service_domain_pb2.py +0 -76
- cadence_python_client-0.2.1/cadence/api/v1/workflow_pb2.py +0 -89
- cadence_python_client-0.2.1/cadence/signal.py +0 -174
- cadence_python_client-0.2.1/tests/cadence/_internal/workflow/test_deterministic_event_loop.py +0 -96
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/.github/dco.yml +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/.github/pull_request_template.md +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/.github/workflows/python-publish.yml +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/.github/workflows/semantic-pr.yml +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/.gitignore +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/.gitmodules +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/CONTRIBUTING.md +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/LICENSE +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/NOTICE +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/__init__.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/_internal/__init__.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/_internal/activity/__init__.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/_internal/activity/_activity_executor.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/_internal/activity/_context.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/_internal/activity/_definition.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/_internal/activity/_heartbeat.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/_internal/rpc/__init__.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/_internal/workflow/__init__.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/_internal/workflow/decision_events_iterator.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/_internal/workflow/history_event_iterator.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/_internal/workflow/statemachine/__init__.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/_internal/workflow/statemachine/activity_state_machine.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/_internal/workflow/statemachine/cancellation.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/_internal/workflow/statemachine/completion_state_machine.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/_internal/workflow/statemachine/decision_manager.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/_internal/workflow/statemachine/decision_state_machine.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/_internal/workflow/statemachine/nondeterminism.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/_internal/workflow/statemachine/timer_state_machine.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/activity.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/common_pb2_grpc.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/decision_pb2.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/decision_pb2.pyi +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/decision_pb2_grpc.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/domain_pb2_grpc.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/error_pb2_grpc.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/history_pb2_grpc.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/query_pb2.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/query_pb2.pyi +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/query_pb2_grpc.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/service_meta_pb2.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/service_meta_pb2.pyi +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/service_meta_pb2_grpc.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/service_visibility_pb2.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/service_visibility_pb2.pyi +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/service_visibility_pb2_grpc.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/service_worker_pb2.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/service_worker_pb2.pyi +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/service_worker_pb2_grpc.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/tasklist_pb2.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/tasklist_pb2.pyi +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/tasklist_pb2_grpc.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/visibility_pb2.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/visibility_pb2.pyi +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/visibility_pb2_grpc.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/api/v1/workflow_pb2_grpc.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/contrib/__init__.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/contrib/openai/README.md +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/contrib/openai/__init__.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/contrib/openai/cadence_agent_runner.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/contrib/openai/cadence_handoff.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/contrib/openai/cadence_model.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/contrib/openai/cadence_registry.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/contrib/openai/images/cadence-web-agent-run.jpg +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/contrib/openai/openai_activities.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/metrics/__init__.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/metrics/constants.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/metrics/metrics.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/metrics/prometheus.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/sample/__init__.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/sample/client_example.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/sample/grpc_usage_example.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/sample/simple_usage_example.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/worker/__init__.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/worker/_activity.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/worker/_base_task_handler.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/worker/_decision.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/worker/_poller.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/worker/_registry.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/worker/_types.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/worker/_worker.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence_python_client.egg-info/dependency_links.txt +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence_python_client.egg-info/top_level.txt +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/scripts/dev.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/scripts/fix_pyi_imports.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/scripts/generate_proto.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/setup.cfg +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/cadence/_internal/activity/test_activity_executor.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/cadence/_internal/activity/test_heartbeat.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/cadence/_internal/workflow/statemachine/test_activity_state_machine.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/cadence/_internal/workflow/statemachine/test_decision_manager.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/cadence/_internal/workflow/statemachine/test_nondeterminism.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/cadence/_internal/workflow/statemachine/test_timer_state_machine.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/cadence/_internal/workflow/test_decision_events_iterator.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/cadence/_internal/workflow/test_history_event_iterator.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/cadence/_internal/workflow/test_workflow_engine.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/cadence/common_activities.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/cadence/metrics/test_metrics.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/cadence/metrics/test_prometheus.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/cadence/test_activity.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/cadence/worker/test_base_task_handler.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/cadence/worker/test_decision_worker_integration.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/cadence/worker/test_poller.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/cadence/worker/test_worker.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/conftest.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/integration_tests/conftest.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/integration_tests/helper.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/integration_tests/nondeterminism/success.json +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/integration_tests/nondeterminism/test_nondeterministic_workflows.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/integration_tests/workflow/test_activities.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/integration_tests/workflow/test_continue_as_new.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/integration_tests/workflow/test_heartbeat.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/integration_tests/workflow/test_serialization.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/integration_tests/workflow/test_timer.py +0 -0
- {cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/tests/integration_tests/workflow/test_workflows.py +0 -0
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
- **Always use `uv` for Python package management**
|
|
5
5
|
- Use `uv run` for running Python commands instead of `python` directly
|
|
6
6
|
- Use `uv sync` for installing dependencies instead of `pip install`
|
|
7
|
-
- Use `uv tool run` for running development tools (pytest,
|
|
7
|
+
- Use `uv tool run` for running development tools (pytest, ruff, etc.); use `uv run mypy` so mypy uses the project environment (e.g. `types-grpcio`).
|
|
8
8
|
- Only use `pip` or `python` directly when specifically required by the tool or documentation
|
|
9
9
|
|
|
10
10
|
## Examples
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
# ✅ Correct
|
|
13
13
|
uv run python scripts/generate_proto.py
|
|
14
14
|
uv run python -m pytest tests/
|
|
15
|
-
uv
|
|
15
|
+
uv run mypy cadence/
|
|
16
16
|
uv tool run ruff check
|
|
17
17
|
|
|
18
18
|
# ❌ Avoid
|
|
@@ -37,13 +37,13 @@ pip install -e ".[dev]"
|
|
|
37
37
|
## Code Quality
|
|
38
38
|
- **ALWAYS run linter and type checker after making code changes**
|
|
39
39
|
- Run linter with auto-fix: `uv tool run ruff check --fix`
|
|
40
|
-
- Run type checking: `uv
|
|
41
|
-
- Use `uv tool run ruff check --fix && uv
|
|
40
|
+
- Run type checking: `uv run mypy cadence/`
|
|
41
|
+
- Use `uv tool run ruff check --fix && uv run mypy cadence/` to run both together
|
|
42
42
|
- **Standard workflow**: Make changes → Run linter → Run type checker → Commit
|
|
43
43
|
|
|
44
44
|
## Development Workflow
|
|
45
45
|
1. Make code changes
|
|
46
46
|
2. Run `uv tool run ruff check --fix` (fixes formatting and linting issues)
|
|
47
|
-
3. Run `uv
|
|
47
|
+
3. Run `uv run mypy cadence/` (checks type safety)
|
|
48
48
|
4. Run `uv run python -m pytest` (run tests)
|
|
49
49
|
5. Commit changes
|
|
@@ -54,7 +54,7 @@ jobs:
|
|
|
54
54
|
uv sync --extra dev --extra openai
|
|
55
55
|
- name: Run mypy type checker
|
|
56
56
|
run: |
|
|
57
|
-
uv run mypy cadence/
|
|
57
|
+
uv run mypy cadence/ tests/
|
|
58
58
|
|
|
59
59
|
test:
|
|
60
60
|
name: Unit Tests
|
|
@@ -74,7 +74,12 @@ jobs:
|
|
|
74
74
|
uv sync --extra dev
|
|
75
75
|
- name: Run unit tests
|
|
76
76
|
run: |
|
|
77
|
-
uv run pytest -
|
|
77
|
+
uv run pytest --integration-tests --cov --cov-branch --cov-report=xml
|
|
78
|
+
- name: Upload coverage reports to Codecov
|
|
79
|
+
uses: codecov/codecov-action@v5
|
|
80
|
+
with:
|
|
81
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
82
|
+
slug: cadence-workflow/cadence-python-client
|
|
78
83
|
|
|
79
84
|
integration_test:
|
|
80
85
|
name: Integration Tests
|
|
@@ -7,7 +7,7 @@ pr: install generate lint type-check test integration-test
|
|
|
7
7
|
# Install dependencies
|
|
8
8
|
install:
|
|
9
9
|
@echo "Installing dependencies..."
|
|
10
|
-
uv sync --
|
|
10
|
+
uv sync --all-extras
|
|
11
11
|
|
|
12
12
|
# Generate idl files
|
|
13
13
|
generate:
|
|
@@ -35,21 +35,27 @@ integration-test:
|
|
|
35
35
|
@echo "Running integration tests..."
|
|
36
36
|
uv run pytest -v --integration-tests
|
|
37
37
|
|
|
38
|
+
integration-test-keep:
|
|
39
|
+
@echo "Running integration tests with cadence alive..."
|
|
40
|
+
uv run pytest -v --integration-tests --keep-cadence-alive
|
|
41
|
+
|
|
38
42
|
# Clean generated files and caches
|
|
39
43
|
clean:
|
|
40
44
|
@echo "Cleaning up..."
|
|
41
45
|
find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
|
|
42
46
|
find . -type f -name "*.pyc" -delete 2>/dev/null || true
|
|
43
47
|
find . -type d -name "*.egg-info" -exec rm -rf {} + 2>/dev/null || true
|
|
48
|
+
rm -rf .mypy_cache
|
|
44
49
|
|
|
45
50
|
# Show help
|
|
46
51
|
help:
|
|
47
52
|
@echo "Available targets:"
|
|
48
|
-
@echo " make pr
|
|
49
|
-
@echo " make install
|
|
50
|
-
@echo " make lint
|
|
51
|
-
@echo " make type-check
|
|
52
|
-
@echo " make test
|
|
53
|
-
@echo " make integration-test
|
|
54
|
-
@echo " make
|
|
55
|
-
@echo " make
|
|
53
|
+
@echo " make pr - Run all PR checks (recommended before submitting PR)"
|
|
54
|
+
@echo " make install - Install dependencies"
|
|
55
|
+
@echo " make lint - Run Ruff linter"
|
|
56
|
+
@echo " make type-check - Run mypy type checker"
|
|
57
|
+
@echo " make test - Run unit tests"
|
|
58
|
+
@echo " make integration-test - Run integration tests"
|
|
59
|
+
@echo " make integration-test-keep - Run integration tests with cadence alive"
|
|
60
|
+
@echo " make clean - Remove generated files and caches"
|
|
61
|
+
@echo " make help - Show this help message"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cadence-python-client
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.3
|
|
4
4
|
Summary: Python framework for authoring Cadence workflows and activities
|
|
5
5
|
Author: Cadence
|
|
6
6
|
License: Apache-2.0
|
|
@@ -31,6 +31,7 @@ Requires-Dist: typing-extensions>=4.0.0
|
|
|
31
31
|
Requires-Dist: prometheus-client>=0.21.0
|
|
32
32
|
Provides-Extra: dev
|
|
33
33
|
Requires-Dist: grpcio-tools>=1.73.1; extra == "dev"
|
|
34
|
+
Requires-Dist: grpc-stubs>=1.53.0.6; extra == "dev"
|
|
34
35
|
Requires-Dist: pytest>=8.4.1; extra == "dev"
|
|
35
36
|
Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
|
|
36
37
|
Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
|
|
@@ -43,6 +44,7 @@ Requires-Dist: pytest-docker>=3.2.3; extra == "dev"
|
|
|
43
44
|
Requires-Dist: opentelemetry-instrumentation-grpc==0.60b1; extra == "dev"
|
|
44
45
|
Requires-Dist: opentelemetry-sdk>=1.39.1; extra == "dev"
|
|
45
46
|
Requires-Dist: setuptools-scm[simple]>=9.2; extra == "dev"
|
|
47
|
+
Requires-Dist: types-grpcio>=1.0.0.20260408; extra == "dev"
|
|
46
48
|
Provides-Extra: docs
|
|
47
49
|
Requires-Dist: sphinx>=6.0.0; extra == "docs"
|
|
48
50
|
Requires-Dist: sphinx-rtd-theme>=1.2.0; extra == "docs"
|
|
@@ -67,11 +69,26 @@ If you'd like to propose a new feature, first join the [CNCF Slack workspace](ht
|
|
|
67
69
|
**This SDK is currently an early work-in-progress (WIP) and is NOT ready for production use.**
|
|
68
70
|
|
|
69
71
|
- This project is still in active development
|
|
70
|
-
- It has not been published to any package repository (PyPI, etc.)
|
|
71
72
|
- APIs and interfaces are subject to change without notice
|
|
72
73
|
|
|
73
74
|
## Installation
|
|
74
75
|
|
|
76
|
+
Install from [PyPI](https://pypi.org/project/cadence-python-client/):
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
pip install cadence-python-client
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Or with `uv`:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
uv add cadence-python-client
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
The core package supports Python `>=3.11,<3.14`.
|
|
89
|
+
|
|
90
|
+
Clone the repository if you want to develop locally:
|
|
91
|
+
|
|
75
92
|
```bash
|
|
76
93
|
git clone https://github.com/cadence-workflow/cadence-python-client.git
|
|
77
94
|
cd cadence-python-client
|
|
@@ -102,8 +119,7 @@ cd cadence-python-client
|
|
|
102
119
|
|
|
103
120
|
3. **Create virtual environment and install dependencies:**
|
|
104
121
|
```bash
|
|
105
|
-
uv
|
|
106
|
-
uv pip install -e ".[dev]"
|
|
122
|
+
uv sync --all-extras
|
|
107
123
|
```
|
|
108
124
|
|
|
109
125
|
Or if you prefer traditional pip:
|
|
@@ -115,70 +131,56 @@ cd cadence-python-client
|
|
|
115
131
|
|
|
116
132
|
### Generate Protobuf and gRPC Files
|
|
117
133
|
|
|
118
|
-
Run the generation script
|
|
134
|
+
Run the generation script only if you change files under `idls/proto/`:
|
|
135
|
+
|
|
119
136
|
```bash
|
|
120
|
-
#
|
|
121
|
-
|
|
122
|
-
uv run python scripts/generate_proto.py
|
|
137
|
+
# Recommended
|
|
138
|
+
make generate
|
|
123
139
|
|
|
124
|
-
# Or
|
|
125
|
-
python scripts/generate_proto.py
|
|
140
|
+
# Or run the script directly
|
|
141
|
+
uv run python scripts/generate_proto.py
|
|
126
142
|
```
|
|
127
143
|
|
|
128
144
|
This will:
|
|
129
|
-
- Download protoc 29.1 binary
|
|
130
|
-
- Install grpcio-tools if needed
|
|
131
145
|
- Generate Python protobuf files in `cadence/api/v1/`
|
|
132
146
|
- Generate gRPC service files in `cadence/api/v1/`
|
|
133
|
-
-
|
|
147
|
+
- Refresh the package imports for the generated modules
|
|
134
148
|
|
|
135
149
|
### Test
|
|
136
150
|
|
|
137
|
-
|
|
138
|
-
```bash
|
|
139
|
-
# Using uv (recommended)
|
|
140
|
-
uv run python cadence/sample/simple_usage_example.py
|
|
141
|
-
uv run python cadence/sample/grpc_usage_example.py
|
|
151
|
+
Run the main checks:
|
|
142
152
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
153
|
+
```bash
|
|
154
|
+
make lint
|
|
155
|
+
make type-check
|
|
156
|
+
make test
|
|
146
157
|
```
|
|
147
158
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
The project includes a development script that provides convenient commands for common tasks:
|
|
159
|
+
Run integration tests with Docker:
|
|
151
160
|
|
|
152
161
|
```bash
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
# Run tests
|
|
157
|
-
uv run python scripts/dev.py test
|
|
158
|
-
|
|
159
|
-
# Run tests with coverage
|
|
160
|
-
uv run python scripts/dev.py test-cov
|
|
161
|
-
|
|
162
|
-
# Run linting
|
|
163
|
-
uv run python scripts/dev.py lint
|
|
164
|
-
|
|
165
|
-
# Format code
|
|
166
|
-
uv run python scripts/dev.py format
|
|
162
|
+
make integration-test
|
|
163
|
+
```
|
|
167
164
|
|
|
168
|
-
|
|
169
|
-
uv run python scripts/dev.py install
|
|
165
|
+
You can also verify the generated files manually:
|
|
170
166
|
|
|
171
|
-
|
|
172
|
-
uv run python
|
|
167
|
+
```bash
|
|
168
|
+
uv run python cadence/sample/simple_usage_example.py
|
|
169
|
+
uv run python cadence/sample/grpc_usage_example.py
|
|
170
|
+
```
|
|
173
171
|
|
|
174
|
-
|
|
175
|
-
uv run python scripts/dev.py build
|
|
172
|
+
### Development Commands
|
|
176
173
|
|
|
177
|
-
|
|
178
|
-
uv run python scripts/dev.py clean
|
|
174
|
+
The current repository workflow is centered on `make` targets:
|
|
179
175
|
|
|
180
|
-
|
|
181
|
-
|
|
176
|
+
```bash
|
|
177
|
+
make install
|
|
178
|
+
make generate
|
|
179
|
+
make lint
|
|
180
|
+
make type-check
|
|
181
|
+
make test
|
|
182
|
+
make integration-test
|
|
183
|
+
make pr
|
|
182
184
|
```
|
|
183
185
|
|
|
184
186
|
## License
|
|
@@ -10,11 +10,26 @@ If you'd like to propose a new feature, first join the [CNCF Slack workspace](ht
|
|
|
10
10
|
**This SDK is currently an early work-in-progress (WIP) and is NOT ready for production use.**
|
|
11
11
|
|
|
12
12
|
- This project is still in active development
|
|
13
|
-
- It has not been published to any package repository (PyPI, etc.)
|
|
14
13
|
- APIs and interfaces are subject to change without notice
|
|
15
14
|
|
|
16
15
|
## Installation
|
|
17
16
|
|
|
17
|
+
Install from [PyPI](https://pypi.org/project/cadence-python-client/):
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
pip install cadence-python-client
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Or with `uv`:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
uv add cadence-python-client
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
The core package supports Python `>=3.11,<3.14`.
|
|
30
|
+
|
|
31
|
+
Clone the repository if you want to develop locally:
|
|
32
|
+
|
|
18
33
|
```bash
|
|
19
34
|
git clone https://github.com/cadence-workflow/cadence-python-client.git
|
|
20
35
|
cd cadence-python-client
|
|
@@ -45,8 +60,7 @@ cd cadence-python-client
|
|
|
45
60
|
|
|
46
61
|
3. **Create virtual environment and install dependencies:**
|
|
47
62
|
```bash
|
|
48
|
-
uv
|
|
49
|
-
uv pip install -e ".[dev]"
|
|
63
|
+
uv sync --all-extras
|
|
50
64
|
```
|
|
51
65
|
|
|
52
66
|
Or if you prefer traditional pip:
|
|
@@ -58,70 +72,56 @@ cd cadence-python-client
|
|
|
58
72
|
|
|
59
73
|
### Generate Protobuf and gRPC Files
|
|
60
74
|
|
|
61
|
-
Run the generation script
|
|
75
|
+
Run the generation script only if you change files under `idls/proto/`:
|
|
76
|
+
|
|
62
77
|
```bash
|
|
63
|
-
#
|
|
64
|
-
|
|
65
|
-
uv run python scripts/generate_proto.py
|
|
78
|
+
# Recommended
|
|
79
|
+
make generate
|
|
66
80
|
|
|
67
|
-
# Or
|
|
68
|
-
python scripts/generate_proto.py
|
|
81
|
+
# Or run the script directly
|
|
82
|
+
uv run python scripts/generate_proto.py
|
|
69
83
|
```
|
|
70
84
|
|
|
71
85
|
This will:
|
|
72
|
-
- Download protoc 29.1 binary
|
|
73
|
-
- Install grpcio-tools if needed
|
|
74
86
|
- Generate Python protobuf files in `cadence/api/v1/`
|
|
75
87
|
- Generate gRPC service files in `cadence/api/v1/`
|
|
76
|
-
-
|
|
88
|
+
- Refresh the package imports for the generated modules
|
|
77
89
|
|
|
78
90
|
### Test
|
|
79
91
|
|
|
80
|
-
|
|
81
|
-
```bash
|
|
82
|
-
# Using uv (recommended)
|
|
83
|
-
uv run python cadence/sample/simple_usage_example.py
|
|
84
|
-
uv run python cadence/sample/grpc_usage_example.py
|
|
92
|
+
Run the main checks:
|
|
85
93
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
94
|
+
```bash
|
|
95
|
+
make lint
|
|
96
|
+
make type-check
|
|
97
|
+
make test
|
|
89
98
|
```
|
|
90
99
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
The project includes a development script that provides convenient commands for common tasks:
|
|
100
|
+
Run integration tests with Docker:
|
|
94
101
|
|
|
95
102
|
```bash
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
# Run tests
|
|
100
|
-
uv run python scripts/dev.py test
|
|
101
|
-
|
|
102
|
-
# Run tests with coverage
|
|
103
|
-
uv run python scripts/dev.py test-cov
|
|
104
|
-
|
|
105
|
-
# Run linting
|
|
106
|
-
uv run python scripts/dev.py lint
|
|
107
|
-
|
|
108
|
-
# Format code
|
|
109
|
-
uv run python scripts/dev.py format
|
|
103
|
+
make integration-test
|
|
104
|
+
```
|
|
110
105
|
|
|
111
|
-
|
|
112
|
-
uv run python scripts/dev.py install
|
|
106
|
+
You can also verify the generated files manually:
|
|
113
107
|
|
|
114
|
-
|
|
115
|
-
uv run python
|
|
108
|
+
```bash
|
|
109
|
+
uv run python cadence/sample/simple_usage_example.py
|
|
110
|
+
uv run python cadence/sample/grpc_usage_example.py
|
|
111
|
+
```
|
|
116
112
|
|
|
117
|
-
|
|
118
|
-
uv run python scripts/dev.py build
|
|
113
|
+
### Development Commands
|
|
119
114
|
|
|
120
|
-
|
|
121
|
-
uv run python scripts/dev.py clean
|
|
115
|
+
The current repository workflow is centered on `make` targets:
|
|
122
116
|
|
|
123
|
-
|
|
124
|
-
|
|
117
|
+
```bash
|
|
118
|
+
make install
|
|
119
|
+
make generate
|
|
120
|
+
make lint
|
|
121
|
+
make type-check
|
|
122
|
+
make test
|
|
123
|
+
make integration-test
|
|
124
|
+
make pr
|
|
125
125
|
```
|
|
126
126
|
|
|
127
127
|
## License
|
{cadence_python_client-0.2.1 → cadence_python_client-0.2.3}/cadence/_internal/fn_signature.py
RENAMED
|
@@ -53,8 +53,20 @@ class FnSignature:
|
|
|
53
53
|
def params_from_payload(
|
|
54
54
|
self, data_converter: DataConverter, payload: Payload
|
|
55
55
|
) -> list[Any]:
|
|
56
|
+
if not self.params:
|
|
57
|
+
return []
|
|
56
58
|
type_hints = [param.type_hint for param in self.params]
|
|
57
|
-
|
|
59
|
+
decoded = _decode_provided_values(data_converter, payload, type_hints)
|
|
60
|
+
for i, param in enumerate(self.params):
|
|
61
|
+
if i < len(decoded):
|
|
62
|
+
continue
|
|
63
|
+
if param.has_default:
|
|
64
|
+
decoded.append(param.default_value)
|
|
65
|
+
else:
|
|
66
|
+
raise ValueError(
|
|
67
|
+
f"required parameter '{param.name}' (position {i}) not provided in payload"
|
|
68
|
+
)
|
|
69
|
+
return decoded
|
|
58
70
|
|
|
59
71
|
@staticmethod
|
|
60
72
|
def of(fn: Callable) -> "FnSignature":
|
|
@@ -88,3 +100,21 @@ class FnSignature:
|
|
|
88
100
|
return_type = hints.get("return", Any)
|
|
89
101
|
|
|
90
102
|
return FnSignature(params, return_type)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def _decode_provided_values(
|
|
106
|
+
data_converter: DataConverter,
|
|
107
|
+
payload: Payload,
|
|
108
|
+
type_hints: Sequence[Type | None],
|
|
109
|
+
) -> list[Any]:
|
|
110
|
+
decoder = getattr(data_converter, "_decode_provided_values", None)
|
|
111
|
+
if callable(decoder):
|
|
112
|
+
return list(decoder(payload, type_hints))
|
|
113
|
+
|
|
114
|
+
counter = getattr(data_converter, "_payload_value_count", None)
|
|
115
|
+
if callable(counter):
|
|
116
|
+
provided_count = int(counter(payload, len(type_hints)))
|
|
117
|
+
return data_converter.from_data(payload, list(type_hints[:provided_count]))
|
|
118
|
+
|
|
119
|
+
# Backward compatibility
|
|
120
|
+
return data_converter.from_data(payload, list(type_hints))
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
from typing import Callable, Any, Optional, Generator, TypeVar
|
|
1
|
+
from typing import Callable, Any, Optional, Generator, TypeVar, cast
|
|
2
2
|
|
|
3
3
|
import grpc
|
|
4
|
-
from google.rpc.status_pb2 import Status
|
|
4
|
+
from google.rpc.status_pb2 import Status
|
|
5
5
|
from grpc.aio import (
|
|
6
6
|
UnaryUnaryClientInterceptor,
|
|
7
7
|
ClientCallDetails,
|
|
@@ -9,7 +9,7 @@ from grpc.aio import (
|
|
|
9
9
|
UnaryUnaryCall,
|
|
10
10
|
Metadata,
|
|
11
11
|
)
|
|
12
|
-
from grpc_status.rpc_status import from_call
|
|
12
|
+
from grpc_status.rpc_status import from_call
|
|
13
13
|
|
|
14
14
|
from cadence.api.v1 import error_pb2
|
|
15
15
|
from cadence import error
|
|
@@ -46,22 +46,22 @@ class CadenceErrorUnaryUnaryCall(UnaryUnaryCall[RequestType, ResponseType]):
|
|
|
46
46
|
return await self._wrapped.code()
|
|
47
47
|
|
|
48
48
|
async def details(self) -> str:
|
|
49
|
-
return await self._wrapped.details()
|
|
49
|
+
return await self._wrapped.details()
|
|
50
50
|
|
|
51
51
|
async def wait_for_connection(self) -> None:
|
|
52
52
|
await self._wrapped.wait_for_connection()
|
|
53
53
|
|
|
54
54
|
def cancelled(self) -> bool:
|
|
55
|
-
return self._wrapped.cancelled()
|
|
55
|
+
return self._wrapped.cancelled()
|
|
56
56
|
|
|
57
57
|
def done(self) -> bool:
|
|
58
|
-
return self._wrapped.done()
|
|
58
|
+
return self._wrapped.done()
|
|
59
59
|
|
|
60
60
|
def time_remaining(self) -> Optional[float]:
|
|
61
|
-
return self._wrapped.time_remaining()
|
|
61
|
+
return self._wrapped.time_remaining()
|
|
62
62
|
|
|
63
63
|
def cancel(self) -> bool:
|
|
64
|
-
return self._wrapped.cancel()
|
|
64
|
+
return self._wrapped.cancel()
|
|
65
65
|
|
|
66
66
|
def add_done_callback(self, callback: DoneCallbackType) -> None:
|
|
67
67
|
self._wrapped.add_done_callback(callback)
|
|
@@ -79,16 +79,18 @@ class CadenceErrorInterceptor(UnaryUnaryClientInterceptor):
|
|
|
79
79
|
|
|
80
80
|
|
|
81
81
|
def map_error(e: AioRpcError) -> error.CadenceRpcError:
|
|
82
|
-
|
|
82
|
+
# AioRpcError implements the grpc.Call interface but doesn't inherit from it in the type stubs
|
|
83
|
+
status: Status | None = from_call(cast(grpc.Call, e))
|
|
84
|
+
message = e.details() or ""
|
|
83
85
|
if not status or not status.details:
|
|
84
|
-
return error.CadenceRpcError(
|
|
86
|
+
return error.CadenceRpcError(message, e.code())
|
|
85
87
|
|
|
86
88
|
details = status.details[0]
|
|
87
89
|
if details.Is(error_pb2.WorkflowExecutionAlreadyStartedError.DESCRIPTOR):
|
|
88
90
|
already_started = error_pb2.WorkflowExecutionAlreadyStartedError()
|
|
89
91
|
details.Unpack(already_started)
|
|
90
92
|
return error.WorkflowExecutionAlreadyStartedError(
|
|
91
|
-
|
|
93
|
+
message,
|
|
92
94
|
e.code(),
|
|
93
95
|
already_started.start_request_id,
|
|
94
96
|
already_started.run_id,
|
|
@@ -97,19 +99,19 @@ def map_error(e: AioRpcError) -> error.CadenceRpcError:
|
|
|
97
99
|
not_exists = error_pb2.EntityNotExistsError()
|
|
98
100
|
details.Unpack(not_exists)
|
|
99
101
|
return error.EntityNotExistsError(
|
|
100
|
-
|
|
102
|
+
message,
|
|
101
103
|
e.code(),
|
|
102
104
|
not_exists.current_cluster,
|
|
103
105
|
not_exists.active_cluster,
|
|
104
106
|
list(not_exists.active_clusters),
|
|
105
107
|
)
|
|
106
108
|
elif details.Is(error_pb2.WorkflowExecutionAlreadyCompletedError.DESCRIPTOR):
|
|
107
|
-
return error.WorkflowExecutionAlreadyCompletedError(
|
|
109
|
+
return error.WorkflowExecutionAlreadyCompletedError(message, e.code())
|
|
108
110
|
elif details.Is(error_pb2.DomainNotActiveError.DESCRIPTOR):
|
|
109
111
|
not_active = error_pb2.DomainNotActiveError()
|
|
110
112
|
details.Unpack(not_active)
|
|
111
113
|
return error.DomainNotActiveError(
|
|
112
|
-
|
|
114
|
+
message,
|
|
113
115
|
e.code(),
|
|
114
116
|
not_active.domain,
|
|
115
117
|
not_active.current_cluster,
|
|
@@ -120,7 +122,7 @@ def map_error(e: AioRpcError) -> error.CadenceRpcError:
|
|
|
120
122
|
not_supported = error_pb2.ClientVersionNotSupportedError()
|
|
121
123
|
details.Unpack(not_supported)
|
|
122
124
|
return error.ClientVersionNotSupportedError(
|
|
123
|
-
|
|
125
|
+
message,
|
|
124
126
|
e.code(),
|
|
125
127
|
not_supported.feature_version,
|
|
126
128
|
not_supported.client_impl,
|
|
@@ -129,20 +131,18 @@ def map_error(e: AioRpcError) -> error.CadenceRpcError:
|
|
|
129
131
|
elif details.Is(error_pb2.FeatureNotEnabledError.DESCRIPTOR):
|
|
130
132
|
not_enabled = error_pb2.FeatureNotEnabledError()
|
|
131
133
|
details.Unpack(not_enabled)
|
|
132
|
-
return error.FeatureNotEnabledError(
|
|
133
|
-
e.details(), e.code(), not_enabled.feature_flag
|
|
134
|
-
)
|
|
134
|
+
return error.FeatureNotEnabledError(message, e.code(), not_enabled.feature_flag)
|
|
135
135
|
elif details.Is(error_pb2.CancellationAlreadyRequestedError.DESCRIPTOR):
|
|
136
|
-
return error.CancellationAlreadyRequestedError(
|
|
136
|
+
return error.CancellationAlreadyRequestedError(message, e.code())
|
|
137
137
|
elif details.Is(error_pb2.DomainAlreadyExistsError.DESCRIPTOR):
|
|
138
|
-
return error.DomainAlreadyExistsError(
|
|
138
|
+
return error.DomainAlreadyExistsError(message, e.code())
|
|
139
139
|
elif details.Is(error_pb2.LimitExceededError.DESCRIPTOR):
|
|
140
|
-
return error.LimitExceededError(
|
|
140
|
+
return error.LimitExceededError(message, e.code())
|
|
141
141
|
elif details.Is(error_pb2.QueryFailedError.DESCRIPTOR):
|
|
142
|
-
return error.QueryFailedError(
|
|
142
|
+
return error.QueryFailedError(message, e.code())
|
|
143
143
|
elif details.Is(error_pb2.ServiceBusyError.DESCRIPTOR):
|
|
144
144
|
service_busy = error_pb2.ServiceBusyError()
|
|
145
145
|
details.Unpack(service_busy)
|
|
146
|
-
return error.ServiceBusyError(
|
|
146
|
+
return error.ServiceBusyError(message, e.code(), service_busy.reason)
|
|
147
147
|
else:
|
|
148
|
-
return error.CadenceRpcError(
|
|
148
|
+
return error.CadenceRpcError(message, e.code())
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
from dataclasses import dataclass
|
|
3
|
-
from typing import Callable, Any
|
|
3
|
+
from typing import Callable, Any, cast
|
|
4
4
|
|
|
5
5
|
from grpc import StatusCode
|
|
6
6
|
from grpc.aio import UnaryUnaryClientInterceptor, ClientCallDetails
|
|
@@ -59,16 +59,24 @@ class RetryInterceptor(UnaryUnaryClientInterceptor):
|
|
|
59
59
|
request: Any,
|
|
60
60
|
) -> Any:
|
|
61
61
|
loop = asyncio.get_running_loop()
|
|
62
|
-
expiration_interval =
|
|
62
|
+
expiration_interval = (
|
|
63
|
+
client_call_details.timeout
|
|
64
|
+
if client_call_details.timeout is not None
|
|
65
|
+
else float("inf")
|
|
66
|
+
)
|
|
63
67
|
start_time = loop.time()
|
|
64
68
|
deadline = start_time + expiration_interval
|
|
65
69
|
|
|
66
70
|
attempts = 0
|
|
67
71
|
while True:
|
|
68
72
|
remaining = deadline - loop.time()
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
73
|
+
call_details = ClientCallDetails(
|
|
74
|
+
method=client_call_details.method,
|
|
75
|
+
timeout=remaining,
|
|
76
|
+
metadata=client_call_details.metadata,
|
|
77
|
+
credentials=client_call_details.credentials,
|
|
78
|
+
wait_for_ready=client_call_details.wait_for_ready,
|
|
79
|
+
)
|
|
72
80
|
rpc_call = await continuation(call_details, request)
|
|
73
81
|
try:
|
|
74
82
|
await rpc_call
|
|
@@ -94,10 +102,11 @@ class RetryInterceptor(UnaryUnaryClientInterceptor):
|
|
|
94
102
|
|
|
95
103
|
|
|
96
104
|
def is_retryable(err: CadenceRpcError, call_details: ClientCallDetails) -> bool:
|
|
97
|
-
# Handle requests to the passive side, matching the Go and Java Clients
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
)
|
|
105
|
+
# Handle requests to the passive side, matching the Go and Java Clients.
|
|
106
|
+
# grpc-stubs types method as str, but grpcio corrected it to bytes in v1.75.0
|
|
107
|
+
# (grpc/grpc#39405). Cast to bytes to match the actual runtime type.
|
|
108
|
+
method = cast(bytes, call_details.method)
|
|
109
|
+
if method == GET_WORKFLOW_HISTORY and isinstance(err, EntityNotExistsError):
|
|
101
110
|
return (
|
|
102
111
|
err.active_cluster is not None
|
|
103
112
|
and err.current_cluster is not None
|
|
@@ -38,8 +38,10 @@ class YarpcMetadataInterceptor(UnaryUnaryClientInterceptor):
|
|
|
38
38
|
else:
|
|
39
39
|
metadata += self._metadata
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
metadata=metadata,
|
|
41
|
+
return ClientCallDetails(
|
|
42
|
+
method=client_call_details.method,
|
|
43
|
+
timeout=client_call_details.timeout or 60.0,
|
|
44
|
+
metadata=metadata,
|
|
45
|
+
credentials=client_call_details.credentials,
|
|
46
|
+
wait_for_ready=client_call_details.wait_for_ready,
|
|
45
47
|
)
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""Adapt :class:`cadence.workflow.ActiveClusterSelectionPolicy` (TypedDict) to its protobuf wire form."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Mapping, cast
|
|
6
|
+
|
|
7
|
+
from cadence.api.v1 import common_pb2
|
|
8
|
+
from cadence.workflow import ActiveClusterSelectionPolicy
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def active_cluster_selection_policy_to_proto(
|
|
12
|
+
policy: ActiveClusterSelectionPolicy | Mapping[str, object] | None,
|
|
13
|
+
) -> common_pb2.ActiveClusterSelectionPolicy | None:
|
|
14
|
+
"""Convert a user active-cluster selection policy to protobuf, or ``None`` if empty.
|
|
15
|
+
|
|
16
|
+
``None`` and an empty mapping both map to ``None``.
|
|
17
|
+
"""
|
|
18
|
+
if policy is None or (isinstance(policy, Mapping) and len(policy) == 0):
|
|
19
|
+
return None
|
|
20
|
+
|
|
21
|
+
out = common_pb2.ActiveClusterSelectionPolicy()
|
|
22
|
+
|
|
23
|
+
if (ca := policy.get("cluster_attribute")) is not None:
|
|
24
|
+
ca_map = cast(Mapping[str, str], ca)
|
|
25
|
+
out.cluster_attribute.CopyFrom(
|
|
26
|
+
common_pb2.ClusterAttribute(
|
|
27
|
+
scope=ca_map.get("scope", ""),
|
|
28
|
+
name=ca_map.get("name", ""),
|
|
29
|
+
)
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
return out
|