chore(extensions): simplify backend package structure by removing superset_extensions namespace (#38476)

This commit is contained in:
Michael S. Molina
2026-03-06 14:49:49 -03:00
committed by GitHub
parent 5fb9e17721
commit a6c0d6321f
12 changed files with 70 additions and 169 deletions

View File

@@ -54,11 +54,10 @@ my-org.dataset-references/
│ └── package.json
├── backend/
│ ├── src/
│ │ └── superset_extensions/
│ │ └── my_org/
│ │ ── dataset_references/
│ │ ├── api.py
│ │ └── entrypoint.py
│ │ └── my_org/
│ │ └── dataset_references/
│ │ ── api.py
│ │ └── entrypoint.py
│ ├── pyproject.toml
│ └── requirements.txt
├── dist/
@@ -68,18 +67,17 @@ my-org.dataset-references/
│ │ ├── remoteEntry.d7a9225d042e4ccb6354.js
│ │ └── 900.038b20cdff6d49cfa8d9.js
│ └── backend
│ └── superset_extensions/
│ └── my_org/
── dataset_references/
├── api.py
│ └── entrypoint.py
│ └── my_org/
│ └── dataset_references/
── api.py
└── entrypoint.py
├── my-org.dataset-references-1.0.0.supx
└── README.md
```
**Note**: With publisher `my-org` and name `dataset-references`, the technical names are:
- Directory name: `my-org.dataset-references` (kebab-case)
- Backend Python namespace: `superset_extensions.my_org.dataset_references`
- Backend Python namespace: `my_org.dataset_references`
- Backend distribution package: `my_org-dataset_references`
- Frontend package name: `@my-org/dataset-references` (scoped)
- Module Federation name: `myOrg_datasetReferences` (camelCase)
@@ -113,7 +111,7 @@ The `extension.json` file contains the metadata necessary for the host applicati
Extensions use standardized entry point locations:
- **Backend**: `backend/src/superset_extensions/{publisher}/{name}/entrypoint.py`
- **Backend**: `backend/src/{publisher}/{name}/entrypoint.py`
- **Frontend**: `frontend/src/index.tsx`
### Build Configuration
@@ -129,7 +127,7 @@ license = "Apache-2.0"
[tool.apache_superset_extensions.build]
# Files to include in the extension build/bundle
include = [
"src/superset_extensions/my_org/dataset_references/**/*.py",
"src/my_org/dataset_references/**/*.py",
]
exclude = []
```

View File

@@ -68,7 +68,7 @@ Include backend? [Y/n]: Y
- **NPM package**: `@my-org/hello-world` (scoped package for frontend distribution)
- **Module Federation name**: `myOrg_helloWorld` (collision-safe JavaScript identifier)
- **Backend package**: `my_org-hello_world` (collision-safe Python distribution name)
- **Python namespace**: `superset_extensions.my_org.hello_world`
- **Python namespace**: `my_org.hello_world`
This approach ensures that extensions from different organizations cannot conflict, even if they use the same technical name (e.g., both `acme.dashboard-widgets` and `corp.dashboard-widgets` can coexist).
@@ -79,10 +79,9 @@ my-org.hello-world/
├── extension.json # Extension metadata and configuration
├── backend/ # Backend Python code
│ ├── src/
│ │ └── superset_extensions/
│ │ └── my_org/
│ │ └── hello_world/
│ │ └── entrypoint.py # Backend registration
│ │ └── my_org/
│ │ └── hello_world/
│ │ └── entrypoint.py # Backend registration
│ └── pyproject.toml
└── frontend/ # Frontend TypeScript/React code
├── src/
@@ -116,9 +115,9 @@ The generated `extension.json` contains the extension's metadata.
## Step 4: Create Backend API
The CLI generated a basic `backend/src/superset_extensions/my_org/hello_world/entrypoint.py`. We'll create an API endpoint.
The CLI generated a basic `backend/src/my_org/hello_world/entrypoint.py`. We'll create an API endpoint.
**Create `backend/src/superset_extensions/my_org/hello_world/api.py`**
**Create `backend/src/my_org/hello_world/api.py`**
```python
from flask import Response
@@ -176,7 +175,7 @@ class HelloWorldAPI(RestApi):
- The endpoint will be accessible at `/extensions/my-org/hello-world/message` (automatic extension context)
- OpenAPI docstrings are crucial - Flask-AppBuilder uses them to automatically generate interactive API documentation at `/swagger/v1`, allowing developers to explore endpoints, understand schemas, and test the API directly from the browser
**Update `backend/src/superset_extensions/my_org/hello_world/entrypoint.py`**
**Update `backend/src/my_org/hello_world/entrypoint.py`**
Replace the generated print statement with API import to trigger registration: