py-serverless-kit 0.1.1__tar.gz → 0.2.0__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.
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/.gitignore +29 -28
- py_serverless_kit-0.2.0/CHANGELOG.md +60 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/CONTRIBUTING.md +13 -13
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/LICENSE +21 -21
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/PKG-INFO +11 -9
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/README.md +8 -6
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/deploy_docs/CONTRIBUTING.md +158 -158
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/docs/README.md +22 -22
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/docs/architecture.md +1 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/docs/cli.md +175 -175
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/docs/configuration.md +246 -245
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/docs/dashboard.md +44 -44
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/docs/events.md +218 -213
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/docs/getting-started.md +177 -176
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/docs/handlers.md +221 -219
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/docs/local-development.md +102 -98
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/docs/migrating-from-aws.md +98 -98
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/docs/providers.md +419 -354
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/docs/troubleshooting.md +1 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/docs/workflows.md +180 -180
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/01-hello-http/README.md +53 -53
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/01-hello-http/app/handlers.py +15 -15
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/01-hello-http/pskit.yml +3 -0
- py_serverless_kit-0.2.0/examples/01-hello-http/requirements.txt +1 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/02-rest-api/README.md +77 -77
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/02-rest-api/app/handlers.py +116 -116
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/02-rest-api/app/store.py +50 -50
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/02-rest-api/pskit.yml +88 -82
- {py_serverless_kit-0.1.1/examples/05-storage-events → py_serverless_kit-0.2.0/examples/02-rest-api}/requirements.txt +1 -1
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/03-scheduled-jobs/README.md +56 -56
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/03-scheduled-jobs/app/jobs.py +51 -51
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/03-scheduled-jobs/pskit.yml +52 -49
- {py_serverless_kit-0.1.1/examples/02-rest-api → py_serverless_kit-0.2.0/examples/03-scheduled-jobs}/requirements.txt +1 -1
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/04-queue-worker/README.md +84 -80
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/04-queue-worker/app/worker.py +81 -75
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/04-queue-worker/pskit.yml +42 -39
- {py_serverless_kit-0.1.1/examples/03-scheduled-jobs → py_serverless_kit-0.2.0/examples/04-queue-worker}/requirements.txt +1 -1
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/05-storage-events/README.md +58 -58
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/05-storage-events/app/files.py +51 -51
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/05-storage-events/pskit.yml +63 -54
- {py_serverless_kit-0.1.1/examples/04-queue-worker → py_serverless_kit-0.2.0/examples/05-storage-events}/requirements.txt +1 -1
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/06-pubsub-topic/README.md +62 -62
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/06-pubsub-topic/app/subscribers.py +41 -41
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/06-pubsub-topic/pskit.yml +30 -27
- py_serverless_kit-0.2.0/examples/06-pubsub-topic/requirements.txt +1 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/07-workflow-orders/README.md +110 -110
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/07-workflow-orders/app/orders.py +84 -84
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/07-workflow-orders/events/b2b.json +5 -5
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/07-workflow-orders/events/declined.json +5 -5
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/07-workflow-orders/events/happy.json +9 -9
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/07-workflow-orders/pskit.yml +102 -99
- py_serverless_kit-0.2.0/examples/07-workflow-orders/requirements.txt +1 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/08-multi-cloud/README.md +73 -71
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/08-multi-cloud/app/handlers.py +45 -45
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/08-multi-cloud/pskit.aws.yml +15 -15
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/08-multi-cloud/pskit.azure.yml +12 -12
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/08-multi-cloud/pskit.gcp.yml +11 -11
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/08-multi-cloud/pskit.yml +96 -90
- py_serverless_kit-0.2.0/examples/08-multi-cloud/requirements.txt +1 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/09-function-invoke/README.md +61 -61
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/09-function-invoke/app/quotes.py +44 -44
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/09-function-invoke/pskit.yml +44 -41
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/09-function-invoke/requirements.txt +1 -1
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/10-stages-and-config/.env.example +5 -5
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/10-stages-and-config/README.md +78 -78
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/10-stages-and-config/app/handlers.py +17 -17
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/10-stages-and-config/app/settings.py +37 -37
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/10-stages-and-config/config/limits.json +5 -5
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/10-stages-and-config/pskit.yml +65 -58
- py_serverless_kit-0.2.0/examples/10-stages-and-config/requirements.txt +1 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/11-custom-terraform/README.md +83 -83
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/11-custom-terraform/app/handlers.py +21 -21
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/11-custom-terraform/app/repository.py +56 -56
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/11-custom-terraform/pskit.yml +75 -64
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/11-custom-terraform/requirements.txt +1 -1
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/11-custom-terraform/scripts/smoke_test.py +26 -26
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/11-custom-terraform/tests/test_orders.py +11 -11
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/12-async-and-context/README.md +61 -61
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/12-async-and-context/app/handlers.py +65 -65
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/12-async-and-context/pskit.yml +33 -30
- py_serverless_kit-0.2.0/examples/12-async-and-context/requirements.txt +1 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/13-migrate-from-aws-lambda/README.md +120 -120
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/13-migrate-from-aws-lambda/after/app/orders.py +57 -57
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/13-migrate-from-aws-lambda/after/pskit.yml +58 -55
- py_serverless_kit-0.2.0/examples/13-migrate-from-aws-lambda/after/requirements.txt +1 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/13-migrate-from-aws-lambda/before/lambda_function.py +67 -67
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/13-migrate-from-aws-lambda/before/state_machine.asl.json +25 -25
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/13-migrate-from-aws-lambda/before/template.yaml +36 -36
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/14-testing/README.md +45 -45
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/14-testing/app/handlers.py +44 -44
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/14-testing/ci.github-workflow.yml +43 -43
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/14-testing/pskit.yml +42 -39
- py_serverless_kit-0.2.0/examples/14-testing/requirements.txt +1 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/14-testing/tests/conftest.py +20 -20
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/14-testing/tests/test_handlers.py +62 -62
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/14-testing/tests/test_workflow.py +31 -31
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/15-ci-cd-deploy/README.md +64 -64
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/15-ci-cd-deploy/app/handlers.py +12 -12
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/15-ci-cd-deploy/deploy.github-workflow.yml +100 -100
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/15-ci-cd-deploy/pskit.yml +55 -50
- py_serverless_kit-0.2.0/examples/15-ci-cd-deploy/requirements.txt +1 -0
- py_serverless_kit-0.2.0/examples/16-on-premises/README.md +60 -0
- py_serverless_kit-0.2.0/examples/16-on-premises/app/handlers.py +54 -0
- py_serverless_kit-0.2.0/examples/16-on-premises/pskit.yml +69 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/README.md +40 -39
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/pyproject.toml +95 -95
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/__main__.py +3 -3
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/_version.py +1 -1
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/cli/templates.py +220 -212
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/config/__init__.py +12 -12
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/config/loader.py +13 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/config/schema.py +1 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/core/deployer.py +180 -180
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/core/describe.py +112 -112
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/dashboard/__init__.py +3 -3
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/dashboard/template.html +248 -248
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/local/__init__.py +3 -3
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/packaging/__init__.py +3 -3
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/packaging/builder.py +252 -252
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/providers/__init__.py +15 -15
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/providers/aws.py +567 -508
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/providers/base.py +4 -1
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/providers/cloudflare.py +264 -264
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/providers/digitalocean.py +211 -211
- py_serverless_kit-0.2.0/src/py_serverless_kit/providers/onprem.py +436 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/providers/oracle.py +304 -304
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/providers/registry.py +1 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/providers/tencent.py +275 -275
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/runtime/__init__.py +6 -6
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/runtime/adapters/__init__.py +18 -18
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/runtime/adapters/_httpfn.py +91 -91
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/runtime/adapters/base.py +86 -86
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/runtime/adapters/gcp.py +1 -1
- py_serverless_kit-0.2.0/src/py_serverless_kit/runtime/adapters/onprem.py +117 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/runtime/batch.py +47 -47
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/runtime/context.py +45 -45
- py_serverless_kit-0.2.0/src/py_serverless_kit/runtime/cron.py +143 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/runtime/dispatch.py +3 -3
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/runtime/errors.py +83 -83
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/runtime/event.py +267 -267
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/runtime/invoke.py +13 -3
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/runtime/log.py +69 -69
- py_serverless_kit-0.2.0/src/py_serverless_kit/runtime/onprem_host.py +1083 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/terraform/__init__.py +3 -3
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/terraform/runner.py +104 -104
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/workflows/__init__.py +35 -35
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/workflows/asl.py +170 -170
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/config/test_loader.py +18 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/config/test_schema.py +79 -79
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/conftest.py +129 -129
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/local/test_server.py +110 -110
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/providers/test_alibaba.py +137 -137
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/providers/test_aws.py +218 -182
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/providers/test_azure.py +104 -104
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/providers/test_cloudflare.py +110 -110
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/providers/test_huawei.py +94 -94
- py_serverless_kit-0.2.0/tests/providers/test_onprem.py +127 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/providers/test_schedule.py +59 -59
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/runtime/test_adapter_alibaba.py +142 -142
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/runtime/test_adapter_aws.py +184 -184
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/runtime/test_adapter_azure.py +146 -146
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/runtime/test_adapter_digitalocean.py +82 -82
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/runtime/test_adapter_gcp.py +165 -165
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/runtime/test_adapter_huawei.py +146 -146
- py_serverless_kit-0.2.0/tests/runtime/test_adapter_onprem.py +58 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/runtime/test_adapter_tencent.py +134 -134
- py_serverless_kit-0.2.0/tests/runtime/test_cron.py +46 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/runtime/test_dispatch.py +146 -146
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/runtime/test_models.py +161 -161
- py_serverless_kit-0.2.0/tests/runtime/test_onprem_host.py +239 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/runtime/test_workflow_engine.py +174 -174
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/test_cli.py +169 -169
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/test_dashboard.py +37 -37
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/test_examples.py +204 -182
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/test_packaging.py +133 -133
- py_serverless_kit-0.2.0/tests/workflows/__init__.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/workflows/test_compilers.py +141 -141
- py_serverless_kit-0.1.1/CHANGELOG.md +0 -34
- py_serverless_kit-0.1.1/examples/06-pubsub-topic/requirements.txt +0 -1
- py_serverless_kit-0.1.1/examples/07-workflow-orders/requirements.txt +0 -1
- py_serverless_kit-0.1.1/examples/08-multi-cloud/requirements.txt +0 -1
- py_serverless_kit-0.1.1/examples/10-stages-and-config/requirements.txt +0 -1
- py_serverless_kit-0.1.1/examples/12-async-and-context/requirements.txt +0 -1
- py_serverless_kit-0.1.1/examples/13-migrate-from-aws-lambda/after/requirements.txt +0 -1
- py_serverless_kit-0.1.1/examples/14-testing/requirements.txt +0 -1
- py_serverless_kit-0.1.1/examples/15-ci-cd-deploy/requirements.txt +0 -1
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/01-hello-http/app/__init__.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/02-rest-api/app/__init__.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/03-scheduled-jobs/app/__init__.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/04-queue-worker/app/__init__.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/05-storage-events/app/__init__.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/06-pubsub-topic/app/__init__.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/07-workflow-orders/app/__init__.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/08-multi-cloud/app/__init__.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/09-function-invoke/app/__init__.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/10-stages-and-config/app/__init__.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/11-custom-terraform/app/__init__.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/12-async-and-context/app/__init__.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/13-migrate-from-aws-lambda/after/app/__init__.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/14-testing/app/__init__.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/examples/15-ci-cd-deploy/app/__init__.py +0 -0
- {py_serverless_kit-0.1.1/src/py_serverless_kit/cli → py_serverless_kit-0.2.0/examples/16-on-premises/app}/__init__.py +0 -0
- {py_serverless_kit-0.1.1/examples/01-hello-http → py_serverless_kit-0.2.0/examples/16-on-premises}/requirements.txt +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/__init__.py +0 -0
- {py_serverless_kit-0.1.1/src/py_serverless_kit/core → py_serverless_kit-0.2.0/src/py_serverless_kit/cli}/__init__.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/cli/main.py +0 -0
- {py_serverless_kit-0.1.1/tests → py_serverless_kit-0.2.0/src/py_serverless_kit/core}/__init__.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/core/project.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/dashboard/generator.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/local/runner.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/local/server.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/providers/alibaba.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/providers/azure.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/providers/gcp.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/providers/huawei.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/providers/ibm.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/providers/schedule.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/providers/terraform_doc.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/runtime/adapters/alibaba.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/runtime/adapters/aws.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/runtime/adapters/azure.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/runtime/adapters/cloudflare.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/runtime/adapters/digitalocean.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/runtime/adapters/huawei.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/runtime/adapters/ibm.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/runtime/adapters/oracle.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/runtime/adapters/tencent.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/runtime/manifest.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/runtime/response.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/runtime/routing.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/runtime/workflow.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/src/py_serverless_kit/workflows/gcp.py +0 -0
- {py_serverless_kit-0.1.1/tests/config → py_serverless_kit-0.2.0/tests}/__init__.py +0 -0
- {py_serverless_kit-0.1.1/tests/local → py_serverless_kit-0.2.0/tests/config}/__init__.py +0 -0
- {py_serverless_kit-0.1.1/tests/providers → py_serverless_kit-0.2.0/tests/local}/__init__.py +0 -0
- {py_serverless_kit-0.1.1/tests/runtime → py_serverless_kit-0.2.0/tests/providers}/__init__.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/providers/test_digitalocean.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/providers/test_gcp.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/providers/test_ibm.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/providers/test_oracle.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/providers/test_tencent.py +0 -0
- {py_serverless_kit-0.1.1/tests/workflows → py_serverless_kit-0.2.0/tests/runtime}/__init__.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/runtime/test_adapter_cloudflare.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/runtime/test_adapter_ibm.py +0 -0
- {py_serverless_kit-0.1.1 → py_serverless_kit-0.2.0}/tests/runtime/test_adapter_oracle.py +0 -0
|
@@ -1,28 +1,29 @@
|
|
|
1
|
-
# Python
|
|
2
|
-
__pycache__/
|
|
3
|
-
*.py[cod]
|
|
4
|
-
*.egg-info/
|
|
5
|
-
.venv/
|
|
6
|
-
venv/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
.
|
|
11
|
-
.
|
|
12
|
-
.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
.
|
|
18
|
-
|
|
19
|
-
*.tfstate
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
.
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
.
|
|
28
|
-
.
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.egg-info/
|
|
5
|
+
.venv/
|
|
6
|
+
venv/
|
|
7
|
+
CLAUDE.md
|
|
8
|
+
build/
|
|
9
|
+
dist/
|
|
10
|
+
.pytest_cache/
|
|
11
|
+
.mypy_cache/
|
|
12
|
+
.ruff_cache/
|
|
13
|
+
.coverage
|
|
14
|
+
htmlcov/
|
|
15
|
+
.pypirc
|
|
16
|
+
# py-serverless-kit working dirs (local terraform state, artifacts)
|
|
17
|
+
.pskit/
|
|
18
|
+
.terraform/
|
|
19
|
+
*.tfstate
|
|
20
|
+
*.tfstate.*
|
|
21
|
+
|
|
22
|
+
# Secrets
|
|
23
|
+
.env
|
|
24
|
+
.pypirc
|
|
25
|
+
|
|
26
|
+
# Editors / OS
|
|
27
|
+
.idea/
|
|
28
|
+
.vscode/
|
|
29
|
+
.DS_Store
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project are documented here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project uses [Semantic Versioning](https://semver.org/).
|
|
4
|
+
|
|
5
|
+
> The function runtime is bundled into every deployment. After upgrading `py-serverless-kit`, run `pskit deploy` again to pick up runtime fixes.
|
|
6
|
+
|
|
7
|
+
## [Unreleased]
|
|
8
|
+
|
|
9
|
+
## [0.2.0] - 2026-10-17
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
- On-premises provider (`provider.name: onprem`). `pskit deploy` starts one long-lived Python process on the machine that runs the command. HTTP is served directly. Schedules, file queues (with dead-letter and partial batch failure), directory storage and file topics are created at start when they do not already exist. Point `provider.options.services.<kind>` at `{use: directory, path: ...}` to use a directory you already have. `existing: true` waits for that directory instead of creating it. Workflows run on the embedded engine inside the host, and `invoke()` stays in-process. `pskit remove` stops the process and leaves the data directory in place.
|
|
13
|
+
- Example [16-on-premises](examples/16-on-premises). Every other example has an `providers.onprem` block (its own port, public auth where a cloud authorizer does not apply, local state where the file used a cloud backend).
|
|
14
|
+
|
|
15
|
+
No change to handlers that already run on a cloud. Redeploy to pick up the new runtime if you use `BatchResult` or `invoke()` on premises.
|
|
16
|
+
|
|
17
|
+
## [0.1.3] - 2026-10-15
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
- AWS: `pskit deploy` failed with `creating Lambda Function ...: decomposing request: bufio.Scanner: token too long` once the bundle (e.g. with vendored dependencies) got large, because the zip was sent inline in every `CreateFunction` request. The artifact is now uploaded once to S3 (`aws_s3_object`) and each Lambda function references it via `s3_bucket`/`s3_key`. This also lifts the 50 MB inline upload limit.
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
- AWS options `artifact_bucket` (use an existing bucket for code uploads instead of the private `<service>-<stage>-code-*` bucket pskit creates) and `artifact_upload: s3 | direct` (`direct` restores the old inline upload).
|
|
24
|
+
|
|
25
|
+
No runtime changes. Existing AWS deployments get a new code bucket on the next `pskit deploy`; Lambda functions are updated in place.
|
|
26
|
+
|
|
27
|
+
## [0.1.2] - 2026-10-15
|
|
28
|
+
|
|
29
|
+
### Fixed
|
|
30
|
+
- Python 3.9 support: `pskit package`/`deploy` (and the Cloudflare provider) crashed with `TypeError: write_text() got an unexpected keyword argument 'newline'`, because `Path.write_text(newline=...)` only exists on Python 3.10+. Generated files are now written as UTF-8 bytes with `\n` line endings on every Python version.
|
|
31
|
+
- GCP adapter: the storage object `size` check now narrows `None` explicitly, so mypy passes on Python 3.9 CI. Runtime behavior is unchanged.
|
|
32
|
+
|
|
33
|
+
No runtime behavior changes: functions deployed with 0.1.1 don't need to be redeployed.
|
|
34
|
+
|
|
35
|
+
## [0.1.1] - 2026-10-15
|
|
36
|
+
|
|
37
|
+
### Changed
|
|
38
|
+
- Author and maintainer set to Asif Khan @ Kavion.ai (`py_serverless_kit.__author__`, package metadata, LICENSE).
|
|
39
|
+
- Project URLs (homepage, docs, issues, changelog) now point to https://github.com/ak9347128658/serverless_kit.
|
|
40
|
+
- README links are absolute so they work on the PyPI project page; added CI/PyPI/license badges.
|
|
41
|
+
- `scripts/validate_all_providers.py` explains that Terraform is optional instead of printing a traceback when it isn't installed.
|
|
42
|
+
|
|
43
|
+
### Added
|
|
44
|
+
- `deploy_docs/How_to_deploy.md`: short PyPI release guide with PowerShell commands and troubleshooting (e.g. TestPyPI `403`).
|
|
45
|
+
- `deploy_docs/HOW_TO_INSTALL_TERRAFORM.md`: installing Terraform on Windows.
|
|
46
|
+
|
|
47
|
+
No runtime changes: functions deployed with 0.1.0 don't need to be redeployed.
|
|
48
|
+
|
|
49
|
+
## [0.1.0] - 2026-10-15
|
|
50
|
+
|
|
51
|
+
### Added
|
|
52
|
+
- Portable handler API: `Event`, `HttpRequest`, `Record`, `Headers`, `Context`, `Response`, HTTP error classes, `BatchResult`, `invoke()`.
|
|
53
|
+
- `pskit.yml` configuration with `extends:`, `providers:` and `stages:` overrides, and `${env:}`, `${opt:}`, `${self:}`, `${file()}` and `${tf:}` variables.
|
|
54
|
+
- Providers: AWS (stable), Google Cloud (stable), Azure (stable), Alibaba Cloud (beta), Huawei Cloud (beta), Tencent Cloud (beta), DigitalOcean (beta), IBM Cloud (beta), Oracle Cloud (experimental), Cloudflare Workers (experimental).
|
|
55
|
+
- Triggers: HTTP (path params, CORS, auth), schedule (rate/cron), queue, storage, topic.
|
|
56
|
+
- Workflows: native AWS Step Functions and Google Cloud Workflows compilers, plus an embedded engine for the other providers and local runs.
|
|
57
|
+
- CLI: `init`, `validate`, `package`, `plan`, `deploy`, `remove`, `info`, `dashboard`, `dev`, `invoke`, `workflow run|show`, `providers`, `tf`.
|
|
58
|
+
- Deployment dashboard (self-contained HTML).
|
|
59
|
+
- Local dev server with hot reload, and `LocalRunner` for tests.
|
|
60
|
+
- `scripts/validate_all_providers.py`, which runs `terraform validate` for every provider.
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
# Contributing
|
|
2
|
-
|
|
3
|
-
The full contributor guide lives in [deploy_docs/CONTRIBUTING.md](deploy_docs/CONTRIBUTING.md). It covers the project layout, dev setup, how to add providers and options, and how to verify Terraform.
|
|
4
|
-
|
|
5
|
-
Maintainers releasing to PyPI: see [deploy_docs/PUBLISHING_TO_PYPI.md](deploy_docs/PUBLISHING_TO_PYPI.md).
|
|
6
|
-
|
|
7
|
-
Quick start:
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\Activate.ps1
|
|
11
|
-
pip install -e ".[dev]"
|
|
12
|
-
pytest && ruff check src tests && mypy
|
|
13
|
-
```
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
The full contributor guide lives in [deploy_docs/CONTRIBUTING.md](deploy_docs/CONTRIBUTING.md). It covers the project layout, dev setup, how to add providers and options, and how to verify Terraform.
|
|
4
|
+
|
|
5
|
+
Maintainers releasing to PyPI: see [deploy_docs/PUBLISHING_TO_PYPI.md](deploy_docs/PUBLISHING_TO_PYPI.md).
|
|
6
|
+
|
|
7
|
+
Quick start:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\Activate.ps1
|
|
11
|
+
pip install -e ".[dev]"
|
|
12
|
+
pytest && ruff check src tests && mypy
|
|
13
|
+
```
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 Asif Khan @ Kavion.ai
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Asif Khan @ Kavion.ai
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: py-serverless-kit
|
|
3
|
-
Version: 0.
|
|
4
|
-
Summary: Write a Python serverless function once and deploy it to AWS, Azure, GCP
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: Write a Python serverless function once and deploy it to AWS, Azure, GCP, 7 more clouds, or an on-premises host with one YAML file, powered by Terraform.
|
|
5
5
|
Project-URL: Homepage, https://github.com/ak9347128658/serverless_kit
|
|
6
6
|
Project-URL: Documentation, https://github.com/ak9347128658/serverless_kit/tree/main/docs
|
|
7
7
|
Project-URL: Issues, https://github.com/ak9347128658/serverless_kit/issues
|
|
@@ -10,7 +10,7 @@ Author: Asif Khan @ Kavion.ai
|
|
|
10
10
|
Maintainer: Asif Khan @ Kavion.ai
|
|
11
11
|
License: MIT
|
|
12
12
|
License-File: LICENSE
|
|
13
|
-
Keywords: aws,azure,faas,gcp,lambda,multi-cloud,serverless,step-functions,terraform
|
|
13
|
+
Keywords: aws,azure,faas,gcp,lambda,multi-cloud,on-premises,serverless,step-functions,terraform
|
|
14
14
|
Classifier: Development Status :: 4 - Beta
|
|
15
15
|
Classifier: Environment :: Console
|
|
16
16
|
Classifier: Intended Audience :: Developers
|
|
@@ -48,12 +48,12 @@ Description-Content-Type: text/markdown
|
|
|
48
48
|
[](https://pypi.org/project/py-serverless-kit/)
|
|
49
49
|
[](https://github.com/ak9347128658/serverless_kit/blob/main/LICENSE)
|
|
50
50
|
|
|
51
|
-
**Write your Python functions once. Deploy them to any of 10 clouds by changing one line of YAML.**
|
|
51
|
+
**Write your Python functions once. Deploy them to any of 10 clouds, or to your own machine, by changing one line of YAML.**
|
|
52
52
|
|
|
53
53
|
`py-serverless-kit` (CLI: `pskit`) is a Serverless-Framework-style toolkit built on **Terraform**. Your handlers use one small, provider-neutral API (`Event`, `Context`, `Response`). A `pskit.yml` file says which cloud they run on and what triggers them: HTTP, schedules, queues, storage, topics. The same file can also define workflows in the style of Step Functions. `pskit deploy` generates Terraform for the chosen cloud, applies it, and builds an HTML dashboard of everything you deployed.
|
|
54
54
|
|
|
55
55
|
```python
|
|
56
|
-
# app/handlers.py - identical on AWS, Azure, GCP, Alibaba, Oracle, IBM, DigitalOcean, Tencent, Huawei, Cloudflare
|
|
56
|
+
# app/handlers.py - identical on AWS, Azure, GCP, Alibaba, Oracle, IBM, DigitalOcean, Tencent, Huawei, Cloudflare, and on premises
|
|
57
57
|
from py_serverless_kit import Event, Context, NotFound
|
|
58
58
|
|
|
59
59
|
def get_order(event: Event, ctx: Context):
|
|
@@ -67,7 +67,7 @@ def get_order(event: Event, ctx: Context):
|
|
|
67
67
|
# pskit.yml
|
|
68
68
|
service: orders
|
|
69
69
|
provider:
|
|
70
|
-
name: aws # <- change to gcp, azure,
|
|
70
|
+
name: aws # <- change to gcp, azure, onprem, ... and redeploy. That's the migration.
|
|
71
71
|
region: us-east-1
|
|
72
72
|
functions:
|
|
73
73
|
get-order:
|
|
@@ -97,7 +97,7 @@ Teams that build on AWS Lambda and Step Functions end up with code full of API G
|
|
|
97
97
|
|
|
98
98
|
## Features
|
|
99
99
|
|
|
100
|
-
- **10
|
|
100
|
+
- **10 clouds and an on-premises host:** AWS Lambda, Azure Functions, Google Cloud Functions (gen2), Alibaba Function Compute, Oracle Functions, IBM Code Engine, DigitalOcean Functions, Tencent SCF, Huawei FunctionGraph, Cloudflare Workers, plus a process on your own machine (`onprem`).
|
|
101
101
|
- **Triggers:** HTTP (path params, CORS, auth), schedules (rate/cron, translated into each cloud's cron dialect), queues, object storage, pub/sub topics, and direct function-to-function `invoke()`.
|
|
102
102
|
- **Workflows:** task / choice / wait / pass / parallel / map / succeed / fail with retry and catch. Native on AWS and GCP; an embedded engine on the other clouds; runnable locally with `pskit workflow run`.
|
|
103
103
|
- **Terraform underneath:** real, reviewable `main.tf.json`, any backend (S3, GCS, azurerm, ...), works with OpenTofu. Escape hatches: `terraform.extra`, `${tf:...}` references, per-function `options`.
|
|
@@ -120,6 +120,7 @@ Teams that build on AWS Lambda and Step Functions end up with code full of API G
|
|
|
120
120
|
| IBM Code Engine | beta | ✅ | – | – | – | – | embedded |
|
|
121
121
|
| Oracle Cloud Functions | experimental | ✅ | – | – | ✅ | – | embedded |
|
|
122
122
|
| Cloudflare Workers (Python) | experimental | ✅ | ✅ | – | – | – | embedded |
|
|
123
|
+
| On-premises | experimental | ✅ | ✅ | ✅ files | ✅ directory | ✅ files | embedded (in the host) |
|
|
123
124
|
|
|
124
125
|
Run `pskit providers` for the live matrix. If a config uses a trigger the target cloud can't support, **`pskit validate` fails with a clear message instead of deploying something half-working.**
|
|
125
126
|
|
|
@@ -251,7 +252,7 @@ More: [docs/architecture.md](https://github.com/ak9347128658/serverless_kit/blob
|
|
|
251
252
|
|
|
252
253
|
## Examples
|
|
253
254
|
|
|
254
|
-
|
|
255
|
+
Sixteen runnable scenarios live in [`examples/`](https://github.com/ak9347128658/serverless_kit/tree/main/examples/). They are tested in CI.
|
|
255
256
|
|
|
256
257
|
| | |
|
|
257
258
|
|---|---|
|
|
@@ -262,7 +263,8 @@ Fifteen runnable scenarios live in [`examples/`](https://github.com/ak9347128658
|
|
|
262
263
|
| [05-storage-events](https://github.com/ak9347128658/serverless_kit/tree/main/examples/05-storage-events) | Object created/deleted with filters |
|
|
263
264
|
| [06-pubsub-topic](https://github.com/ak9347128658/serverless_kit/tree/main/examples/06-pubsub-topic) | Topic fan-out and filters |
|
|
264
265
|
| [07-workflow-orders](https://github.com/ak9347128658/serverless_kit/tree/main/examples/07-workflow-orders) | Every workflow state type, retry/catch |
|
|
265
|
-
| [08-multi-cloud](https://github.com/ak9347128658/serverless_kit/tree/main/examples/08-multi-cloud) | Same code, all
|
|
266
|
+
| [08-multi-cloud](https://github.com/ak9347128658/serverless_kit/tree/main/examples/08-multi-cloud) | Same code, all 11 providers |
|
|
267
|
+
| [16-on-premises](https://github.com/ak9347128658/serverless_kit/tree/main/examples/16-on-premises) | HTTP, schedule, queue, storage, topic and a workflow on one machine |
|
|
266
268
|
| [09-function-invoke](https://github.com/ak9347128658/serverless_kit/tree/main/examples/09-function-invoke) | Function-to-function `invoke()` |
|
|
267
269
|
| [10-stages-and-config](https://github.com/ak9347128658/serverless_kit/tree/main/examples/10-stages-and-config) | Stages, variables, secrets |
|
|
268
270
|
| [11-custom-terraform](https://github.com/ak9347128658/serverless_kit/tree/main/examples/11-custom-terraform) | `terraform.extra`, `${tf:...}`, remote state, hooks |
|
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
[](https://pypi.org/project/py-serverless-kit/)
|
|
5
5
|
[](https://github.com/ak9347128658/serverless_kit/blob/main/LICENSE)
|
|
6
6
|
|
|
7
|
-
**Write your Python functions once. Deploy them to any of 10 clouds by changing one line of YAML.**
|
|
7
|
+
**Write your Python functions once. Deploy them to any of 10 clouds, or to your own machine, by changing one line of YAML.**
|
|
8
8
|
|
|
9
9
|
`py-serverless-kit` (CLI: `pskit`) is a Serverless-Framework-style toolkit built on **Terraform**. Your handlers use one small, provider-neutral API (`Event`, `Context`, `Response`). A `pskit.yml` file says which cloud they run on and what triggers them: HTTP, schedules, queues, storage, topics. The same file can also define workflows in the style of Step Functions. `pskit deploy` generates Terraform for the chosen cloud, applies it, and builds an HTML dashboard of everything you deployed.
|
|
10
10
|
|
|
11
11
|
```python
|
|
12
|
-
# app/handlers.py - identical on AWS, Azure, GCP, Alibaba, Oracle, IBM, DigitalOcean, Tencent, Huawei, Cloudflare
|
|
12
|
+
# app/handlers.py - identical on AWS, Azure, GCP, Alibaba, Oracle, IBM, DigitalOcean, Tencent, Huawei, Cloudflare, and on premises
|
|
13
13
|
from py_serverless_kit import Event, Context, NotFound
|
|
14
14
|
|
|
15
15
|
def get_order(event: Event, ctx: Context):
|
|
@@ -23,7 +23,7 @@ def get_order(event: Event, ctx: Context):
|
|
|
23
23
|
# pskit.yml
|
|
24
24
|
service: orders
|
|
25
25
|
provider:
|
|
26
|
-
name: aws # <- change to gcp, azure,
|
|
26
|
+
name: aws # <- change to gcp, azure, onprem, ... and redeploy. That's the migration.
|
|
27
27
|
region: us-east-1
|
|
28
28
|
functions:
|
|
29
29
|
get-order:
|
|
@@ -53,7 +53,7 @@ Teams that build on AWS Lambda and Step Functions end up with code full of API G
|
|
|
53
53
|
|
|
54
54
|
## Features
|
|
55
55
|
|
|
56
|
-
- **10
|
|
56
|
+
- **10 clouds and an on-premises host:** AWS Lambda, Azure Functions, Google Cloud Functions (gen2), Alibaba Function Compute, Oracle Functions, IBM Code Engine, DigitalOcean Functions, Tencent SCF, Huawei FunctionGraph, Cloudflare Workers, plus a process on your own machine (`onprem`).
|
|
57
57
|
- **Triggers:** HTTP (path params, CORS, auth), schedules (rate/cron, translated into each cloud's cron dialect), queues, object storage, pub/sub topics, and direct function-to-function `invoke()`.
|
|
58
58
|
- **Workflows:** task / choice / wait / pass / parallel / map / succeed / fail with retry and catch. Native on AWS and GCP; an embedded engine on the other clouds; runnable locally with `pskit workflow run`.
|
|
59
59
|
- **Terraform underneath:** real, reviewable `main.tf.json`, any backend (S3, GCS, azurerm, ...), works with OpenTofu. Escape hatches: `terraform.extra`, `${tf:...}` references, per-function `options`.
|
|
@@ -76,6 +76,7 @@ Teams that build on AWS Lambda and Step Functions end up with code full of API G
|
|
|
76
76
|
| IBM Code Engine | beta | ✅ | – | – | – | – | embedded |
|
|
77
77
|
| Oracle Cloud Functions | experimental | ✅ | – | – | ✅ | – | embedded |
|
|
78
78
|
| Cloudflare Workers (Python) | experimental | ✅ | ✅ | – | – | – | embedded |
|
|
79
|
+
| On-premises | experimental | ✅ | ✅ | ✅ files | ✅ directory | ✅ files | embedded (in the host) |
|
|
79
80
|
|
|
80
81
|
Run `pskit providers` for the live matrix. If a config uses a trigger the target cloud can't support, **`pskit validate` fails with a clear message instead of deploying something half-working.**
|
|
81
82
|
|
|
@@ -207,7 +208,7 @@ More: [docs/architecture.md](https://github.com/ak9347128658/serverless_kit/blob
|
|
|
207
208
|
|
|
208
209
|
## Examples
|
|
209
210
|
|
|
210
|
-
|
|
211
|
+
Sixteen runnable scenarios live in [`examples/`](https://github.com/ak9347128658/serverless_kit/tree/main/examples/). They are tested in CI.
|
|
211
212
|
|
|
212
213
|
| | |
|
|
213
214
|
|---|---|
|
|
@@ -218,7 +219,8 @@ Fifteen runnable scenarios live in [`examples/`](https://github.com/ak9347128658
|
|
|
218
219
|
| [05-storage-events](https://github.com/ak9347128658/serverless_kit/tree/main/examples/05-storage-events) | Object created/deleted with filters |
|
|
219
220
|
| [06-pubsub-topic](https://github.com/ak9347128658/serverless_kit/tree/main/examples/06-pubsub-topic) | Topic fan-out and filters |
|
|
220
221
|
| [07-workflow-orders](https://github.com/ak9347128658/serverless_kit/tree/main/examples/07-workflow-orders) | Every workflow state type, retry/catch |
|
|
221
|
-
| [08-multi-cloud](https://github.com/ak9347128658/serverless_kit/tree/main/examples/08-multi-cloud) | Same code, all
|
|
222
|
+
| [08-multi-cloud](https://github.com/ak9347128658/serverless_kit/tree/main/examples/08-multi-cloud) | Same code, all 11 providers |
|
|
223
|
+
| [16-on-premises](https://github.com/ak9347128658/serverless_kit/tree/main/examples/16-on-premises) | HTTP, schedule, queue, storage, topic and a workflow on one machine |
|
|
222
224
|
| [09-function-invoke](https://github.com/ak9347128658/serverless_kit/tree/main/examples/09-function-invoke) | Function-to-function `invoke()` |
|
|
223
225
|
| [10-stages-and-config](https://github.com/ak9347128658/serverless_kit/tree/main/examples/10-stages-and-config) | Stages, variables, secrets |
|
|
224
226
|
| [11-custom-terraform](https://github.com/ak9347128658/serverless_kit/tree/main/examples/11-custom-terraform) | `terraform.extra`, `${tf:...}`, remote state, hooks |
|