strider-framework 0.17.62__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.
- strider_framework-0.17.62/.gitignore +146 -0
- strider_framework-0.17.62/PKG-INFO +416 -0
- strider_framework-0.17.62/README.md +345 -0
- strider_framework-0.17.62/docs/01-quickstart.md +227 -0
- strider_framework-0.17.62/docs/02-settings.md +799 -0
- strider_framework-0.17.62/docs/03-models.md +157 -0
- strider_framework-0.17.62/docs/04-viewsets.md +257 -0
- strider_framework-0.17.62/docs/05-auth.md +361 -0
- strider_framework-0.17.62/docs/06-auth-backends.md +204 -0
- strider_framework-0.17.62/docs/07-cli.md +195 -0
- strider_framework-0.17.62/docs/08-permissions.md +289 -0
- strider_framework-0.17.62/docs/10-fields.md +349 -0
- strider_framework-0.17.62/docs/11-relations.md +324 -0
- strider_framework-0.17.62/docs/12-querysets.md +363 -0
- strider_framework-0.17.62/docs/13-serializers.md +286 -0
- strider_framework-0.17.62/docs/14-validators.md +406 -0
- strider_framework-0.17.62/docs/20-middleware.md +362 -0
- strider_framework-0.17.62/docs/21-replicas.md +277 -0
- strider_framework-0.17.62/docs/22-soft-delete.md +248 -0
- strider_framework-0.17.62/docs/23-routing.md +240 -0
- strider_framework-0.17.62/docs/24-dependencies.md +307 -0
- strider_framework-0.17.62/docs/25-realtime.md +521 -0
- strider_framework-0.17.62/docs/30-messaging.md +496 -0
- strider_framework-0.17.62/docs/31-workers.md +370 -0
- strider_framework-0.17.62/docs/32-tenancy.md +357 -0
- strider_framework-0.17.62/docs/33-choices.md +299 -0
- strider_framework-0.17.62/docs/34-exceptions.md +311 -0
- strider_framework-0.17.62/docs/35-datetime.md +332 -0
- strider_framework-0.17.62/docs/36-security.md +379 -0
- strider_framework-0.17.62/docs/37-storage.md +346 -0
- strider_framework-0.17.62/docs/40-admin.md +442 -0
- strider_framework-0.17.62/docs/41-migrations.md +164 -0
- strider_framework-0.17.62/docs/99-faq-troubleshooting.md +1067 -0
- strider_framework-0.17.62/docs/CHANGELOG.md +55 -0
- strider_framework-0.17.62/docs/README.md +341 -0
- strider_framework-0.17.62/libs/__init__.py +0 -0
- strider_framework-0.17.62/main.py +24 -0
- strider_framework-0.17.62/publish.sh +163 -0
- strider_framework-0.17.62/pyproject.toml +142 -0
- strider_framework-0.17.62/strider/__init__.py +629 -0
- strider_framework-0.17.62/strider/__main__.py +16 -0
- strider_framework-0.17.62/strider/admin/__init__.py +132 -0
- strider_framework-0.17.62/strider/admin/_typing.py +92 -0
- strider_framework-0.17.62/strider/admin/collectstatic.py +202 -0
- strider_framework-0.17.62/strider/admin/defaults.py +238 -0
- strider_framework-0.17.62/strider/admin/discovery.py +167 -0
- strider_framework-0.17.62/strider/admin/event_tracking.py +197 -0
- strider_framework-0.17.62/strider/admin/exceptions.py +231 -0
- strider_framework-0.17.62/strider/admin/infrastructure.py +429 -0
- strider_framework-0.17.62/strider/admin/log_handler.py +241 -0
- strider_framework-0.17.62/strider/admin/middleware.py +148 -0
- strider_framework-0.17.62/strider/admin/models.py +531 -0
- strider_framework-0.17.62/strider/admin/ops_views.py +1818 -0
- strider_framework-0.17.62/strider/admin/options.py +1023 -0
- strider_framework-0.17.62/strider/admin/permissions.py +174 -0
- strider_framework-0.17.62/strider/admin/resource_inventory.py +183 -0
- strider_framework-0.17.62/strider/admin/router.py +511 -0
- strider_framework-0.17.62/strider/admin/serializers.py +265 -0
- strider_framework-0.17.62/strider/admin/site.py +314 -0
- strider_framework-0.17.62/strider/admin/static/stride-admin/css/admin.css +45 -0
- strider_framework-0.17.62/strider/admin/static/stride-admin/js/admin.js +26 -0
- strider_framework-0.17.62/strider/admin/templates/admin/base.html +666 -0
- strider_framework-0.17.62/strider/admin/templates/admin/dashboard.html +265 -0
- strider_framework-0.17.62/strider/admin/templates/admin/detail.html +2794 -0
- strider_framework-0.17.62/strider/admin/templates/admin/list.html +450 -0
- strider_framework-0.17.62/strider/admin/templates/admin/login.html +216 -0
- strider_framework-0.17.62/strider/admin/templates/admin/ops/dashboard.html +285 -0
- strider_framework-0.17.62/strider/admin/templates/admin/ops/events.html +569 -0
- strider_framework-0.17.62/strider/admin/templates/admin/ops/infrastructure.html +245 -0
- strider_framework-0.17.62/strider/admin/templates/admin/ops/kafka.html +1066 -0
- strider_framework-0.17.62/strider/admin/templates/admin/ops/logs.html +186 -0
- strider_framework-0.17.62/strider/admin/templates/admin/ops/tasks.html +515 -0
- strider_framework-0.17.62/strider/admin/templates/admin/ops/workers.html +309 -0
- strider_framework-0.17.62/strider/admin/types.py +299 -0
- strider_framework-0.17.62/strider/admin/views.py +1699 -0
- strider_framework-0.17.62/strider/admin/ws_events.py +174 -0
- strider_framework-0.17.62/strider/app.py +934 -0
- strider_framework-0.17.62/strider/auth/__init__.py +217 -0
- strider_framework-0.17.62/strider/auth/backends.py +354 -0
- strider_framework-0.17.62/strider/auth/base.py +851 -0
- strider_framework-0.17.62/strider/auth/decorators.py +464 -0
- strider_framework-0.17.62/strider/auth/hashers.py +420 -0
- strider_framework-0.17.62/strider/auth/helpers.py +104 -0
- strider_framework-0.17.62/strider/auth/middleware.py +473 -0
- strider_framework-0.17.62/strider/auth/models.py +1082 -0
- strider_framework-0.17.62/strider/auth/permissions.py +402 -0
- strider_framework-0.17.62/strider/auth/schemas.py +139 -0
- strider_framework-0.17.62/strider/auth/tokens.py +327 -0
- strider_framework-0.17.62/strider/auth/views.py +607 -0
- strider_framework-0.17.62/strider/choices.py +383 -0
- strider_framework-0.17.62/strider/cli/__init__.py +19 -0
- strider_framework-0.17.62/strider/cli/interactive.py +517 -0
- strider_framework-0.17.62/strider/cli/main.py +3753 -0
- strider_framework-0.17.62/strider/cli/project_init.py +103 -0
- strider_framework-0.17.62/strider/cli/templates/__init__.py +174 -0
- strider_framework-0.17.62/strider/cli/templates/default/.env.template +12 -0
- strider_framework-0.17.62/strider/cli/templates/default/.gitignore.template +19 -0
- strider_framework-0.17.62/strider/cli/templates/default/pyproject.toml.template +22 -0
- strider_framework-0.17.62/strider/cli/templates/default/src/__init__.py.template +1 -0
- strider_framework-0.17.62/strider/cli/templates/default/src/apps/__init__.py.template +1 -0
- strider_framework-0.17.62/strider/cli/templates/default/src/apps/models.py.template +2 -0
- strider_framework-0.17.62/strider/cli/templates/default/src/apps/users/__init__.py.template +1 -0
- strider_framework-0.17.62/strider/cli/templates/default/src/apps/users/models.py.template +21 -0
- strider_framework-0.17.62/strider/cli/templates/default/src/apps/users/urls.py.template +9 -0
- strider_framework-0.17.62/strider/cli/templates/default/src/apps/users/views.py.template +13 -0
- strider_framework-0.17.62/strider/cli/templates/default/src/main.py.template +4 -0
- strider_framework-0.17.62/strider/cli/templates/default/src/models.py.template +2 -0
- strider_framework-0.17.62/strider/cli/templates/default/src/settings.py.template +30 -0
- strider_framework-0.17.62/strider/cli/templates/kafka/.env.template +16 -0
- strider_framework-0.17.62/strider/cli/templates/kafka/.gitignore.template +19 -0
- strider_framework-0.17.62/strider/cli/templates/kafka/docker-compose.yml.template +42 -0
- strider_framework-0.17.62/strider/cli/templates/kafka/pyproject.toml.template +24 -0
- strider_framework-0.17.62/strider/cli/templates/kafka/src/__init__.py.template +1 -0
- strider_framework-0.17.62/strider/cli/templates/kafka/src/apps/__init__.py.template +1 -0
- strider_framework-0.17.62/strider/cli/templates/kafka/src/apps/events/__init__.py.template +1 -0
- strider_framework-0.17.62/strider/cli/templates/kafka/src/apps/events/consumers.py.template +19 -0
- strider_framework-0.17.62/strider/cli/templates/kafka/src/apps/events/models.py.template +18 -0
- strider_framework-0.17.62/strider/cli/templates/kafka/src/apps/events/producers.py.template +20 -0
- strider_framework-0.17.62/strider/cli/templates/kafka/src/apps/events/urls.py.template +7 -0
- strider_framework-0.17.62/strider/cli/templates/kafka/src/apps/events/views.py.template +22 -0
- strider_framework-0.17.62/strider/cli/templates/kafka/src/apps/models.py.template +2 -0
- strider_framework-0.17.62/strider/cli/templates/kafka/src/main.py.template +4 -0
- strider_framework-0.17.62/strider/cli/templates/kafka/src/models.py.template +2 -0
- strider_framework-0.17.62/strider/cli/templates/kafka/src/settings.py.template +37 -0
- strider_framework-0.17.62/strider/cli/templates/minimal/.env.template +11 -0
- strider_framework-0.17.62/strider/cli/templates/minimal/.gitignore.template +19 -0
- strider_framework-0.17.62/strider/cli/templates/minimal/pyproject.toml.template +22 -0
- strider_framework-0.17.62/strider/cli/templates/minimal/src/__init__.py.template +1 -0
- strider_framework-0.17.62/strider/cli/templates/minimal/src/apps/__init__.py.template +1 -0
- strider_framework-0.17.62/strider/cli/templates/minimal/src/apps/items/__init__.py.template +1 -0
- strider_framework-0.17.62/strider/cli/templates/minimal/src/apps/items/models.py.template +17 -0
- strider_framework-0.17.62/strider/cli/templates/minimal/src/apps/items/urls.py.template +7 -0
- strider_framework-0.17.62/strider/cli/templates/minimal/src/apps/items/views.py.template +12 -0
- strider_framework-0.17.62/strider/cli/templates/minimal/src/apps/models.py.template +2 -0
- strider_framework-0.17.62/strider/cli/templates/minimal/src/apps/users/__init__.py.template +1 -0
- strider_framework-0.17.62/strider/cli/templates/minimal/src/apps/users/models.py.template +10 -0
- strider_framework-0.17.62/strider/cli/templates/minimal/src/main.py.template +4 -0
- strider_framework-0.17.62/strider/cli/templates/minimal/src/models.py.template +2 -0
- strider_framework-0.17.62/strider/cli/templates/minimal/src/settings.py.template +26 -0
- strider_framework-0.17.62/strider/cli/templates/tenant/.env.template +14 -0
- strider_framework-0.17.62/strider/cli/templates/tenant/.gitignore.template +19 -0
- strider_framework-0.17.62/strider/cli/templates/tenant/docker-compose.yml.template +19 -0
- strider_framework-0.17.62/strider/cli/templates/tenant/pyproject.toml.template +22 -0
- strider_framework-0.17.62/strider/cli/templates/tenant/src/__init__.py.template +1 -0
- strider_framework-0.17.62/strider/cli/templates/tenant/src/apps/__init__.py.template +1 -0
- strider_framework-0.17.62/strider/cli/templates/tenant/src/apps/items/__init__.py.template +1 -0
- strider_framework-0.17.62/strider/cli/templates/tenant/src/apps/items/models.py.template +19 -0
- strider_framework-0.17.62/strider/cli/templates/tenant/src/apps/items/urls.py.template +7 -0
- strider_framework-0.17.62/strider/cli/templates/tenant/src/apps/items/views.py.template +18 -0
- strider_framework-0.17.62/strider/cli/templates/tenant/src/apps/models.py.template +3 -0
- strider_framework-0.17.62/strider/cli/templates/tenant/src/apps/tenants/__init__.py.template +1 -0
- strider_framework-0.17.62/strider/cli/templates/tenant/src/apps/tenants/models.py.template +17 -0
- strider_framework-0.17.62/strider/cli/templates/tenant/src/apps/tenants/urls.py.template +7 -0
- strider_framework-0.17.62/strider/cli/templates/tenant/src/apps/tenants/views.py.template +13 -0
- strider_framework-0.17.62/strider/cli/templates/tenant/src/main.py.template +4 -0
- strider_framework-0.17.62/strider/cli/templates/tenant/src/models.py.template +2 -0
- strider_framework-0.17.62/strider/cli/templates/tenant/src/settings.py.template +35 -0
- strider_framework-0.17.62/strider/cli/templates/workers/.env.template +18 -0
- strider_framework-0.17.62/strider/cli/templates/workers/.gitignore.template +19 -0
- strider_framework-0.17.62/strider/cli/templates/workers/docker-compose.yml.template +24 -0
- strider_framework-0.17.62/strider/cli/templates/workers/pyproject.toml.template +23 -0
- strider_framework-0.17.62/strider/cli/templates/workers/src/__init__.py.template +1 -0
- strider_framework-0.17.62/strider/cli/templates/workers/src/apps/__init__.py.template +1 -0
- strider_framework-0.17.62/strider/cli/templates/workers/src/apps/models.py.template +2 -0
- strider_framework-0.17.62/strider/cli/templates/workers/src/apps/tasks/__init__.py.template +1 -0
- strider_framework-0.17.62/strider/cli/templates/workers/src/apps/tasks/models.py.template +32 -0
- strider_framework-0.17.62/strider/cli/templates/workers/src/apps/tasks/urls.py.template +7 -0
- strider_framework-0.17.62/strider/cli/templates/workers/src/apps/tasks/views.py.template +54 -0
- strider_framework-0.17.62/strider/cli/templates/workers/src/apps/tasks/workers.py.template +23 -0
- strider_framework-0.17.62/strider/cli/templates/workers/src/main.py.template +4 -0
- strider_framework-0.17.62/strider/cli/templates/workers/src/models.py.template +2 -0
- strider_framework-0.17.62/strider/cli/templates/workers/src/settings.py.template +40 -0
- strider_framework-0.17.62/strider/config.py +1884 -0
- strider_framework-0.17.62/strider/database.py +443 -0
- strider_framework-0.17.62/strider/datetime.py +1271 -0
- strider_framework-0.17.62/strider/dependencies.py +452 -0
- strider_framework-0.17.62/strider/deployment/__init__.py +29 -0
- strider_framework-0.17.62/strider/deployment/docker.py +361 -0
- strider_framework-0.17.62/strider/deployment/kubernetes.py +361 -0
- strider_framework-0.17.62/strider/deployment/pm2.py +143 -0
- strider_framework-0.17.62/strider/exceptions.py +791 -0
- strider_framework-0.17.62/strider/fields.py +679 -0
- strider_framework-0.17.62/strider/messaging/__init__.py +157 -0
- strider_framework-0.17.62/strider/messaging/avro.py +435 -0
- strider_framework-0.17.62/strider/messaging/base.py +439 -0
- strider_framework-0.17.62/strider/messaging/config.py +69 -0
- strider_framework-0.17.62/strider/messaging/confluent/__init__.py +75 -0
- strider_framework-0.17.62/strider/messaging/confluent/admin.py +762 -0
- strider_framework-0.17.62/strider/messaging/confluent/broker.py +251 -0
- strider_framework-0.17.62/strider/messaging/confluent/consumer.py +199 -0
- strider_framework-0.17.62/strider/messaging/confluent/producer.py +243 -0
- strider_framework-0.17.62/strider/messaging/decorators.py +280 -0
- strider_framework-0.17.62/strider/messaging/kafka/__init__.py +56 -0
- strider_framework-0.17.62/strider/messaging/kafka/admin.py +647 -0
- strider_framework-0.17.62/strider/messaging/kafka/broker.py +230 -0
- strider_framework-0.17.62/strider/messaging/kafka/consumer.py +215 -0
- strider_framework-0.17.62/strider/messaging/kafka/producer.py +193 -0
- strider_framework-0.17.62/strider/messaging/rabbitmq/__init__.py +26 -0
- strider_framework-0.17.62/strider/messaging/rabbitmq/broker.py +181 -0
- strider_framework-0.17.62/strider/messaging/rabbitmq/consumer.py +121 -0
- strider_framework-0.17.62/strider/messaging/rabbitmq/producer.py +79 -0
- strider_framework-0.17.62/strider/messaging/redis/__init__.py +60 -0
- strider_framework-0.17.62/strider/messaging/redis/broker.py +178 -0
- strider_framework-0.17.62/strider/messaging/redis/connection.py +232 -0
- strider_framework-0.17.62/strider/messaging/redis/consumer.py +157 -0
- strider_framework-0.17.62/strider/messaging/redis/producer.py +76 -0
- strider_framework-0.17.62/strider/messaging/registry.py +431 -0
- strider_framework-0.17.62/strider/messaging/topics.py +232 -0
- strider_framework-0.17.62/strider/messaging/tracking.py +124 -0
- strider_framework-0.17.62/strider/messaging/workers.py +950 -0
- strider_framework-0.17.62/strider/middleware.py +815 -0
- strider_framework-0.17.62/strider/migrations/__init__.py +97 -0
- strider_framework-0.17.62/strider/migrations/__main__.py +19 -0
- strider_framework-0.17.62/strider/migrations/analyzer.py +713 -0
- strider_framework-0.17.62/strider/migrations/cli.py +447 -0
- strider_framework-0.17.62/strider/migrations/dialects/__init__.py +95 -0
- strider_framework-0.17.62/strider/migrations/dialects/base.py +196 -0
- strider_framework-0.17.62/strider/migrations/dialects/mysql.py +79 -0
- strider_framework-0.17.62/strider/migrations/dialects/postgresql.py +91 -0
- strider_framework-0.17.62/strider/migrations/dialects/sqlite.py +71 -0
- strider_framework-0.17.62/strider/migrations/engine.py +923 -0
- strider_framework-0.17.62/strider/migrations/migration.py +82 -0
- strider_framework-0.17.62/strider/migrations/operations.py +930 -0
- strider_framework-0.17.62/strider/migrations/state.py +576 -0
- strider_framework-0.17.62/strider/models.py +1217 -0
- strider_framework-0.17.62/strider/permissions.py +400 -0
- strider_framework-0.17.62/strider/querysets.py +871 -0
- strider_framework-0.17.62/strider/realtime.py +585 -0
- strider_framework-0.17.62/strider/relations.py +833 -0
- strider_framework-0.17.62/strider/routing.py +1177 -0
- strider_framework-0.17.62/strider/schema.py +961 -0
- strider_framework-0.17.62/strider/serializers.py +376 -0
- strider_framework-0.17.62/strider/storage.py +452 -0
- strider_framework-0.17.62/strider/tasks/__init__.py +72 -0
- strider_framework-0.17.62/strider/tasks/base.py +394 -0
- strider_framework-0.17.62/strider/tasks/config.py +67 -0
- strider_framework-0.17.62/strider/tasks/decorators.py +197 -0
- strider_framework-0.17.62/strider/tasks/registry.py +178 -0
- strider_framework-0.17.62/strider/tasks/scheduler.py +259 -0
- strider_framework-0.17.62/strider/tasks/worker.py +647 -0
- strider_framework-0.17.62/strider/tenancy.py +338 -0
- strider_framework-0.17.62/strider/testing/__init__.py +99 -0
- strider_framework-0.17.62/strider/testing/assertions.py +347 -0
- strider_framework-0.17.62/strider/testing/client.py +247 -0
- strider_framework-0.17.62/strider/testing/database.py +307 -0
- strider_framework-0.17.62/strider/testing/factories.py +393 -0
- strider_framework-0.17.62/strider/testing/mocks.py +658 -0
- strider_framework-0.17.62/strider/testing/plugin.py +635 -0
- strider_framework-0.17.62/strider/urls.py +339 -0
- strider_framework-0.17.62/strider/validation.py +768 -0
- strider_framework-0.17.62/strider/validators.py +982 -0
- strider_framework-0.17.62/strider/views.py +1434 -0
- strider_framework-0.17.62/tests/__init__.py +1 -0
- strider_framework-0.17.62/tests/conftest.py +40 -0
- strider_framework-0.17.62/tests/test_admin.py +995 -0
- strider_framework-0.17.62/tests/test_auth_helpers.py +312 -0
- strider_framework-0.17.62/tests/test_imports.py +263 -0
- strider_framework-0.17.62/tests/test_issues_fixes.py +441 -0
- strider_framework-0.17.62/tests/test_models.py +193 -0
- strider_framework-0.17.62/tests/test_permissions.py +373 -0
- strider_framework-0.17.62/tests/test_querysets.py +414 -0
- strider_framework-0.17.62/tests/test_relations.py +374 -0
- strider_framework-0.17.62/tests/test_routing_custom_actions.py +64 -0
- strider_framework-0.17.62/tests/test_serializers.py +171 -0
- strider_framework-0.17.62/tests/test_validation.py +307 -0
- strider_framework-0.17.62/uv.lock +2990 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
test_project/
|
|
7
|
+
|
|
8
|
+
# C extensions
|
|
9
|
+
*.so
|
|
10
|
+
|
|
11
|
+
# Distribution / packaging
|
|
12
|
+
.Python
|
|
13
|
+
build/
|
|
14
|
+
develop-eggs/
|
|
15
|
+
dist/
|
|
16
|
+
downloads/
|
|
17
|
+
eggs/
|
|
18
|
+
.eggs/
|
|
19
|
+
lib/
|
|
20
|
+
lib64/
|
|
21
|
+
parts/
|
|
22
|
+
sdist/
|
|
23
|
+
var/
|
|
24
|
+
wheels/
|
|
25
|
+
share/python-wheels/
|
|
26
|
+
*.egg-info/
|
|
27
|
+
.installed.cfg
|
|
28
|
+
*.egg
|
|
29
|
+
MANIFEST
|
|
30
|
+
|
|
31
|
+
# PyInstaller
|
|
32
|
+
*.manifest
|
|
33
|
+
*.spec
|
|
34
|
+
|
|
35
|
+
# Installer logs
|
|
36
|
+
pip-log.txt
|
|
37
|
+
pip-delete-this-directory.txt
|
|
38
|
+
|
|
39
|
+
# Unit test / coverage reports
|
|
40
|
+
htmlcov/
|
|
41
|
+
.tox/
|
|
42
|
+
.nox/
|
|
43
|
+
.coverage
|
|
44
|
+
.coverage.*
|
|
45
|
+
.cache
|
|
46
|
+
nosetests.xml
|
|
47
|
+
coverage.xml
|
|
48
|
+
*.cover
|
|
49
|
+
*.py,cover
|
|
50
|
+
.hypothesis/
|
|
51
|
+
.pytest_cache/
|
|
52
|
+
|
|
53
|
+
# Translations
|
|
54
|
+
*.mo
|
|
55
|
+
*.pot
|
|
56
|
+
|
|
57
|
+
# Django stuff:
|
|
58
|
+
*.log
|
|
59
|
+
local_settings.py
|
|
60
|
+
db.sqlite3
|
|
61
|
+
db.sqlite3-journal
|
|
62
|
+
|
|
63
|
+
# Flask stuff:
|
|
64
|
+
instance/
|
|
65
|
+
.webassets-cache
|
|
66
|
+
|
|
67
|
+
# Scrapy stuff:
|
|
68
|
+
.scrapy
|
|
69
|
+
|
|
70
|
+
# Sphinx documentation
|
|
71
|
+
docs/_build/
|
|
72
|
+
|
|
73
|
+
# PyBuilder
|
|
74
|
+
.pybuilder/
|
|
75
|
+
target/
|
|
76
|
+
|
|
77
|
+
# Jupyter Notebook
|
|
78
|
+
.ipynb_checkpoints
|
|
79
|
+
|
|
80
|
+
# IPython
|
|
81
|
+
profile_default/
|
|
82
|
+
ipython_config.py
|
|
83
|
+
|
|
84
|
+
# pyenv
|
|
85
|
+
.python-version
|
|
86
|
+
|
|
87
|
+
# pipenv
|
|
88
|
+
Pipfile.lock
|
|
89
|
+
|
|
90
|
+
# PEP 582
|
|
91
|
+
__pypackages__/
|
|
92
|
+
|
|
93
|
+
# Celery stuff
|
|
94
|
+
celerybeat-schedule
|
|
95
|
+
celerybeat.pid
|
|
96
|
+
|
|
97
|
+
# SageMath parsed files
|
|
98
|
+
*.sage.py
|
|
99
|
+
|
|
100
|
+
# Environments
|
|
101
|
+
.env
|
|
102
|
+
.venv
|
|
103
|
+
env/
|
|
104
|
+
venv/
|
|
105
|
+
ENV/
|
|
106
|
+
env.bak/
|
|
107
|
+
venv.bak/
|
|
108
|
+
|
|
109
|
+
# Spyder project settings
|
|
110
|
+
.spyderproject
|
|
111
|
+
.spyproject
|
|
112
|
+
|
|
113
|
+
# Rope project settings
|
|
114
|
+
.ropeproject
|
|
115
|
+
|
|
116
|
+
# mkdocs documentation
|
|
117
|
+
/site
|
|
118
|
+
|
|
119
|
+
# mypy
|
|
120
|
+
.mypy_cache/
|
|
121
|
+
.dmypy.json
|
|
122
|
+
dmypy.json
|
|
123
|
+
|
|
124
|
+
# Pyre type checker
|
|
125
|
+
.pyre/
|
|
126
|
+
|
|
127
|
+
# pytype static type analyzer
|
|
128
|
+
.pytype/
|
|
129
|
+
|
|
130
|
+
# Cython debug symbols
|
|
131
|
+
cython_debug/
|
|
132
|
+
|
|
133
|
+
# IDE
|
|
134
|
+
.idea/
|
|
135
|
+
.vscode/
|
|
136
|
+
*.swp
|
|
137
|
+
*.swo
|
|
138
|
+
*~
|
|
139
|
+
|
|
140
|
+
# Database
|
|
141
|
+
*.db
|
|
142
|
+
*.sqlite
|
|
143
|
+
|
|
144
|
+
# OS
|
|
145
|
+
.DS_Store
|
|
146
|
+
Thumbs.db
|
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: strider-framework
|
|
3
|
+
Version: 0.17.62
|
|
4
|
+
Summary: Strider - Django-inspired, FastAPI-powered. Alta performance, baixo acoplamento, produtividade extrema.
|
|
5
|
+
Project-URL: Homepage, https://github.com/SorPuti/stride
|
|
6
|
+
Project-URL: Documentation, https://github.com/SorPuti/stride#readme
|
|
7
|
+
Project-URL: Repository, https://github.com/SorPuti/stride
|
|
8
|
+
Author: Stride Team
|
|
9
|
+
License: MIT
|
|
10
|
+
Keywords: api,async,cli,django,fastapi,framework,rest
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Framework :: FastAPI
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
20
|
+
Classifier: Topic :: Internet :: WWW/HTTP :: HTTP Servers
|
|
21
|
+
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
22
|
+
Requires-Python: <4.0,>=3.10
|
|
23
|
+
Requires-Dist: aiosqlite>=0.19.0
|
|
24
|
+
Requires-Dist: fastapi>=0.109.0
|
|
25
|
+
Requires-Dist: jinja2>=3.1.0
|
|
26
|
+
Requires-Dist: pydantic-settings>=2.1.0
|
|
27
|
+
Requires-Dist: pydantic[email]>=2.5.0
|
|
28
|
+
Requires-Dist: pyjwt>=2.8.0
|
|
29
|
+
Requires-Dist: python-multipart>=0.0.6
|
|
30
|
+
Requires-Dist: sqlalchemy>=2.0.25
|
|
31
|
+
Requires-Dist: uvicorn[standard]>=0.27.0
|
|
32
|
+
Provides-Extra: dev
|
|
33
|
+
Requires-Dist: httpx>=0.26.0; extra == 'dev'
|
|
34
|
+
Requires-Dist: ipython>=8.0.0; extra == 'dev'
|
|
35
|
+
Requires-Dist: mypy>=1.8.0; extra == 'dev'
|
|
36
|
+
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
|
|
37
|
+
Requires-Dist: pytest>=7.4.0; extra == 'dev'
|
|
38
|
+
Requires-Dist: ruff>=0.1.0; extra == 'dev'
|
|
39
|
+
Provides-Extra: enterprise
|
|
40
|
+
Requires-Dist: aio-pika>=9.0.0; extra == 'enterprise'
|
|
41
|
+
Requires-Dist: aiokafka>=0.10.0; extra == 'enterprise'
|
|
42
|
+
Requires-Dist: asyncpg>=0.29.0; extra == 'enterprise'
|
|
43
|
+
Requires-Dist: croniter>=2.0.0; extra == 'enterprise'
|
|
44
|
+
Requires-Dist: redis>=5.0.0; extra == 'enterprise'
|
|
45
|
+
Provides-Extra: gcs
|
|
46
|
+
Requires-Dist: google-cloud-storage>=2.0.0; extra == 'gcs'
|
|
47
|
+
Provides-Extra: kafka
|
|
48
|
+
Requires-Dist: aiokafka>=0.10.0; extra == 'kafka'
|
|
49
|
+
Provides-Extra: messaging
|
|
50
|
+
Requires-Dist: aio-pika>=9.0.0; extra == 'messaging'
|
|
51
|
+
Requires-Dist: aiokafka>=0.10.0; extra == 'messaging'
|
|
52
|
+
Requires-Dist: croniter>=2.0.0; extra == 'messaging'
|
|
53
|
+
Requires-Dist: redis>=5.0.0; extra == 'messaging'
|
|
54
|
+
Provides-Extra: mysql
|
|
55
|
+
Requires-Dist: aiomysql>=0.2.0; extra == 'mysql'
|
|
56
|
+
Provides-Extra: postgres
|
|
57
|
+
Requires-Dist: asyncpg>=0.29.0; extra == 'postgres'
|
|
58
|
+
Requires-Dist: psycopg[binary]>=3.1.0; extra == 'postgres'
|
|
59
|
+
Provides-Extra: rabbitmq
|
|
60
|
+
Requires-Dist: aio-pika>=9.0.0; extra == 'rabbitmq'
|
|
61
|
+
Provides-Extra: redis
|
|
62
|
+
Requires-Dist: redis>=5.0.0; extra == 'redis'
|
|
63
|
+
Provides-Extra: storage
|
|
64
|
+
Requires-Dist: google-cloud-storage>=2.0.0; extra == 'storage'
|
|
65
|
+
Provides-Extra: testing
|
|
66
|
+
Requires-Dist: faker>=20.0.0; extra == 'testing'
|
|
67
|
+
Requires-Dist: httpx>=0.26.0; extra == 'testing'
|
|
68
|
+
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'testing'
|
|
69
|
+
Requires-Dist: pytest>=7.4.0; extra == 'testing'
|
|
70
|
+
Description-Content-Type: text/markdown
|
|
71
|
+
|
|
72
|
+
# Stride
|
|
73
|
+
|
|
74
|
+
Framework Python para APIs REST de alta performance. Combina a produtividade do Django REST Framework com a velocidade do FastAPI.
|
|
75
|
+
|
|
76
|
+
## Por que mais um framework?
|
|
77
|
+
|
|
78
|
+
FastAPI e excelente para performance, mas exige muito codigo repetitivo para CRUD. Django REST Framework e produtivo, mas lento e sem async nativo. Stride resolve esse trade-off.
|
|
79
|
+
|
|
80
|
+
```python
|
|
81
|
+
# 30 linhas para uma API completa com CRUD, validacao, permissoes e documentacao
|
|
82
|
+
class UserViewSet(ModelViewSet):
|
|
83
|
+
model = User
|
|
84
|
+
input_schema = UserInput
|
|
85
|
+
output_schema = UserOutput
|
|
86
|
+
permission_classes = [IsAuthenticated]
|
|
87
|
+
permission_classes_by_action = {"list": [AllowAny], "destroy": [IsAdmin]}
|
|
88
|
+
|
|
89
|
+
router = AutoRouter(prefix="/api/v1")
|
|
90
|
+
router.register("/users", UserViewSet)
|
|
91
|
+
app = StrideApp(routers=[router])
|
|
92
|
+
|
|
93
|
+
# Resultado: 6 endpoints REST, OpenAPI docs, validacao Pydantic, permissoes por acao
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Benchmark
|
|
97
|
+
|
|
98
|
+
Testes realizados com wrk, 10 threads, 100 conexoes, 30 segundos. Endpoint GET /users/ retornando 100 registros.
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
Framework Requests/sec Latency (avg) Latency (p99)
|
|
102
|
+
---------------------------------------------------------------------------
|
|
103
|
+
FastAPI puro 15,200 6.5ms 18ms
|
|
104
|
+
Stride 14,100 7.1ms 21ms
|
|
105
|
+
Django + DRF 2,100 47ms 180ms
|
|
106
|
+
Flask + SQLAlchemy 3,400 29ms 95ms
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Stride mantem 93% da performance do FastAPI puro. A diferenca de 7% vem da camada de ViewSet e permissoes - overhead aceitavel considerando a reducao de boilerplate.
|
|
110
|
+
|
|
111
|
+
**Por que Django e tao mais lento?**
|
|
112
|
+
- WSGI sincrono bloqueia threads
|
|
113
|
+
- Django ORM nao e async (sync_to_async adiciona overhead)
|
|
114
|
+
- Serializers DRF usam reflexao pesada
|
|
115
|
+
|
|
116
|
+
## Comparativo Tecnico
|
|
117
|
+
|
|
118
|
+
| Aspecto | Django + DRF | FastAPI Puro | Stride |
|
|
119
|
+
|---------|--------------|--------------|----------------|
|
|
120
|
+
| Async nativo | Parcial (sync_to_async) | Total | Total |
|
|
121
|
+
| Tipagem | Runtime | Compilacao | Compilacao |
|
|
122
|
+
| ORM | Django ORM (sync) | Manual | SQLAlchemy 2.0 (async) |
|
|
123
|
+
| Validacao | DRF Serializers | Pydantic | Pydantic |
|
|
124
|
+
| ViewSets | Sim | Manual | Sim |
|
|
125
|
+
| Permissoes | Sim | Manual | Sim |
|
|
126
|
+
| OpenAPI | drf-spectacular | Nativo | Nativo |
|
|
127
|
+
| Boilerplate CRUD | Baixo | Alto | Baixo |
|
|
128
|
+
| Performance | ~2k req/s | ~15k req/s | ~14k req/s |
|
|
129
|
+
|
|
130
|
+
## Decisoes Arquiteturais
|
|
131
|
+
|
|
132
|
+
### SQLAlchemy 2.0 ao inves de Django ORM
|
|
133
|
+
|
|
134
|
+
Django ORM nao foi projetado para async. O `sync_to_async` e um wrapper que executa queries em thread pool, adicionando overhead e complexidade. SQLAlchemy 2.0 tem async nativo com `asyncpg`.
|
|
135
|
+
|
|
136
|
+
```python
|
|
137
|
+
# Django: sync_to_async adiciona ~2ms por query
|
|
138
|
+
users = await sync_to_async(list)(User.objects.filter(is_active=True))
|
|
139
|
+
|
|
140
|
+
# Stride: async nativo, sem overhead
|
|
141
|
+
users = await User.objects.using(db).filter(is_active=True).all()
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Alem disso, SQLAlchemy 2.0 tem tipagem forte com `Mapped[T]`, permitindo que IDEs e mypy detectem erros em tempo de desenvolvimento.
|
|
145
|
+
|
|
146
|
+
### Pydantic ao inves de DRF Serializers
|
|
147
|
+
|
|
148
|
+
DRF Serializers usam reflexao pesada (`__getattr__`, metaclasses) para funcionar. Pydantic compila validadores em Rust, resultando em validacao 10-100x mais rapida.
|
|
149
|
+
|
|
150
|
+
```python
|
|
151
|
+
# DRF: ~500us por validacao
|
|
152
|
+
class UserSerializer(serializers.Serializer):
|
|
153
|
+
email = serializers.EmailField()
|
|
154
|
+
name = serializers.CharField(max_length=100)
|
|
155
|
+
|
|
156
|
+
# Stride: ~5us por validacao
|
|
157
|
+
class UserInput(InputSchema):
|
|
158
|
+
email: str
|
|
159
|
+
name: str
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### ViewSets simplificados
|
|
163
|
+
|
|
164
|
+
DRF ViewSets tem dispatch complexo com multiplas camadas de mixins. Stride usa heranca simples e metodos async diretos.
|
|
165
|
+
|
|
166
|
+
```python
|
|
167
|
+
# Hierarquia DRF: GenericAPIView -> mixins -> GenericViewSet -> ModelViewSet
|
|
168
|
+
# Hierarquia Core: ViewSet -> ModelViewSet
|
|
169
|
+
|
|
170
|
+
# Menos indiracao = menos overhead = codigo mais facil de debugar
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Permissoes composiveis
|
|
174
|
+
|
|
175
|
+
Sistema de permissoes inspirado no DRF, mas com operadores Python para composicao.
|
|
176
|
+
|
|
177
|
+
```python
|
|
178
|
+
# Permissao composta: autenticado E (dono OU admin)
|
|
179
|
+
permission = IsAuthenticated() & (IsOwner() | IsAdmin())
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## Dependencias
|
|
183
|
+
|
|
184
|
+
O framework usa apenas bibliotecas estaveis e bem mantidas:
|
|
185
|
+
|
|
186
|
+
| Dependencia | Versao | Proposito |
|
|
187
|
+
|-------------|--------|-----------|
|
|
188
|
+
| `fastapi` | >=0.100 | Motor HTTP async, OpenAPI automatico |
|
|
189
|
+
| `pydantic` | >=2.0 | Validacao e serializacao (core em Rust) |
|
|
190
|
+
| `pydantic-settings` | >=2.0 | Configuracao via .env |
|
|
191
|
+
| `sqlalchemy` | >=2.0 | ORM async com tipagem forte |
|
|
192
|
+
| `asyncpg` | >=0.28 | Driver PostgreSQL async (opcional) |
|
|
193
|
+
| `aiosqlite` | >=0.19 | Driver SQLite async (desenvolvimento) |
|
|
194
|
+
| `uvicorn` | >=0.23 | Servidor ASGI |
|
|
195
|
+
| `python-jose` | >=3.3 | JWT para autenticacao |
|
|
196
|
+
| `passlib` | >=1.7 | Hash de senhas (bcrypt, argon2) |
|
|
197
|
+
| `aiokafka` | >=0.8 | Cliente Kafka async (opcional) |
|
|
198
|
+
|
|
199
|
+
**Dependencias opcionais por feature:**
|
|
200
|
+
- Messaging: `aiokafka`, `aio-pika` (RabbitMQ), `redis`
|
|
201
|
+
- PostgreSQL: `asyncpg`
|
|
202
|
+
- Argon2: `argon2-cffi`
|
|
203
|
+
|
|
204
|
+
## Instalacao
|
|
205
|
+
|
|
206
|
+
### Global (CLI disponivel em qualquer diretorio)
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
# Recomendado: pipx instala em ambiente isolado
|
|
210
|
+
pipx install stride
|
|
211
|
+
|
|
212
|
+
# Alternativa: pip global (requer --break-system-packages no Debian/Ubuntu)
|
|
213
|
+
pip install stride --break-system-packages
|
|
214
|
+
|
|
215
|
+
# Alternativa: pip no diretorio do usuario
|
|
216
|
+
pip install stride --user
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
Apos instalacao global, o comando `core` fica disponivel:
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
core --help
|
|
223
|
+
core startproject meu_projeto
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### Local (por projeto)
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
# Criar e ativar virtualenv
|
|
230
|
+
python -m venv .venv
|
|
231
|
+
source .venv/bin/activate # Linux/Mac
|
|
232
|
+
# .venv\Scripts\activate # Windows
|
|
233
|
+
|
|
234
|
+
# Instalar no projeto
|
|
235
|
+
pip install stride
|
|
236
|
+
|
|
237
|
+
# Com extras opcionais
|
|
238
|
+
pip install "stride[postgres,kafka]"
|
|
239
|
+
pip install "stride[enterprise]" # Todas as features
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### Extras disponiveis
|
|
243
|
+
|
|
244
|
+
| Extra | Dependencias |
|
|
245
|
+
|-------|--------------|
|
|
246
|
+
| `postgres` | asyncpg, psycopg |
|
|
247
|
+
| `mysql` | aiomysql |
|
|
248
|
+
| `kafka` | aiokafka |
|
|
249
|
+
| `redis` | redis |
|
|
250
|
+
| `rabbitmq` | aio-pika |
|
|
251
|
+
| `messaging` | kafka + redis + rabbitmq + croniter |
|
|
252
|
+
| `enterprise` | messaging + postgres |
|
|
253
|
+
|
|
254
|
+
## Quick Start
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
# Criar projeto
|
|
258
|
+
stride init my-api
|
|
259
|
+
cd my-api
|
|
260
|
+
|
|
261
|
+
# Configurar banco e rodar
|
|
262
|
+
stride makemigrations --name initial
|
|
263
|
+
stride migrate
|
|
264
|
+
stride run
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
Acesse http://localhost:8000/docs para documentacao interativa.
|
|
268
|
+
|
|
269
|
+
## Estrutura do Projeto
|
|
270
|
+
|
|
271
|
+
```
|
|
272
|
+
/my-api
|
|
273
|
+
/.env # Configuracoes (DATABASE_URL, SECRET_KEY)
|
|
274
|
+
/migrations # Migracoes de banco (geradas automaticamente)
|
|
275
|
+
/src
|
|
276
|
+
/apps
|
|
277
|
+
/users
|
|
278
|
+
models.py # Models SQLAlchemy
|
|
279
|
+
schemas.py # Input/Output Pydantic
|
|
280
|
+
views.py # ViewSets
|
|
281
|
+
routes.py # Rotas
|
|
282
|
+
permissions.py # Permissoes customizadas
|
|
283
|
+
main.py # Entry point
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
## Documentacao
|
|
287
|
+
|
|
288
|
+
| Guia | Descricao |
|
|
289
|
+
|------|-----------|
|
|
290
|
+
| [Quickstart](docs/01-quickstart.md) | Primeira API em 5 minutos |
|
|
291
|
+
| [ViewSets](docs/02-viewsets.md) | CRUD, actions, hooks |
|
|
292
|
+
| [Authentication](docs/03-authentication.md) | JWT, permissoes |
|
|
293
|
+
| [Messaging](docs/04-messaging.md) | Kafka, RabbitMQ, Redis |
|
|
294
|
+
| [Deployment](docs/07-deployment.md) | Docker, Kubernetes |
|
|
295
|
+
|
|
296
|
+
[Documentacao completa](docs/README.md)
|
|
297
|
+
|
|
298
|
+
## Roadmap
|
|
299
|
+
|
|
300
|
+
### Suporte a WebSockets
|
|
301
|
+
|
|
302
|
+
Integracao nativa com WebSockets do FastAPI para aplicacoes real-time. Planejado: decorators para handlers, broadcast para grupos, integracao com sistema de permissoes.
|
|
303
|
+
|
|
304
|
+
```python
|
|
305
|
+
# Planejado
|
|
306
|
+
@websocket("/ws/chat/{room_id}")
|
|
307
|
+
class ChatConsumer(WebSocketConsumer):
|
|
308
|
+
permission_classes = [IsAuthenticated]
|
|
309
|
+
|
|
310
|
+
async def on_connect(self, websocket, room_id):
|
|
311
|
+
await self.channel_layer.group_add(f"room_{room_id}", websocket)
|
|
312
|
+
|
|
313
|
+
async def on_message(self, websocket, data):
|
|
314
|
+
await self.channel_layer.group_send(f"room_{data['room_id']}", data)
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
### Cache integrado (Redis)
|
|
318
|
+
|
|
319
|
+
Camada de cache transparente para QuerySets e respostas de ViewSet. Invalidacao automatica em create/update/delete.
|
|
320
|
+
|
|
321
|
+
```python
|
|
322
|
+
# Planejado
|
|
323
|
+
class PostViewSet(ModelViewSet):
|
|
324
|
+
model = Post
|
|
325
|
+
cache_timeout = 300 # 5 minutos
|
|
326
|
+
cache_key_prefix = "posts"
|
|
327
|
+
|
|
328
|
+
# Cache automatico em list() e retrieve()
|
|
329
|
+
# Invalidacao automatica em create(), update(), destroy()
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### Rate limiting
|
|
333
|
+
|
|
334
|
+
Limitacao de requisicoes por IP, usuario ou API key. Configuravel por ViewSet ou action.
|
|
335
|
+
|
|
336
|
+
```python
|
|
337
|
+
# Planejado
|
|
338
|
+
class APIViewSet(ModelViewSet):
|
|
339
|
+
throttle_classes = [AnonRateThrottle, UserRateThrottle]
|
|
340
|
+
throttle_rates = {
|
|
341
|
+
"anon": "100/hour",
|
|
342
|
+
"user": "1000/hour",
|
|
343
|
+
}
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
### Background tasks
|
|
347
|
+
|
|
348
|
+
Sistema de tarefas em background ja implementado. Suporta filas, retry, scheduling.
|
|
349
|
+
|
|
350
|
+
```python
|
|
351
|
+
# Ja disponivel
|
|
352
|
+
@task(queue="default", max_retries=3)
|
|
353
|
+
async def send_email(user_id: int, template: str):
|
|
354
|
+
user = await User.objects.get(id=user_id)
|
|
355
|
+
await email_service.send(user.email, template)
|
|
356
|
+
|
|
357
|
+
# Chamar
|
|
358
|
+
await send_email.delay(user_id=1, template="welcome")
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
### Admin interface
|
|
362
|
+
|
|
363
|
+
Interface administrativa auto-gerada a partir dos models. Inspirada no Django Admin, mas com frontend moderno (React/Vue).
|
|
364
|
+
|
|
365
|
+
```python
|
|
366
|
+
# Planejado
|
|
367
|
+
from strider.admin import AdminSite, ModelAdmin
|
|
368
|
+
|
|
369
|
+
class UserAdmin(ModelAdmin):
|
|
370
|
+
list_display = ["id", "email", "is_active", "created_at"]
|
|
371
|
+
list_filter = ["is_active", "role"]
|
|
372
|
+
search_fields = ["email", "name"]
|
|
373
|
+
|
|
374
|
+
admin = AdminSite()
|
|
375
|
+
admin.register(User, UserAdmin)
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
### CLI para scaffolding
|
|
379
|
+
|
|
380
|
+
CLI ja disponivel para operacoes comuns:
|
|
381
|
+
|
|
382
|
+
```bash
|
|
383
|
+
# Ja disponivel
|
|
384
|
+
stride init my-api # Criar projeto
|
|
385
|
+
stride makemigrations --name x # Gerar migracao
|
|
386
|
+
stride migrate # Aplicar migracoes
|
|
387
|
+
stride run # Rodar servidor
|
|
388
|
+
core worker # Rodar worker de tasks
|
|
389
|
+
core consumer # Rodar consumer de mensagens
|
|
390
|
+
core docker generate # Gerar docker-compose.yml
|
|
391
|
+
|
|
392
|
+
# Planejado
|
|
393
|
+
core generate app users # Gerar app com estrutura padrao
|
|
394
|
+
core generate model Post # Gerar model com CRUD
|
|
395
|
+
core generate viewset Post # Gerar ViewSet a partir de model
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
## Contribuindo
|
|
399
|
+
|
|
400
|
+
```bash
|
|
401
|
+
# Clonar e instalar
|
|
402
|
+
git clone https://github.com/user/stride.git
|
|
403
|
+
cd stride
|
|
404
|
+
pip install -e ".[dev]"
|
|
405
|
+
|
|
406
|
+
# Rodar testes
|
|
407
|
+
pytest
|
|
408
|
+
|
|
409
|
+
# Rodar linter
|
|
410
|
+
ruff check .
|
|
411
|
+
mypy core/
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
## Licenca
|
|
415
|
+
|
|
416
|
+
MIT
|