stackport 0.2.1__tar.gz → 0.2.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {stackport-0.2.1/stackport.egg-info → stackport-0.2.3}/PKG-INFO +5 -5
- {stackport-0.2.1 → stackport-0.2.3}/README.md +4 -4
- {stackport-0.2.1 → stackport-0.2.3}/backend/routes/dynamodb.py +1 -7
- {stackport-0.2.1 → stackport-0.2.3}/backend/routes/s3.py +1 -28
- stackport-0.2.3/backend/routes/sqs.py +575 -0
- {stackport-0.2.1 → stackport-0.2.3}/backend/routes/tags.py +1 -15
- stackport-0.2.3/backend/schemas/__init__.py +11 -0
- stackport-0.2.3/backend/schemas/dynamodb.py +10 -0
- stackport-0.2.3/backend/schemas/s3.py +30 -0
- stackport-0.2.3/backend/schemas/sqs.py +80 -0
- stackport-0.2.3/backend/schemas/tags.py +17 -0
- {stackport-0.2.1 → stackport-0.2.3}/pyproject.toml +1 -1
- {stackport-0.2.1 → stackport-0.2.3/stackport.egg-info}/PKG-INFO +5 -5
- {stackport-0.2.1 → stackport-0.2.3}/stackport.egg-info/SOURCES.txt +9 -4
- stackport-0.2.3/tests/test_sqs_routes.py +776 -0
- stackport-0.2.3/ui/dist/assets/index-B2xjVeE-.js +609 -0
- stackport-0.2.3/ui/dist/assets/index-D_vb_J84.css +1 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/index.html +2 -2
- stackport-0.2.1/backend/routes/sqs.py +0 -308
- stackport-0.2.1/tests/test_sqs_routes.py +0 -290
- stackport-0.2.1/ui/dist/assets/index-BNpVm9Z9.js +0 -568
- stackport-0.2.1/ui/dist/assets/index-CgkBNKzX.css +0 -1
- {stackport-0.2.1 → stackport-0.2.3}/LICENSE +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/MANIFEST.in +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/backend/__init__.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/backend/aws_client.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/backend/cache.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/backend/cli.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/backend/config.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/backend/main.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/backend/routes/__init__.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/backend/routes/common.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/backend/routes/ec2.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/backend/routes/endpoints.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/backend/routes/iam.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/backend/routes/lambda_svc.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/backend/routes/logs.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/backend/routes/resources.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/backend/routes/secretsmanager.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/backend/routes/stats.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/backend/websocket.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/setup.cfg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/stackport.egg-info/dependency_links.txt +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/stackport.egg-info/entry_points.txt +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/stackport.egg-info/requires.txt +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/stackport.egg-info/top_level.txt +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/tests/test_cache.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/tests/test_cli.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/tests/test_client.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/tests/test_config.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/tests/test_dynamodb_routes.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/tests/test_ec2_routes.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/tests/test_endpoints.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/tests/test_iam_routes.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/tests/test_lambda_routes.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/tests/test_logs_routes.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/tests/test_multi_endpoint.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/tests/test_readonly_middleware.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/tests/test_registries.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/tests/test_routes.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/tests/test_s3_routes.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/tests/test_s3_upload_limit_env.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/tests/test_secretsmanager_routes.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/tests/test_tags_routes.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/tests/test_websocket.py +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/acm.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/apigateway.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/appsync.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/athena.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/cloudformation.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/cloudfront.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/cognito-idp.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/dynamodb.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/ec2.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/ecr.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/ecs.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/elasticache.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/elasticfilesystem.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/elasticloadbalancing.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/elasticmapreduce.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/events.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/firehose.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/glue.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/iam.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/kinesis.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/kms.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/lambda.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/logs.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/monitoring.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/rds.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/route53.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/s3.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/secretsmanager.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/ses.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/sns.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/sqs.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/ssm.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/stepfunctions.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/aws-icons/wafv2.svg +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/favicon.png +0 -0
- {stackport-0.2.1 → stackport-0.2.3}/ui/dist/favicon.svg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: stackport
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.3
|
|
4
4
|
Summary: Universal AWS resource browser for local emulators
|
|
5
5
|
Author: Davi Reis Vieira
|
|
6
6
|
License: MIT
|
|
@@ -54,13 +54,13 @@ Dynamic: license-file
|
|
|
54
54
|
## Screenshots
|
|
55
55
|
|
|
56
56
|
**Dashboard** — Service overview with resource counts and health status
|
|
57
|
-

|
|
57
|
+

|
|
58
58
|
|
|
59
|
-
**
|
|
60
|
-

|
|
61
61
|
|
|
62
62
|
**S3 Browser** — File browser with upload, download, folder navigation, and tagging
|
|
63
|
-

|
|
63
|
+

|
|
64
64
|
|
|
65
65
|
## Features
|
|
66
66
|
|
|
@@ -19,13 +19,13 @@
|
|
|
19
19
|
## Screenshots
|
|
20
20
|
|
|
21
21
|
**Dashboard** — Service overview with resource counts and health status
|
|
22
|
-

|
|
22
|
+

|
|
23
23
|
|
|
24
|
-
**
|
|
25
|
-

|
|
26
26
|
|
|
27
27
|
**S3 Browser** — File browser with upload, download, folder navigation, and tagging
|
|
28
|
-

|
|
28
|
+

|
|
29
29
|
|
|
30
30
|
## Features
|
|
31
31
|
|
|
@@ -2,11 +2,11 @@ import logging
|
|
|
2
2
|
from typing import Any
|
|
3
3
|
|
|
4
4
|
from fastapi import APIRouter, Depends, Query
|
|
5
|
-
from pydantic import BaseModel
|
|
6
5
|
|
|
7
6
|
from backend.aws_client import get_client
|
|
8
7
|
from backend.cache import cache
|
|
9
8
|
from backend.routes.common import get_endpoint_url
|
|
9
|
+
from backend.schemas.dynamodb import QueryRequest
|
|
10
10
|
|
|
11
11
|
logger = logging.getLogger(__name__)
|
|
12
12
|
|
|
@@ -154,12 +154,6 @@ def scan_table(
|
|
|
154
154
|
return {"error": str(e), "items": [], "count": 0}
|
|
155
155
|
|
|
156
156
|
|
|
157
|
-
class QueryRequest(BaseModel):
|
|
158
|
-
partition_key_value: str
|
|
159
|
-
sort_key_value: str | None = None
|
|
160
|
-
sort_key_operator: str = "=" # =, <, <=, >, >=, BETWEEN, BEGINS_WITH
|
|
161
|
-
limit: int = 25
|
|
162
|
-
|
|
163
157
|
|
|
164
158
|
@router.post("/tables/{name}/query")
|
|
165
159
|
def query_table(name: str, request: QueryRequest, endpoint_url: str | None = Depends(get_endpoint_url)):
|
|
@@ -6,12 +6,11 @@ from typing import Annotated
|
|
|
6
6
|
from botocore.exceptions import ClientError
|
|
7
7
|
from fastapi import APIRouter, Depends, File, HTTPException, Query, UploadFile
|
|
8
8
|
from fastapi.responses import StreamingResponse
|
|
9
|
-
from pydantic import BaseModel, model_validator
|
|
10
|
-
|
|
11
9
|
from backend.aws_client import get_client
|
|
12
10
|
from backend.cache import cache
|
|
13
11
|
from backend.config import AWS_REGION, S3_MAX_UPLOAD_BYTES, is_local_endpoint
|
|
14
12
|
from backend.routes.common import get_endpoint_url
|
|
13
|
+
from backend.schemas.s3 import CreateFolderBody, DeleteBatchBody
|
|
15
14
|
|
|
16
15
|
logger = logging.getLogger(__name__)
|
|
17
16
|
|
|
@@ -191,32 +190,6 @@ def list_objects(
|
|
|
191
190
|
}
|
|
192
191
|
|
|
193
192
|
|
|
194
|
-
class DeleteBatchBody(BaseModel):
|
|
195
|
-
"""Delete by explicit keys or by prefix (recursive). Provide exactly one."""
|
|
196
|
-
|
|
197
|
-
keys: list[str] | None = None
|
|
198
|
-
prefix: str | None = None
|
|
199
|
-
|
|
200
|
-
@model_validator(mode="after")
|
|
201
|
-
def exactly_one_mode(self):
|
|
202
|
-
has_keys = bool(self.keys)
|
|
203
|
-
has_prefix = bool(self.prefix and self.prefix.strip())
|
|
204
|
-
if has_keys == has_prefix:
|
|
205
|
-
raise ValueError('Provide exactly one of non-empty "keys" or "prefix"')
|
|
206
|
-
return self
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
class CreateFolderBody(BaseModel):
|
|
210
|
-
prefix: str
|
|
211
|
-
|
|
212
|
-
@model_validator(mode="after")
|
|
213
|
-
def trailing_slash(self):
|
|
214
|
-
if not self.prefix.endswith("/"):
|
|
215
|
-
raise ValueError('Folder prefix must end with "/"')
|
|
216
|
-
if ".." in self.prefix or self.prefix.startswith("/"):
|
|
217
|
-
raise ValueError("Invalid prefix")
|
|
218
|
-
return self
|
|
219
|
-
|
|
220
193
|
|
|
221
194
|
def _validate_object_key(key: str) -> None:
|
|
222
195
|
if ".." in key or key.startswith("/"):
|