py-serverless-kit 0.1.0__py3-none-any.whl
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/__init__.py +47 -0
- py_serverless_kit/__main__.py +3 -0
- py_serverless_kit/_version.py +2 -0
- py_serverless_kit/cli/__init__.py +0 -0
- py_serverless_kit/cli/main.py +491 -0
- py_serverless_kit/cli/templates.py +212 -0
- py_serverless_kit/config/__init__.py +12 -0
- py_serverless_kit/config/loader.py +316 -0
- py_serverless_kit/config/schema.py +457 -0
- py_serverless_kit/core/__init__.py +0 -0
- py_serverless_kit/core/deployer.py +180 -0
- py_serverless_kit/core/describe.py +112 -0
- py_serverless_kit/core/project.py +147 -0
- py_serverless_kit/dashboard/__init__.py +3 -0
- py_serverless_kit/dashboard/generator.py +65 -0
- py_serverless_kit/dashboard/template.html +248 -0
- py_serverless_kit/local/__init__.py +3 -0
- py_serverless_kit/local/runner.py +234 -0
- py_serverless_kit/local/server.py +200 -0
- py_serverless_kit/packaging/__init__.py +3 -0
- py_serverless_kit/packaging/builder.py +252 -0
- py_serverless_kit/providers/__init__.py +15 -0
- py_serverless_kit/providers/alibaba.py +268 -0
- py_serverless_kit/providers/aws.py +508 -0
- py_serverless_kit/providers/azure.py +417 -0
- py_serverless_kit/providers/base.py +310 -0
- py_serverless_kit/providers/cloudflare.py +264 -0
- py_serverless_kit/providers/digitalocean.py +211 -0
- py_serverless_kit/providers/gcp.py +480 -0
- py_serverless_kit/providers/huawei.py +292 -0
- py_serverless_kit/providers/ibm.py +132 -0
- py_serverless_kit/providers/oracle.py +304 -0
- py_serverless_kit/providers/registry.py +60 -0
- py_serverless_kit/providers/schedule.py +153 -0
- py_serverless_kit/providers/tencent.py +275 -0
- py_serverless_kit/providers/terraform_doc.py +125 -0
- py_serverless_kit/runtime/__init__.py +6 -0
- py_serverless_kit/runtime/adapters/__init__.py +18 -0
- py_serverless_kit/runtime/adapters/_httpfn.py +91 -0
- py_serverless_kit/runtime/adapters/alibaba.py +147 -0
- py_serverless_kit/runtime/adapters/aws.py +201 -0
- py_serverless_kit/runtime/adapters/azure.py +185 -0
- py_serverless_kit/runtime/adapters/base.py +86 -0
- py_serverless_kit/runtime/adapters/cloudflare.py +126 -0
- py_serverless_kit/runtime/adapters/digitalocean.py +74 -0
- py_serverless_kit/runtime/adapters/gcp.py +176 -0
- py_serverless_kit/runtime/adapters/huawei.py +173 -0
- py_serverless_kit/runtime/adapters/ibm.py +91 -0
- py_serverless_kit/runtime/adapters/oracle.py +161 -0
- py_serverless_kit/runtime/adapters/tencent.py +151 -0
- py_serverless_kit/runtime/batch.py +47 -0
- py_serverless_kit/runtime/context.py +45 -0
- py_serverless_kit/runtime/dispatch.py +277 -0
- py_serverless_kit/runtime/errors.py +83 -0
- py_serverless_kit/runtime/event.py +267 -0
- py_serverless_kit/runtime/invoke.py +119 -0
- py_serverless_kit/runtime/log.py +69 -0
- py_serverless_kit/runtime/manifest.py +121 -0
- py_serverless_kit/runtime/response.py +177 -0
- py_serverless_kit/runtime/routing.py +74 -0
- py_serverless_kit/runtime/workflow.py +312 -0
- py_serverless_kit/terraform/__init__.py +3 -0
- py_serverless_kit/terraform/runner.py +104 -0
- py_serverless_kit/workflows/__init__.py +35 -0
- py_serverless_kit/workflows/asl.py +170 -0
- py_serverless_kit/workflows/gcp.py +328 -0
- py_serverless_kit-0.1.0.dist-info/METADATA +300 -0
- py_serverless_kit-0.1.0.dist-info/RECORD +71 -0
- py_serverless_kit-0.1.0.dist-info/WHEEL +4 -0
- py_serverless_kit-0.1.0.dist-info/entry_points.txt +3 -0
- py_serverless_kit-0.1.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: py-serverless-kit
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Write a Python serverless function once and deploy it to AWS, Azure, GCP and 7 more clouds with one YAML file, powered by Terraform.
|
|
5
|
+
Project-URL: Homepage, https://github.com/kavion-ai/py-serverless-kit
|
|
6
|
+
Project-URL: Documentation, https://github.com/kavion-ai/py-serverless-kit/tree/main/docs
|
|
7
|
+
Project-URL: Issues, https://github.com/kavion-ai/py-serverless-kit/issues
|
|
8
|
+
Project-URL: Changelog, https://github.com/kavion-ai/py-serverless-kit/blob/main/CHANGELOG.md
|
|
9
|
+
Author: Asif Khan @ Kavion.ai
|
|
10
|
+
Maintainer: Asif Khan @ Kavion.ai
|
|
11
|
+
License: MIT
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Keywords: aws,azure,faas,gcp,lambda,multi-cloud,serverless,step-functions,terraform
|
|
14
|
+
Classifier: Development Status :: 4 - Beta
|
|
15
|
+
Classifier: Environment :: Console
|
|
16
|
+
Classifier: Intended Audience :: Developers
|
|
17
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
18
|
+
Classifier: Operating System :: OS Independent
|
|
19
|
+
Classifier: Programming Language :: Python :: 3
|
|
20
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
24
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
25
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
26
|
+
Classifier: Topic :: Software Development :: Build Tools
|
|
27
|
+
Classifier: Topic :: System :: Distributed Computing
|
|
28
|
+
Classifier: Typing :: Typed
|
|
29
|
+
Requires-Python: >=3.9
|
|
30
|
+
Requires-Dist: click>=8.1
|
|
31
|
+
Requires-Dist: pydantic<3,>=2.5
|
|
32
|
+
Requires-Dist: pyyaml>=6.0
|
|
33
|
+
Provides-Extra: aws
|
|
34
|
+
Requires-Dist: boto3>=1.28; extra == 'aws'
|
|
35
|
+
Provides-Extra: dev
|
|
36
|
+
Requires-Dist: build>=1.0; extra == 'dev'
|
|
37
|
+
Requires-Dist: mypy>=1.8; extra == 'dev'
|
|
38
|
+
Requires-Dist: pytest-cov>=4.1; extra == 'dev'
|
|
39
|
+
Requires-Dist: pytest>=7.4; extra == 'dev'
|
|
40
|
+
Requires-Dist: ruff>=0.5; extra == 'dev'
|
|
41
|
+
Requires-Dist: twine>=5.0; extra == 'dev'
|
|
42
|
+
Requires-Dist: types-pyyaml; extra == 'dev'
|
|
43
|
+
Description-Content-Type: text/markdown
|
|
44
|
+
|
|
45
|
+
# py-serverless-kit
|
|
46
|
+
|
|
47
|
+
**Write your Python functions once. Deploy them to any of 10 clouds by changing one line of YAML.**
|
|
48
|
+
|
|
49
|
+
`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.
|
|
50
|
+
|
|
51
|
+
```python
|
|
52
|
+
# app/handlers.py - identical on AWS, Azure, GCP, Alibaba, Oracle, IBM, DigitalOcean, Tencent, Huawei, Cloudflare
|
|
53
|
+
from py_serverless_kit import Event, Context, NotFound
|
|
54
|
+
|
|
55
|
+
def get_order(event: Event, ctx: Context):
|
|
56
|
+
order = ORDERS.get(event.http.path_params["id"])
|
|
57
|
+
if order is None:
|
|
58
|
+
raise NotFound("no such order") # -> HTTP 404 JSON on every cloud
|
|
59
|
+
return order # -> HTTP 200 JSON
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
```yaml
|
|
63
|
+
# pskit.yml
|
|
64
|
+
service: orders
|
|
65
|
+
provider:
|
|
66
|
+
name: aws # <- change to gcp, azure, alibaba, ... and redeploy. That's the migration.
|
|
67
|
+
region: us-east-1
|
|
68
|
+
functions:
|
|
69
|
+
get-order:
|
|
70
|
+
handler: app.handlers.get_order
|
|
71
|
+
events:
|
|
72
|
+
- http: GET /orders/{id}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
pskit deploy # terraform apply on AWS
|
|
77
|
+
pskit deploy --provider gcp # same code, Google Cloud Functions
|
|
78
|
+
pskit dashboard --open # every function, trigger, URL and resource id
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Why
|
|
84
|
+
|
|
85
|
+
Teams that build on AWS Lambda and Step Functions end up with code full of API Gateway event parsing, SQS record loops and hand-written ASL. When the business needs another cloud, every function has to be rewritten. `py-serverless-kit` fixes this at both layers:
|
|
86
|
+
|
|
87
|
+
| Layer | Locked-in way | With pskit |
|
|
88
|
+
|---|---|---|
|
|
89
|
+
| Handler code | Parses `event["requestContext"]["http"]["method"]`, `Records[].body`, ... | Uses `event.http.method`, `event.records[].body`: the same on every cloud |
|
|
90
|
+
| Triggers / infra | SAM / CloudFormation / console clicks | One `pskit.yml`, rendered to Terraform for the target cloud |
|
|
91
|
+
| Workflows | Step Functions ASL | Portable state machine, compiled to Step Functions, Google Cloud Workflows, or run by the built-in engine everywhere else |
|
|
92
|
+
| Visibility | One console per cloud | One generated dashboard across all clouds and stages |
|
|
93
|
+
|
|
94
|
+
## Features
|
|
95
|
+
|
|
96
|
+
- **10 providers:** AWS Lambda, Azure Functions, Google Cloud Functions (gen2), Alibaba Function Compute, Oracle Functions, IBM Code Engine, DigitalOcean Functions, Tencent SCF, Huawei FunctionGraph, Cloudflare Workers.
|
|
97
|
+
- **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()`.
|
|
98
|
+
- **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`.
|
|
99
|
+
- **Terraform underneath:** real, reviewable `main.tf.json`, any backend (S3, GCS, azurerm, ...), works with OpenTofu. Escape hatches: `terraform.extra`, `${tf:...}` references, per-function `options`.
|
|
100
|
+
- **Config that scales:** `extends:`, per-provider `providers:` blocks, per-stage `stages:` blocks, and `${env:}`, `${opt:}`, `${self:}`, `${file()}` variables.
|
|
101
|
+
- **Local dev:** `pskit dev` (hot-reloading HTTP server), `pskit invoke` with synthetic queue/storage/schedule events, and a `LocalRunner` for pytest.
|
|
102
|
+
- **Dashboard:** a self-contained `index.html` listing every deployment, function, trigger, endpoint, ARN/id, console link and workflow.
|
|
103
|
+
- **Production details:** deterministic artifacts (no redeploy when nothing changed), partial batch failures (`BatchResult`), structured JSON logs, consistent HTTP error mapping, stack traces hidden from clients, a stdlib-only runtime (no extra dependencies inside your function), and hooks (`before_deploy`, ...).
|
|
104
|
+
|
|
105
|
+
## Supported providers
|
|
106
|
+
|
|
107
|
+
| Provider | Tier | HTTP | Schedule | Queue | Storage | Topic | Workflows |
|
|
108
|
+
|---|---|:-:|:-:|:-:|:-:|:-:|---|
|
|
109
|
+
| AWS Lambda | stable | ✅ | ✅ | ✅ SQS | ✅ S3 | ✅ SNS | native (Step Functions) |
|
|
110
|
+
| Google Cloud Functions | stable | ✅ | ✅ | ✅ Pub/Sub | ✅ GCS | ✅ Pub/Sub | native (Cloud Workflows) |
|
|
111
|
+
| Azure Functions | stable | ✅ | ✅ | ✅ Storage Queue | ✅ Blob | ✅ Service Bus | embedded |
|
|
112
|
+
| Alibaba Function Compute | beta | ✅ | ✅ | – | ✅ OSS | ✅ MNS | embedded |
|
|
113
|
+
| Huawei FunctionGraph | beta | ✅ | ✅ | – | ✅ OBS | ✅ SMN | embedded |
|
|
114
|
+
| Tencent SCF | beta | ✅ | ✅ | – | ✅ COS | – | embedded |
|
|
115
|
+
| DigitalOcean Functions | beta | ✅ | ✅ | – | – | – | embedded |
|
|
116
|
+
| IBM Code Engine | beta | ✅ | – | – | – | – | embedded |
|
|
117
|
+
| Oracle Cloud Functions | experimental | ✅ | – | – | ✅ | – | embedded |
|
|
118
|
+
| Cloudflare Workers (Python) | experimental | ✅ | ✅ | – | – | – | embedded |
|
|
119
|
+
|
|
120
|
+
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.**
|
|
121
|
+
|
|
122
|
+
> **Maturity, honestly stated:** the Terraform generated for every provider is checked with `terraform validate` against the real provider plugins (in CI, too). The *stable* providers cover the most surface area. *beta* and *experimental* providers follow vendor docs for event payloads that `validate` can't check, so try them on a non-production account first. See [docs/providers.md](docs/providers.md) for each provider's details and limits.
|
|
123
|
+
|
|
124
|
+
## Install
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
pip install py-serverless-kit
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
You also need **Terraform ≥ 1.5** (or OpenTofu) on your `PATH`, plus credentials for your cloud. See [Getting started](docs/getting-started.md#cloud-credentials).
|
|
131
|
+
|
|
132
|
+
## Quick start
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
pskit init my-api --provider aws --template full # templates: http | events | workflow | full
|
|
136
|
+
cd my-api
|
|
137
|
+
pskit dev # http://127.0.0.1:3000/hello
|
|
138
|
+
pskit invoke -f hello --path "/hello?name=Ada"
|
|
139
|
+
pskit workflow run order-pipeline -i '{"amount": 42}'
|
|
140
|
+
pskit deploy --stage dev
|
|
141
|
+
pskit info
|
|
142
|
+
pskit dashboard --open
|
|
143
|
+
pskit remove --stage dev
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Move to another cloud
|
|
147
|
+
|
|
148
|
+
Change `provider.name`, or keep one file with per-cloud blocks:
|
|
149
|
+
|
|
150
|
+
```yaml
|
|
151
|
+
provider:
|
|
152
|
+
name: aws
|
|
153
|
+
region: us-east-1
|
|
154
|
+
providers: # applied only when that provider is selected
|
|
155
|
+
gcp: {region: europe-west1, options: {project: my-project}}
|
|
156
|
+
azure: {region: westeurope, options: {subscription_id: "${env:ARM_SUBSCRIPTION_ID}"}}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
pskit deploy --provider gcp
|
|
161
|
+
pskit deploy --provider azure --stage prod
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Triggers at a glance
|
|
165
|
+
|
|
166
|
+
```yaml
|
|
167
|
+
functions:
|
|
168
|
+
api:
|
|
169
|
+
handler: app.api.handle
|
|
170
|
+
events:
|
|
171
|
+
- http: {method: POST, path: /orders, cors: true}
|
|
172
|
+
- http: GET /orders/{id}
|
|
173
|
+
nightly:
|
|
174
|
+
handler: app.jobs.nightly
|
|
175
|
+
events:
|
|
176
|
+
- schedule: {cron: "0 2 * * *", input: {report: daily}, timezone: Europe/Berlin}
|
|
177
|
+
worker:
|
|
178
|
+
handler: app.jobs.process
|
|
179
|
+
timeout: 60
|
|
180
|
+
events:
|
|
181
|
+
- queue: {name: orders, batch_size: 10, dead_letter: orders-dlq}
|
|
182
|
+
thumbnails:
|
|
183
|
+
handler: app.media.on_upload
|
|
184
|
+
events:
|
|
185
|
+
- storage: {bucket: my-uploads-bucket, events: [created], suffix: .jpg}
|
|
186
|
+
audit:
|
|
187
|
+
handler: app.audit.on_event
|
|
188
|
+
events:
|
|
189
|
+
- topic: order-events
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
```python
|
|
193
|
+
from py_serverless_kit import BatchResult, Event, Context
|
|
194
|
+
|
|
195
|
+
def process(event: Event, ctx: Context):
|
|
196
|
+
result = BatchResult() # retry only failed messages where the cloud supports it
|
|
197
|
+
for record in event.records:
|
|
198
|
+
try:
|
|
199
|
+
handle(record.json())
|
|
200
|
+
except Exception:
|
|
201
|
+
result.fail(record)
|
|
202
|
+
return result
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### Workflows (portable Step Functions)
|
|
206
|
+
|
|
207
|
+
```yaml
|
|
208
|
+
workflows:
|
|
209
|
+
order-pipeline:
|
|
210
|
+
start_at: Validate
|
|
211
|
+
states:
|
|
212
|
+
Validate:
|
|
213
|
+
type: task
|
|
214
|
+
function: validate-order
|
|
215
|
+
retry: [{errors: [TimeoutError], max_attempts: 3, backoff_rate: 2}]
|
|
216
|
+
catch: [{errors: [ValueError], next: Rejected}]
|
|
217
|
+
next: Route
|
|
218
|
+
Route:
|
|
219
|
+
type: choice
|
|
220
|
+
choices: [{variable: "$.amount", gt: 1000, next: ManualReview}]
|
|
221
|
+
default: Charge
|
|
222
|
+
ManualReview: {type: wait, seconds: 3600, next: Charge}
|
|
223
|
+
Charge: {type: task, function: charge-order, end: true}
|
|
224
|
+
Rejected: {type: fail, error: OrderRejected}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
The same definition becomes **AWS Step Functions** on AWS, **Google Cloud Workflows** on GCP, and an **embedded orchestrator function** on the other clouds. `pskit workflow show order-pipeline --format asl` prints the generated ASL.
|
|
228
|
+
|
|
229
|
+
## How it works
|
|
230
|
+
|
|
231
|
+
```
|
|
232
|
+
pskit.yml ──► config loader ──► provider validation ──► packager ──────────► artifact.zip
|
|
233
|
+
(extends, providers:, (capabilities, (your code + stdlib-only
|
|
234
|
+
stages:, ${vars}) limits, runtimes) runtime + manifest + shim)
|
|
235
|
+
│
|
|
236
|
+
▼
|
|
237
|
+
provider renderer ──► .pskit/<provider>-<stage>/main.tf.json
|
|
238
|
+
│ terraform init / apply
|
|
239
|
+
▼
|
|
240
|
+
deployment.json ──► dashboard/index.html
|
|
241
|
+
|
|
242
|
+
At runtime: cloud event ──► shim ──► runtime.adapters.<cloud> ──► Event ──► your handler
|
|
243
|
+
your result ──► Response / raw value ──► adapter ──► native cloud response
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
More: [docs/architecture.md](docs/architecture.md).
|
|
247
|
+
|
|
248
|
+
## Examples
|
|
249
|
+
|
|
250
|
+
Fifteen runnable scenarios live in [`examples/`](examples/). They are tested in CI.
|
|
251
|
+
|
|
252
|
+
| | |
|
|
253
|
+
|---|---|
|
|
254
|
+
| [01-hello-http](examples/01-hello-http) | Minimal HTTP function |
|
|
255
|
+
| [02-rest-api](examples/02-rest-api) | CRUD, path params, validation errors, CORS, cookies, binary, JWT |
|
|
256
|
+
| [03-scheduled-jobs](examples/03-scheduled-jobs) | rate/cron schedules with input and time zones |
|
|
257
|
+
| [04-queue-worker](examples/04-queue-worker) | Queue consumer, partial batch failures, dead-letter queue |
|
|
258
|
+
| [05-storage-events](examples/05-storage-events) | Object created/deleted with filters |
|
|
259
|
+
| [06-pubsub-topic](examples/06-pubsub-topic) | Topic fan-out and filters |
|
|
260
|
+
| [07-workflow-orders](examples/07-workflow-orders) | Every workflow state type, retry/catch |
|
|
261
|
+
| [08-multi-cloud](examples/08-multi-cloud) | Same code, all 10 providers |
|
|
262
|
+
| [09-function-invoke](examples/09-function-invoke) | Function-to-function `invoke()` |
|
|
263
|
+
| [10-stages-and-config](examples/10-stages-and-config) | Stages, variables, secrets |
|
|
264
|
+
| [11-custom-terraform](examples/11-custom-terraform) | `terraform.extra`, `${tf:...}`, remote state, hooks |
|
|
265
|
+
| [12-async-and-context](examples/12-async-and-context) | async handlers, logging, deadlines |
|
|
266
|
+
| [13-migrate-from-aws-lambda](examples/13-migrate-from-aws-lambda) | Before/after migration of Lambda + Step Functions |
|
|
267
|
+
| [14-testing](examples/14-testing) | Unit-testing handlers and workflows with pytest |
|
|
268
|
+
| [15-ci-cd-deploy](examples/15-ci-cd-deploy) | GitHub Actions deploys per stage |
|
|
269
|
+
|
|
270
|
+
## Documentation
|
|
271
|
+
|
|
272
|
+
| | |
|
|
273
|
+
|---|---|
|
|
274
|
+
| [Getting started](docs/getting-started.md) | Install, credentials, first deploy |
|
|
275
|
+
| [Configuration reference](docs/configuration.md) | Every `pskit.yml` key, variables, `extends`, stages |
|
|
276
|
+
| [Events](docs/events.md) | HTTP, schedule, queue, storage, topic, with a per-provider matrix |
|
|
277
|
+
| [Handler API](docs/handlers.md) | `Event`, `Context`, `Response`, errors, `BatchResult`, `invoke()` |
|
|
278
|
+
| [Workflows](docs/workflows.md) | State machine reference, engines, limitations |
|
|
279
|
+
| [Providers](docs/providers.md) | Options, credentials, resources and limits per cloud |
|
|
280
|
+
| [CLI](docs/cli.md) | Every command and flag |
|
|
281
|
+
| [Local development](docs/local-development.md) | `pskit dev`, `invoke`, testing |
|
|
282
|
+
| [Dashboard](docs/dashboard.md) | The deployment UI |
|
|
283
|
+
| [Architecture](docs/architecture.md) | Internals and third-party providers |
|
|
284
|
+
| [Migrating from AWS](docs/migrating-from-aws.md) | Lambda + Step Functions → pskit |
|
|
285
|
+
| [Troubleshooting](docs/troubleshooting.md) | Common errors and fixes |
|
|
286
|
+
|
|
287
|
+
## Contributing & releasing
|
|
288
|
+
|
|
289
|
+
- Contributor guide: [deploy_docs/CONTRIBUTING.md](deploy_docs/CONTRIBUTING.md)
|
|
290
|
+
- Quick PyPI release guide: [deploy_docs/How_to_deploy.md](deploy_docs/How_to_deploy.md)
|
|
291
|
+
- Publishing to PyPI (step by step): [deploy_docs/PUBLISHING_TO_PYPI.md](deploy_docs/PUBLISHING_TO_PYPI.md)
|
|
292
|
+
- Security policy: [SECURITY.md](SECURITY.md)
|
|
293
|
+
|
|
294
|
+
## Author
|
|
295
|
+
|
|
296
|
+
Created and maintained by **Asif Khan @ [Kavion.ai](https://kavion.ai)**.
|
|
297
|
+
|
|
298
|
+
## License
|
|
299
|
+
|
|
300
|
+
MIT, see [LICENSE](LICENSE).
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
py_serverless_kit/__init__.py,sha256=Lc2v9E64SOic8bnbTXBW5a4_k5lHNiszewJRM_Ga0Zk,1199
|
|
2
|
+
py_serverless_kit/__main__.py,sha256=3MIhUB-AkMyd_bVfNAdzV9zd_X81dbyXPOfucvwhJ20,35
|
|
3
|
+
py_serverless_kit/_version.py,sha256=-ran-EJeM12RxR5V_X3q7UidaDbHeaUfcmeKnKo7NGw,59
|
|
4
|
+
py_serverless_kit/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
|
+
py_serverless_kit/cli/main.py,sha256=VOpi-3Th6OdscG7t2ri3wwnzQrGCDAXZeRwqtjiSYlA,20142
|
|
6
|
+
py_serverless_kit/cli/templates.py,sha256=O145ZjFS_DaQAU8vZhtPmjSEsmVWFrhn8SNXTC-Z4RA,5842
|
|
7
|
+
py_serverless_kit/config/__init__.py,sha256=iYl3gFvYIB0N9j5VmIrnA3L_OcVi-kbRewDFmgbdQ5k,291
|
|
8
|
+
py_serverless_kit/config/loader.py,sha256=PvecFZpLq4H_6PzUs5CLZaUCECVGj_Ge9MXW4030MHk,12040
|
|
9
|
+
py_serverless_kit/config/schema.py,sha256=49VlbCOOeuAe5wLwsDwBhYihQZlwzcNvPRfEcUyY0Sg,17467
|
|
10
|
+
py_serverless_kit/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
|
+
py_serverless_kit/core/deployer.py,sha256=_pfbS-H7Eh-VbJtJyZ8LUtTRyVqE_VMcyatxhp_8Nzc,6950
|
|
12
|
+
py_serverless_kit/core/describe.py,sha256=iU4NxKCC8ph8k_KRMhGnpbYpDVDd46tlUOFrjOEoFWw,4400
|
|
13
|
+
py_serverless_kit/core/project.py,sha256=3UESb8_ZJVQesqSqNjpUozSuQ4NDTbaaIkKX_7k2CLE,6135
|
|
14
|
+
py_serverless_kit/dashboard/__init__.py,sha256=U3vfHz9qRDhO9vVMaJTcfHohWCWWFXgURNgJU69US8Q,164
|
|
15
|
+
py_serverless_kit/dashboard/generator.py,sha256=T_lX-PtvYRMN9GRuF8fwioIwu7Z4jP1kqjNCwwiUkcA,2556
|
|
16
|
+
py_serverless_kit/dashboard/template.html,sha256=IKubc_Yxum5yieX3D74lVnECc11fUpAHS_xMp37uoI0,14788
|
|
17
|
+
py_serverless_kit/local/__init__.py,sha256=EGmRyTqbe3LSZXOqY1XiCQsBNRKclDV7W6oFVEmjwlg,139
|
|
18
|
+
py_serverless_kit/local/runner.py,sha256=sevTMXtW4OrJlFFFcwzlUvZvj0l2DT1-inda1XgiFQI,9345
|
|
19
|
+
py_serverless_kit/local/server.py,sha256=BZ2Vub1khatbXJWsc0rRBXFo8_2h4pA5C13Pq7h4zfA,8947
|
|
20
|
+
py_serverless_kit/packaging/__init__.py,sha256=Xuk0SK_dQxsp4FJO_d7n1Gdsh7by5me1xdaimKzfvUU,128
|
|
21
|
+
py_serverless_kit/packaging/builder.py,sha256=qPULdYQzzXiDZ8P59cWYTNGdyHSaLluHiBfkgoVL-fk,8705
|
|
22
|
+
py_serverless_kit/providers/__init__.py,sha256=68S17yBbM7iXvHf42mS-yzIlD-jPPZQtXK3YjFVZztM,355
|
|
23
|
+
py_serverless_kit/providers/alibaba.py,sha256=XvJg0DdIl3WEo4xBQh_XSEQmFKTB7dRh78cEbsY4mSg,11689
|
|
24
|
+
py_serverless_kit/providers/aws.py,sha256=uBM1Yhv5QHr9PoTUemkbghCpRr2R_qEiYtumgSJvlh4,22852
|
|
25
|
+
py_serverless_kit/providers/azure.py,sha256=ZFWh5QhlcEd1CntjY7_EpGhptS83gQQjLhEWS_FvfA0,20075
|
|
26
|
+
py_serverless_kit/providers/base.py,sha256=Wrm1YHziNSRYpoS6bLgYcJqMVdTtA0DM0iwJBDwTmWI,11862
|
|
27
|
+
py_serverless_kit/providers/cloudflare.py,sha256=7yFDhw0TPYORHiW2b1zOtW1C8YMpTiLdXq6ldARbcwg,11032
|
|
28
|
+
py_serverless_kit/providers/digitalocean.py,sha256=Nj6mktijYfYih-7cMoDcf29nOg72WCfqPcqaQ1dHBuI,8777
|
|
29
|
+
py_serverless_kit/providers/gcp.py,sha256=82rKRHMkQ9wXI30fgGoqU-X7TXHvONSRzdrND7bHhcQ,21281
|
|
30
|
+
py_serverless_kit/providers/huawei.py,sha256=PNNvhT3PlmpiYsgiU2tXOv5X0wtmRyErXg_LwUzWChU,12616
|
|
31
|
+
py_serverless_kit/providers/ibm.py,sha256=wh7HRWPJkaAng_AVr49_zv28Nwg8pv2RkkPCa3qhvGA,5813
|
|
32
|
+
py_serverless_kit/providers/oracle.py,sha256=kgl_C2r0gci2Ya9eypvnivI5-hzVjDBJ4KC8UeFThFc,13577
|
|
33
|
+
py_serverless_kit/providers/registry.py,sha256=O5DdPn2oAukBQfnERnbsqzzOTKrV6UdKQjr4rWd6_Ho,2202
|
|
34
|
+
py_serverless_kit/providers/schedule.py,sha256=Y-30z9aFg5arb5kv_Fhm4OKNAE8lUAcV7WXhjuQo2V0,5030
|
|
35
|
+
py_serverless_kit/providers/tencent.py,sha256=axC3WUz9mPmA48obSxrJhE-TudNof69vLEmd6IILmdE,11918
|
|
36
|
+
py_serverless_kit/providers/terraform_doc.py,sha256=z79ggz9XOln5d-qiNk77_XqX5gC41dFXwlbtkKHP4RI,4732
|
|
37
|
+
py_serverless_kit/runtime/__init__.py,sha256=bJk26VXGDwIy9pTmdxWvFpay6CCIiz9tqe1LJt61afM,265
|
|
38
|
+
py_serverless_kit/runtime/batch.py,sha256=_gTHwc7CDuNpz0bxGSMJizCIbpWmXf16Ybwxi6d7LPM,1428
|
|
39
|
+
py_serverless_kit/runtime/context.py,sha256=2vroIt1cdLt85VLR7SJEGlqawyQQYF7vRhiNCyafrZM,1582
|
|
40
|
+
py_serverless_kit/runtime/dispatch.py,sha256=wesn_-MgNTXjb9csKuNlRhKJJSxOklp9uJvgAjUDATg,11169
|
|
41
|
+
py_serverless_kit/runtime/errors.py,sha256=CG2oSkQRsRLdhkJeD1RjkJeevt4TY_Bq_wQykT0XUFw,1951
|
|
42
|
+
py_serverless_kit/runtime/event.py,sha256=Fza-ARJ-rVYJuiwQYTcTQ4gNjl2ETdAZCxbpXMz_KXk,8690
|
|
43
|
+
py_serverless_kit/runtime/invoke.py,sha256=gGGYryAz_DLluB0mD9_nda3c4jgPn_rw_tkTAeQI9G0,5057
|
|
44
|
+
py_serverless_kit/runtime/log.py,sha256=YcpevZBTeSYtoe1x9f8N_YlMRnKbZuhgn5yUn9DjeXQ,2610
|
|
45
|
+
py_serverless_kit/runtime/manifest.py,sha256=ZEYqytO1eay2kOFfdl1lgLGDqLnMteMJm6ZdzO_aG04,4126
|
|
46
|
+
py_serverless_kit/runtime/response.py,sha256=uybQq5Bdfxndx3iI0yd6uaVcC9Xjg9Lx50k8wrTX61U,6582
|
|
47
|
+
py_serverless_kit/runtime/routing.py,sha256=325FzIaUL12izr03BaSc2Pb9gSS-UThFNFhARwerkzc,2695
|
|
48
|
+
py_serverless_kit/runtime/workflow.py,sha256=eFgfaFxiAWcByeUBgCQeakdYWZPAnJC0agdqZaZCO5g,12515
|
|
49
|
+
py_serverless_kit/runtime/adapters/__init__.py,sha256=ucpqTcbdTVa0RgXZPHmTui1cHKtoc5Q9-zOLZzJOwAI,382
|
|
50
|
+
py_serverless_kit/runtime/adapters/_httpfn.py,sha256=1V6_JihKm45kPiK58c2mfVxfHETMbvGo1F_SoTho0zs,3558
|
|
51
|
+
py_serverless_kit/runtime/adapters/alibaba.py,sha256=ronsIwovHil-6BZZoObvSDXp58hueqRxuIYq4R1mMt4,5776
|
|
52
|
+
py_serverless_kit/runtime/adapters/aws.py,sha256=aCBL2238LRKy9W2KMWl_1x5Mku5FAhq1JCDjOaMPeoI,8054
|
|
53
|
+
py_serverless_kit/runtime/adapters/azure.py,sha256=klj_qjTSvewoZ963KsmeTAqg-LpXrpqnFkfB5Ll4dTU,6692
|
|
54
|
+
py_serverless_kit/runtime/adapters/base.py,sha256=AeTBnMw6IvsofYSycASlSOUgaZasZn6Xp_0VfBW61jk,2565
|
|
55
|
+
py_serverless_kit/runtime/adapters/cloudflare.py,sha256=pWKzZE-MoozdkMM3CwhEKfSYuxmaUntG6ik-5_ivrbc,4366
|
|
56
|
+
py_serverless_kit/runtime/adapters/digitalocean.py,sha256=NZ7wxguyWV-OA30k9NkxUjjBY67CaZFbZzLepgQSx-s,3006
|
|
57
|
+
py_serverless_kit/runtime/adapters/gcp.py,sha256=32tD85hZ8jd2ztnvu0-GLJwH4KgmaOoP7sQ2wG-hLug,7101
|
|
58
|
+
py_serverless_kit/runtime/adapters/huawei.py,sha256=LdLnD_Z65ZOJVYnsPZQq6azxBTF738SP-kbhvYIvINE,6437
|
|
59
|
+
py_serverless_kit/runtime/adapters/ibm.py,sha256=5cWJsRXplZokYLtvQJQpQdiRzzzCWuRY4HZ-REqDc6s,3245
|
|
60
|
+
py_serverless_kit/runtime/adapters/oracle.py,sha256=cBgUauTJR6qHqt46__jWGJcjbZ5peEL1Mad_XBFEnV0,6039
|
|
61
|
+
py_serverless_kit/runtime/adapters/tencent.py,sha256=Y3IQTdBIhwxgo5sG4Ai4URG1mYPdYZYCYaOSWvOPPNw,5897
|
|
62
|
+
py_serverless_kit/terraform/__init__.py,sha256=G3Yv2CcQsT2qKgKjH6zpdNRMQujb1bQOeAAf7FxtJmM,129
|
|
63
|
+
py_serverless_kit/terraform/runner.py,sha256=UWj967MU9lZ5dY709MaBk7-e6H40FSzH1U7T8DiTlhY,3755
|
|
64
|
+
py_serverless_kit/workflows/__init__.py,sha256=kiBOsnxHk8FqFCV7_Z0Evc4J0ygpDPmQJy_CPs4ecj4,1107
|
|
65
|
+
py_serverless_kit/workflows/asl.py,sha256=5UFBfAKUaWjGlq4xG2bM_VrcZnLwsfZWD-Re4dCdeIA,6532
|
|
66
|
+
py_serverless_kit/workflows/gcp.py,sha256=_t1Kj3D9Cb9_NhwJ-FIpxK5A96jODf9w_vn0-r8Ixlc,14568
|
|
67
|
+
py_serverless_kit-0.1.0.dist-info/METADATA,sha256=j59FWmDAGpbTpUPdYpKYoqQ9KK11JusZ5usMiN0y12M,14679
|
|
68
|
+
py_serverless_kit-0.1.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
|
|
69
|
+
py_serverless_kit-0.1.0.dist-info/entry_points.txt,sha256=I-fW8cddXp3EkwMyijn1KuLGZ0MungQBPpjJ5Ey7xuY,110
|
|
70
|
+
py_serverless_kit-0.1.0.dist-info/licenses/LICENSE,sha256=i-WgXn7_Gua7z8_iZsNK0mhS5fug1fqYEoLgF-4FyXs,1078
|
|
71
|
+
py_serverless_kit-0.1.0.dist-info/RECORD,,
|
|
@@ -0,0 +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.
|