diff options
| author | CoprDistGit <infra@openeuler.org> | 2023-05-10 08:11:32 +0000 | 
|---|---|---|
| committer | CoprDistGit <infra@openeuler.org> | 2023-05-10 08:11:32 +0000 | 
| commit | 2d9f9a3fe4bfa43f9ecb905856c3d23d1b616123 (patch) | |
| tree | 8e7939900e24c6d0c57f1ffe7d0fe9992a0e70a3 | |
| parent | 62307b5068de451a685c01073c2322759d5b8c6c (diff) | |
automatic import of python-temporal-python-sdk
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | python-temporal-python-sdk.spec | 527 | ||||
| -rw-r--r-- | sources | 1 | 
3 files changed, 529 insertions, 0 deletions
@@ -0,0 +1 @@ +/temporal-python-sdk-1.0.19.tar.gz diff --git a/python-temporal-python-sdk.spec b/python-temporal-python-sdk.spec new file mode 100644 index 0000000..fdf587f --- /dev/null +++ b/python-temporal-python-sdk.spec @@ -0,0 +1,527 @@ +%global _empty_manifest_terminate_build 0 +Name:		python-temporal-python-sdk +Version:	1.0.19 +Release:	1 +Summary:	Unofficial Python SDK for the Temporal Workflow Engine +License:	MIT License +URL:		https://github.com/firdaus/temporal-python-sdk +Source0:	https://mirrors.nju.edu.cn/pypi/web/packages/f9/35/65b712ff6bfaec51f783d3c54228579e0f4900f5f93f82e73b89fe81c1a6/temporal-python-sdk-1.0.19.tar.gz +BuildArch:	noarch + +Requires:	python3-betterproto-for-temporal-python-sdk +Requires:	python3-dataclasses-json +Requires:	python3-grpcio +Requires:	python3-grpclib +Requires:	python3-h2 +Requires:	python3-more-itertools +Requires:	python3-pytz +Requires:	python3-tblib + +%description +# Unofficial Python SDK for the Temporal Workflow Engine + +## Status + +This should be considered EXPERIMENTAL at the moment. At the moment, all I can say is that the [test cases](https://gist.github.com/firdaus/4ec442f2c626122ad0c8d379a7ffd8bc) currently pass. I have not tested this for any real world use cases yet.  + +## Installation + +``` +pip install temporal-python-sdk +``` +## Sample Code + +Sample code for using this library can be found in [Workflows in Python Using Temporal](https://onepointzero.app/workflows-in-python-using-temporal/). + +## Hello World + +```python +import asyncio +import logging +from datetime import timedelta + +from temporal.activity_method import activity_method +from temporal.workerfactory import WorkerFactory +from temporal.workflow import workflow_method, Workflow, WorkflowClient + +logging.basicConfig(level=logging.INFO) + +TASK_QUEUE = "HelloActivity-python-tq" +NAMESPACE = "default" + +# Activities Interface +class GreetingActivities: +    @activity_method(task_queue=TASK_QUEUE, schedule_to_close_timeout=timedelta(seconds=1000)) +    async def compose_greeting(self, greeting: str, name: str) -> str: +        raise NotImplementedError + + +# Activities Implementation +class GreetingActivitiesImpl: +    async def compose_greeting(self, greeting: str, name: str): +        return greeting + " " + name + "!" + + +# Workflow Interface +class GreetingWorkflow: +    @workflow_method(task_queue=TASK_QUEUE) +    async def get_greeting(self, name: str) -> str: +        raise NotImplementedError + + +# Workflow Implementation +class GreetingWorkflowImpl(GreetingWorkflow): + +    def __init__(self): +        self.greeting_activities: GreetingActivities = Workflow.new_activity_stub(GreetingActivities) +        pass + +    async def get_greeting(self, name): +        return await self.greeting_activities.compose_greeting("Hello", name) + + +async def client_main(): +    client = WorkflowClient.new_client(namespace=NAMESPACE) + +    factory = WorkerFactory(client, NAMESPACE) +    worker = factory.new_worker(TASK_QUEUE) +    worker.register_activities_implementation(GreetingActivitiesImpl(), "GreetingActivities") +    worker.register_workflow_implementation_type(GreetingWorkflowImpl) +    factory.start() + +    greeting_workflow: GreetingWorkflow = client.new_workflow_stub(GreetingWorkflow) +    result = await greeting_workflow.get_greeting("Python") +    print(result) +    print("Stopping workers.....") +    await worker.stop() +    print("Workers stopped......") + +if __name__ == '__main__': +    asyncio.run(client_main()) +``` + +## Roadmap  + +1.0 +- [x]  Workflow argument passing and return values +- [x]  Activity invocation +- [x]  Activity heartbeat and Activity.getHeartbeatDetails() +- [x]  doNotCompleteOnReturn +- [x]  ActivityCompletionClient +    - [x]  complete +    - [x]  complete_exceptionally +- [x]  Activity get_namespace(), get_task_token() get_workflow_execution() +- [x]  Activity Retry +- [x]  Activity Failure Exceptions +- [x] workflow_execution_timeout / workflow_run_timeout / workflow_task_timeout +- [x] Workflow exceptions +- [x]  Cron workflows +- [x]  Workflow static methods: +    - [x]  await_till() +    - [x]  sleep() +    - [x]  current_time_millis() +    - [x]  now() +    - [x]  random_uuid() +    - [x]  new_random() +    - [x]  get_workflow_id() +    - [x]  get_run_id() +    - [x]  get_version() +    - [x]  get_logger() +- [x]  Activity invocation parameters +- [x]  Query method +- [x]  Signal methods +- [x]  Workflow start parameters - workflow_id etc... +- [x]  Workflow client - starting workflows synchronously +- [x]  Workflow client - starting workflows asynchronously (WorkflowClient.start) +- [x]  Get workflow result after async execution (client.wait_for_close) +- [x]  Workflow client - invoking signals +- [x]  Workflow client - invoking queries + +1.1 +- [x] ActivityStub and Workflow.newUntypedActivityStub +- [x] Remove threading, use coroutines for everything all concurrency +- [x] Classes as arguments and return values to/from activity and workflow methods (DataConverter) +    - [x] Type hints for DataConverter +- [x] Parallel activity execution (STATUS: there's a working but not finalized API). + +1.2 +- [x] Timers +- [x] Custom workflow ids through start() and new_workflow_stub() +- [ ] WorkflowStub and WorkflowClient.newUntypedWorkflowStub +- [ ] ContinueAsNew  +- [ ] Sticky workflows  +- [ ] Child Workflows  + +1.3 +- [ ] Support for keyword arguments  + +2.0 +- [ ] Compatibility with Java client  +- [ ] Compatibility with Golang client  +- [ ] Upgrade python-betterproto  + +Post 2.0: +- [ ] sideEffect/mutableSideEffect  +- [ ] Local activity  +- [ ] Cancellation Scopes  +- [ ] Explicit activity ids for activity invocations  + + + + +%package -n python3-temporal-python-sdk +Summary:	Unofficial Python SDK for the Temporal Workflow Engine +Provides:	python-temporal-python-sdk +BuildRequires:	python3-devel +BuildRequires:	python3-setuptools +BuildRequires:	python3-pip +%description -n python3-temporal-python-sdk +# Unofficial Python SDK for the Temporal Workflow Engine + +## Status + +This should be considered EXPERIMENTAL at the moment. At the moment, all I can say is that the [test cases](https://gist.github.com/firdaus/4ec442f2c626122ad0c8d379a7ffd8bc) currently pass. I have not tested this for any real world use cases yet.  + +## Installation + +``` +pip install temporal-python-sdk +``` +## Sample Code + +Sample code for using this library can be found in [Workflows in Python Using Temporal](https://onepointzero.app/workflows-in-python-using-temporal/). + +## Hello World + +```python +import asyncio +import logging +from datetime import timedelta + +from temporal.activity_method import activity_method +from temporal.workerfactory import WorkerFactory +from temporal.workflow import workflow_method, Workflow, WorkflowClient + +logging.basicConfig(level=logging.INFO) + +TASK_QUEUE = "HelloActivity-python-tq" +NAMESPACE = "default" + +# Activities Interface +class GreetingActivities: +    @activity_method(task_queue=TASK_QUEUE, schedule_to_close_timeout=timedelta(seconds=1000)) +    async def compose_greeting(self, greeting: str, name: str) -> str: +        raise NotImplementedError + + +# Activities Implementation +class GreetingActivitiesImpl: +    async def compose_greeting(self, greeting: str, name: str): +        return greeting + " " + name + "!" + + +# Workflow Interface +class GreetingWorkflow: +    @workflow_method(task_queue=TASK_QUEUE) +    async def get_greeting(self, name: str) -> str: +        raise NotImplementedError + + +# Workflow Implementation +class GreetingWorkflowImpl(GreetingWorkflow): + +    def __init__(self): +        self.greeting_activities: GreetingActivities = Workflow.new_activity_stub(GreetingActivities) +        pass + +    async def get_greeting(self, name): +        return await self.greeting_activities.compose_greeting("Hello", name) + + +async def client_main(): +    client = WorkflowClient.new_client(namespace=NAMESPACE) + +    factory = WorkerFactory(client, NAMESPACE) +    worker = factory.new_worker(TASK_QUEUE) +    worker.register_activities_implementation(GreetingActivitiesImpl(), "GreetingActivities") +    worker.register_workflow_implementation_type(GreetingWorkflowImpl) +    factory.start() + +    greeting_workflow: GreetingWorkflow = client.new_workflow_stub(GreetingWorkflow) +    result = await greeting_workflow.get_greeting("Python") +    print(result) +    print("Stopping workers.....") +    await worker.stop() +    print("Workers stopped......") + +if __name__ == '__main__': +    asyncio.run(client_main()) +``` + +## Roadmap  + +1.0 +- [x]  Workflow argument passing and return values +- [x]  Activity invocation +- [x]  Activity heartbeat and Activity.getHeartbeatDetails() +- [x]  doNotCompleteOnReturn +- [x]  ActivityCompletionClient +    - [x]  complete +    - [x]  complete_exceptionally +- [x]  Activity get_namespace(), get_task_token() get_workflow_execution() +- [x]  Activity Retry +- [x]  Activity Failure Exceptions +- [x] workflow_execution_timeout / workflow_run_timeout / workflow_task_timeout +- [x] Workflow exceptions +- [x]  Cron workflows +- [x]  Workflow static methods: +    - [x]  await_till() +    - [x]  sleep() +    - [x]  current_time_millis() +    - [x]  now() +    - [x]  random_uuid() +    - [x]  new_random() +    - [x]  get_workflow_id() +    - [x]  get_run_id() +    - [x]  get_version() +    - [x]  get_logger() +- [x]  Activity invocation parameters +- [x]  Query method +- [x]  Signal methods +- [x]  Workflow start parameters - workflow_id etc... +- [x]  Workflow client - starting workflows synchronously +- [x]  Workflow client - starting workflows asynchronously (WorkflowClient.start) +- [x]  Get workflow result after async execution (client.wait_for_close) +- [x]  Workflow client - invoking signals +- [x]  Workflow client - invoking queries + +1.1 +- [x] ActivityStub and Workflow.newUntypedActivityStub +- [x] Remove threading, use coroutines for everything all concurrency +- [x] Classes as arguments and return values to/from activity and workflow methods (DataConverter) +    - [x] Type hints for DataConverter +- [x] Parallel activity execution (STATUS: there's a working but not finalized API). + +1.2 +- [x] Timers +- [x] Custom workflow ids through start() and new_workflow_stub() +- [ ] WorkflowStub and WorkflowClient.newUntypedWorkflowStub +- [ ] ContinueAsNew  +- [ ] Sticky workflows  +- [ ] Child Workflows  + +1.3 +- [ ] Support for keyword arguments  + +2.0 +- [ ] Compatibility with Java client  +- [ ] Compatibility with Golang client  +- [ ] Upgrade python-betterproto  + +Post 2.0: +- [ ] sideEffect/mutableSideEffect  +- [ ] Local activity  +- [ ] Cancellation Scopes  +- [ ] Explicit activity ids for activity invocations  + + + + +%package help +Summary:	Development documents and examples for temporal-python-sdk +Provides:	python3-temporal-python-sdk-doc +%description help +# Unofficial Python SDK for the Temporal Workflow Engine + +## Status + +This should be considered EXPERIMENTAL at the moment. At the moment, all I can say is that the [test cases](https://gist.github.com/firdaus/4ec442f2c626122ad0c8d379a7ffd8bc) currently pass. I have not tested this for any real world use cases yet.  + +## Installation + +``` +pip install temporal-python-sdk +``` +## Sample Code + +Sample code for using this library can be found in [Workflows in Python Using Temporal](https://onepointzero.app/workflows-in-python-using-temporal/). + +## Hello World + +```python +import asyncio +import logging +from datetime import timedelta + +from temporal.activity_method import activity_method +from temporal.workerfactory import WorkerFactory +from temporal.workflow import workflow_method, Workflow, WorkflowClient + +logging.basicConfig(level=logging.INFO) + +TASK_QUEUE = "HelloActivity-python-tq" +NAMESPACE = "default" + +# Activities Interface +class GreetingActivities: +    @activity_method(task_queue=TASK_QUEUE, schedule_to_close_timeout=timedelta(seconds=1000)) +    async def compose_greeting(self, greeting: str, name: str) -> str: +        raise NotImplementedError + + +# Activities Implementation +class GreetingActivitiesImpl: +    async def compose_greeting(self, greeting: str, name: str): +        return greeting + " " + name + "!" + + +# Workflow Interface +class GreetingWorkflow: +    @workflow_method(task_queue=TASK_QUEUE) +    async def get_greeting(self, name: str) -> str: +        raise NotImplementedError + + +# Workflow Implementation +class GreetingWorkflowImpl(GreetingWorkflow): + +    def __init__(self): +        self.greeting_activities: GreetingActivities = Workflow.new_activity_stub(GreetingActivities) +        pass + +    async def get_greeting(self, name): +        return await self.greeting_activities.compose_greeting("Hello", name) + + +async def client_main(): +    client = WorkflowClient.new_client(namespace=NAMESPACE) + +    factory = WorkerFactory(client, NAMESPACE) +    worker = factory.new_worker(TASK_QUEUE) +    worker.register_activities_implementation(GreetingActivitiesImpl(), "GreetingActivities") +    worker.register_workflow_implementation_type(GreetingWorkflowImpl) +    factory.start() + +    greeting_workflow: GreetingWorkflow = client.new_workflow_stub(GreetingWorkflow) +    result = await greeting_workflow.get_greeting("Python") +    print(result) +    print("Stopping workers.....") +    await worker.stop() +    print("Workers stopped......") + +if __name__ == '__main__': +    asyncio.run(client_main()) +``` + +## Roadmap  + +1.0 +- [x]  Workflow argument passing and return values +- [x]  Activity invocation +- [x]  Activity heartbeat and Activity.getHeartbeatDetails() +- [x]  doNotCompleteOnReturn +- [x]  ActivityCompletionClient +    - [x]  complete +    - [x]  complete_exceptionally +- [x]  Activity get_namespace(), get_task_token() get_workflow_execution() +- [x]  Activity Retry +- [x]  Activity Failure Exceptions +- [x] workflow_execution_timeout / workflow_run_timeout / workflow_task_timeout +- [x] Workflow exceptions +- [x]  Cron workflows +- [x]  Workflow static methods: +    - [x]  await_till() +    - [x]  sleep() +    - [x]  current_time_millis() +    - [x]  now() +    - [x]  random_uuid() +    - [x]  new_random() +    - [x]  get_workflow_id() +    - [x]  get_run_id() +    - [x]  get_version() +    - [x]  get_logger() +- [x]  Activity invocation parameters +- [x]  Query method +- [x]  Signal methods +- [x]  Workflow start parameters - workflow_id etc... +- [x]  Workflow client - starting workflows synchronously +- [x]  Workflow client - starting workflows asynchronously (WorkflowClient.start) +- [x]  Get workflow result after async execution (client.wait_for_close) +- [x]  Workflow client - invoking signals +- [x]  Workflow client - invoking queries + +1.1 +- [x] ActivityStub and Workflow.newUntypedActivityStub +- [x] Remove threading, use coroutines for everything all concurrency +- [x] Classes as arguments and return values to/from activity and workflow methods (DataConverter) +    - [x] Type hints for DataConverter +- [x] Parallel activity execution (STATUS: there's a working but not finalized API). + +1.2 +- [x] Timers +- [x] Custom workflow ids through start() and new_workflow_stub() +- [ ] WorkflowStub and WorkflowClient.newUntypedWorkflowStub +- [ ] ContinueAsNew  +- [ ] Sticky workflows  +- [ ] Child Workflows  + +1.3 +- [ ] Support for keyword arguments  + +2.0 +- [ ] Compatibility with Java client  +- [ ] Compatibility with Golang client  +- [ ] Upgrade python-betterproto  + +Post 2.0: +- [ ] sideEffect/mutableSideEffect  +- [ ] Local activity  +- [ ] Cancellation Scopes  +- [ ] Explicit activity ids for activity invocations  + + + + +%prep +%autosetup -n temporal-python-sdk-1.0.19 + +%build +%py3_build + +%install +%py3_install +install -d -m755 %{buildroot}/%{_pkgdocdir} +if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi +if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi +if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi +if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi +pushd %{buildroot} +if [ -d usr/lib ]; then +	find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/lib64 ]; then +	find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/bin ]; then +	find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/sbin ]; then +	find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst +fi +touch doclist.lst +if [ -d usr/share/man ]; then +	find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst +fi +popd +mv %{buildroot}/filelist.lst . +mv %{buildroot}/doclist.lst . + +%files -n python3-temporal-python-sdk -f filelist.lst +%dir %{python3_sitelib}/* + +%files help -f doclist.lst +%{_docdir}/* + +%changelog +* Wed May 10 2023 Python_Bot <Python_Bot@openeuler.org> - 1.0.19-1 +- Package Spec generated @@ -0,0 +1 @@ +0e07100ddca1e8b35041a45aeb3369a1  temporal-python-sdk-1.0.19.tar.gz  | 
