Compare commits

..

1138 Commits

Author SHA1 Message Date
Peng Ren
aaaa071673 feat(database): SIP-195 Add MongoDB database engine support (#37368)
Co-authored-by: Peng Ren <ia250@cummins.com>
(cherry picked from commit 73d4332b51)
2026-07-20 13:30:17 -07:00
Mehmet Salih Yavuz
5538984135 fix(databases): reset import file entry after invalid file error (#42240)
(cherry picked from commit c1e660fac8)
2026-07-20 11:00:59 -07:00
Jean Massucatto
376d11e1f0 fix(sqllab): reflect query history deletion without page refresh (#41019)
Co-authored-by: Evan Rusackas <evan@rusackas.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit fe7d9b4724)
2026-07-18 13:17:37 -07:00
Amin Ghadersohi
4ffffb54e9 docs(mcp): fix instruction/docstring drift and annotation metadata in mcp_service (#41922)
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
(cherry picked from commit 73aa8ef280)
2026-07-17 19:20:49 -07:00
Joe Li
151fb74075 fix(charts): render time comparison without a time grain (#42054)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit 157ef61fd8)
2026-07-17 11:29:42 -07:00
Joe Li
25a7461660 fix(dashboard): seed default active tab path at hydration (#42075)
(cherry picked from commit 20e6dfd37d)
2026-07-17 11:29:42 -07:00
Joe Li
2024f30f47 fix(alerts): remove double border on InputNumber fields in report modal (#42090)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit 3b7647eb6e)
2026-07-17 11:29:42 -07:00
Evan Rusackas
5a77e7d871 fix(dashboard): prevent filter dropdown button from disappearing during layout recalculations (#38193)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Claude <claude@anthropic.com>
(cherry picked from commit 55bb75efe6)
2026-07-17 11:29:42 -07:00
Joe Li
fe68d20aee fix(components): keep table pagination working after sorting by a column (#969)
The antd Table onChange callback in TableCollection fires for pagination,
filter, and sort changes alike. With an active sorter, every page click
re-dispatched setSortBy with a new array instance; react-table's
usePagination (autoResetPage) resets pageIndex whenever the sortBy state
identity changes, which cancelled the navigation. Sorting a column in any
client-paginated TableView (e.g. the dashboard 'View as table' pane) made
the pagination controls unresponsive, and ListView/server pagination
triggered a spurious page-1 refetch.

Gate the sort dispatch on antd's extra.action so only genuine sorter
changes reach setSortBy.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 11:29:42 -07:00
Joe Li
3aebd88087 ci(pre-commit): install helm-docs via go instead of untrusted brew tap (#973)
Homebrew rolled out an untrusted-tap security change on the GitHub runner
image that makes `brew install norwoodj/tap/helm-docs` fail with "Skipping
norwoodj/tap because it is not trusted", so the pre-commit workflow's
"Enable brew and helm-docs" step now exits non-zero before the hooks ever
run. This turned the "pre-commit checks" job red on every push regardless of
the diff.

Replace the brew tap install with `go install
github.com/norwoodj/helm-docs/cmd/helm-docs@v1.14.2`, matching apache/superset
upstream and keeping the binary version aligned with the helm-docs pre-commit
hook rev in .pre-commit-config.yaml.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-17 11:29:42 -07:00
yousoph
e415108bd9 fix(dashboard): block dependent filter from fetching until defaultToFirstItem parent selects (#40978)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
(cherry picked from commit 8603048518)
2026-07-17 11:29:42 -07:00
yousoph
de1313922e fix(plugin-chart-echarts): clarify Tooltip sort by metric description for stacked charts (#42106)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
(cherry picked from commit 2dfd08fdb3)
2026-07-17 11:29:42 -07:00
Mike Bridge
fc6b5c3c49 fix(charts): preserve time filter for expression axes (#42052)
Co-authored-by: Mike Bridge <michael.bridge@ext.preset.io>
(cherry picked from commit 90f9238f8a)
2026-07-17 11:29:42 -07:00
Amin Ghadersohi
4d46307576 fix(mcp): await ctx.info calls in update_dashboard tool (#41920)
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
(cherry picked from commit cec9afb165)
2026-07-17 11:29:42 -07:00
Elizabeth Thompson
84ece5439c fix(plugin-chart-echarts): use echarts 5.6.0 i18n export path for locale import (#42055)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit beb9d53687)
2026-07-17 11:29:42 -07:00
Joe Li
05b33371ee fix(subdirectory): apply the application root to plain anchor links (#962)
Three link sites render plain anchors (Typography.Link href=...) rather than
router <Link to=...>, so they bypass the <Router basename> that prefixes the
rest of the app and produce broken links under a SUPERSET_APP_ROOT
subdirectory deployment:

- the delete-dataset modal's "Affected Dashboards" / "Affected Charts" lists
- the tag list page's dashboard, chart and query rows
- an empty dashboard tab's "create a new chart" link

Add a prefixAppRoot helper to pathUtils and apply it at those sites. It cannot
reuse ensureAppRoot: that helper skips paths that already start with the
application root, and the dashboard route is itself /superset/dashboard/<id>/,
so with an application root of /superset it no-ops and the link stays broken.
prefixAppRoot always prefixes, which is what these router-relative paths need,
and it reproduces exactly what <Link to={url}> already renders via the router
basename on the dashboard and chart list pages. Absolute and protocol-relative
URLs still pass through untouched.

Cover each site with subdirectory regression tests, including the colliding
/superset root, plus unit tests for the helper.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-17 11:29:42 -07:00
Amin Ghadersohi
7bb3a48d26 fix(mcp): add AliasChoices to chart/dashboard/dataset request schemas (#41597)
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

(cherry picked from commit bd9ba24266)

[6.0 adaptation] Production schema aliases (chart/dashboard/dataset schemas.py)
applied to the 6.0 baseline. Two files needed adaptation because 6.0 predates
later MCP refactors:

- chart/schemas.py: kept the 6.0 base classes and added only
  `model_config = ConfigDict(populate_by_name=True)` to GenerateExploreLinkRequest
  and UpdateChartPreviewRequest. Dropped upstream's ChartRequestNormalizerMixin
  base (absent on 6.0 — would be F821); the model_config achieves the same
  populate-by-name behavior the aliases require.

- test_dashboard_schemas.py: kept TestRequestSchemaAliasChoices (exercises
  GetDashboardInfoRequest / ListDashboardsRequest / AddChartToDashboardRequest —
  all present on 6.0). Dropped upstream's TestDuplicateDashboardResponse (the
  Duplicate Dashboard feature is absent on 6.0).

dashboard/dataset schemas.py, chart/dataset tests, and the new dataset test
file applied clean. pytest: 184 passed (42 alias/canonical-resolution cases)
across all three schema test files.
2026-07-17 11:29:42 -07:00
Mehmet Salih Yavuz
7989bcea9e fix(dashboard): prevent native filter loss when saving chart customizations (#42032)
Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com>

(cherry picked from commit 76bb5f8e69)

[6.0 adaptation] Production sources (reducers/nativeFilters.ts, util/getRelatedCharts.ts,
actions/nativeFilters.ts, actions/chartCustomizationActions.ts) applied clean. Only the two
test files were ported to the 6.0 baseline:

- reducers/nativeFilters.test.ts: dropped 6.0's stale SET_NATIVE_FILTERS_CONFIG_COMPLETE
  tests that asserted the pre-fix "backend response is the source of truth / drop-on-omit"
  behavior; those directly contradict the landed merge-based reducer (which now preserves
  untouched filters and only removes ids in action.deletedIds). Kept #42032's canonical
  new-behavior set: removes deleted / removes all when all ids deleted / preserves untouched
  on omit / mixed Filter+ChartCustomization / adds+removes / merges+deletes.

- util/getRelatedCharts.test.ts: kept the undefined-filter guard test; excluded two
  master-baseline DatasourceType.SemanticView cases (SemanticView is absent on 6.0).

jest: 23/23 green across both files (nativeFilters.test.ts + getRelatedCharts.test.ts).
2026-07-17 11:29:42 -07:00
Antonio Rivero
257332aa71 fix(async-queries): back off polling when async event requests keep failing (#42012)
(cherry picked from commit 42523f8cc4)

6.0-release adaptation: asyncEvent.ts applied clean. asyncEvent.test.ts
ported to fetch-mock v11 (6.0 baseline): callHistory.calls() -> calls(),
clearHistory().removeRoutes() -> reset(). Excluded the reserved-job_id
prototype-pollution test.each block (master-baseline, not part of #42012).
2026-07-17 11:29:42 -07:00
yousoph
b957f5668c fix(explore): default Save As for new charts in save dialog (#41314)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 01cd215202)
2026-07-17 11:29:42 -07:00
Amin Ghadersohi
087648c0e9 fix(mcp): bind Big Number chart to a temporal column for dashboard time filters (#41895)
(cherry picked from commit bd61e09b4e)
2026-07-17 11:29:42 -07:00
Maxime Beauchemin
8f6fa85a7b fix(charts): fix time comparison crash when offsets share a numeric prefix (#39344)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 0efcd54250)
2026-07-17 11:29:42 -07:00
yousoph
492b74c8f8 fix(dataset): copy catalog field when duplicating a BigQuery dataset (#41106)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Evan Rusackas <evan@rusackas.com>
(cherry picked from commit f5deda7864)
2026-07-17 11:29:42 -07:00
yousoph
73646e6c2c fix(oauth2): retrigger queries for unsaved charts and schema loading after OAuth2 redirect (#41101)
(cherry picked from commit 098b95560d)
2026-07-17 11:29:42 -07:00
yousoph
92588d67ab fix(native-filters): persist created/pasted default values in select filter (#40984)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Joe Li <joe@preset.io>
(cherry picked from commit e08c2c12da)
2026-07-17 11:29:42 -07:00
Enzo Martellucci
8459338f45 fix(chart-echarts): disable animation for report screenshots so time-shift lines render fully (#42003)
(cherry picked from commit 5dd060b714)
2026-07-17 11:29:42 -07:00
Mehmet Salih Yavuz
d907259be8 feat(mcp): add update_dataset_metric tool for editing saved dataset metrics (#40975)
(cherry picked from commit 2fac66d1a3)
2026-07-17 11:29:42 -07:00
Amin Ghadersohi
ff2ebcfdfb fix(mcp): make list-item truncation cap configurable in get_dashboard_info (#41698)
(cherry picked from commit 62ccdfacc2)
2026-07-14 11:50:37 -07:00
Enzo Martellucci
9ee3272399 fix(dashboard): deleted Display Control reappears after Apply Filters (#41999)
(cherry picked from commit 8f75f1a353)
2026-07-14 11:50:37 -07:00
Amin Ghadersohi
20a6cad0c9 fix(mcp): stop masking dashboard lookup DB errors as not-found (#41919)
(cherry picked from commit 873566c827)
2026-07-14 11:50:37 -07:00
Alexandru Soare
65bd436527 feat(ListView): cherry-picking for folders feature onto 6.0-release (#961)
* feat(ListView): expose expandable prop (#40765)

* feat(listview): Add headerContent prop and HomeOutlined icon (#41244)

* feat(Icons): adding Layout icon (#41853)
2026-07-14 11:50:37 -07:00
Amin Ghadersohi
a06173b66a feat(mcp): add get_dashboard_datasets tool (#40961)
(cherry picked from commit fd9c84be43)
2026-07-14 11:50:37 -07:00
amaannawab923
0576ac4b57 fix(ag-grid): honor dataset hour offset in time range filters (#41391)
Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com>
Co-authored-by: Enzo Martellucci <enzomartellucci@gmail.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
(cherry picked from commit 9b508ebe0d)
2026-07-13 13:14:19 -07:00
yousoph
f723884808 fix(databases): update broken database documentation links to /user-docs namespace (#41557)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Đỗ Trọng Hải <41283691+hainenber@users.noreply.github.com>
Co-authored-by: Evan Rusackas <evan@preset.io>
(cherry picked from commit 033b7bc385)
2026-07-13 13:14:19 -07:00
yousoph
d703cc21ea feat(tags): add favorites filter to Tags list view (#41461)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
(cherry picked from commit c0b0a2fdaf)
2026-07-13 13:14:19 -07:00
yousoph
a3285544b3 fix(tags): make favorite star toggle in Tags list view (#41460)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
(cherry picked from commit d42076d541)
2026-07-07 16:19:15 -07:00
amaannawab923
9fb756a207 fix(ag-grid): keep basic conditional formatting aligned after sort (#41390)
Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com>
Co-authored-by: Enzo Martellucci <enzomartellucci@gmail.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
(cherry picked from commit ffd0982942)
2026-07-07 08:33:38 -07:00
amaannawab923
e29a281071 fix(ag-grid): select cell on click instead of its text (#41392)
Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com>
Co-authored-by: Enzo Martellucci <enzomartellucci@gmail.com>
(cherry picked from commit 5e384f54d3)
2026-07-07 08:27:46 -07:00
Mehmet Salih Yavuz
e12c08b0ea fix(sqllab): preserve saved query description when editing (#41685)
(cherry picked from commit de5a233ccf)
2026-07-07 08:25:05 -07:00
amaannawab923
f94de107b4 fix(ag-grid): persist "None" value aggregation selection (#41386)
Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com>
Co-authored-by: Enzo Martellucci <enzomartellucci@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
(cherry picked from commit fb496e158a)
2026-07-06 16:34:46 -07:00
yousoph
ca5e45458e fix(explore): prevent Results FilterInput from stealing focus during remount (#41100)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 19e94855a1)
2026-07-03 14:38:16 -07:00
Mike Bridge
fbf3667cfa fix(dao): SQL-faithful NULL and non-string handling in LIKE-family operators (#41653)
Co-authored-by: Mike Bridge <michael.bridge@ext.preset.io>
(cherry picked from commit be46d65e3b)
2026-07-03 14:25:47 -07:00
Joe Li
a870453816 fix(sqllab): preserve query history after tab migration (#41403)
(cherry picked from commit 7926c3a93a)
2026-07-03 14:22:22 -07:00
Joe Li
1d026a5322 fix(mixed-chart): preserve order_desc and series_limit_metric in buildQuery (#41401)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
(cherry picked from commit 825b582815)
2026-07-03 14:20:28 -07:00
Kamil Gabryjelski
800f57d628 fix(plugin-chart-ag-grid-table): show correct percent-metric totals in summary row (#41247)
Signed-off-by: Kamil Gabryjelski <kamil.gabryjelski@gmail.com>
(cherry picked from commit 2d78a8733c)
2026-07-03 14:19:06 -07:00
Joe Li
0cc04ff8a2 fix(mcp): handle SSL connection drop during pre-call session teardown (#39917)
Manual port of apache/superset#39917 (commit 85935b0b) onto 6.0-release.
A clean cherry-pick does not apply because mcp_service/auth.py has diverged
structurally on this branch, but the vulnerable code path is present verbatim:
sync_wrapper calls db.session.remove() before user resolution on reused
thread-pool threads. If the thread-local DBAPI connection died between
requests (RDS SSL idle-timeout / max-connection-age), the implicit rollback
raises a DBAPIError and crashes the tool call.

Wrap the pre-call remove in _remove_session_safe(), which catches DBAPIError,
invalidates the dead connection so the pool discards it, and retries remove()
so the tool proceeds on a fresh connection. Ports the accompanying regression
test byte-for-byte behaviorally.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 14:21:40 -07:00
Mehmet Salih Yavuz
99a374adda fix(dashboard): show a not-found state for a deleted dashboard (#41686)
(cherry picked from commit 8bf3933972)
2026-07-02 12:37:13 -07:00
Amin Ghadersohi
c63ada38f2 feat(mcp): add tags + typed metadata fields to update_dashboard (#40957)
(cherry picked from commit c60d8bb656)
2026-07-02 12:25:24 -07:00
Greg Neighbors
9cd2a0d7b8 feat(mcp): dashboard layout, theme, and CSS control + update_dashboard tool (#40399)
Co-authored-by: gkneighb <26003+gkneighb@users.noreply.github.com>
Co-authored-by: Greg Neighbors <gregneighbors@Gregs-MacBook-Air-2.local>
Co-authored-by: Greg Neighbors <gregneighbors@Gregs-Air-2.lan>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Evan Rusackas <evan@rusackas.com>
(cherry picked from commit d8bcc66472)
2026-07-02 12:11:12 -07:00
Mehmet Salih Yavuz
39a5abe515 fix(sqllab): reject blank saved query and dataset names (#41624)
Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com>
(cherry picked from commit a48ca9ce72)
2026-07-02 11:38:48 -07:00
Mehmet Salih Yavuz
c3d323f5c5 fix(sqllab): filter results table when typing in the search box (#41625)
(cherry picked from commit a919dda2ac)
2026-07-02 11:32:24 -07:00
Jean Massucatto
4969a91d56 fix(dashboard): pre-filter time grain for display controls (#40000)
Co-authored-by: Joe Li <joe@preset.io>
(cherry picked from commit e58ce1cf39)
2026-07-02 11:27:32 -07:00
Mehmet Salih Yavuz
721ec5fcc7 fix(sqllab): truncate long tab names in the overflow ("...") dropdown (#41585)
(cherry picked from commit b7d5de8e52)
2026-07-02 11:23:20 -07:00
Amin Ghadersohi
eb8a8aebf5 fix(mcp): escape LIKE wildcards in find_users to prevent user enumeration (#41593)
(cherry picked from commit 7f4cac63c9)
2026-07-02 11:06:44 -07:00
Amin Ghadersohi
aab1c0483e chore(mcp): remove low-value list/info tools that fail agent-native policy (#40690)
(cherry picked from commit ef7379c47e)

Adapted for 6.0-release: on this branch only the css_template and theme MCP
tool groups exist, so this pick removes those two groups (their list/get tools,
schemas, and unit tests) along with their docstring and get_schema references.
The plugin, action_log, and task-management tool groups the upstream change
also touched do not exist on 6.0 and were left untouched.
2026-07-02 10:35:18 -07:00
jesperct
214065ac0e fix(explore): stop metric edits from bleeding across metrics with duplicate optionNames (#41208)
Adapted for 6.0-release: the dedupeAdhocMetricOptionName helper and its
wiring were ported onto this branch's pre-TS-migration files
(AdhocMetric.js, MetricsControl.jsx) with type annotations stripped, and
onto DndMetricSelect.tsx whose coerceMetrics lacked the master type
casts. Behavior matches upstream: duplicate optionNames are regenerated
on load so editing one metric no longer overwrites another.

Co-authored-by: Evan Rusackas <evan@rusackas.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
(cherry picked from commit 0c12114ea9)
2026-07-02 10:22:40 -07:00
Joe Li
2df6091bb3 fix(dashboard): suppress favorite status error toast on 404 (#41402)
Adapted for 6.0-release: ported onto dashboardState.js/.test.js (still
pre-TS-migration on this branch) and onto the guard-less catch block,
preserving 6.0's existing "toast on any non-404 error" behavior while
swallowing the 404 case. The upstream currentId guard is a separate
change not present on this branch and is intentionally not included.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 797e497f4b)
2026-07-02 10:17:31 -07:00
yousoph
634d2ee2cb fix(explore): enable free-text entry for temporal D3 format selector in Table chart (#41194)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 105b896038)
2026-07-02 10:12:02 -07:00
jesperct
5bffda9a49 fix(sqllab): quote autocomplete table names that need it (#41199)
(cherry picked from commit 15626a047c)
2026-06-30 23:22:08 -07:00
Elizabeth Thompson
074cafc9dd fix(screenshots): catch empty-bytes tiled result and set ERROR on falsy image (#41097)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 134919ea36)
2026-06-30 21:41:27 -07:00
yousoph
fdef6d33ee fix(bigquery): quote dotted STRUCT columns per-segment in drill to detail (#41462)
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
(cherry picked from commit b8b23d6219)
2026-06-30 16:22:45 -07:00
Elizabeth Thompson
5cd2031618 fix(reports): pre-commit tab permalinks before state machine transaction (#41096)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit e15dc5735f)
2026-06-30 16:18:18 -07:00
Maxime Beauchemin
8b6cc68954 feat(mcp): resolve call_tool proxy name and capture error_type in logging (#38915)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
(cherry picked from commit b6f545e61e)
2026-06-30 12:25:20 -07:00
Maxime Beauchemin
527e729a9a fix(table): ensure dimensions appear before metrics in column order (#39346)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 4f19bc4c5f)
2026-06-29 11:45:20 -07:00
Amin Ghadersohi
56b5133721 fix(mcp): make search_tools query optional to fix null content on tool discovery (#40906)
(cherry picked from commit 820e3d18d3)
2026-06-26 20:48:41 -07:00
Alexandru Soare
57948b865d feat(security): Add extension hooks for custom access control, ownership, and asset lifecycle (#40707)
(cherry picked from commit 6d08e79259)
2026-06-26 15:59:54 -07:00
Mehmet Salih Yavuz
d0c3bc89a9 feat(explore): add full-range option for time-shift comparison (#41334)
(cherry picked from commit 9a11c15a33)
2026-06-26 15:59:54 -07:00
yousoph
1bef0b1d31 fix(pandas-postprocessing): handle prophet errors and validate minimum data points for forecast (#41180)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit f6ce105450)
2026-06-26 15:59:54 -07:00
yousoph
605ed6294d fix(sql_lab): serialize dict/list cell values as valid JSON strings (#41099)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 1d0866556f)
2026-06-26 15:59:54 -07:00
Enzo Martellucci
d2a5b43548 fix(big-number): respect extra_form_data.time_compare in Big Number with Time Comparison (#41342)
(cherry picked from commit 3ff90bd532)
2026-06-26 15:59:54 -07:00
yousoph
f73adb5a89 fix(sql-lab): normalize tabViewId in QUERY_EDITOR_SET_SQL reducer (#40983)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit c1f4062af6)
2026-06-26 15:59:54 -07:00
yousoph
b6d496532b fix(explore): pre-populate SaveModal dashboard from chart metadata (#41181)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 133473d0f4)
2026-06-26 15:59:54 -07:00
yousoph
111644cdc2 fix(dashboard): normalize legacy currentState to filterState in native_filters URL param (#40929)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit f70a2eac89)
2026-06-25 14:10:25 -07:00
Amin Ghadersohi
1465350ae2 fix(dashboards): remove thumbnail_url from list API to reduce cache cost (#38567)
(cherry picked from commit eebe1a1a5b)
2026-06-25 14:04:17 -07:00
Amin Ghadersohi
cd4f86c82c fix(bigquery): set default dataset from schema in adjust_engine_params (#40776)
(cherry picked from commit c1b5d05f83)
2026-06-25 14:00:02 -07:00
Amin Ghadersohi
62bf3a0c43 feat(mcp): add aggregation field to BigNumberChartConfig for Big Number with Trendline (#40775)
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
(cherry picked from commit 4b96b91b53)
2026-06-25 13:58:39 -07:00
Vitor Avila
be41e026f1 fix(chart API): Consider time grain filters with the filters_dashboard_id param (#41290)
(cherry picked from commit 3b46a5f121)
2026-06-22 21:02:01 -07:00
Geidō
268f1aee39 fix(dashboard): required filters reliably apply default + Apply enables on change (#40470)
(cherry picked from commit 01ed81785e)
2026-06-22 08:25:08 -07:00
Alexandru Soare
0a8f166c6f fix(matrixify): Set singular metric field for pie and other single-me… (#40852)
(cherry picked from commit 378473a6fe)
2026-06-22 08:21:27 -07:00
Vitor Avila
a363c81887 fix(chart API): apply dashboard filters by live scope, not stale chartsInScope (#41214)
(cherry picked from commit 334b13c3d9)
2026-06-19 12:33:44 -07:00
Vitor Avila
34ee189094 fix(chart): preserve SQL_QUERY_MUTATOR line comments structure (#41215)
(cherry picked from commit 9e130e5927)
2026-06-19 12:30:00 -07:00
Vitor Avila
57a4fd096f fix(chart API): Do not duplicate Jinja-applied filters with filters_dashboard_id (#41131)
(cherry picked from commit b4e3452bfd)
2026-06-19 12:26:44 -07:00
Evan Rusackas
4fb3c6cc8d fix(dashboard): replace chartsInScope references at import time (#38171)
Co-authored-by: Rémy Dubois <remy.dubois@komodohealth.com>
Co-authored-by: Claude Code <noreply@anthropic.com>
(cherry picked from commit 19d01521bf)
2026-06-19 12:20:52 -07:00
Richard Fogaca Nienkotter
ff0d8d8055 fix(embedded): skip CSRF token fetch for guest streaming chart exports (#41004)
(cherry picked from commit a1bc3c67ed)
2026-06-18 12:29:28 -07:00
jesperct
89c57aa0cc fix(explore): drop inherit/custom time shifts when switching to a viz that can't honor them (#40865)
(cherry picked from commit 188c84f1cd)
2026-06-18 12:25:23 -07:00
jesperct
bae6e6a646 fix(charts): apply datetime format to unaggregated temporal columns (#41060)
(cherry picked from commit ef82da8458)
2026-06-17 16:36:33 -07:00
jesperct
5caad5201a fix(plugin-chart-handlebars): follow the app theme in Customize code editors (#40952)
(cherry picked from commit 2d2a8f3ab0)
2026-06-17 16:27:56 -07:00
Joao Amaral
de4d0f6d94 fix(celery): check app context before session removal in teardown (#37574)
Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
Co-authored-by: Đỗ Trọng Hải <41283691+hainenber@users.noreply.github.com>
Co-authored-by: Daniel Vaz Gaspar <danielvazgaspar@gmail.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Elizabeth Thompson <eschutho@gmail.com>
(cherry picked from commit 750518cf6f)
2026-06-17 08:15:55 -07:00
Hugh A. Miles II
e6db576381 feat(dashboard): add Rison-encoded URL filter support (#39795)
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
(cherry picked from commit 9a79588d35)
2026-06-12 10:47:55 -07:00
Alexandru Soare
01ef788f9b fix(explore): require Update Chart for Matrixify dimension changes (#40851)
(cherry picked from commit 56c856e802)
2026-06-12 09:45:10 -07:00
Elizabeth Thompson
226726fbf4 fix: replace deprecated appbuilder.app with current_app (#40876)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit c0e78f39d7)
2026-06-12 09:45:10 -07:00
Elizabeth Thompson
827fb467ca fix: use Series.iloc for positional access in generate_join_column (#40936)
(cherry picked from commit b0d7880ac0)
2026-06-12 09:45:10 -07:00
Geidō
6f6aa37df3 fix(deps): cap paramiko <4.0 to keep SSH tunneling working (#40973)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Mehmet Salih Yavuz <salih.yavuz@proton.me>
(cherry picked from commit 74845eaf0b)
2026-06-12 09:45:10 -07:00
Mehmet Salih Yavuz
bf0f73df02 fix(theme): SDK theme config overrides dashboard-level theme in embedded mode (#40763)
(cherry picked from commit d7ddf2023d)
2026-06-12 09:45:10 -07:00
jesperct
89e5815b66 fix(dashboard): update browser tab title when dashboard is renamed (#40730)
Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com>
(cherry picked from commit 21189ae130)
2026-06-12 09:45:10 -07:00
Daniel Vaz Gaspar
03f350a479 fix(sqllab): prevent corrupted query state from blocking SQL Lab access (#40580)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Joe Li <joe@preset.io>
2026-06-12 09:45:10 -07:00
chaselynisabella
4136be1f30 feat(path): support metric-based color scales & line width by metric (#39165)
(cherry picked from commit ac035083d7)
2026-06-05 19:31:31 -07:00
yousoph
dbfafa83aa fix(dashboard): prevent divider display controls from reverting on second save (#40696)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit e956f82224)
2026-06-05 18:41:30 -07:00
jesperct
5125ae0fd8 fix(dashboard): sort Dynamic Group By display values alphabetically (#40220)
(cherry picked from commit 8119204857)
2026-06-05 17:54:29 -07:00
Richard Fogaca Nienkotter
8cfe2ae02a fix(embedded): add guest token to streaming exports (#40712)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
(cherry picked from commit 601f9c2b8c)
2026-06-05 17:51:36 -07:00
Amin Ghadersohi
9e45088364 fix(mcp): add select_columns lean defaults to get_dashboard_info, get_chart_info, get_dataset_info (#40473)
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: Richard Fogaça <richardfogaca@gmail.com>
(cherry picked from commit aa4092ba68)
2026-06-05 17:50:15 -07:00
Maxime Beauchemin
5e46e58453 fix(table): fix cross-filter not clearing on second click in Interactive Table (#39253)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit c2d96e0dce)
2026-06-05 17:48:21 -07:00
Amin Ghadersohi
f7429845d5 fix(mcp): API key authentication for MCP — transport, validation, and RBAC (#39604)
(cherry picked from commit 7d69f76127)
2026-06-05 17:44:00 -07:00
Amin Ghadersohi
9a72a03608 fix(mcp): fall back to form_data spatial query for Deck.gl charts (#40339)
(cherry picked from commit f4dfb7f026)
2026-06-05 17:35:32 -07:00
Amin Ghadersohi
54fc66b7cf fix(mcp): escape LIKE wildcards in MCP list tool search filters (#40682)
(cherry picked from commit 001834470b)
2026-06-05 17:34:22 -07:00
Kamil Gabryjelski
b40738fd10 feat(gsheets): restore public/private sheet selector (#40466)
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
(cherry picked from commit 2abbb64e6b)
2026-06-05 17:33:05 -07:00
Amin Ghadersohi
59af59405b chore(deps): migrate MCP service JWT errors from authlib.jose to joserfc (#40582)
(cherry picked from commit a6d2c95480)
2026-06-05 17:27:44 -07:00
Amin Ghadersohi
2ead15894e feat(mcp): add list_reports and get_report_info tools (#40348)
Co-authored-by: Richard Fogaça <richardfogaca@gmail.com>
(cherry picked from commit 5312d0adf8)
2026-06-05 17:24:35 -07:00
Amin Ghadersohi
b84377cdfd feat(mcp): add list_tags and get_tag_info MCP tools (#40349)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 8d8eeb3505)
2026-06-05 17:12:45 -07:00
Amin Ghadersohi
5f0e9a5377 feat(mcp): add list and get tools for saved queries and query history (#40346)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit a69bbcb044)
2026-06-05 17:10:32 -07:00
Amin Ghadersohi
22327a9a0a feat(mcp): add list and get tools for CSS templates and themes (#40343)
(cherry picked from commit d350792d43)
2026-06-05 17:07:42 -07:00
Amin Ghadersohi
385b84f572 feat(mcp): add list and get tools for annotation layers and annotations (#40342)
(cherry picked from commit f614863ed7)
2026-06-05 17:02:25 -07:00
Mehmet Salih Yavuz
e23a3eae1a feat(mcp): add get_dashboard_layout companion tool (#40328)
(cherry picked from commit 8853ab5c75)
2026-06-05 16:59:16 -07:00
Elizabeth Thompson
4e315fd769 fix(roles): resolve HTTP 429 errors on role management page (#39465)
Adapted for 6.0-release: only the fetchOptions.ts concurrency throttle (429
fix) applies. The RoleListEditModal.tsx/test.tsx changes (414 fix) depend on
the AsyncSelect architecture introduced in #38387, which is not present on
6.0; in 6.0 the modal receives permissions/groups as props from the parent
list page rather than fetching them itself with id-IN filters, so the 414
URL-length code path does not exist here.

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit f037449b75)
2026-06-05 16:57:06 -07:00
Gabriel Torres Ruiz
610d1c5998 feat(mcp): support custom SQL metrics in generate_chart and update_chart (#40448)
(cherry picked from commit e68251fa70)
2026-06-05 16:53:09 -07:00
Amin Ghadersohi
98ee054613 feat(mcp): browser hello page with working middleware and config-driven content (#40471)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 0dc58d1042)
2026-06-05 16:49:56 -07:00
Amin Ghadersohi
abc4dfb01c fix(mcp): return error when target_tab not found in add_chart_to_existing_dashboard (#40124)
(cherry picked from commit e041f25385)
2026-06-05 16:48:48 -07:00
Amin Ghadersohi
c814025522 fix(mcp): prevent encoding error on tools/list when middleware raises (#40446)
(cherry picked from commit 952a6f3a23)
2026-06-05 16:46:29 -07:00
Joe Li
b9cdea4b95 fix(select): replace cached options with search results in AsyncSelect (#40039)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 3b4892c48c)
2026-06-05 16:45:32 -07:00
Amin Ghadersohi
227a97ce73 feat(mcp): add series_limit to generate_chart XY config (#40307)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 5966bb1c1e)
2026-06-05 16:44:27 -07:00
Amin Ghadersohi
8247e67d58 fix(mcp): hide write tools from users without write permissions (#40098)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit e25d708197)
2026-06-05 16:42:55 -07:00
SkinnyPigeon
9ee01c54f4 feat: Allow specific mcp tools to be disabled (#39835)
(cherry picked from commit 70419e9d8f)
2026-06-05 16:39:29 -07:00
Beto Dealmeida
93265c1ac7 chore: bump shillelagh to 1.4.4 (#39870)
(cherry picked from commit 76955017eb)
2026-06-05 16:35:49 -07:00
Richard Fogaca Nienkotter
febab1e24d fix(mcp): default chart previews to ascii (#39719)
(cherry picked from commit d0abb66fdf)
2026-06-05 16:34:34 -07:00
Amin Ghadersohi
0e12a92930 fix(mcp): correct method name in API key auth (extract_api_key_from_request) (#39437)
(cherry picked from commit 7c4f87615b)
2026-06-05 16:31:35 -07:00
Amin Ghadersohi
c9d505eaa8 fix(mcp): unwrap ToolResult payload before truncation in ResponseSizeGuardMiddleware (#39578)
Co-authored-by: Elizabeth Thompson <eschutho@gmail.com>
(cherry picked from commit b1b6a057d8)
2026-06-05 16:30:33 -07:00
Gabriel Torres Ruiz
e357c10a44 fix(mcp): clear stale query_context in update_chart so filters and row_limit are applied (#39413)
(cherry picked from commit 919daabe54)
2026-06-05 16:28:59 -07:00
Maxime Beauchemin
020ce9ca8e fix(table): use column label instead of SQL expression for orderby in downloads (#39332)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit b3e88db87e)
2026-06-05 15:54:52 -07:00
Richard Fogaca Nienkotter
301b5901f2 fix(dashboard): apply dynamic groupby display controls to scoped charts (#39356)
(cherry picked from commit c3a0f2749b)
2026-06-05 15:21:25 -07:00
Richard Fogaca Nienkotter
b63f86765c fix(heatmap): skip orderby for value-based axis sorts (#39290)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit c971ea3ec6)
2026-06-05 14:42:26 -07:00
Maxime Beauchemin
8e6c0f05b8 fix(SqlLab): improve SQL diff modal — responsive width, padding, tabs, and copy button (#39246)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 450701ecec)
2026-06-05 13:46:42 -07:00
Evan Rusackas
0f45af3d98 fix(dashboard-import): remap chartsInScope on import (#26338) (#40140)
Co-authored-by: Claude Code <noreply@anthropic.com>
Co-authored-by: Claude <claude@anthropic.com>
(cherry picked from commit 4a9aecda4a)
2026-06-05 11:54:42 -07:00
Mafi
fa702ac47b fix(dashboard): use datasetUuid instead of datasetId in display controls export/import (SC-104655) (#40008)
Co-authored-by: Matt Fitzgerald <matt.fitzgerald@preset.io>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 144dae7c43)
2026-06-05 11:33:17 -07:00
Elizabeth Thompson
3c83e2e18f fix(reports): add per-tile animation wait to prevent partial ECharts renders in tiled screenshots (#40694)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 42367afb25)
2026-06-05 09:16:03 -07:00
Vitor Avila
896c36a14b fix(dashboard-filter): Consider dashboard filters to charts not declared in the dashboard position (#40774)
(cherry picked from commit 7406098708)
2026-06-04 14:27:52 -07:00
Jean Massucatto
2f2da14c58 fix(charts): show non-filterable columns in metric section for table … (#39524)
(cherry picked from commit fc0245bdb0)
2026-06-04 14:25:51 -07:00
Mehmet Salih Yavuz
15d4adb6b6 fix(reports): skip permalink when dashboard state has no anchor or filters (#40530)
(cherry picked from commit e2ed989639)
2026-06-03 15:47:38 -07:00
Jean Massucatto
cdbc89408a fix(explore): tighten popover title-to-tabs spacing to 12px (#40410)
(cherry picked from commit d2d46169bf)
2026-06-03 15:47:38 -07:00
Jean Massucatto
e0b9397b28 fix(chart-list): sort by changed_on instead of last_saved_at (#39984)
(cherry picked from commit 1b8099811b)
2026-06-03 15:47:38 -07:00
jesperct
a1395b3f3e fix(time-comparison): shift offset filter when X-axis is adhoc Custom SQL (#40586)
(cherry picked from commit 699e741c69)
2026-06-03 15:47:38 -07:00
Jean Massucatto
4b0fcb88b7 fix(world-map): preserve bubbles and exclude only null metrics from color scale (#39926)
(cherry picked from commit 7275116f4c)
2026-06-03 15:47:38 -07:00
Jean Massucatto
5824083248 fix(dashboard): clear undo history (#40569)
(cherry picked from commit ddb647cd3a)
2026-06-03 15:47:38 -07:00
Jean Massucatto
2d74122302 fix(dataset): sort by data type when clicking Datatype column header (#40411)
(cherry picked from commit 316dd3db22)
2026-06-03 15:47:38 -07:00
jesperct
5c3f4bc27e fix(dashboard): preserve user selection when Dynamic Group By overlaps base (#40031)
(cherry picked from commit d52e28c564)
2026-06-03 15:47:38 -07:00
jesperct
8de0b923da fix(dataset): validate catalog against allow_multi_catalog on import (#40376)
(cherry picked from commit a2eda11a81)
2026-06-03 15:47:38 -07:00
jesperct
8caa35c2cf fix(chart-echarts): drop white textBorder from Funnel segment labels (#40468)
(cherry picked from commit c73106b7a2)
2026-06-03 15:47:38 -07:00
Maxime Beauchemin
c53e38e566 fix(list-view): preserve user name in filter pill after navigation (#39505)
Co-authored-by: Joe Li <joe@preset.io>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
(cherry picked from commit a273fe4d62)
2026-06-03 15:47:38 -07:00
Kamil Gabryjelski
33027be139 fix(mcp): Improve validation errors and field aliases to reduce failed LLM tool calls (#38625)
(cherry picked from commit d91b96814e)
2026-06-03 15:47:38 -07:00
Richard Fogaca Nienkotter
e2c746a9a5 fix(mcp): return requested update chart previews (#40077)
(cherry picked from commit fa06989ed7)
2026-06-03 15:47:38 -07:00
Alexandru Soare
f759506366 feat(mcp): make form_data_key optional in update_chart_preview (#39680)
(cherry picked from commit 33585b0480)
2026-06-03 09:13:54 -07:00
Alexandru Soare
9ea64571dd chore(mcp): Simplify chart preview response (#40020)
(cherry picked from commit b64561f3a3)
2026-06-03 09:13:54 -07:00
Mehmet Salih Yavuz
4349e7c97b fix(mcp): use name URL param so AI-generated SQL Lab titles render (#40288)
(cherry picked from commit 8ab4695ba3)
2026-06-03 09:13:54 -07:00
Alexandru Soare
894d64cdd9 fix(preview): fix chart preview bugs (#40063)
(cherry picked from commit 558ff4452b)
2026-06-03 09:13:54 -07:00
Mehmet Salih Yavuz
e8e9fa9e61 feat(mcp): make config optional in generate_explore_link (#39559)
(cherry picked from commit 4c3f65ef0b)
2026-06-03 09:13:54 -07:00
Mehmet Salih Yavuz
4b0bd34372 feat(mcp): include applied dashboard filters in get_chart_info (#39620)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
(cherry picked from commit 53d8e5bdfa)
2026-06-03 09:13:54 -07:00
Mehmet Salih Yavuz
7ce69aecdf fix(mcp): eager-load dataset.metrics to prevent Excel export DetachedInstanceError (#39483)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
(cherry picked from commit 2f95d288dd)
2026-06-03 09:13:54 -07:00
Mehmet Salih Yavuz
cd64365399 feat(mcp): add find_users tool and owner filter columns for listings (#39679)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
(cherry picked from commit d1d07112aa)
2026-06-03 09:13:54 -07:00
Alexandru Soare
a88648a793 fix(recommandation): Fix chart recommandation (#39886)
(cherry picked from commit e3711bec39)
2026-06-03 09:13:54 -07:00
Mehmet Salih Yavuz
741693e2f5 feat(mcp): chart formatting options across all supported chart types (#39887)
(cherry picked from commit ce9cab098f)
2026-06-03 09:13:54 -07:00
Alexandru Soare
82050eac85 fix(mcp): Skip misleading trend analysis for categorical ASCII charts (#39761)
(cherry picked from commit fb276b08dd)
2026-06-03 09:13:54 -07:00
Alexandru Soare
41d4d46b55 fix(mcp): raise right error (#39964)
(cherry picked from commit 6e8b3bf976)
2026-06-03 09:13:54 -07:00
Alexandru Soare
ad42f8a8b4 feat(mcp): Add mcp_call_id to tool responses for server log correlation (#39776)
(cherry picked from commit 55024e8f4d)
2026-06-03 09:13:54 -07:00
Alexandru Soare
68adc2cb41 fix(mcp): Block destructive DDL (DROP, TRUNCATE, ALTER) in execute_sql (#39621)
(cherry picked from commit b98bd2a07a)
2026-06-03 09:13:54 -07:00
Alexandru Soare
7e47e27ff0 fix(mcp): changed_on_humanized null in write tool responses (generate_dashboard, generate_chart) (#39488)
(cherry picked from commit 0a3a35018c)
2026-06-02 14:25:36 -07:00
Alexandru Soare
575f1cc9cb chore(mcp): Standardize error response shapes across chart tools (#39905)
(cherry picked from commit 966e97989b)
2026-06-02 14:24:55 -07:00
Jean Massucatto
9e96ac04bb fix(explore): hide value input for unary filter operators (#39924)
(cherry picked from commit 965ec47296)
2026-06-01 16:29:57 -07:00
Abdul Rehman
b90d74bce0 fix(frontend): handle null/undefined path in ensureAppRoot (#39940)
Co-authored-by: Đỗ Trọng Hải <41283691+hainenber@users.noreply.github.com>
(cherry picked from commit 816794b198)
2026-06-01 11:22:35 -07:00
Martyn Gigg
d7a9d99ac0 fix(superset-frontend): Fixes for broken functionality when an application root is defined (#36058)
(cherry picked from commit e4f649e49c)
2026-06-01 11:19:22 -07:00
Joe Li
e976a30937 fix(export): URL prefix handling for subdirectory deployments (#36771)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 22cfc4536b)
2026-06-01 11:14:14 -07:00
Joe Li
9f96751d93 test(playwright): convert and create new dataset list playwright tests (#36196)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit d0361cb881)
2026-06-01 11:00:33 -07:00
Evan Rusackas
f8314ba725 fix(sqla): pass catalog and schema to get_sqla_engine in values_for_column (#38681)
Co-authored-by: Superset Dev <dev@superset.apache.org>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Claude <claude@anthropic.com>
(cherry picked from commit 26ef4b7ed3)
2026-05-22 15:14:47 -07:00
Elizabeth Thompson
c952010683 fix(reports): guard null dashboard height in Playwright screenshots (#40179)
(cherry picked from commit f187a8e1c4)
2026-05-22 15:14:47 -07:00
Jean Massucatto
5f03a3a80b fix(explore): prevent unnecessary scrollbars during chart rendering (#39291)
(cherry picked from commit 054aeb3bae)
2026-05-22 15:14:47 -07:00
Richard Fogaca Nienkotter
51d76fdf9e fix(mcp): apply cached adhoc filters to chart retrieval (#40099)
(cherry picked from commit 8fa5a75c70)
2026-05-22 15:14:47 -07:00
Amin Ghadersohi
b46ee47661 fix(mcp): database filter columns, timeseries SQL, and unsaved chart datasource name (#39636)
Completes the earlier partial backport of #39636 (commit 9039d1460c)
which only applied the database/schemas.py + test_database_tools.py
chunks and dropped the get_chart_sql.py + test_get_chart_sql.py chunks
entirely. The dropped chunks introduce the `_resolve_engine` and
`_resolve_datasource_name` helpers used by #40099.

(cherry picked from commit 7774ec7e3c)
2026-05-22 15:14:47 -07:00
Maxime Beauchemin
8af0ff7e3b fix(table): fall back to datasource columns for conditional formatting when query results are empty (#39345)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Joe Li <joe@preset.io>

Adapted for 6.0-release:
- Dropped the `allColumns` block and ENTIRE_ROW formatting option;
  ObjectFormattingEnum.ENTIRE_ROW was introduced in master-only PR
  #35897 (feat: add formatting column and formatting object to
  conditional formatting table) which is not on 6.0-release.
- The customer-visible fix (fallback to datasource columns when query
  results are empty) is preserved for 6.0's existing numericColumns
  control surface.
- Test file: dropped the two `allColumns`/ENTIRE_ROW assertions and
  the dedicated ENTIRE_ROW test for the same reason.

(cherry picked from commit a60860c969)
2026-05-22 12:08:30 -07:00
Amin Ghadersohi
0dbdf00587 fix(mcp): improve not-found errors to suggest corresponding list_* tools (#39919)
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
(cherry picked from commit 460992d89b)
2026-05-22 12:08:30 -07:00
Sandesh Devaraju
2fed392839 fix(mcp): JSON-serialize order_by_cols and support sort direction (#39952)
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
(cherry picked from commit 823eb905d3)
2026-05-22 12:08:30 -07:00
Richard Fogaca Nienkotter
7f501aab42 fix(mcp): expose table chart type labels in chart responses (#40060)
(cherry picked from commit 2a1dcb79e3)
2026-05-22 12:08:30 -07:00
Amin Ghadersohi
aef0d65b3f fix(mcp): clarify request wrapper in list_datasets, list_charts, list_dashboards (#39920)
(cherry picked from commit cfb0b6e811)
2026-05-22 12:08:30 -07:00
Amin Ghadersohi
cd341db6d8 fix(mcp): add default request parameter to list_charts and list_dashboards (#39730)
(cherry picked from commit 957b298ae1)
2026-05-22 10:37:55 -07:00
Mafi
0cab4885bc fix(sqllab): execute prequeries on streaming connection to fix PostgreSQL CSV export (#40194)
Co-authored-by: Matt Fitzgerald <matt.fitzgerald@preset.io>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit b66c104fde)
2026-05-22 10:37:55 -07:00
jesperct
6e38cc4c80 fix(echarts): preserve dataZoom range across setOption(notMerge) (#40173)
(cherry picked from commit 5bb54cc96b)
2026-05-22 10:37:55 -07:00
Richard Fogaca Nienkotter
123d563eb1 feat(mcp): add data boundary instruction to harden against prompt injection (#40080)
(cherry picked from commit c59ab8bffd)
2026-05-21 14:58:34 -07:00
Mafi
464398f37b fix(mixed-timeseries): preserve all-NaN metric columns after pivot when Jinja evaluates to NULL (#40005)
Co-authored-by: Matt Fitzgerald <matt.fitzgerald@preset.io>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 01224007da)
2026-05-21 14:58:23 -07:00
Jean Massucatto
f62211a0ca fix(sqllab): handle scientific notation in big number JSON responses (#39994)
(cherry picked from commit e6179036ec)
2026-05-21 14:57:55 -07:00
Amin Ghadersohi
a888e9957a fix(mcp): ASCII chart crashes with NaN when dataset contains null values (#39916)
(cherry picked from commit 547660dcc4)
2026-05-21 14:56:53 -07:00
Richard Fogaca Nienkotter
f3628fa653 fix(explore): preserve preview chart name on save (#39908)
(cherry picked from commit 8c80caefa3)
2026-05-21 14:56:29 -07:00
Elizabeth Thompson
680bd7e444 fix(reports): narrow spinner checks to viewport and tighten exception handling (#39895)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 8d2b655c22)
2026-05-21 14:56:21 -07:00
Elizabeth Thompson
7d28006505 fix(mcp): exclude self-referencing filter columns from get_schema output (#39826)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
(cherry picked from commit ef0efb7493)
2026-05-21 14:55:51 -07:00
Elizabeth Thompson
1bb32b70cb fix(export): fix double app-root prefix in chart/drill-detail export URLs (#39710)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 958d4aa3de)
2026-05-20 18:09:13 -07:00
Mehmet Salih Yavuz
46ef48971b fix: chart rendering race condition and homepage connection reset (#40065)
Co-authored-by: Geidō <60598000+geido@users.noreply.github.com>
(cherry picked from commit a62bf2b0bb)
2026-05-20 11:58:28 -07:00
Mehmet Salih Yavuz
4745484c7c fix(rls): prevent double-apply when converting physical dataset to virtual (#39725)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
(cherry picked from commit 8b0e63b58c)
2026-05-20 11:51:41 -07:00
Mehmet Salih Yavuz
ae25eede48 fix(dashboard): Clear All filters now stages changes until Apply (#39778)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com>
(cherry picked from commit 245fffca79)
2026-05-20 11:50:04 -07:00
Mehmet Salih Yavuz
d5cd674740 fix(dashboard): row limit warning missing for non-table charts (#39911)
(cherry picked from commit 372b50e19d)
2026-05-20 11:45:48 -07:00
Mehmet Salih Yavuz
94cfefeaa6 fix(table): consolidate visual column options under Visual formatting section (#39856)
(cherry picked from commit 69fbbfd7ce)
2026-05-20 11:43:34 -07:00
Enzo Martellucci
debc7da93b fix(embedded-sdk): grant fullscreen and clipboard-write by default (#39943)
(cherry picked from commit d3784879c2)
2026-05-20 11:42:31 -07:00
Richard Fogaca Nienkotter
7344426aea fix(dashboard): match auto-refresh paused-dot outline to icon color (#39909)
(cherry picked from commit 8088c5d1de)
2026-05-20 11:42:02 -07:00
Joe Li
c9618cc73a fix(dashboard): restore top-level tab drop target for dashboards with content (#39423)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
(cherry picked from commit d7fa9301cc)
2026-05-19 17:04:44 -07:00
jesperct
7672dce4aa fix(echarts): suppress phantom x-axis label at axis edge when no time grain (#39972)
(cherry picked from commit 5393fdfabf)
2026-05-19 15:12:17 -07:00
Vitor Avila
cf2f4c0438 fix(OAuth2): Re-query the OAuth2 token to avoid stale reference (#40071)
(cherry picked from commit d40a5cad5d)
2026-05-19 15:12:17 -07:00
Beto Dealmeida
eeedcaf47b fix: OAuth2 exception should be 403 (#40074)
(cherry picked from commit 736a51c13f)
2026-05-19 15:12:17 -07:00
Vitor Avila
1666be2b95 fix(OAuth2): Support OAuth2 exception with legacy endpoint (#39897)
(cherry picked from commit 3745e37182)
2026-05-19 15:12:17 -07:00
Vitor Avila
b900cc53b7 fix(GSheets OAuth2): Re-add UnauthenticatedError (#39785)
(cherry picked from commit 3f550f166f)
2026-05-19 15:12:17 -07:00
Vitor Avila
05e68c3187 fix(db oauth2): Improve OAuth2 flow (#39499)
(cherry picked from commit 191337e08d)
2026-05-19 14:06:43 -07:00
Beto Dealmeida
b968978ad5 fix(oauth2): silence lock acquisition errors on token refresh (#39463)
Co-authored-by: Beto Dealmeida <beto@preset.io>
(cherry picked from commit 5fb89b865d)
2026-05-19 14:03:39 -07:00
jesperct
3543be247f fix(AlertReportModal): TypeError when pasting text into the Alerts content form search field (#39298)
Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
(cherry picked from commit 6cebba49ca)
2026-05-18 22:12:43 -07:00
Maxime Beauchemin
fa2fbb2c00 fix(importexport): honor overwrite flag on /api/v1/assets/import (#39502)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit d90d3a2dea)
2026-05-18 14:05:41 -07:00
Maxime Beauchemin
0ba574d3f2 fix(sqllab): include template_params when overwriting a dataset (#39501)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 6ee4d694bc)
2026-05-18 14:04:10 -07:00
Maxime Beauchemin
2e4b7accc4 fix(trino/presto): use equality for boolean filters to support computed columns (#39500)
(cherry picked from commit d023fe1703)
2026-05-18 14:03:47 -07:00
Jean Massucatto
3c56ad9bc8 fix(table): restore dropdown arrow visibility on paginated table page… (#39305)
(cherry picked from commit 9c3c8dcc0b)
2026-05-18 14:03:06 -07:00
Jean Massucatto
c2079726cd fix(chart): use categorical axis for bar charts with numeric x-axis (#39141)
Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com>
(cherry picked from commit 171414f165)
2026-05-18 14:02:18 -07:00
Maxime Beauchemin
91678ca2cd fix(import): import tags during CLI native asset import (#39495)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit c4cf03f899)
2026-05-18 14:01:44 -07:00
jesperct
271b3fecee fix(time-comparison): use chart row_limit instead of instance config in offset queries (#39490)
(cherry picked from commit d8dd2d99b3)
2026-05-18 10:58:47 -07:00
Gabriel Torres Ruiz
60f1d01f25 feat(mcp): add create_virtual_dataset tool to save SQL queries as datasets (#39279)
(cherry picked from commit 18d6feb499)
2026-05-18 10:56:33 -07:00
Amin Ghadersohi
dc5afb132a fix(mcp): use tiktoken for response-size-guard token estimation (#39912)
(cherry picked from commit 9b520312a1)
2026-05-18 10:14:31 -07:00
Amin Ghadersohi
d7fdb8a979 fix(mcp): validate column refs in generate_explore_link, update_chart_preview, and update_chart (#39797)
(cherry picked from commit 4a21a5365f)
(cherry picked from commit 7230edcb69869a342e80ca28d76ae1aec3612b80)
2026-05-17 21:37:15 -07:00
Richard Fogaca Nienkotter
4ad3053c7f fix(mcp): warn on invalid chart preview form data key (#39891)
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
(cherry picked from commit 9459bc7bf4)
2026-05-17 21:37:04 -07:00
Joe Li
b03b060533 fix(explore): add matrixify_enable guard to prevent stale validators on pre-revamp charts (#38765)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 4b17ac2629)
2026-05-17 19:42:45 -07:00
jesperct
bd8801cd5f test(plugin-chart-echarts): regression guards for temporal x-axis labels on timeseries charts (#39208)
(cherry picked from commit 5b5f23d127)
2026-05-17 18:08:11 -07:00
Amin Ghadersohi
a4a85b09d1 fix(mcp): point get_dataset_info url to explore view instead of legacy tablemodelview edit (#39838)
(cherry picked from commit 673634f7af)
2026-05-16 23:09:18 -07:00
Amin Ghadersohi
53c2d1a31d feat(mcp): warn when execute_sql template_params used with templating disabled (#39858)
(cherry picked from commit 28239c18d4)
2026-05-16 22:39:51 -07:00
Enzo Martellucci
4bfaeb8f10 feat(mcp): add generate_bug_report tool with PII sanitization (#39595)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
(cherry picked from commit e4fe08ab9e)
2026-05-15 20:10:15 -07:00
Enzo Martellucci
fa9ecaa243 fix(mcp): fall back to title match when dashboard slug lookup misses (#39567)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
(cherry picked from commit e3e834bbf7)
2026-05-15 20:09:55 -07:00
Richard Fogaca Nienkotter
8ba59e7351 fix(mcp): sanitize read path output for LLM context (#39738)
(cherry picked from commit c2b9272f4c)
2026-05-15 19:37:31 -07:00
Amin Ghadersohi
9af36ae61c feat(mcp): add get_chart_sql tool and expose chart filters in get_chart_info (#38700)
(cherry picked from commit 6948e73ec7)
2026-05-15 19:26:05 -07:00
Kamil Gabryjelski
65a03dd29a fix(mcp): Support form_data_key without chart identifier for unsaved charts (#38628)
(cherry picked from commit af5e05db2e)
2026-05-15 19:19:06 -07:00
Amin Ghadersohi
0b37b8211b chore(mcp): extract shared chart helpers and ASCII rendering into separate modules (#39438)
(cherry picked from commit e6853894ab)
2026-05-15 14:31:59 -07:00
Gabriel Torres Ruiz
9b94dde8fe fix(mcp): prevent LLM from creating new dashboard instead of adding chart to existing one (#39353)
(cherry picked from commit c289731212)
2026-05-15 11:33:39 -07:00
Maxime Beauchemin
ef6c89dab5 fix(dataset-editor): fix SQL expression editor extra spaces and height expansion (#39248)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 0aa8cace1b)
2026-05-15 10:49:01 -07:00
Maxime Beauchemin
9342573737 fix(tags): fix Bulk tag modal dropdown clipping and stale tag cache (#39210)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit d915e4f3ff)
2026-05-15 09:14:38 -07:00
Amin Ghadersohi
2e502a4019 fix(mcp): add description and certification fields to default list tool columns (#39017)
(cherry picked from commit 7be2acb2f3)
2026-05-14 21:02:44 -07:00
Joe Li
cc35510e3e fix(frontend): preserve absolute and protocol-relative URLs in ensureAppRoot (#38316)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 6c359733e1)
2026-05-14 16:49:37 -07:00
Elizabeth Thompson
ab722c903e fix(dashboard): prevent duplicate subdirectory prefix when toggling fullscreen (#39534)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 86ba63b072)
2026-05-14 16:49:16 -07:00
Mafi
084a2018e4 fix(plugin-chart-ag-grid-table): use display text for filter and sort on HTML cells (#39885)
Co-authored-by: Richard Fogaca Nienkotter <63572350+richardfogaca@users.noreply.github.com>
(cherry picked from commit 187bb416e7)
2026-05-14 16:48:24 -07:00
Amin Ghadersohi
052ed7cacc feat(mcp): add query_dataset tool to query datasets using semantic layer (#39727)
(cherry picked from commit f29d82b3b1)
2026-05-12 14:50:26 -07:00
Joe Li
d66d39fd1a feat(explore): add CSV/XLS download to drill-to-detail modal (#37109)
Adds CSV and XLSX download buttons plus an explicit reload control to the
drill-to-detail and drill-by modals. Adds a shared DownloadDropdown
component used by both modals.

Backport of #37109 from master to 6.0-release. Adapted for 6.0-release:
- All @apache-superset/core/* imports collapsed back to @superset-ui/core
  (the namespace refactor is master-only).
- canCopyClipboard from usePermissions is master-only; gated the new
  copy-disabled tooltip on canDownload instead until canCopyClipboard
  is ported.
- TabularDataRow type is master-only (utils/common is still .js); inlined
  as Record<string, unknown>[].
- The Explore pane Results/Samples tabs receive onDownloadCSV/
  onDownloadXLSX/onReload as optional props but the row-limit selector
  changes from master are intentionally omitted (master moved that area
  toward a different pattern that is not present on 6.0-release).
- Backend FRONTEND_CONF_KEYS gains ROW_LIMIT so the new drill download
  payload can read it from common.conf.

(cherry picked from commits fa31ec8, 967fa7b, 9ba8fda, b39419c, b74cc05,
15be40b, d8c8849, 6e1f03b, ca0e9cf, 76cdc1f)

Co-Authored-By: alex-poor <alex@karo.co.nz>
2026-05-11 11:34:59 -07:00
yousoph
012ea6dd59 fix(dashboards): sc 104687 chart name revert (#761) 2026-05-11 00:00:35 -07:00
Amin Ghadersohi
5d88ea00fa fix(mcp): rename _FastMCPValidationFilter to public symbol (#39722)
(cherry picked from commit 09c7e1fc08)
(cherry picked from commit bf1eb3d57e4d10a6c0a5ad15e8cab498c49b006f)
2026-05-08 15:46:58 -07:00
Enzo Martellucci
baf1ba6b09 fix(reports): keep body sized so standalone screenshots don't time out (#39944)
(cherry picked from commit b5186d1c65)
2026-05-08 14:28:16 -07:00
Amin Ghadersohi
9039d1460c fix(mcp): database filter columns, timeseries SQL, and unsaved chart datasource name (#39636)
(cherry picked from commit 7774ec7e3c)
2026-05-08 12:59:05 -07:00
Mehmet Salih Yavuz
c23bd3e8b9 fix(mcp): surface structured errors for generate_chart validation failures (#39484)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
(cherry picked from commit 3f28f5d012)
2026-05-08 12:55:26 -07:00
Beto Dealmeida
73db5fa5f4 feat(sqlglot): Vertica dialect (#39969)
(cherry picked from commit 4311a15eb2)
2026-05-08 11:49:22 -07:00
jesperct
6597bcecb8 fix(colors): reassign colliding series when dashboard locks shared dimension color (#39297)
Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
(cherry picked from commit 9e91ae8cff)
2026-05-08 11:48:54 -07:00
Vitor Avila
fe1ab92778 fix: OpenSearch dialect identifier delimiters (#39953)
(cherry picked from commit ad5e3170dd)
2026-05-08 11:39:36 -07:00
Maxime Beauchemin
b35fc63485 fix(ui): remove makeUrl() double-prefix bugs under subdirectory deployment (#39503)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Vitor Avila <96086495+Vitor-Avila@users.noreply.github.com>
(cherry picked from commit aa710672ed)
2026-05-08 11:39:36 -07:00
Amin Ghadersohi
327782d236 fix(mcp): classify user errors as WARNING, system errors as ERROR (#39634)
Co-authored-by: Elizabeth Thompson <eschutho@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 6947881ba7)
2026-05-08 11:39:36 -07:00
Mehmet Salih Yavuz
64c1286f42 fix(plugin-chart-handlebars): preserve template on explore open (#39442)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
(cherry picked from commit cf587caca7)
2026-05-08 11:39:36 -07:00
Enzo Martellucci
683d21580a fix(mcp): surface XSS sanitization in chart/dashboard names instead of silently stripping (#39491)
(cherry picked from commit d7941ccfec)
2026-05-08 11:39:36 -07:00
Enzo Martellucci
1e33a5d2ec fix(mcp): surface validation errors in generate_chart instead of empty response (#39522)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
(cherry picked from commit dae79a6cba)
2026-05-08 11:39:36 -07:00
Amin Ghadersohi
8b581d1345 chore(mcp): remove dead parse_request decorator and utility code (#39498)
(cherry picked from commit 29806780dc)
2026-05-08 11:39:36 -07:00
Kamil Gabryjelski
2f8440f496 fix(big-number): use correct default font size for subtitle/subheader (#39493)
(cherry picked from commit bf7ec853fa)
2026-05-08 11:39:36 -07:00
Amin Ghadersohi
d3cead1a69 fix(mcp): default XY chart x-axis to dataset primary datetime column (#39421)
Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
(cherry picked from commit 5cff657812)
2026-05-08 11:39:36 -07:00
Gabriel Torres Ruiz
d37b592d3b fix(mcp): support explicit query_mode in TableChartConfig (#39412)
(cherry picked from commit 2e0d482ccf)
2026-05-08 11:39:36 -07:00
Gabriel Torres Ruiz
ef826a9a50 fix(mcp): replace inputSchema with parameters_hint in search_tools results by default (#39411)
(cherry picked from commit e5b3a9c25d)
2026-05-08 11:39:36 -07:00
Amin Ghadersohi
51d4a98d0a fix(mcp): always push fresh app context per tool call to prevent g.user race (#39385)
(cherry picked from commit e7b9fb277e)
2026-05-08 11:39:35 -07:00
Amin Ghadersohi
3de3155838 fix(mcp): update instructions to use correct request wrapper and identifier params (#39392)
(cherry picked from commit 838ee870d0)
2026-05-08 11:39:35 -07:00
Amin Ghadersohi
0afcfc37a2 fix(mcp): batch fix for execute_sql crashes, null timestamps, and deck.gl errors (#38977)
(cherry picked from commit daefedebcd)
2026-05-08 11:39:35 -07:00
Kamil Gabryjelski
fc8f01c188 fix(explore): migrate from window.history to React Router history API (#38887)
(cherry picked from commit fc705d94e3)
2026-05-08 11:39:35 -07:00
Amin Ghadersohi
dcb5c21815 fix(mcp): honor target_tab parameter when adding charts to tabbed dashboards (#38409)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 3bb9704cd5)
2026-05-07 23:13:20 -07:00
Amin Ghadersohi
a6b4623fe2 fix(mcp): improve default chart names with descriptive format (#38406)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 0cfd760a36)
2026-05-07 23:06:14 -07:00
bdonovan1
351e08d487 fix(sqla): parenthesize calculated column expressions in WHERE clause (#39793)
Co-authored-by: Brian Donovan <briand@netflix.com>
Co-authored-by: Vitor Avila <96086495+Vitor-Avila@users.noreply.github.com>
(cherry picked from commit 5b5dd01028)
2026-05-07 11:15:30 -07:00
Alexandru Soare
0008a0606d fix(sql): quote identifiers in transpile_to_dialect to fix case-sensitive column filters (#39521)
(cherry picked from commit adfbbf1433)

Adapted: also lifts a small infrastructure slice from #37311 (commit
87bbd54d0a) — namely the source_engine
parameter and source_dialect logic on transpile_to_dialect, plus its
three accompanying unit tests. #37311 itself is a feature PR
(import-time virtual-dataset transpilation) that is not desired on
6.0-release; only the plumbing this fix relies on is included.

The source_engine plumbing is required because #39521's call site
passes source_engine=engine to make validate() idempotent on its
second pass: the second invocation re-parses already-transpiled output
that may contain dialect-specific quoting (e.g. MySQL/BigQuery
backticks) which the generic Dialect cannot handle. Without it, the
fix would introduce a new regression on those engines.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 14:42:18 -07:00
Enzo Martellucci
5b6a622c3f fix(reports): preserve urlParams in multi-tab report fan-out (#39884)
(cherry picked from commit 9aaa12c7d4)
2026-05-06 14:00:15 -07:00
Enzo Martellucci
b73900a89e fix(echarts): increase default axis title margins to prevent label overlap (#39447)
(cherry picked from commit 1903b919d6)
2026-05-06 12:00:38 -07:00
Beto Dealmeida
c520f6ec21 fix(clickhouse): prevent expensive table scan (#39867)
(cherry picked from commit 5325b87e73)
2026-05-06 11:49:41 -07:00
Joe Li
68050c4720 fix(theme): set color-scheme on html to fix dark mode scrollbars (#39704)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 7bee2afa8e)

Adapted: source path superset-frontend/packages/superset-core/src/theme/GlobalStyles.tsx
remapped to superset-frontend/packages/superset-ui-core/... — the superset-core
package rename (#38448) is not present on 6.0-release.
2026-05-06 11:47:57 -07:00
Geidō
8cb56acdc1 fix(dashboard): prevent duplicate screenshot downloads (#39525)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
(cherry picked from commit 4fcb3144ff)
2026-05-06 11:11:46 -07:00
Elizabeth Thompson
bae1342956 fix(mcp): clear stale thread-local DB session in sync tool wrapper (#39798)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 98eaaaa6d6)
2026-05-01 11:12:10 -07:00
Elizabeth Thompson
1e40128f6f fix(reports): poll for spinner absence instead of snapshotting loading elements (#39579)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit f0d521dfc2)
2026-04-30 14:41:56 -07:00
Vitor Avila
4f5152b17d fix: Enforce per-user caching on legacy API endpoint (#39789)
(cherry picked from commit 86eb6176d1)
2026-04-30 14:09:24 -07:00
Brian Schreder
9cd3e54a17 feat(dashboard): pre-filter time grain (#38922)
(cherry picked from commit a222dab781)
2026-04-30 12:32:33 -07:00
Daniel Vaz Gaspar
bd720d57fb fix(mysql): fallback to pymysql when MySQLdb is not installed in get_datatype() (#39729)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-30 11:02:59 -07:00
Elizabeth Thompson
be13d5001c feat(mcp): restore self-lookup via created_by_me flag (#39638)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 8d17c34068)
2026-04-30 11:02:59 -07:00
Richard Fogaca Nienkotter
04e7b705e2 fix(mcp): redact dashboard data model metadata (#39632)
(cherry picked from commit 57e563b177)
2026-04-30 11:02:59 -07:00
Richard Fogaca Nienkotter
8254f3b1f9 fix(mcp): protect data-model metadata from dashboard viewers (#39599)
Co-authored-by: Elizabeth Thompson <eschutho@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit d79eb5842a)
2026-04-30 10:58:56 -07:00
Richard Fogaca Nienkotter
ac86bcc518 fix(mcp): hide user directory metadata from responses (#39576)
Co-authored-by: Elizabeth Thompson <eschutho@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 0d50fd676b)
2026-04-29 15:51:11 -07:00
Amin Ghadersohi
7599b3d92e fix(mcp): restore typed ChartConfig in tool schemas for LLM visibility (#39732)
(cherry picked from commit 4b42f82f13)
2026-04-29 11:59:50 -07:00
Daniel Vaz Gaspar
c202f7637e fix(docs): correct broken link to security documentation (#722)
The networking-settings page linked to /docs/security/securing_superset
which doesn't exist. The correct path is /docs/security/security.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-29 09:13:08 -07:00
Daniel Vaz Gaspar
be77acec4d chore(deps): bump pillow from 12.1.1 to 12.2.0 (#39590) 2026-04-29 09:12:55 -07:00
Joe Li
44c00a5173 refactor(chart): replace word cloud sort_by_series migration with code defaults (#39575)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
(cherry picked from commit 39f12786a2)
2026-04-29 09:12:55 -07:00
bdonovan1
be4991a286 fix(chart): word cloud secondary sort prevents Druid TopN optimization when sort_by_metric enabled (#39073)
Co-authored-by: Brian Donovan <briand@netflix.com>
(cherry picked from commit 78fb09695b)
2026-04-29 09:12:55 -07:00
Declan Zhao
1f0c4be92f feat(user_info): include Groups in user data payload when include_perms is True and show Groups on user_info page (#39450)
(cherry picked from commit 4ee3a0fc07)
2026-04-29 09:12:55 -07:00
Richard Fogaca Nienkotter
7af0c218a5 fix(dashboard): preserve dynamic group by column order (#39333)
(cherry picked from commit 0f417f0040)
2026-04-29 09:12:55 -07:00
Maxime Beauchemin
83d2cfb539 fix(charts): set g.form_data for metric() Jinja macro on GET chart data endpoint (#39347)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 151d7d76da)
2026-04-29 09:12:55 -07:00
Amin Ghadersohi
ea91ae1d03 fix(mcp): sanitize chart config errors and accept field name aliases (#39606)
(cherry picked from commit ad20285dd6)
2026-04-29 09:12:55 -07:00
Amin Ghadersohi
5a6cd8f6db fix(mcp): resolve $ref by inlining definitions in compact schema (#39562)
(cherry picked from commit 012bf52c8c)
2026-04-29 09:12:55 -07:00
Maxime Beauchemin
ef887b9a8c fix(dashboard): apply full transitive ancestor chain for dependent filters (#39504)
(cherry picked from commit 18d89f25ce)
2026-04-29 09:12:55 -07:00
Damian Pendrak
aca0518fb3 fix(deckgl): UI fixes on deck.gl exclude layers (#38958)
(cherry picked from commit 230b25dd72)
2026-04-29 09:12:55 -07:00
Alexandru Soare
11f41f3e8a fix(mcp): Add defensive validator for ColumnInfo.is_nullable (#39365)
(cherry picked from commit 0857611a4e)
2026-04-29 09:12:55 -07:00
Geidō
68918706ea fix(dataset): calculated columns in virtual datasets fail when used as dynamic aggregation filter dimensions (#39004)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 51ea2c297d)
2026-04-29 09:12:55 -07:00
Mehmet Salih Yavuz
67c6956af1 feat(mcp): add a preview flow to mcp chart updates (#39383)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
(cherry picked from commit 69f062b804)
2026-04-29 09:12:55 -07:00
Mehmet Salih Yavuz
dd3d543e09 fix(SelectFilter): auto clear search input (#39157)
(cherry picked from commit 7c76fd3d81)
2026-04-29 09:12:55 -07:00
Alexandru Soare
25f6866bdd feat(filters): Adding empty state for filter modal (#38909)
(cherry picked from commit 411f769896)
2026-04-29 09:12:55 -07:00
Alexandru Soare
b88bd7d301 fix(MCP): fix MCP logs (#39159)
(cherry picked from commit ffcc6e8b63)
2026-04-29 09:12:55 -07:00
Mike Bridge
db81802b8c fix(dashboard): allow filter list to scroll in filter config modal sidebar (#39203)
Co-authored-by: Mike Bridge <michael.bridge@ext.preset.io>
(cherry picked from commit 7a243d329e)
2026-04-29 09:12:55 -07:00
Daniel Vaz Gaspar
f6f60266fb chore(deps): bump yaml from 1.10.2 to 1.10.3 in /superset-frontend (#697)
Fixes Uncontrolled Recursion vulnerability in yaml 1.x.
Updates 3 nested entries (storybook, babel-plugin-macros, superset-ui-demo).

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-29 09:12:55 -07:00
Daniel Vaz Gaspar
aff4204c05 chore(deps): bump prismjs from 1.29.0 to 1.30.0 in /superset-frontend (#698)
Fixes Arbitrary Code Injection vulnerability in prismjs.

Note: refractor 3.6.0 pins prismjs ~1.27.0 — that nested entry requires
a refractor upgrade to fix (addressed separately).

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-29 09:12:55 -07:00
Daniel Vaz Gaspar
bbfbc92590 chore(deps): bump mdast-util-to-hast from 13.2.0 to 13.2.1 in /superset-frontend (#694)
Fixes Improperly Controlled Modification of Object Attributes vulnerability.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-29 09:12:55 -07:00
Daniel Vaz Gaspar
4026e52d27 chore(deps): bump jws from 4.0.0 to 4.0.1 in /superset-frontend (#695)
Fixes Improper Verification of Cryptographic Signature vulnerability.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-29 09:12:55 -07:00
Daniel Vaz Gaspar
2cb1ad79d7 chore(deps): bump ajv from 6.12.6 to 6.14.0 and 8.17.1 to 8.18.0 in /superset-frontend (#693)
Fixes ReDoS vulnerability (CVE) in ajv 8.17.1. Also bumps nested ajv 6.x
entries to 6.14.0 to match upstream.

Upstream: 577b965a60

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-29 09:12:55 -07:00
Daniel Vaz Gaspar
eff77319e9 chore(deps-dev): bump copy-webpack-plugin to 14.0.0 and css-minimizer-webpack-plugin to 8.0.0 (#690)
Bumps copy-webpack-plugin 13.0.0→14.0.0 and css-minimizer-webpack-plugin
7.0.2→8.0.0 to resolve serialize-javascript 6.0.2→7.0.5 (CVE-2026-34043,
BDSA-2020-4569 CVSS 8.1, tagged Zero-click RCE).

Note: webpack's bundled terser-webpack-plugin still pulls serialize-javascript
6.0.2 as a transitive dep — requires webpack upgrade to fully resolve.

Cherry-picked from upstream apache/superset commits 361afff798, a2c23a2a58.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-29 09:12:55 -07:00
Daniel Vaz Gaspar
f024995424 fix(security): add UserSAMLModelView to USER_MODEL_VIEWS (#39568)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-29 09:12:55 -07:00
Daniel Vaz Gaspar
2f2418258a chore(deps): bump js-yaml from 3.14.1 to 3.14.2 and 4.1.0 to 4.1.1 in /superset-frontend (#687)
Bumps root js-yaml 3.14.1→3.14.2 and nested js-yaml 4.1.0→4.1.1
to address prototype pollution vulnerability (CVE-2025-64718, CVSS 9.8).
Lerna's exact-pinned 4.1.0 entries are left as-is since they require
that exact version.

Cherry-picked from upstream apache/superset commit 362b5e3b89.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-29 09:12:55 -07:00
Vitor Avila
8e754a1fc9 fix(OpenSearch): OpenSearch dialect for sqlglot (#39538) 2026-04-29 09:12:55 -07:00
Daniel Vaz Gaspar
40724b2e2d chore(deps): bump lodash-es from 4.17.23 to 4.18.1 in /superset-frontend (#686)
Bumps lodash-es to ^4.18.1 in generator-superset to address prototype
pollution and arbitrary code injection vulnerabilities.

Cherry-picked from upstream apache/superset commit a9ced5c881.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-29 09:12:55 -07:00
Daniel Vaz Gaspar
806ee595df chore(deps): bump dompurify from 3.3.3 to 3.4.0 in /superset-frontend (#685)
Bumps dompurify to ^3.4.0 in superset-ui-core and legacy-preset-chart-nvd3
to address 3 known vulnerabilities (CVEs). Removes stale nested lock entries
so both workspace packages resolve to the hoisted 3.4.0.

Cherry-picked from upstream apache/superset commit 03725d1aaa.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-29 09:12:55 -07:00
Deadman
e436c6bf05 feat(api): Add filter_dashboard_id parameter to apply dashboard filters to chart/data endpoint (#38638)
Co-authored-by: Matthew Deadman <matthewdeadman@Matthews-MacBook-Pro-2.local>
Co-authored-by: Matthew Deadman <matthewdeadman@matthews-mbp-2.lan>
Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
2026-04-29 09:07:50 -07:00
Joe Li
5888707fc3 chore: package bumps (#39014) 2026-04-21 17:44:50 +01:00
dependabot[bot]
393047d201 chore(deps): bump pillow from 11.3.0 to 12.1.1 (#37935)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-21 17:01:20 +01:00
Joe Li
b1004af91d fix(dashboard): restore groupby in buildExistingColumnsSet and guard null customization config (#39416)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Richard Fogaça <richardfogaca@gmail.com>
(cherry picked from commit d3de16c5f5)
2026-04-20 16:10:13 -07:00
dependabot[bot]
e85830bfea chore(deps): bump markdown-to-jsx from 9.7.13 to 9.7.15 in /superset-frontend (#39217)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit 0d91f5e982)
2026-04-20 14:49:20 -07:00
dependabot[bot]
c7aa7946c0 chore(deps): bump markdown-to-jsx from 9.7.6 to 9.7.8 in /superset-frontend (#38507)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit 5f99d613a0)
2026-04-20 14:49:20 -07:00
dependabot[bot]
08adb0bcdc chore(deps): bump markdown-to-jsx from 9.7.4 to 9.7.6 in /superset-frontend (#38225)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit 4809903bb8)
2026-04-20 14:49:20 -07:00
dependabot[bot]
e7940d2df9 chore(deps): bump markdown-to-jsx from 9.7.3 to 9.7.4 in /superset-frontend (#37959)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit ffd7f10320)
2026-04-20 14:49:20 -07:00
dependabot[bot]
3f929c643c chore(deps): bump markdown-to-jsx from 9.7.2 to 9.7.3 in /superset-frontend (#37730)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit 1c35c3f6d0)
2026-04-20 14:49:20 -07:00
dependabot[bot]
c59576b288 chore(deps): bump markdown-to-jsx from 9.6.1 to 9.7.2 in /superset-frontend (#37691)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit 27889651b3)
2026-04-20 14:49:20 -07:00
dependabot[bot]
0171080b2a chore(deps): bump markdown-to-jsx from 9.6.0 to 9.6.1 in /superset-frontend (#37420)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit 09b5af5945)
2026-04-20 14:49:20 -07:00
dependabot[bot]
0df13f512a chore(deps): bump lodash from 4.17.23 to 4.18.1 in /superset-frontend (#39043)
Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: hainenber <dotronghai96@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: hainenber <dotronghai96@gmail.com>
(cherry picked from commit c372f5980c)
2026-04-20 14:49:20 -07:00
dependabot[bot]
61e8aeb2d8 chore(deps): bump dompurify from 3.3.2 to 3.3.3 in /superset-frontend (#38592)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Đỗ Trọng Hải <41283691+hainenber@users.noreply.github.com>
(cherry picked from commit f4a57a13bc)
2026-04-20 14:49:20 -07:00
dependabot[bot]
212da53fa4 chore(deps): bump dompurify from 3.3.1 to 3.3.2 in /superset-frontend (#38455)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evan Rusackas <evan@preset.io>
(cherry picked from commit d752be5f74)
2026-04-20 14:49:20 -07:00
Amin Ghadersohi
a618135e6d fix(mcp): handle OAuth-authenticated databases in execute_sql (#39166) 2026-04-20 10:52:44 +01:00
Amin Ghadersohi
d60ba0d93b fix(mcp): compress chart config schemas to reduce search_tools token usage (#39018) 2026-04-20 10:52:30 +01:00
Joe Li
99d1ba9bcc revert: remove accidental hideTab guard from 6.0-release (#672)
The hideTab guard was unintentionally brought into 6.0-release during
the cherry-pick of #38809 (conflict resolution picked up the master
version which included #38846). Since hideTab was never intended for
6.0-release, remove the guard to restore the pre-regression behavior
where tabs always render and activeTabs populates correctly.

Fixes: SC-104110

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-17 18:34:20 -07:00
Joe Li
ea970d5e5b fix(deckgl): complete scatterplot categorical color fix (#658)
* fix(deckgl): complete cherry-pick of scatterplot categorical color fix (#35537)

The original cherry-pick of apache/superset#35537 was incomplete — it
included CategoricalDeckGLContainer.tsx and controlPanel.ts but missed
buildQuery.ts and transformProps.ts. Those files still referenced
`category_name` while the UI control (deckGLCategoricalColor) saves to
`dimension`, causing the categorical column to never be included in the
query and cat_color to never be populated on data points.

Renames category_name → dimension in buildQuery.ts and transformProps.ts
to match the control panel field name, completing the fix.

[sc-99443]

* fix: update tests and fix sliceId typo in CategoricalDeckGLContainer

Addresses code review feedback:

1. buildQuery.test.ts: rename category_name → dimension in test data
   to match the interface change, preventing test failure

2. transformProps.test.ts: rename category_name → dimension in test
   data and update test name to reflect the current field name

3. CategoricalDeckGLContainer.tsx line 71: fix fd.sliceId → fd.slice_id
   (snake_case). This code path in getCategories() was previously
   unreachable because fd.dimension was always falsy. Now that the
   fix makes it live, the colorFn seed must use the correct field
   to match the rendering path at line 182.

* test: add negative-case regression guards for dimension field

Adds two tests that would have caught the original category_name vs
dimension mismatch:

1. buildQuery: when dimension is absent, no extra column is added
   to the query (only spatial columns remain)

2. transformProps: when dimension is absent, cat_color is not set
   on scatter points (stays undefined)

These guard against future regressions where the form field name
diverges from what buildQuery/transformProps read.
2026-04-17 18:34:10 -07:00
Amin Ghadersohi
2dbc887fab fix(mcp): surface OAuth auth URL when execute_sql hits OAuth-protected database (#670)
The cherry-pick of apache/superset#39166 onto 6.0-release (commit
3cda699864) dropped the changes to
superset/mcp_service/sql_lab/tool/execute_sql.py. As a result,
OAuth2RedirectError raised during SQL execution falls through to
ExecuteSqlCore._handle_execution_error, which only calls str(e) and
drops the authorization URL stored in ex.error.extra["url"].

Clients see error_type=OAUTH2_REDIRECT but no URL in the error body
("You don't have permission to access the data."), so the end user
has no way to start the OAuth flow.

Fix: handle OAuth2RedirectError and OAuth2Error explicitly in
_handle_execution_error and use build_oauth2_redirect_message to
extract the URL from extra, mirroring the behavior already present on
master in execute_sql.py.

[sc-102144]
2026-04-16 18:32:34 -03:00
Joe Li
63f8c6203f Revert "fix(pivot-table): safely cast numeric strings to numbers for date formatting (#38953)"
This reverts commit ff7685de52.
2026-04-16 09:58:19 -07:00
dependabot[bot]
418c3ee49d chore(deps): bump cryptography from 44.0.3 to 46.0.5 (#37912)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit dc995328a8)
2026-04-14 21:17:56 -07:00
Daniel Vaz Gaspar
114de77ee9 fix(deps): bump Python dependencies to fix 7 security vulnerabilities (#38447)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 5c4bf0f6ea)
2026-04-14 12:14:07 -07:00
Alexandru Soare
2aee9517d2 fix(explore): Prevent error toast when navigating away from Explore page (#39065)
(cherry picked from commit 66a9e2e16e)
2026-04-14 09:48:00 -07:00
Alexandru Soare
10562ae344 fix(popup): Dropdown popup width doesn't match input width when tags collapse in oneLine mode (#39136)
(cherry picked from commit c2a35e2eea)
2026-04-14 09:43:57 -07:00
Alexandru Soare
e7107b0f5c fix(select): select all button cutoff (#39005)
(cherry picked from commit 5138aa2c11)
2026-04-14 09:43:52 -07:00
Alexandru Soare
ee2ae515bd fix(dashboard): Ensure screenshot downloads always generate fresh images/pdfs (#38880)
(cherry picked from commit 1462ac9282)
2026-04-13 16:39:24 -07:00
Amin Ghadersohi
b5fd6197fa feat(mcp): add get_chart_type_schema tool for on-demand schema discovery (#39142)
(cherry picked from commit 5f9fc31ae2)
2026-04-13 16:39:24 -07:00
Amin Ghadersohi
e4a0453b2e feat(mcp): add Big Number chart type support to MCP service (#38403)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 4245720851)
2026-04-13 15:31:02 -07:00
Kamil Gabryjelski
476fc81fc7 fix(mcp): Created dashboard should be in draft state by default (#39011)
(cherry picked from commit 135e0f8099)
2026-04-13 15:30:50 -07:00
Geidō
782502cd14 fix(reports): log exception traceback in _get_csv_data (#39069)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 25eea295f6)
2026-04-13 15:30:38 -07:00
Michael S. Molina
850d4b655b fix(echarts): fix stacked horizontal bar chart clipping and duplicate x-axis labels (#39012)
(cherry picked from commit 022342839a)
2026-04-13 10:16:50 -07:00
Michael S. Molina
3818e57fac fix(dataset-editor): improve modal layout and fix Settings tab horizontal scroll (#39009)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
(cherry picked from commit 38f0dc74f7)
2026-04-13 10:16:50 -07:00
Amin Ghadersohi
54f98293a4 fix(mcp): handle table chart raw mode in query builders and sanitize dashboard titles (#38990)
(cherry picked from commit 0bae05d4a9)
2026-04-13 10:16:50 -07:00
Amin Ghadersohi
36cf1845a4 fix(mcp): fix dashboard owners Pydantic crash and preserve chart preview filters (#38987)
(cherry picked from commit 190f1a59c5)
2026-04-13 10:16:50 -07:00
Michael S. Molina
02789bc723 fix(query): pass datasource table to template processor for schema-aware Jinja rendering (#38984)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 94d8735d4b)
2026-04-13 10:16:50 -07:00
Amin Ghadersohi
81db93122f fix(mcp): handle stale SSL connections, heatmap duplicate labels, and session rollback (#39015)
(cherry picked from commit b3a402d936)
2026-04-13 10:16:50 -07:00
JUST.in DO IT
7965fc7862 fix(dashboard): remove opacity on filter dropdown (#39074)
(cherry picked from commit c7d175b842)
2026-04-13 10:16:50 -07:00
Amin Ghadersohi
2540109ccf fix(mcp): improve execute_sql response-too-large error to suggest limit parameter (#39003)
(cherry picked from commit 851bbeea48)
2026-04-13 10:16:50 -07:00
Amin Ghadersohi
98aecb6248 fix(mcp): compress chart config schemas to reduce search_tools token usage (#39018)
(cherry picked from commit bf9aff19b5)
2026-04-13 10:16:50 -07:00
SBIN2010
8f0d01ca96 feat: Add currencies controls in country map (#39016)
(cherry picked from commit b05764d070)
2026-04-13 10:16:50 -07:00
Amin Ghadersohi
c982f0eb05 fix(mcp): add dynamic response truncation for oversized info tool responses (#39107)
(cherry picked from commit 83ad1eca26)
2026-04-13 10:16:50 -07:00
Amin Ghadersohi
6f6fb14e1a fix(mcp): remove JWT ValueError g.user fallback in auth layer (#39106)
(cherry picked from commit 92747246fc)
2026-04-13 10:16:50 -07:00
Amin Ghadersohi
a93b0842bf fix(mcp): fix form_data null, dataset URL, ASCII preview, and chart rename (#39109)
(cherry picked from commit 7380a59ab8)
2026-04-13 10:16:50 -07:00
Maxime Beauchemin
1757ec5338 feat(mcp): add database connection listing and info tools (#39111)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Amin Ghadersohi <amin.ghadersohi@gmail.com>
(cherry picked from commit a62be684a0)
2026-04-13 10:16:49 -07:00
Sam Firke
5c64c2fe3e fix(SQL Lab): handle columns without names (#38986)
(cherry picked from commit 12eb40db01)
2026-04-13 10:16:49 -07:00
Maxime Beauchemin
aae9d4a251 fix(explore): handle boolean false values correctly in control rendering (#39172)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 6ba9096870)
2026-04-13 10:16:49 -07:00
Amin Ghadersohi
e9c4d537b3 fix(mcp): resolve null fields in list_datasets, list_databases, and save_sql_query (#39206)
(cherry picked from commit 1bde6f3bfd)
2026-04-13 10:16:49 -07:00
Maxime Beauchemin
954bb4c4b7 fix(frontend): fix loading spinner positioning in Save modal and filters panel (#39205)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: yousoph <sophieyou12@gmail.com>
(cherry picked from commit d63308ca37)
2026-04-13 10:16:49 -07:00
Maxime Beauchemin
14f676e036 fix(ace-editor): style bracket matching to blend with theme (#39182)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit b8b2bdedf9)
2026-04-13 10:16:49 -07:00
Luiz Otavio
ffb66ad5bf fix: add template_processor so Jinja gets rendered before SQLGlot parse (#39207)
(cherry picked from commit 2e80f2a473)
2026-04-13 10:16:49 -07:00
Maxime Beauchemin
938e6db229 fix(sqllab): use monospace font for SQL in database error messages (#39181)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit ed659958f3)
2026-04-13 10:16:49 -07:00
Maxime Beauchemin
2ddfb4bd54 fix(plugin-chart-handlebars): improve CSS sanitization tooltip and hide when not needed (#39180)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 36de05fe36)
2026-04-13 10:16:49 -07:00
Maxime Beauchemin
f06a0c22ff fix(sqllab): demote "Save as new" button from primary to secondary (#39179)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 140f0001f2)
2026-04-13 10:16:49 -07:00
Michael S. Molina
41e19876c3 fix(explore): Unnecessary scroll bars appearing on charts in Explore (#39160)
Co-authored-by: Đỗ Trọng Hải <41283691+hainenber@users.noreply.github.com>
(cherry picked from commit 3a3a6536b7)
2026-04-13 10:16:49 -07:00
Alexandru Soare
31e2b33b03 fix(filterReports): _generate_native_filter() crashes on null/empty filterValues (#38954)
(cherry picked from commit 4f695e1b4d)
2026-04-13 10:16:49 -07:00
Maxime Beauchemin
2113e9d28e fix(explore): constrain Edit Dataset modal height to prevent footer cutoff (#39211)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit bad5a35fce)
2026-04-13 10:16:49 -07:00
Mehmet Salih Yavuz
7e63aac9ff fix(AlertsReports): untie filters from alerts reports tabs flag (#38722)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
(cherry picked from commit 5263abdc60)
2026-04-13 10:16:49 -07:00
Enzo Martellucci
12b4dc4a4a fix(reports): escape SQL LIKE wildcards in find_by_extra_metadata (#38738)
Co-authored-by: Mehmet Salih Yavuz <salih.yavuz@proton.me>
(cherry picked from commit 6649f35a0d)
2026-04-13 10:16:49 -07:00
Amin Ghadersohi
3cda699864 fix(mcp): handle OAuth-authenticated databases in execute_sql (#39166)
(cherry picked from commit 68067d7f44)
2026-04-13 10:16:49 -07:00
Vitor Avila
ece8b8ff5b fix: Drill to Detail for Embedded (#39214)
Co-authored-by: Maxime Beauchemin <maximebeauchemin@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit c7955a38ef)
2026-04-13 10:16:49 -07:00
Shaitan
8ffa2216b6 fix(sql-lab): apply access check in SqlExecutionResultsCommand (#38952)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit f49310b8ff)
2026-04-13 10:16:49 -07:00
Amin Ghadersohi
af097d7857 fix(mcp): wire up compact schema serialization for search_tools results (#39229)
(cherry picked from commit e17cf3c808)
2026-04-13 10:16:49 -07:00
Amin Ghadersohi
4f7e78d088 fix(mcp): strip json_metadata and position_json from get_dashboard_info response (#39101)
(cherry picked from commit 680cef0ee0)
2026-04-13 10:16:48 -07:00
Joe Li
ff7685de52 fix(pivot-table): safely cast numeric strings to numbers for date formatting (#38953)
Manual adaptation of apache/superset#38953 for 6.0-release where
TableRenderers is .jsx (not .tsx). Adds convertToNumberIfNumeric()
helper and wraps dateFormatters calls to handle numeric timestamp
strings correctly.

(cherry picked from commit f1cd1ae710)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 10:16:48 -07:00
Kamil Gabryjelski
98cee6eafa feat(mcp): support saved metrics from datasets in chart generation (#38955)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
(cherry picked from commit 15bab227bb)
2026-04-13 10:16:48 -07:00
Amin Ghadersohi
3cde64f1ed fix(mcp): validate dataset exists in generate_explore_link before generating URL (#38951)
(cherry picked from commit 89f7e5e7ba)
2026-04-13 10:16:48 -07:00
Amin Ghadersohi
636bd9c77a fix(mcp): prevent PendingRollbackError from poisoned sessions after SSL drops (#38934)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit d331a043a3)
2026-04-13 10:16:48 -07:00
Amin Ghadersohi
3a82b4d931 fix(mcp): prevent GRID_ID injection into ROOT_ID on tabbed dashboards (#38890)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit aa1a69555b)
2026-04-13 10:16:48 -07:00
Amin Ghadersohi
90830f2780 fix(mcp): remove @parse_request decorator for cleaner tool schemas (#38918)
(cherry picked from commit d1903afc69)
2026-04-13 10:16:48 -07:00
Amin Ghadersohi
799f18a626 fix(mcp): prevent stale g.user from causing user impersonation across tool calls (#38747)
(cherry picked from commit 38fdfb4ca2)
2026-04-13 10:16:48 -07:00
Gabriel Torres Ruiz
4f06107761 fix(ag-grid): jpeg export of ag-grid tables (#38781)
(cherry picked from commit 69c8eef78e)
2026-04-13 10:16:48 -07:00
Maxime Beauchemin
9554280795 refactor(plugins): replace react-icons with antd icons, remove 83MB dependency (#39184)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 63cceb6a79)
2026-04-13 10:16:48 -07:00
venkateshwaran shanmugham
ae1387ed41 fix: implement native browser fullscreen for dashboard charts (#38819)
Signed-off-by: Venkateshwaran Shanmugham <venkateshwaracholan@gmail.com>
Co-authored-by: Michael S. Molina <70410625+michael-s-molina@users.noreply.github.com>
Co-authored-by: Mehmet Salih Yavuz <salih.yavuz@proton.me>
Co-authored-by: Richard Fogaça <richardfogaca@gmail.com>
Co-authored-by: Richard Fogaca Nienkotter <63572350+richardfogaca@users.noreply.github.com>
(cherry picked from commit e39dd1afce)
2026-04-13 10:16:48 -07:00
Enzo Martellucci
deb64d2595 fix(table): cross-filtering breaks after renaming column labels via Custom SQL (#38858)
(cherry picked from commit aba7e6dae4)
2026-04-13 10:16:48 -07:00
Maxime Beauchemin
a2176c30a8 fix(explore): add left-indentation to control panel hierarchy (#39177)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit a64609f4f3)
2026-04-13 10:16:48 -07:00
Mike Bridge
65660bfa99 fix(dashboard): Vertical filter bar gradient is extending past the filter bar area (#39204)
Co-authored-by: Mike Bridge <michael.bridge@ext.preset.io>
(cherry picked from commit 8bcc90c766)
2026-04-13 10:16:48 -07:00
Richard Fogaca Nienkotter
78507c97de fix(echarts): prevent tooltip crash during dashboard auto-refresh (#39277)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
(cherry picked from commit e9911fbac4)
2026-04-13 10:16:48 -07:00
Đỗ Trọng Hải
d4e59a205c fix(AlteredSliceTag): not display undefined filter value for chart change record (#38883)
Signed-off-by: hainenber <dotronghai96@gmail.com>
(cherry picked from commit 11f2140c37)
2026-04-13 10:16:48 -07:00
Daniel Vaz Gaspar
aa41f8d48c feat: role/user CRUD events and login/logout tracking in the action log (#39121)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 15:25:19 -07:00
Elizabeth Thompson
b36300201f fix(reports): propagate PlaywrightTimeout so execution transitions to ERROR state (#39176)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
(cherry picked from commit 587fe4af63)
2026-04-09 14:57:58 -07:00
Michael S. Molina
45d2a35ad2 chore(deps): Upgrade sqlglot from 27.15.2 to 28.10.0 (#37841)
(cherry picked from commit c41942a38a)
2026-04-09 14:57:58 -07:00
Enzo Martellucci
8768c51e02 fix(charts): add X Axis Number Format control for numeric X-axis columns (#38809)
Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
(cherry picked from commit e0a0a22542)
2026-04-09 14:57:58 -07:00
Enzo Martellucci
e7efb67f3e fix(echarts): adapt y-axis ticks and padding for compact timeseries charts (#38673)
(cherry picked from commit f0b20dc445)
2026-04-08 14:54:39 -07:00
Enzo Martellucci
c87cefbb56 fix(select): ensure filter dropdown matches input field width (#38886)
(cherry picked from commit 41d401a879)
2026-04-08 14:43:15 -07:00
Amin Ghadersohi
1a819812f8 fix(mcp): enforce MAX_PAGE_SIZE limit on list tools to prevent oversized responses (#38959)
(cherry picked from commit 2c9cf0bd55)
2026-04-01 10:50:34 -07:00
Amin Ghadersohi
e2f50f7dab fix(mcp): resolve chatbot tool call flakiness with URL and instruction fixes (#38532)
(cherry picked from commit 6ef4794778)
2026-03-30 15:57:47 -07:00
Richard Fogaca Nienkotter
c5d51ed944 fix(dataset): add missing currency_code_column to DatasetPostSchema (#38853)
(cherry picked from commit 9c288d66b5)
2026-03-30 14:39:16 -07:00
Mehmet Salih Yavuz
ed6e4566c3 fix(Timeseries): dedup x axis labels (#38733)
(cherry picked from commit f832f9b0d5)
2026-03-30 11:41:38 -07:00
Enzo Martellucci
0c2d789a89 fix(reports): PUT with empty recipients list does not persist the change (#38711)
(cherry picked from commit 40387d5daa)
2026-03-27 15:14:01 -07:00
Alexandru Soare
acfc93c893 refactor(passwords): accept passwords via YAML file (#38059)
Co-authored-by: Mehmet Salih Yavuz <salih.yavuz@proton.me>
(cherry picked from commit 5c782397bb)
2026-03-27 15:13:41 -07:00
Alexandru Soare
680c0afd59 fix(report): raise warning when filter type not recognized (#38676)
(cherry picked from commit 37c4a36fdb)
2026-03-27 14:53:36 -07:00
Mehmet Salih Yavuz
d0448991bd fix(MainNav): display all menu items on smaller screens (#38732)
(cherry picked from commit fdcb942f3c)
2026-03-27 14:53:36 -07:00
Beto Dealmeida
13cf98e91f feat: prevent Postgres connection to Redshift (#38693)
(cherry picked from commit 5d9f53ff0c)
2026-03-27 14:53:36 -07:00
Amin Ghadersohi
86d52d1d97 fix(mcp): add try/except around DAO re-fetch to handle session errors in multi-tenant (#38859)
(cherry picked from commit 6dc3d7ad9f)
2026-03-27 14:53:36 -07:00
Beto Dealmeida
31df4f273b fix: type probing (#38889)
(cherry picked from commit 8983edea66)
2026-03-27 14:53:36 -07:00
Enzo Martellucci
6eb942c014 fix(sqla): parenthesize extras where/having clauses in query generation (#38183)
Co-authored-by: Diego Pucci <diegopucci.me@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit c7a1f57487)
2026-03-27 14:53:36 -07:00
Alexandru Soare
c6bb30de1d fix(keys): Unsafe dict access in get_native_filters_params() crashes execution (#38272)
(cherry picked from commit 89d1b80ce7)
2026-03-27 09:31:34 -07:00
Joe Li
fe5094c350 fix(models): correct TabState.latest_query_id column type to match FK target (#38837)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 4b26f8c712)
2026-03-26 13:34:31 -07:00
Amin Ghadersohi
6df97feb98 feat(api-keys): add API key authentication via FAB SecurityManager (#37973)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Kamil Gabryjelski <kamil.gabryjelski@gmail.com>
(cherry picked from commit 811dcb3715)
2026-03-25 19:24:50 -07:00
Amin Ghadersohi
45ec9f2cb5 fix(mcp): add permission checks to generate_dashboard and update_chart tools (#38845)
(cherry picked from commit 23a5e95884)
2026-03-25 19:24:50 -07:00
Kamil Gabryjelski
87559699d7 fix(mcp): detect unknown chart config fields and suggest correct ones (#38848)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
(cherry picked from commit 16f5a2a41a)
2026-03-25 19:24:50 -07:00
Amin Ghadersohi
8dd1088c34 fix(mcp): fix generate_dashboard cross-session SQLAlchemy error (#38827)
(cherry picked from commit 09594b32f9)
2026-03-25 19:24:50 -07:00
Amin Ghadersohi
59dcbe1850 fix(mcp): convert adhoc filters to QueryObject format before query compilation (#38774)
(cherry picked from commit 44c2c765ae)
2026-03-25 19:24:50 -07:00
Amin Ghadersohi
5f6604b874 fix(mcp): normalize call_tool proxy arguments to prevent encoding TypeError (#38775)
(cherry picked from commit 0d5721910e)
2026-03-25 19:24:50 -07:00
Kamil Gabryjelski
29285560cc fix(mcp): fix detached Slice instance error in chart/dashboard serialization (#38767)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 1d72480c17)
2026-03-25 19:24:50 -07:00
Amin Ghadersohi
3cc27a8b06 feat(mcp): Add tool annotations for MCP directory compliance (#38641)
(cherry picked from commit 1c8224f4c6)
2026-03-25 19:24:50 -07:00
Amin Ghadersohi
f17351c5e2 feat(mcp): add Handlebars chart type support to MCP service (#38402)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit c596df9294)
2026-03-25 19:24:50 -07:00
Kamil Gabryjelski
847143d9e6 fix(mcp): Chart schema followups - DRY extraction, template fix, alias and test gaps (#38746)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
(cherry picked from commit 211f29b723)
2026-03-25 19:24:50 -07:00
Kamil Gabryjelski
3411a435c8 fix: Add aliases and groupby list to chart schemas (#38740)
(cherry picked from commit 14b1b456e1)
2026-03-25 19:24:50 -07:00
Kamil Gabryjelski
fd16e3b870 fix: Row limit support for chart mcp tools (#38717)
(cherry picked from commit a314e5b35e)
2026-03-25 19:24:49 -07:00
Amin Ghadersohi
d33cd49e84 fix(mcp): expose individual tool parameters when MCP_PARSE_REQUEST_ENABLED=False (#38714)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit e02ca8871d)
2026-03-25 19:24:49 -07:00
Kamil Gabryjelski
f6c23692bf fix(mcp): use correct permission class for save_sql_query tool (#38764)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
(cherry picked from commit 5e5c05362c)
2026-03-25 15:36:06 -07:00
Amin Ghadersohi
2c36fb6860 fix(mcp): return all statement results for multi-statement SQL queries (#38388)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit b6c3b3ef46)
2026-03-25 11:16:24 -07:00
Mehmet Salih Yavuz
7ab7e501f0 fix(Matrixify): readd matrixify_enable guard missing (#38759)
(cherry picked from commit 7222327992)
2026-03-24 15:43:40 -07:00
Amin Ghadersohi
4a04cefef4 fix(mcp): prevent encoding errors and fix tool bugs on MCP client transports (#38786)
(cherry picked from commit ed3c5280a9)
2026-03-24 15:39:33 -07:00
Amin Ghadersohi
b56d6a4628 fix(mcp): fix dashboard slug null and execute_sql encoding error (#38710)
(cherry picked from commit c2a21915ff)
2026-03-24 15:29:07 -07:00
Alexandru Soare
8440925b24 fix(button): Theming configurations for button elements is not consistent (#38604)
(cherry picked from commit 82a74c88aa)
2026-03-24 13:01:40 -07:00
Mehmet Salih Yavuz
a23acd9253 feat(theming): Custom label tokens (#38679)
(cherry picked from commit 86a260e39b)
2026-03-24 13:01:40 -07:00
Enzo Martellucci
ae46f586bc fix(reports): validate nativeFilters on report create/update and deactivate on dashboard filter deletion (#38715)
(cherry picked from commit e088979fbe)
2026-03-23 16:49:13 -07:00
Mehmet Salih Yavuz
76a81dd59b fix(AlertsReports): validate anchor_list is a list (#38723)
(cherry picked from commit 100ad7d9ee)
2026-03-23 16:49:08 -07:00
Enzo Martellucci
5b82fb60f6 feat(themes): add JSON formatting to theme modal editor (#38739)
(cherry picked from commit cbb2b2f3c2)
2026-03-23 16:46:51 -07:00
Mehmet Salih Yavuz
051fbd386a chore(Reports): remove unused and incorrect field (#38724)
(cherry picked from commit 44179199ba)
2026-03-23 16:44:22 -07:00
Levis Mbote
b557a467db fix(explore): display actual data type instead of "column" in column tooltip (#38554)
(cherry picked from commit e67bc5bee5)
2026-03-23 16:44:17 -07:00
Mehmet Salih Yavuz
5f54389754 fix(DropdownContainer): add fresh to avoid stale data (#38702)
(cherry picked from commit cc34d19d24)
2026-03-23 15:31:16 -07:00
Amin Ghadersohi
f0c542dcd7 feat(mcp): add BM25 tool search transform to reduce initial context size (#38562)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 97a66f7a64)
2026-03-22 11:44:35 -07:00
Joe Li
654bcd6b3f fix(dashboard): use inline theme data to prevent 403 for non-admin users (#38384)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 03de7e1ec6)
2026-03-20 11:36:09 -07:00
Levis Mbote
5e1a89644e fix(dashboard): correct tab underline width for newly added dashboard tabs. (#38524)
(cherry picked from commit ee233d16d6)
2026-03-20 10:39:55 -07:00
Levis Mbote
7a7840ec83 fix(theme): ensure colorLink follows colorPrimary when not explicitly set (#38517)
(cherry picked from commit 65f13f773e)
2026-03-20 09:34:35 -07:00
Amin Ghadersohi
cc76855755 fix(mcp): replace uuid with url and changed_on_humanized in default list columns (#38566)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit fc156d0014)
2026-03-20 09:34:35 -07:00
Levis Mbote
7848a8c33e fix(theme): persist local theme id so "Local" tag remains after navigation (#38527)
(cherry picked from commit b754f2d173)
2026-03-20 09:34:35 -07:00
Levis Mbote
46deb48d1b fix(timeseries-table): enable proper column sorting in timeseries-table chart (#38579)
(cherry picked from commit 6b9dd23e3a)
2026-03-20 09:34:34 -07:00
Alexandru Soare
fd9e0c076c fix(firebolt): Firebolt SQL entered with EXCLUDE is rewritten to EXCEPT (#38742)
(cherry picked from commit 6465450b64)
2026-03-20 09:34:34 -07:00
Amin Ghadersohi
289602d160 fix(mcp): fix crashes in list tools, dataset info, chart preview, and add owner/favorite filters (#38277)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit d5cf77cd60)
2026-03-20 09:34:34 -07:00
Amin Ghadersohi
a26f76fcb0 feat(mcp): add save_sql_query tool for SQL Lab saved queries (#38414)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 48220fb33f)
2026-03-18 12:56:12 -07:00
Beto Dealmeida
a8d7481c92 feat: apply RLS conservatively (#38683)
(cherry picked from commit a854fa60a2)
2026-03-17 09:23:50 -07:00
Amin Ghadersohi
43567f2172 fix(mcp): wrap LoggingMiddleware.on_message event_logger in try/except (#38560)
(cherry picked from commit 6d7cfac8b2)
2026-03-17 09:17:35 -07:00
Joe Li
29416f48cc fix(embedded): default to light theme instead of system preference (#38644)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit aa5adb0fce)
2026-03-16 09:48:08 -07:00
Mehmet Salih Yavuz
d896d48f24 feat(matrixify): Revamp control panel (#38519)
(cherry picked from commit ed622e254a)
2026-03-14 09:50:36 -07:00
Enzo Martellucci
26ff84377f fix(explore/dashboard): fix CSV/Excel downloads for legacy chart types (#38513)
Co-authored-by: Diego Pucci <diegopucci.me@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
(cherry picked from commit 9516d1a306)
2026-03-14 09:09:55 -07:00
Amin Ghadersohi
48de355979 feat(mcp): add extra_form_data param to get_chart_data for dashboard filters (#38531)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit f458e2d484)
2026-03-13 23:20:24 -07:00
Amin Ghadersohi
f6e2c7c730 fix(mcp): extract role names as strings in UserInfo serialization (#38612)
(cherry picked from commit d4f1f8db00)
2026-03-13 23:19:42 -07:00
Amin Ghadersohi
c0d21dc0c2 feat(mcp): implement RBAC permission checking for MCP tools (#38407)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 7943af359c)
2026-03-13 23:11:32 -07:00
Amin Ghadersohi
c9ee19fdad feat(mcp): auto-generate dashboard title from chart names when omitted (#38410)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit eb77452857)
2026-03-13 16:24:39 -07:00
Alexandru Soare
e6a3262c2d fix(matrixify): Matrixify to not override slice id (#38515)
Co-authored-by: Evan Rusackas <evan@preset.io>
(cherry picked from commit 27197faba9)
2026-03-13 15:22:37 -07:00
Rafael Benitez
b5906a36c1 fix(world-map): add fallback fill color when colorFn returns null (#38602)
Adapted from master commit ba7271b to WorldMap.js (JS) on 6.0-release.

- Accepted: null-safe extents, fallback colorFn, ?? theme.colorBorder
- Accepted: 3 new tests adapted for 6.0-release test structure
- Rejected: TypeScript conversion (file is .js on this branch)

(cherry picked from commit ba7271b4d8)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 15:21:36 -07:00
Alexandru Soare
3954ace76c fix(timeshiftcolor): Time shift color to match the original color (#38473)
(cherry picked from commit f6106cd26f)
2026-03-13 15:11:20 -07:00
Enzo Martellucci
de8ff8e27a fix(deckgl): polygon chart not rendering when boundary column contains nested geometry JSON (#38595)
(cherry picked from commit 32a64d02c7)
2026-03-13 15:06:26 -07:00
Mehmet Salih Yavuz
8d24548b52 fix: add parent_slice_id for multilayer charts to embed (#38243)
(cherry picked from commit 95f61bd223)
2026-03-13 12:07:18 -07:00
Mehmet Salih Yavuz
c383a3bbe7 fix: add embedded box sizing rule for layout (#38351)
Co-authored-by: Joe Li <joe@preset.io>
(cherry picked from commit 7f476a79b3)
2026-03-13 08:59:09 -07:00
Daniel Gaspar
5fed167e11 feat(auth): add SAML login support to frontend (#38606)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 11:06:32 +00:00
Alexandru Soare
7f7eb90dc4 fix(bug): Error when adding a filter using custom sql (#38246)
(cherry picked from commit 880cab58c3)
2026-03-12 21:41:17 -07:00
Yuriy Krasilnikov
3857fae5ab fix(embedded): prevent double RLS application in virtual datasets (#37395)
(cherry picked from commit 09e9c6a522)
2026-03-12 14:54:59 -07:00
Amin Ghadersohi
2011d7497b fix(charts): set reasonable default y-axis title margin to prevent label overlap (#38389)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit fe7f220c21)
2026-03-11 18:10:33 -07:00
Amin Ghadersohi
089e39defa feat(mcp): add horizontal bar chart orientation support to generate_chart (#38390)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 6342c4f338)
2026-03-11 18:09:45 -07:00
Amin Ghadersohi
182f086a61 fix(mcp): add guardrails to prevent LLM artifact generation (#38391)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 5fa70bdbd8)
2026-03-11 17:45:22 -07:00
Amin Ghadersohi
6be0727015 fix(mcp): add missing command.validate() to MCP chart data tools (#38521)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 2a876e8b86)
2026-03-11 17:42:08 -07:00
Đỗ Trọng Hải
410418e616 fix(plugin/cal-heatmap): properly color tooltip's text for both dark/light theme (#38010)
(cherry picked from commit a30492f55e)
2026-03-11 17:33:29 -07:00
yousoph
e2ac463087 fix(dashboard): prevent Apply button from disabling when required filters are auto-applied (#38479)
Co-authored-by: Kamil Gabryjelski <kamil.gabryjelski@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 62cebc8a0e)
2026-03-11 16:17:57 -07:00
Amin Ghadersohi
0e42f18746 fix(mcp): improve prompts, resources, and instructions clarity (#37389)
(cherry picked from commit 1ee14c5993)
2026-03-11 15:24:58 -07:00
Vitor Avila
397433786d feat: support for import/export masked_encrypted_extra (frontend) (#38078)
(cherry picked from commit d9a91f99db)
2026-03-11 14:34:43 -07:00
Vitor Avila
88480c5ea4 feat: support for import/export masked_encrypted_extra (backend) (#38077)
(cherry picked from commit 8c9efe5659)
2026-03-11 14:05:09 -07:00
Vitor Avila
780607c1e6 feat: Labels for encrypted fields (#38075)
(cherry picked from commit 228b598409)
2026-03-10 21:52:41 -07:00
Amin Ghadersohi
9fcb6f401d feat(mcp): add pie, pivot table, and mixed timeseries chart creation support (#38375) 2026-03-10 16:55:32 -07:00
Amin Ghadersohi
d1a4352a82 feat(mcp): add compile check to validate chart queries before returning (#38408)
(cherry picked from commit 3609cd9544)
2026-03-10 16:45:43 -07:00
Amin Ghadersohi
bce38fcda3 fix(mcp): suppress third-party deprecation warnings from client responses (#38401)
(cherry picked from commit 7d2efd8c1a)
2026-03-10 14:55:20 -07:00
Amin Ghadersohi
4f55739936 fix(mcp): use broad Exception in outermost tool-level handlers (#38254)
(cherry picked from commit abf0b7cf4b)
2026-03-10 14:37:48 -07:00
Amin Ghadersohi
3df5816400 fix(mcp): add eager loading to get_info tools to prevent N+1 query timeouts (#38129)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit c54b21ef98)
2026-03-10 14:04:30 -07:00
Amin Ghadersohi
55802de557 feat(mcp): support unsaved state in Explore and Dashboard tools (#37183)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 3084907931)
2026-03-10 13:52:17 -07:00
Amin Ghadersohi
7e0535eade fix(mcp): fix dashboard chart placement with proper COLUMN layout and tab support (#37970)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 6e94a6c21a)
2026-03-10 13:24:18 -07:00
Gabriel Torres Ruiz
ee5b64fcef fix(dashboard): ensure clear all respects required filter validation (#37681)
(cherry picked from commit bc99b710bd)
2026-03-09 13:51:45 -07:00
yousoph
a10ca5614d fix(charts): revert: improve negative stacked bar label positioning and accessibility (#37405) (#38484)
Co-authored-by: Kamil Gabryjelski <kamil.gabryjelski@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 9983e255f8)
2026-03-09 11:57:14 -07:00
yousoph
ac059ef879 fix(heatmap): correct tooltip display to show axis values instead of indices (#38487)
(cherry picked from commit 577654cd02)
2026-03-09 11:52:12 -07:00
Gabriel Torres Ruiz
2077439423 fix(theme): prevent background color flash on page load (#38399)
(cherry picked from commit dca41f9a7b)
2026-03-09 10:32:11 -07:00
Beto Dealmeida
443fa69686 feat(alerts/reports): external URL warning (#35021)
(cherry picked from commit 03ad1789f0)
2026-03-09 10:17:13 -07:00
Vitor Avila
3895c754ba feat: Support OAuth2 single-use refresh tokens (#38364)
(cherry picked from commit fa34609952)
2026-03-09 10:16:32 -07:00
Amin Ghadersohi
f5d6a73da1 fix: silence deprecation warnings causing noisy production logs (#38128)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 01d5245cd2)
2026-03-08 20:31:51 -07:00
Amin Ghadersohi
80bb47a15b fix(screenshots): downgrade screenshot timeout logs from ERROR to WARNING (#38130)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 985c3d12a1)
2026-03-08 20:31:20 -07:00
Amin Ghadersohi
a4d7521a40 feat(mcp): add user roles to MCP response and permission-aware instructions (#38367)
(cherry picked from commit db7665c0bc)
2026-03-08 20:28:09 -07:00
Vitor Avila
ecafff68a6 fix: more DB OAuth2 fixes (#37398)
(cherry picked from commit 6043e7e7e3)
2026-03-08 18:00:26 -07:00
Antonio Rivero
660efb4f66 chore(playwright): Using warning for timeouts (#38441)
(cherry picked from commit 20cc3345d8)
2026-03-07 23:06:57 -08:00
Enzo Martellucci
aef92c5dd7 fix(dashboard): fix multiple drag-and-drop and edit mode issues (#37891)
(cherry picked from commit f0416eff78)
2026-03-07 18:25:57 -08:00
Alexandru Soare
340789892d fix(bugs): fixing bugs for world map chart (#38030)
(cherry picked from commit 7743183401)
2026-03-07 18:25:31 -08:00
Joe Li
5f13ad81e8 fix(echarts): adaptive formatting labels (#38017) 2026-03-06 09:42:22 -08:00
Joe Li
d44c5ebc08 fix(alerts): fix error toast when editing report with saved tab selection (#38198)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 939e4194c6)
2026-03-06 09:42:22 -08:00
Alexandru Soare
25fb18c5e8 fix(componentParent): Newly created tabs don't show up in Scoping tab (#37807)
(cherry picked from commit 761cee2d85)
2026-03-04 22:21:01 -08:00
Enzo Martellucci
60c56a5125 fix(explore): prevent TypeError when chart dimension returns empty string (#38276)
(cherry picked from commit 016417f793)
2026-03-04 21:34:31 -08:00
Mehmet Salih Yavuz
da4d0c3399 fix(Select): select all buttons to inherit font (#38313)
(cherry picked from commit ac2914486f)
2026-03-04 21:30:34 -08:00
Vitor Avila
98f6db917f chore: Support specifying app_root via superset_config.py (#38284)
(cherry picked from commit 6fe69fc81c)
2026-03-04 21:27:27 -08:00
Joe Li
d3250bc7ea fix(reports): validate database field on PUT report schedule (#38084)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 5eb35a4795)
2026-03-04 21:26:19 -08:00
Amin Ghadersohi
457a3407c2 feat(mcp): add detailed JWT error messages and default auth factory fallback (#37972)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit ae99b19422)
2026-03-01 10:39:16 -08:00
Amin Ghadersohi
813cc00f95 feat(mcp): add response size guard to prevent oversized responses (#37200)
(cherry picked from commit cc1128a404)
2026-03-01 10:38:47 -08:00
Amin Ghadersohi
aceb2de180 fix(mcp): normalize column names to fix time series filter prompt issue (#37187)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit a1312a86e8)
2026-03-01 10:38:14 -08:00
Amin Ghadersohi
3cbb208b4f feat(mcp): dynamic feature availability via menus and feature flags (#37964)
(cherry picked from commit 1cd35bb102)
2026-03-01 10:37:51 -08:00
Kamil Gabryjelski
26271c8c35 fix: Warning toasts when user drops folder item outside of dnd context (#38304)
(cherry picked from commit 1d141b2948)
2026-03-01 00:54:22 -08:00
Mehmet Salih Yavuz
0376806615 fix(Dataset Folders): improve search-collapse (#38188)
(cherry picked from commit 7f280f5de9)
2026-03-01 00:54:22 -08:00
Joe Li
78b159169b feat(folders-editor): drag entire folder block as single unit (#38122)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 63f1d9eb98)
2026-03-01 00:54:22 -08:00
Joe Li
4fc7e43ad2 fix(folders): remove stale column/metric refs from folders on delete (#38302)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 5e890a8cf7)
2026-03-01 00:54:22 -08:00
Kamil Gabryjelski
ceeac7039e fix(folders): expand collapsed folders on Select All and add selection counter (#38270)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 11dfda11d3)
2026-02-28 23:43:42 -08:00
Kamil Gabryjelski
9b8e501b1d feat: Persist default folders location when repositioned in folders editor (#38105)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 660357c76b)
2026-02-28 23:33:54 -08:00
Kamil Gabryjelski
d0ebe47868 fix: Badge count in folders editor (#38100)
(cherry picked from commit 86c8fa5cd7)
2026-02-28 23:33:54 -08:00
Kamil Gabryjelski
95e2575cf6 fix(dataset-modal): show warning toast when dropping items outside folders (#38257)
Co-authored-by: Claude Opus 4 <noreply@anthropic.com>
(cherry picked from commit 2ecfb3406c)
2026-02-28 23:33:54 -08:00
Kamil Gabryjelski
7079a12938 fix(dataset-modal): prevent shift-select from selecting search-hidden items (#38255)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 7f72c747f5)
2026-02-28 23:33:54 -08:00
Kamil Gabryjelski
fc53623c6d fix(dataset-modal): fix drag overlay shift caused by modal transform containing block (#38274)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 8a053bbe07)
2026-02-28 23:33:54 -08:00
Kamil Gabryjelski
f8b0c37d45 fix(dataset-modal): include nested folders when dragging all their children (#38275)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 0827ec3811)
2026-02-28 23:33:54 -08:00
Kamil Gabryjelski
56973bf76a fix(button): use colorLink token for link-style buttons (#38121)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 7937246575)
2026-02-28 23:33:54 -08:00
Kamil Gabryjelski
44ea2dddc2 fix(dataset-modal): fix folders tab scrollbar by establishing proper flex chain (#38123)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit e30a9caba5)
2026-02-28 23:33:54 -08:00
Kamil Gabryjelski
a3fbf90cd3 fix: Warning toast copy in folders editor (#38099)
(cherry picked from commit e12140beb6)
2026-02-28 23:33:54 -08:00
Kamil Gabryjelski
fd9ebdecae fix: Search in folders editor with verbose names (#38101)
(cherry picked from commit f049d3e34a)
2026-02-28 23:33:54 -08:00
Kamil Gabryjelski
c645c6b6cd feat: Larger folder drag area in folders editor (#38102)
(cherry picked from commit b7a3224f04)
2026-02-28 23:33:54 -08:00
Kamil Gabryjelski
d8d7e674c2 feat: Dataset folders editor (#36239)
(cherry picked from commit a6a66ca483)
(cherry picked from commit 3cb90d7cc093d03403598397e6aadd69be47e9b0)
2026-02-28 23:33:54 -08:00
Joe Li
05f564754f feat: auto refresh dashboard (#37459) 2026-02-28 23:33:54 -08:00
Joe Li
44579ae8a6 fix(crud): reorder table actions + improve react memoization + improve hooks (#37897)
(cherry picked from commit 6fdaa8e9b3)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 23:33:54 -08:00
Joe Li
eb63e4b74f feat(embedded): add feature flag to disable logout button in embedded contexts (#37537)
(cherry picked from commit e06427d1ef)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 23:33:54 -08:00
Joe Li
c0932f79a3 fix(mcp): validate chart datasets and narrow exception handlers (#38119)
(cherry picked from commit eef4d95c22)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 23:33:53 -08:00
Joe Li
e272c186f6 perf(security): cache RLS filters per-request to avoid repeated DB queries (#38110)
(cherry picked from commit 3e3c9686de)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 23:33:53 -08:00
Joe Li
ee9e19b9bf feat(oauth2): add PKCE support for database OAuth2 authentication (#37067)
(cherry picked from commit 5d20dc57d7)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 23:33:53 -08:00
Joe Li
6490cfbd6b feat(themes): add enhanced validation and error handling with fallback mechanisms (#37378)
(cherry picked from commit 0d5ddb3674)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 11:23:27 -08:00
Joe Li
a003dceff4 perf(dashboard): skip thumbnail_url computing on single dashboard endpoint (#38015)
(cherry picked from commit f5a5a804e2)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 11:23:23 -08:00
Joe Li
6995d7c2ad fix(alerts): show friendly filter names in report edit modal (#38054)
(cherry picked from commit 6a61baf5be)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 11:23:12 -08:00
Joe Li
f656b90e71 fix(chart): make chart error banners non-dismissible (#38014)
(cherry picked from commit c1c012fb52)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 20:29:24 -08:00
Joe Li
3fb3694b21 fix(save-chart): fix info icon alignment in save chart modal (#37708)
(cherry picked from commit bbafae5f62)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 20:29:24 -08:00
Vitor Avila
1d8d25e5ba fix: Allow non-owners to fave/unfave charts (#38095) 2026-02-27 20:29:24 -08:00
JUST.in DO IT
960da53633 fix(world-map): reset hover highlight on mouse out (#37716)
Co-authored-by: Arunodoy18 <arunodoy630@gmail.com>
(cherry picked from commit a04571fa20)
2026-02-27 20:29:21 -08:00
Enzo Martellucci
5f6cc13b53 fix(alert-modal): show the add filter button on firefox (#38093)
(cherry picked from commit 26053a8b5d)
2026-02-27 20:28:50 -08:00
Enzo Martellucci
87b936f93b fix(chart): prevent x-axis date labels from disappearing when rotated (#37755)
(cherry picked from commit 5a134170a0)
2026-02-27 20:28:50 -08:00
Mehmet Salih Yavuz
0d155c4b64 fix(GAQ): don't use async queries when cache timeout is -1 (#38089)
(cherry picked from commit e4a7cd30c3)
2026-02-27 20:28:50 -08:00
Vitor Avila
9f8c2964a2 fix: Include app_root in next param (#37942)
(cherry picked from commit 9ec56f5f02)
2026-02-27 20:28:50 -08:00
Felipe López
2df50370e3 fix(charts): missing globalOpacity prop with mapbox (#37168)
(cherry picked from commit 319a131ec9)
2026-02-27 20:28:49 -08:00
Felipe López
a1ce95b14d fix(charts): numerical column for the Point Radius field in mapbox (#36962)
(cherry picked from commit 675a4c7a66)
2026-02-27 20:28:47 -08:00
Elizabeth Thompson
a1a4ca0238 refactor(db): use Dialect instead of Engine in select_star to avoid SSH tunnels (#35540)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit e9b494163b)
2026-02-23 11:39:59 -08:00
Gabriel Torres Ruiz
221bbd6d41 test(native-filters): add unit tests for requiredFirst filter logic (#37640)
(cherry picked from commit 75fa474fce)
2026-02-23 11:38:24 -08:00
yousoph
922857f0eb fix(dashboard): update chart customization UI text to "Display controls" (#37462)
Co-authored-by: Maxime Beauchemin <maximebeauchemin@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 5fa6925522)
2026-02-23 11:20:12 -08:00
Joe Li
055f4cd081 fix(chart-customizations): support migration of dynamic group by (#37176)
(cherry picked from commit 1a77e17179)

Adapted:
- hydrate.ts → hydrate.js: removed TypeScript type assertions, kept JS-compatible imports

Accepted:
- Legacy chart customization format migration (migrateChartCustomization utility)
- LEGACY_GROUPBY_PREFIX support in filter state management
- Dashboard.ts type additions for legacy format
- 490-line test suite

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 11:19:54 -08:00
Damian Pendrak
2e29c23f9c fix(deckgl): remove dataset field from Deck.gl Layer Visibility Display controls (#37611)
(cherry picked from commit 22ac5e02b6)
2026-02-23 11:18:56 -08:00
Damian Pendrak
256ad817bc feat(dashboard): chart customizations modal and plugins (#36062) 2026-02-23 11:16:59 -08:00
Amin Ghadersohi
1b876feaff fix(mcp): Remove unsupported thumbnail/preview URLs and internal fields from MCP schemas (#38109)
(cherry picked from commit 2a3567d2f1)
2026-02-23 09:08:27 -05:00
Damian Pendrak
b1fd97f969 feat(matrixify): add single metric constraint (#37169)
(cherry picked from commit 5a777c0f45)
2026-02-21 16:13:33 -08:00
Jamile Celento
f4d50fc98f fix(echarts): formula annotations not rendering with dataset-level columns label (#37522)
(cherry picked from commit 080f629ea2)
2026-02-21 10:06:13 -08:00
Jean Massucatto
d70c5d61cd fix(echarts-timeseries-combined-labels): combine annotation labels for events at same timestamp (#37164)
(cherry picked from commit 0c0d915391)
2026-02-20 21:58:03 -08:00
Vanessa Giannoni
719d9d827e feat(charts): improve negative stacked bar label positioning and accessibility (#37405)
(cherry picked from commit 77148277b9)
2026-02-20 21:55:32 -08:00
Luis Sánchez
d1e9baba41 feat(timeseries): remove stream style for bar charts (#37532)
(cherry picked from commit 5f0001affc)
2026-02-20 21:45:53 -08:00
Vanessa Giannoni
b327c5843a fix(table): preserve time grain aggregation when temporal column casing changes (#37893)
(cherry picked from commit f4acce5727)
2026-02-20 21:45:53 -08:00
Jamile Celento
d9f78dd754 fix(native-filters): respect filter scope in nested tabs by prioritizing chartsInScope (#37139)
Cherry-pick from 23fec55e3d.

- Accepted: Core fix to prioritize chartsInScope over rootPath in
  useIsFilterInScope; state.test.ts with 6 nested tab tests;
  getChartIdsInFilterScope.test.ts with comprehensive scope tests
- Adapted: Removed isChartCustomization branch (not present on
  6.0-release); kept 6.0-release types (Filter | Divider)
- Rejected: isChartCustomization logic (depends on chart customizations
  feature not present on 6.0-release)

(cherry picked from commit 23fec55e3d)
2026-02-20 21:45:50 -08:00
Enzo Martellucci
9c1daeac81 fix(charts): improve error display for failed charts in dashboards (#37939)
Cherry-pick frontend changes only from b565128fe7.

- Accepted: Chart.tsx fix to show backend API errors instead of infinite
  loading spinner when datasource is placeholder; ErrorContainer wrapper
  for scrollable error display; Chart.test.tsx with test coverage
- Adapted: Removed chartRenderingSucceeded from test mock (not in
  6.0-release Actions type)
- Rejected: gsheets.py needs_oauth2() changes (method doesn't exist on
  6.0-release); test_gsheets.py test for missing method

(cherry picked from commit b565128fe7)
2026-02-20 21:23:07 -08:00
Amin Ghadersohi
292242cf70 fix(thumbnails): stabilize digest by sorting datasources and charts (#38079)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 1ecff6fe5c)
2026-02-20 15:49:44 -08:00
Amin Ghadersohi
9bff2932df feat(mcp): add LIKE, ILIKE, IN, NOT IN filter operators to MCP chart tools (#38071)
(cherry picked from commit 9f8b212ccc)
2026-02-20 10:24:27 -05:00
Alexandru Soare
599b4e9299 fix(scatter): Fix ad-hoc metric for pointsize (#37669)
(cherry picked from commit 2b411b32ba)
2026-02-18 11:17:21 -08:00
Enzo Martellucci
5be6d41457 fix: Prevent table rows from overlapping pagination in table view (#37174)
Co-authored-by: Diego Pucci <diegopucci.me@gmail.com>
(cherry picked from commit c59d0a73d4)
2026-02-18 11:07:52 -08:00
Alexandru Soare
d8b5d45979 fix(sql): fix sql suggestions (#37699)
(cherry picked from commit ae8d671fea)
2026-02-18 11:00:06 -08:00
Mehmet Salih Yavuz
a1c96bbce5 fix(explore): Don't show unsaved changes modal on new charts (#37714)
(cherry picked from commit 69c679be20)
2026-02-18 10:16:25 -08:00
Enzo Martellucci
1758b00d70 fix(native-filters): align refresh icon with default value field (#37802)
(cherry picked from commit b012b63e5b)
2026-02-18 10:15:41 -08:00
Mehmet Salih Yavuz
5e9eae0c10 fix(charts): Force refresh uses async mode when GAQ is enabled (#37845)
(cherry picked from commit 7b21979fa3)
2026-02-18 10:15:03 -08:00
Amin Ghadersohi
553d5938a8 feat(mcp): expose current user identity in get_instance_info and add created_by_fk filter (#37967)
(cherry picked from commit f7218e7a19)
2026-02-18 09:17:02 -08:00
Amin Ghadersohi
465537c249 fix(mcp): use last data-bearing statement in execute_sql response (#37968)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 09:16:49 -08:00
Amin Ghadersohi
77b32b3f82 fix(mcp): handle more chart types in get_chart_data fallback query construction (#37969)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 5cd829f13c)
2026-02-18 09:16:30 -08:00
dependabot[bot]
b100abb338 chore(deps): bump react-error-boundary from 6.0.0 to 6.1.0 in /superset-frontend (#37206)
Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: hainenber <dotronghai96@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: hainenber <dotronghai96@gmail.com>
(cherry picked from commit 6453980d8d)
2026-02-17 23:43:59 -08:00
dependabot[bot]
4f7fca981d chore(deps): bump markdown-to-jsx from 7.7.4 to 9.6.0 in /superset-frontend (#37354)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit 7c69ec7f24)
2026-02-17 23:16:08 -08:00
dependabot[bot]
8b5a649d66 chore(deps): bump min-document from 2.19.0 to 2.19.1 in /superset-frontend (#36046)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit e915d7d1d0)
2026-02-17 23:11:28 -08:00
dependabot[bot]
92a6c6fb7c chore(deps): bump brace-expansion in /superset-frontend (#34744)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit 691926f0e1)
2026-02-17 23:07:44 -08:00
dependabot[bot]
079ffaedd4 chore(deps): bump qs from 6.14.1 to 6.14.2 in /superset-frontend (#37936)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit 5300f65a74)
2026-02-17 23:04:03 -08:00
dependabot[bot]
698059b524 chore(deps): update dompurify requirement from ^3.3.0 to ^3.3.1 in /superset-frontend/plugins/legacy-preset-chart-nvd3 (#36471)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evan Rusackas <evan@rusackas.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 955953b467)
2026-02-17 23:04:03 -08:00
dependabot[bot]
f3a4870b76 chore(deps): update dompurify requirement from ^3.2.4 to ^3.3.1 in /superset-frontend/packages/superset-ui-core (#36513)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evan Rusackas <evan@rusackas.com>
(cherry picked from commit 46e21c3003)
2026-02-17 23:04:03 -08:00
dependabot[bot]
0b61bf224e chore(deps): bump lodash-es from 4.17.22 to 4.17.23 in /superset-frontend (#37347)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit b576665f9a)
2026-02-17 23:04:03 -08:00
dependabot[bot]
17c7b27891 chore(deps): bump lodash from 4.17.21 to 4.17.23 in /superset-frontend (#37348)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
(cherry picked from commit 3a811d680d)
2026-02-17 23:04:03 -08:00
Nancy Chauhan
60e6fa2672 fix(security): update jspdf to 4.0.0 to address CVE-2025-68428 (#37553)
(cherry picked from commit 8fd3401077)
2026-02-17 23:04:03 -08:00
Đỗ Trọng Hải
eef2d9781c feat(deps): significant npm audit fix to trim off inadvertently runtime dep from upstream libraries (#37220)
Signed-off-by: hainenber <dotronghai96@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
(cherry picked from commit a1d65c7529)
2026-02-17 23:04:03 -08:00
Jamile Celento
a3f3c0c3c6 fix(native-filters): update TEMPORAL_RANGE filter subject when Time Column filter is applied (#36985)
(cherry picked from commit 2dfc770b0f)
2026-02-17 23:04:03 -08:00
Vanessa Giannoni
21188ccb01 fix(timeseries): restore ECharts tooltip after closing drill menu (#37284)
(cherry picked from commit 6b7b23ed78)
2026-02-17 23:04:03 -08:00
Jonathan Alberth Quispe Fuentes
d8b89468ad fix(roles): optimize user fetching and resolve N+1 query issue (#37235)
(cherry picked from commit 88ce1425e2)
2026-02-17 23:04:03 -08:00
Luis Sánchez
843fd75eaa fix(FiltersBadge): world map wont show filter icon after refresh page (#37260)
(cherry picked from commit 88a14f2ba0)
2026-02-17 23:03:42 -08:00
Jamile Celento
c60cafe755 fix(table): only show increase/decrease color options when time comparison enabled (#37362)
(cherry picked from commit 3347b9bf6c)
2026-02-12 19:29:08 -08:00
Vinícius Borges Alencar
8bb9e9629a refactor(charts): filter saved metrics by key and label (#37136)
(cherry picked from commit 82d6076804)
2026-02-12 16:11:20 -08:00
Vanessa Giannoni
0dca0294d8 fix(explore): remove extra spacing when Advanced Analytics section is hidden (#37456)
(cherry picked from commit 7110fc9cde)
2026-02-12 16:11:20 -08:00
Jean Massucatto
5f6a07e2dd fix(select): prevent bulk action buttons from being cut off in filters (#37453)
(cherry picked from commit abf90de0ca)
2026-02-12 16:11:19 -08:00
Amin Ghadersohi
7535753e05 fix(mcp): Add database_name as valid filter column for list_datasets (#37865)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 3f64c25712)
2026-02-12 16:11:19 -08:00
Amin Ghadersohi
94e4cb68e1 feat(mcp): add event_logger instrumentation to MCP tools (#37859)
(cherry picked from commit 4dfece9ee5)
(cherry picked from commit adfe91c9167c2d5cbd98d0a28f6e945d3fb81244)
2026-02-12 16:11:19 -08:00
Kamil Gabryjelski
82d8293f86 fix: Unreachable drop zones within tabs in dashbboard editor (#37904) 2026-02-12 16:05:31 -08:00
Kamil Gabryjelski
0f36680719 perf: fix N+1 query in Slice.datasource property (#37899) 2026-02-11 19:04:16 +01:00
Kamil Gabryjelski
cd65864b15 perf: fix N+1 query in chart list API when thumbnail_url is requested (#37895) 2026-02-11 19:03:57 +01:00
Kamil Gabryjelski
d6616410d5 fix(native-filters): Filters with select first value not restored correctly from url (#37855) 2026-02-10 16:22:49 -08:00
Amin Ghadersohi
b5cbbe86b7 fix(security): Add table blocklist and fix MCP SQL validation bypass (#37411)
(cherry picked from commit 15b3c96f8e)
2026-02-10 16:21:57 -08:00
Kamil Gabryjelski
a219f6cbe6 fix: Vertical lines in the middle of Treemap categories (#37808) 2026-02-10 16:37:27 +01:00
Alexandru Soare
4f0680c32e fix(dashboard): Prevent fatal error when database connection is unavailable (#37576)
(cherry picked from commit 9ea5ded988)
2026-02-09 09:27:25 -08:00
Amin Ghadersohi
f8dd7d8783 fix(mcp): remove html.escape to fix ampersand display in chart titles (#37186)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 01ac966b83)
2026-02-06 09:30:51 -05:00
Amin Ghadersohi
93d371a94c fix(mcp): include x_axis column in query context for series charts with group_by (#37639)
(cherry picked from commit 47db185e3b)
2026-02-05 14:03:19 -05:00
Amin Ghadersohi
9756610269 fix(mcp): prevent DATE_TRUNC on non-temporal columns in chart generation (#37433)
(cherry picked from commit 4147d877fc)
2026-02-05 12:40:57 -05:00
Amin Ghadersohi
d6f0b845fd fix(mcp): treat runtime validation warnings as informational, not errors (#37214)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit a9dca529c1)
2026-02-05 12:40:35 -05:00
Amin Ghadersohi
837d25579a chore(mcp): remove unused MCP_SERVICE feature flag (#37618)
(cherry picked from commit 5914e83436)
2026-02-03 10:35:32 -05:00
Amin Ghadersohi
cc7fb79596 feat(mcp): add config toggle to disable parse_request decorator (#37617)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 0b5e4dd5de)
2026-02-03 10:34:58 -05:00
Beto Dealmeida
86caadf861 feat: Add PWA file handler for CSV/XLS/Parquet uploads (#36191)
Cherry-picked from master (f2b6c39) with adaptations:
- Changed import path from @apache-superset/core to @superset-ui/core
- Removed ReactRefreshWebpackPlugin (not in 6.0-release)
- Fixed button type attribute in test file

Co-authored-by: Beto Dealmeida <roberto@dealmeida.net>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 21:25:32 -08:00
Luis Sánchez
357ab7597e chore(charts): echarts left padding too big and automation of title (#36993)
(cherry picked from commit 91131d5996)
2026-02-02 21:25:32 -08:00
Ramiro Aquino Romero
4688b7aa8c fix: charts row limit warning is missing for server (#37112)
(cherry picked from commit f60c82e4a6)
2026-02-02 16:29:25 -08:00
Jonathan Alberth Quispe Fuentes
f0214b1818 fix: Heatmap does not render correctly on normalization (#37208)
(cherry picked from commit 4a7cdccdad)
2026-02-02 16:29:12 -08:00
Jean Massucatto
32386ecfc5 fix(redshift): normalize table names to lowercase for CSV uploads (#37019)
(cherry picked from commit e8363cf606)
2026-02-02 16:28:49 -08:00
Pedro Rodrigues
eda6cad773 fix: big number drill to details column data (#37068)
(cherry picked from commit 2cce0308d4)
2026-02-02 16:12:23 -08:00
Felipe López
854538c858 fix(charts): Table chart shows an error on row limit (#37218) 2026-02-02 16:06:19 -08:00
Beto Dealmeida
4c1e8cc51c feat: AWS Cross-Account IAM Authentication for Aurora (#37585)
(cherry picked from commit 05c2354997)
2026-02-02 16:04:01 -08:00
Alejandro Solares
738919ea5e chore(deps): bump dependencies to address security vulnerabilities (#37552)
(cherry picked from commit d6029f5c8a)
2026-02-02 15:59:05 -08:00
Jean Massucatto
01c4300f17 fix(themes): correct action icons size and restore missing tooltips (#37409)
(cherry picked from commit 5a99588f57)
2026-02-02 15:57:41 -08:00
Jean Massucatto
d006b5fda7 fix(deckgl): change deck gl Path default line width unit to meters (#37248) 2026-02-02 15:42:38 -08:00
Mehmet Salih Yavuz
44ef12f5dc fix(Multilayer): preserve dashboard context for embedded (#37495)
(cherry picked from commit 1501af06fe)
2026-02-02 10:23:58 -08:00
Ramiro Aquino Romero
3ff12813c1 feat(deckgl): add auto zoom option in deck gl multi layer (#37221) 2026-01-31 11:31:22 -08:00
Gabriel Torres Ruiz
b0b044e653 fix(dashboard): catch DatasourceNotFound in get_datasets to prevent 404 (#37503)
(cherry picked from commit 06e4f4ff4c)
2026-01-30 12:17:18 -08:00
Amin Ghadersohi
ffb0519e74 fix(mcp): tools not listed when JWT auth is enabled (#37377)
(cherry picked from commit 6663709a23)
2026-01-30 13:55:50 -05:00
yousoph
cf3ab011e3 fix(matrixify): Rename Tag from 'Matrixify' to 'Matrixified' (#37402)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit bb5be6cf54)
2026-01-29 22:08:22 -08:00
Ramiro Aquino Romero
f10b2f8584 fix: display correct icon for Multi Chart in quick switcher (#37256) 2026-01-29 11:17:58 -08:00
Kamil Gabryjelski
be20fe9db7 fix(mcp): Instance not bound to session error (#37548) 2026-01-29 11:17:58 -08:00
Vanessa Giannoni
887aca2f1b fix(ag-grid-table): preserve time grain aggregation when temporal column casing changes (#36990)
(cherry picked from commit a7e7cc30a9)
2026-01-29 11:17:58 -08:00
Vanessa Giannoni
0fb95136b8 feat(dashboard): show dataset column labels in View as table (#37140)
(cherry picked from commit 2ec3aaaeea)
2026-01-29 11:17:58 -08:00
Reynold Morel
381950124e fix(dashboard): resolve dropdown popup positioning (#36963)
(cherry picked from commit 43653d1fa1)
2026-01-29 11:17:58 -08:00
Vanessa Giannoni
01495d485d fix(dashboard-filters): prevent clearing all filters when editing a native filter (#37253)
(cherry picked from commit ec2509a8b4)
2026-01-29 11:17:58 -08:00
Amin Ghadersohi
1ef94be726 fix(mcp): always filter list responses by columns_requested (#37505) 2026-01-28 14:39:57 +01:00
Daniel Vaz Gaspar
8fad912835 feat(cache): use configurable hash algorithm for flask-caching (#37361)
(cherry picked from commit 290bcc1dbb)
2026-01-26 12:40:53 -08:00
Amin Ghadersohi
f309668127 chore(deps): bump fastmcp from 2.14.0 to 2.14.3 (#37410)
(cherry picked from commit 0ecc69d2f1)
2026-01-26 12:40:53 -08:00
Reynold Morel
c0c0ee484a fix(chart): implement geohash decoding (#37027)
(cherry picked from commit b99fc582e4)
2026-01-26 12:40:53 -08:00
SBIN2010
55e31e74cb feat(tree chart): add initial tree depth to tree chart (#35425)
(cherry picked from commit 21f85a4145)
2026-01-26 12:40:53 -08:00
Alex Yang
e5e2c2a5dd feat: Floating Point Formatting for Scatter Point Chart (#35915)
Co-authored-by: Vincent <vincent.trung4@gmail.com>
(cherry picked from commit 001b6cb801)
2026-01-26 12:40:53 -08:00
Daniel Vaz Gaspar
8c15e72de6 fix: variable shadowing in test_connection command (#37397)
(cherry picked from commit f2b54e882d)
2026-01-26 12:40:53 -08:00
dependabot[bot]
d395f5b368 chore(deps): bump @deck.gl/layers from 9.1.13 to 9.2.2 in /superset-frontend (#35743)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evan Rusackas <evan@rusackas.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit f2e677c150)
2026-01-26 12:40:53 -08:00
Gabriel Torres Ruiz
0802c6804c fix(theme): migrate APP_NAME to brandAppName theme token with backward compatibility (#37370)
Co-authored-by: Rafael Benitez <rebenitez1802@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Beto Dealmeida <roberto@dealmeida.net>
Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
2026-01-26 12:40:53 -08:00
Vitor Avila
3c37bb01ea fix: DB OAuth2 fixes (#37350)
(cherry picked from commit cc972cad5a)
2026-01-26 12:40:53 -08:00
Vitor Avila
fa30a74e8e feat: Handle OAuth2 dance with TableSelector (#37315) 2026-01-26 12:40:53 -08:00
Enzo Martellucci
6214278106 fix(echarts): restore dashed line style for time comparison series (#37135)
(cherry picked from commit 3fa5bb4138)
2026-01-26 12:40:52 -08:00
Amin Ghadersohi
872319d415 feat(mcp): add stacked bar/area chart support (#37188)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 0fedfe03d5)
2026-01-26 12:40:52 -08:00
Jean Massucatto
5606d5d2e3 perf(date_parser): bound regex quantifiers for deterministic parsing performance (#36983)
Cherry-picked from master commit 459b4cb23d

Accepted:
- Bounded \s+ to \s{1,5} and \s* to \s{0,5} in time_range_lookup regexes
- Added tests for bounded whitespace validation

Adapted:
- Preserved 6.0-release "first/1st of" patterns between modified sections
- Kept existing tests for "first of" expressions

Original author: Jean Massucatto <massucattoj@gmail.com>
2026-01-26 12:40:52 -08:00
Luis Sánchez
a9a03db940 refactor(TimezoneSelector): Enhance timezone selection logic and improve performance (#36486) 2026-01-26 12:40:52 -08:00
Mehmet Salih Yavuz
676c73f6d5 feat(Matrixify): add matrixify tag to list view and explore (#37247) 2026-01-26 12:40:52 -08:00
Richard Fogaca Nienkotter
68c7750f35 feat: Dynamic currency (#36416) 2026-01-26 12:40:52 -08:00
Alexandru Soare
6315380029 fix(transpile_query): Fix export_as_csv error: "transpile_to_dialect": ['Unknown field.'] (#37249)
(cherry picked from commit 2187fb4ab4)
2026-01-26 12:40:52 -08:00
Amin Ghadersohi
cf83ef89eb feat(mcp): add time_grain parameter to XY chart generation (#37182)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit e1fa374517)
2026-01-26 12:40:52 -08:00
amaannawab923
f61003756b feat(ag-grid-table): Enable Time Shift feature for AG Grid Table (#37072)
(cherry picked from commit 39238ef8a9)
2026-01-26 12:40:52 -08:00
Amin Ghadersohi
265209a9e4 feat(mcp): Add Redis EventStore support for multi-pod deployments (#37216)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 50d0508a92)
2026-01-26 12:40:52 -08:00
Amin Ghadersohi
1e678737c7 fix(mcp): Remove screenshot URL functionality from MCP chart tools (#37228)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 2d20079a88)
2026-01-26 12:40:52 -08:00
Amin Ghadersohi
ad9b3f6182 feat(mcp): Add support for AG Grid Interactive Table (ag-grid-table) viz_type (#37191)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit fe16c828cf)
2026-01-26 12:40:52 -08:00
Amin Ghadersohi
531d8512a8 fix(sqllab): show virtual dataset banner only when isDataset param is true (#37184)
(cherry picked from commit 6e1718910f)
2026-01-26 12:40:52 -08:00
Amin Ghadersohi
152f9ddbe0 fix(mcp): restore select_columns filtering in list tools (#37213)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 896947c787)
2026-01-26 12:40:52 -08:00
Alexandru Soare
b5f3892b8c feat(dates): adding handling for first of (#37098)
(cherry picked from commit 8f35cc93673a56ba499510fbefabf9e4a46d8b6f)
2026-01-26 12:40:52 -08:00
SBIN2010
bcd0fc13e2 feat: add tab select with save chart to dashboard (#36332)
Co-authored-by: Evan Rusackas <evan@preset.io>
Co-authored-by: Enzo Martellucci <enzomartellucci@gmail.com>
(cherry picked from commit c30edaf075)
2026-01-26 12:40:52 -08:00
Alexandru Soare
1f03ba0683 fix(data-zoom): Data-zoom not rendered properly in Matrixify (#37134)
(cherry picked from commit 9555798d37)
2026-01-26 12:40:52 -08:00
Mehmet Salih Yavuz
88a14f309a chore(Matrixify): disable matrixify for incompatible viz types (#37163)
(cherry picked from commit 95c14b1fc1)
2026-01-26 12:40:52 -08:00
Enzo Martellucci
5d58c8a55e fix(charts): properly parse error responses in StatefulChart (#37130)
(cherry picked from commit 23b91d22ef)
2026-01-26 12:40:51 -08:00
Amin Ghadersohi
104440115e refactor(mcp): simplify single metric chart type check (#37215)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 2bcb66c2fc)
2026-01-26 12:40:51 -08:00
Amin Ghadersohi
c6c5d43073 fix(mcp): Handle big_number charts and make semantic warnings non-blocking (#37142)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit d0783da3e5)
2026-01-26 12:40:51 -08:00
Amin Ghadersohi
65eb3bbfa9 fix(mcp): push Flask app context in mcp_auth_hook for tool execution (#37190)
(cherry picked from commit 4532ccf638)
2026-01-26 12:40:51 -08:00
Declan Zhao
4e2afa81d3 fix(prune_logs): improve performance by using id column only for ordering log records when max_rows_per_run is provided (#37138)
(cherry picked from commit 137ebdee39)
2026-01-26 12:40:51 -08:00
Elizabeth Thompson
cd2d61f95f fix(table chart): time comparison totals returning null (#37111)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit a272253243)
2026-01-26 12:40:51 -08:00
Mehmet Salih Yavuz
f435c44189 fix(Matrixify): Do not clear values when saving (#37090)
(cherry picked from commit e053418c97)
2026-01-26 12:40:51 -08:00
Alexandru Soare
435c01c5a3 fix(datasets): ui bug fixes (#37058)
(cherry picked from commit fc67569cd4)
2026-01-26 12:40:51 -08:00
Enzo Martellucci
26b8925600 fix(explore): dispatch NumberControl value on blur to allow field clearing (#37007)
(cherry picked from commit 5f58241795)
2026-01-26 12:40:51 -08:00
Luis Sánchez
66ec7f1e3d chore(chart): rollback legend top alignment to the right (#36994)
(cherry picked from commit dcdcf88969)
2026-01-26 12:40:51 -08:00
amaannawab923
a078221a24 feat(ag-grid): Server Side Filtering for Column Level Filters (#35683)
(cherry picked from commit 4f444ae1d2)
2026-01-26 12:40:51 -08:00
Michael S. Molina
e07d12b1bb feat(embedded-sdk): Add resolvePermalinkUrl callback for custom permalink URLs (#36924)
(cherry picked from commit 53dddf4db2)
2026-01-26 12:40:51 -08:00
Beto Dealmeida
f04f638506 chore: remove deprecated function (#37021)
(cherry picked from commit 14c0cad0ba)
2026-01-26 12:40:51 -08:00
Amin Ghadersohi
8c6b7b455b fix(mypy): add overrides for superset-core local dev consistency (#36907)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit f895250cf9)
2026-01-26 12:40:51 -08:00
Amin Ghadersohi
e85033c0ff fix(mcp): resolve startup failures from circular DAO imports (#37023)
(cherry picked from commit ecefba5bf7)
2026-01-26 12:40:51 -08:00
Enzo Martellucci
9093761713 refactor(db-engine-specs): use standard OAuth 2.0 params in base class (#37010)
(cherry picked from commit ea90d1f141)
2026-01-26 12:40:51 -08:00
Daniel Vaz Gaspar
211cd7a219 chore: bump flask-cors to 6.0.2 (#36640)
(cherry picked from commit f48322c17d)
2026-01-26 12:40:51 -08:00
Amin Ghadersohi
513297ebc6 fix(mcp): remove unused ctx parameter from health_check tool (#36992)
(cherry picked from commit 85cf46dc1c)
2026-01-26 12:40:51 -08:00
Amin Ghadersohi
be3097c206 feat(mcp): change save_chart default to False for preview-first workflow (#36935)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 047360641a)
2026-01-26 12:40:51 -08:00
Daniel Vaz Gaspar
f34e7687b1 fix: streaming export losing g context (#36950)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit a6d85dccf8)
2026-01-26 12:40:51 -08:00
Amin Ghadersohi
fe7be94604 fix(mcp): use chart.query_context for get_chart_data like the API does (#36937)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 64ee48f147)
2026-01-26 12:40:51 -08:00
Amin Ghadersohi
519deb99e1 feat(mcp): add unified get_schema tool for schema discovery (#36458)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 84279acd2f)
2026-01-26 12:40:51 -08:00
Enzo Martellucci
c5f26c30b7 fix(alert-report-modal): enhance dashboard filters behavior and visibility (#36380)
(cherry picked from commit e1c022344e)
2026-01-26 12:40:50 -08:00
Mehmet Salih Yavuz
67e36b5195 fix(deck.gl): Fix Scatterplot chart error when using fixed point size (#36890)
Co-authored-by: Claude <noreply@anthropic.com>
2026-01-26 12:40:50 -08:00
Geidō
9ea4cbb15f fix: Query history view button in SqlLab (#36540) 2026-01-26 12:40:50 -08:00
Enzo Martellucci
39355ee10d fix(dashboard): resolve tab reorder state sync issues (#36855)
(cherry picked from commit e112d863bf)
2026-01-26 12:40:50 -08:00
Beto Dealmeida
ef08904e25 fix: apply EXCLUDE_USERS_FROM_LISTS to /api/v1/security/users/ (#36742)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit ecb4e483df)
2026-01-26 12:40:50 -08:00
Alexandru Soare
75d881909f fix(margin): Fixing margin issues (#36479)
(cherry picked from commit 54eb6317ef)
2026-01-26 12:40:50 -08:00
Kamil Gabryjelski
ea8e813fc5 chore: Close playwright browser gracefully (#36537)
(cherry picked from commit f3407d7a56)
2026-01-26 12:40:50 -08:00
Joshua Daniel
d675b3ef57 feat(chart): support icons and text in the deck.gl Geojson visualization (#36201)
Co-authored-by: Joshua Daniel <jdaniel@gflenv.com>
(cherry picked from commit 5e0ee40762)
2026-01-26 12:40:50 -08:00
Luis Sánchez
7d8f310ca6 fix(SearchFilter): prevent unintended autocomplete on search input (#36209)
(cherry picked from commit c9ec173647)
2026-01-26 12:40:50 -08:00
Vitor Avila
b92d08e4f9 fix: store form_data as dict during viz type migration (#36680)
(cherry picked from commit d14f502126)
2026-01-26 12:40:50 -08:00
Vitor Avila
d52ce3999a fix: Support datetime_format during import (#36679)
(cherry picked from commit 821b259805)
2026-01-26 12:40:50 -08:00
Chad Rossouw
f63a74ea42 feat(database): add cloudflare d1 support (#36348)
Co-authored-by: danielalyoshin <daniel.alyoshin@gmail.com>
Co-authored-by: Shreyas Rao <raoshreyas2004@gmail.com>
Co-authored-by: Murphy Lee <murphylee2004@gmail.com>
(cherry picked from commit e5579ed939)
2026-01-26 12:40:50 -08:00
Amin Ghadersohi
3ddf4cbd42 chore(deps): upgrade fastmcp from 2.13.x to 2.14.0 (#36594)
(cherry picked from commit a1b5b92265)
2026-01-26 12:40:50 -08:00
Amin Ghadersohi
7aa8b372b7 chore(deps): upgrade redis from 4.x to 5.x (#36593)
(cherry picked from commit 92c63a54e4)
2026-01-26 12:40:50 -08:00
Amin Ghadersohi
879a92ee83 feat(mcp): add datasource field to generate_explore_link form_data (#36543)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit e5b7e38a30)
2026-01-26 12:40:50 -08:00
Amin Ghadersohi
56a2631ccd feat(mcp): return form_data and form_data_key in generate_chart and generate_explore_link responses (#36539)
(cherry picked from commit a588668899)
2026-01-26 12:40:50 -08:00
Daniel Vaz Gaspar
3c2004e588 feat: add option for hash algorithms (#35621)
Co-authored-by: Ville Brofeldt <33317356+villebro@users.noreply.github.com>
(cherry picked from commit bb22eb1ca8)
2026-01-26 12:40:50 -08:00
Gabriel Torres Ruiz
13b5b3f8d1 feat(theming): add per-theme custom font URL support (#36317) 2026-01-26 12:40:50 -08:00
Daniel Vaz Gaspar
35421ad840 fix: core mcp injection and ephemeral envs (#36440)
(cherry picked from commit 1d9c93a793)
2026-01-26 12:40:50 -08:00
Mehmet Salih Yavuz
6c41ff14ea fix(SaveModal): Update chart state when saving in explore (#36441)
(cherry picked from commit fb2826f92e)
2026-01-26 12:40:49 -08:00
Alexandru Soare
6244cc38b1 feat(state): remove chart state when navigation away from the dashboard (#36421)
(cherry picked from commit 8c603a6f8b)
2026-01-26 12:40:49 -08:00
Mohammad Al-Qasem
3ae4e3d3df feat(table): Gradient Toggle (#36280)
Co-authored-by: Claude <noreply@anthropic.com>
2026-01-26 12:40:49 -08:00
Beto Dealmeida
e49c5db85a chore: improve types (#36367)
(cherry picked from commit 482c674a0f)
2026-01-26 12:40:49 -08:00
Beto Dealmeida
bb7d4ca123 feat: Explorable protocol (#36245)
(cherry picked from commit 16e6452b8c)
2026-01-26 12:40:49 -08:00
Edison Liem
edd9345227 feat(dashboard): implement boolean conditional formatting (#36338)
Co-authored-by: Morris <morrisho215215@gmail.com>
(cherry picked from commit eabb5bdf7d)
2026-01-26 12:40:49 -08:00
Antonio Rivero
a5afc48768 fix(dashboards): Use same decorators as FAB (#36423)
(cherry picked from commit 4a249a0745)
2026-01-26 12:40:49 -08:00
Daniel Vaz Gaspar
41b46ccb6b chore: bump urllib3 to 2.6.0 (#36526)
Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
2026-01-26 12:40:49 -08:00
Antonio Rivero
713de8f1dc feat(mcp): Caching uses in-memory store by default when no external store is configured (#36527) 2026-01-26 12:40:49 -08:00
Antonio Rivero
5db29c0f70 feat(mcp): Add ResponseCachingMiddleware and Storage (#36497) 2026-01-26 12:40:49 -08:00
Amin Ghadersohi
5b38b9baf4 fix(mcp): Use config-based URL for MCP service instead of request auto-detection (#36460)
(cherry picked from commit 8d7c83419c)
2026-01-26 12:40:49 -08:00
Declan Zhao
9601d8113c feat(prune_logs): add optional max_rows_per_run param (#36313)
(cherry picked from commit d121cfdbda)
2026-01-26 12:40:49 -08:00
Beto Dealmeida
62d07a9916 chore: cleanup ssh tunnel (#34388)
(cherry picked from commit c458f99dd4)
2026-01-26 12:40:49 -08:00
Kaito Watanabe
f94170598c feat: show search filtered total (#36083)
(cherry picked from commit 6e0960c3f5)
2026-01-26 12:40:49 -08:00
Amin Ghadersohi
fa6e28598a feat(mcp): add tool tags for Tool Search optimization (#36405)
(cherry picked from commit 5c91ab91fb)
2026-01-26 12:40:49 -08:00
Mehmet Salih Yavuz
683b9a0f05 fix(SaveModal): reset chart state when saving and going to a dashboard (#36402)
(cherry picked from commit b40467c7e2)
2026-01-26 12:40:49 -08:00
Beto Dealmeida
1bf0639f40 feat: DB2 dialect for sqlglot (#36365)
(cherry picked from commit e4cb84bc02)
2026-01-26 12:40:49 -08:00
Beto Dealmeida
fea90d8a67 fix: normalize totals cache keys for async hits (#36274)
(cherry picked from commit 775d1ba061)
2026-01-26 12:40:49 -08:00
Vitor Avila
b14e107fca fix: Do no aggregate results for CSV downloads from AG Grid raw records table (#36247)
(cherry picked from commit 9fc7a83320)
2026-01-26 12:40:49 -08:00
Mehmet Salih Yavuz
ddb16032de fix(timeshift): Add a more reliable strategy for correct temporal col (#36309)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit a754258fad)
2026-01-26 12:40:49 -08:00
Gabriel Torres Ruiz
a7d6afa295 fix(deckgl): use DatasourceType enum in polygon transformProps test + some TS issues (#36336)
(cherry picked from commit a745fd49fa)
2026-01-26 12:40:48 -08:00
Damian Pendrak
dfe04f8fd4 fix(deckgl): polygon elevation fixed value (#35266)
(cherry picked from commit de7f41a888)
2026-01-26 12:40:48 -08:00
Amin Ghadersohi
b1a00163db refactor(mcp): use dynamic APP_NAME instead of hardcoded Superset branding (#36371)
(cherry picked from commit 2c6bed27aa)
2026-01-26 12:40:48 -08:00
Enzo Martellucci
f2a26236aa feat(alert-report-modal): Use extensions registry for DateFilterControl in AlertReportModal (#36376)
(cherry picked from commit 51798edb23)
2026-01-26 12:40:48 -08:00
Alexandru Soare
6f887bbaf0 feat(embed): get charts payload (#36237)
Co-authored-by: Vitor Avila <vitorfragadeavila@gmail.com>
Co-authored-by: Mehmet Salih Yavuz <salih.yavuz@proton.me>
(cherry picked from commit 341ae994c5)
2026-01-26 12:40:48 -08:00
Amin Ghadersohi
2a55db95a1 fix(mcp): access wrapped function in dataset tool tests (#36295)
(cherry picked from commit 2af5a5adb0)
2026-01-26 12:40:48 -08:00
Amin Ghadersohi
e5def29e63 feat(mcp): implement selective column serialization for list tools (#36035) 2026-01-26 12:40:48 -08:00
Amin Ghadersohi
1674628881 fix(mcp-service): improve MCP tool parameter clarity and validation (#36137)
Co-authored-by: Rafael Benitez <rafael.benitez@contractors.food52.com>
(cherry picked from commit f98939103b)
2026-01-26 12:40:48 -08:00
Amin Ghadersohi
685d4cc891 build: Add pytest-asyncio to enable async MCP service tests (#36251)
(cherry picked from commit ab36bd3965)
2026-01-26 12:40:48 -08:00
Amin Ghadersohi
50326c23a9 feat(datasets): add datetime format detection to dataset columns (#36150)
Co-authored-by: Claude Code <claude@anthropic.com>
(cherry picked from commit 06a8f4df02)
2026-01-26 12:40:48 -08:00
Beto Dealmeida
fab1f03527 fix: double computation of contribution_totals (#36226)
(cherry picked from commit aca18fff99)
2026-01-26 12:40:48 -08:00
Beto Dealmeida
c01b041e40 fix: cache key generation (#36225)
(cherry picked from commit 0c87034b17)
2026-01-26 12:40:48 -08:00
Antonio Rivero
83bc43898e feat(dashboards): Add config to filter implicit tags in list API (#36246)
(cherry picked from commit c966dd4f9e)
2026-01-26 12:40:48 -08:00
amaannawab923
e08749b9bb feat(ag-grid): add SQLGlot-based SQL escaping for where and having filter clauses (#36136)
(cherry picked from commit 186693b840)
2026-01-26 12:40:48 -08:00
Beto Dealmeida
3d7fb83bef refactor: refactor get_query_result (#36057)
(cherry picked from commit a2267d869b)
2026-01-26 12:40:48 -08:00
Amin Ghadersohi
13c70c7ee3 fix(mcp): Allow MCP tools to accept string or object request formats (#36271)
(cherry picked from commit cf88551a56)
2026-01-26 12:40:48 -08:00
Amin Ghadersohi
3b81e5699e feat(mcp): Add flexible input parsing to handle double-serialized requests (#36249) 2026-01-26 12:40:48 -08:00
Alexandru Soare
32eddb6b1f feat(Tabs): Rearange tabs when editing dashboard (#35156)
(cherry picked from commit 71c015c579)
2026-01-26 12:40:48 -08:00
Amin Ghadersohi
e1d0a9f5f0 fix(security): enable AUTH_RATE_LIMITED to work correctly (#36195)
Co-authored-by: Joe Li <joe@preset.io>
(cherry picked from commit 92d8139136)
2026-01-26 12:40:48 -08:00
amaannawab923
734eff9caf feat(streaming): Streaming CSV uploads for over 100k records for constant memory usage (#35478)
(cherry picked from commit 35f156a1e1)
2026-01-26 12:40:47 -08:00
Amin Ghadersohi
20f1bb0367 docs(mcp): add comprehensive architecture, security, and production deployment documentation (#36017)
(cherry picked from commit 66afdfd119)
2026-01-26 12:40:47 -08:00
Enzo Martellucci
cf92127702 chore(DatabaseModal): simplify collapsible logic for extra extension section (#36118)
(cherry picked from commit 53b9045943)
2026-01-26 12:40:47 -08:00
Richard Fogaca Nienkotter
7614fbabbf feat(dashboard): "embed code" option on dashboard share tab (#33163)
Co-authored-by: richardfn <richard.fogaca@appsilon.com>
Co-authored-by: Enzo Martellucci <52219496+EnxDev@users.noreply.github.com>
(cherry picked from commit 80ec241108)
2026-01-26 12:40:47 -08:00
Gabriel Torres Ruiz
72173554fe fix(csv-upload): log detailed errors during chunk concatenation for debugging (#36108)
(cherry picked from commit 9d06a5888f)
2026-01-26 12:40:47 -08:00
Beto Dealmeida
dc14cb34fa chore: annotate important types (#36034)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit fb7d0e0e3d)
2026-01-26 12:40:47 -08:00
Gabriel Torres Ruiz
c5fdf86230 feat(embedded): add setThemeMode API for dynamic theme switching (#36125)
(cherry picked from commit 282f4e5de2)
2026-01-26 12:40:47 -08:00
Kamil Gabryjelski
822fc672f3 perf: Fix dashboard performance issues (#36119)
(cherry picked from commit 6723a58780)
2026-01-26 12:40:47 -08:00
Amin Ghadersohi
cff983c91e fix: pin setuptools <81 to prevent pkg_resources removal (#36104)
(cherry picked from commit 519990e2fb)
2026-01-26 12:40:47 -08:00
Enzo Martellucci
216763d05d fix: Use total count to filter datasets (#36135)
Co-authored-by: Diego Pucci <diegopucci.me@gmail.com>
(cherry picked from commit 962faa2196)
2026-01-26 12:40:47 -08:00
Amin Ghadersohi
28a3c5f5b9 feat(mcp): add configurable branding for MCP service (#36033)
(cherry picked from commit dad469297c)
2026-01-26 12:40:47 -08:00
Enzo Martellucci
5611f81ec3 style(database-modal): vertically align the button and the InfoTooltip icon (#36087)
(cherry picked from commit f8933c2743)
2026-01-26 12:40:47 -08:00
Daniel Vaz Gaspar
0fd66328df chore: bump FAB to 5.0.2 (#36086)
(cherry picked from commit b051f779e6)
2026-01-26 12:40:47 -08:00
Antonio Rivero
b8abe9531e chore(logs): Add is_cached in sync AND async results (#36102)
(cherry picked from commit 60f29ba6fb)
2026-01-26 12:40:47 -08:00
Amin Ghadersohi
462b634a31 fix(mcp): simplify health_check tool and refactor system utils (#36063)
(cherry picked from commit c244e7f847)
2026-01-26 12:40:47 -08:00
Mehmet Salih Yavuz
e11e61b5ea feat(frontend): add dataset cache clearing utilities and integration (#35264)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Geidō <60598000+geido@users.noreply.github.com>
(cherry picked from commit 0b535b792e)
2026-01-26 12:40:47 -08:00
Richard Fogaca Nienkotter
8eba7a7860 fix(dashboard): prevent validation error in properties modal when ope… (#36045)
(cherry picked from commit 9be61a1245)
2026-01-26 12:40:47 -08:00
Joe Li
e506cf4bfa fix(tests): fix flakey tests with PropertiesModal.test.tsx, FiltersConfigModal.test.tsx and ChartList.listview.test.tsx (#36037)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 0a5144fc1d)
2026-01-26 12:40:47 -08:00
Joe Li
e1c9285467 feat(playwright): Remove Cypress auth tests in favor of Playwright auth tests (#35938)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 64ca080bb8)
2026-01-26 12:40:47 -08:00
Amin Ghadersohi
e0d4f9dc27 fix(mcp-service): ensure Flask app context in auth hook and resolve Pydantic warnings (#36013)
(cherry picked from commit 9605a4a9cb)
2026-01-26 12:40:47 -08:00
Richard Fogaca Nienkotter
1ea68dd451 style(sqllab): restore Template Parameters modal styling (#35965)
(cherry picked from commit ae63f64771)
2026-01-26 12:40:46 -08:00
Amin Ghadersohi
00ac662977 chore(mcp-service): upgrade fastmcp from 2.10.6 to 2.13.0.2 (#36014)
(cherry picked from commit 3167a0dbc0)
2026-01-26 12:40:46 -08:00
Amin Ghadersohi
f59110cf28 refactor(mcp): shorten tool name from get_superset_instance_info to get_instance_info (#36032)
(cherry picked from commit d2550a525b)
2026-01-26 12:40:46 -08:00
Gabriel Torres Ruiz
e27e26debe fix(UI): spacings + UI fixes (#36010)
(cherry picked from commit c11be72ead)
2026-01-26 12:40:46 -08:00
Amin Ghadersohi
e74ee8ee69 test: revert unrelated flaky test fix from MCP PR (#36015)
(cherry picked from commit f5f5913a29)
2026-01-26 12:40:46 -08:00
Antonio Rivero
b003d1bdd7 chore(logs): Use correct log level and remove duplicates for get_query (#36023)
(cherry picked from commit 3765c31163)
2026-01-26 12:40:46 -08:00
Enzo Martellucci
c41b061063 fix(ui): bump AntD to 5.26.0 to fix Splitter drag menu issue (#35782)
(cherry picked from commit 84a1abd357)
2026-01-26 12:40:46 -08:00
Antonio Rivero
549dd41388 feat(logs): Add is_cached as part of ChartDataRestApi.data actions (#36001)
(cherry picked from commit a1d4dff99d)
2026-01-26 12:40:46 -08:00
Rafael Benitez
1d6d1ca1a7 fix(dataset): sync columns checkbox not responding to clicks in virtual dataset modal (#35650)
(cherry picked from commit 46db8b7803)
2026-01-26 12:40:46 -08:00
Amin Ghadersohi
beff839b5b feat(mcp): MCP service implementation (PRs 3-9 consolidated) (#35877)
(cherry picked from commit fee4e7d8e2)
2026-01-26 12:40:46 -08:00
Amin Ghadersohi
46069a2269 fix(mcp): remove hardcoded admin username fallbacks (#35875)
(cherry picked from commit 7733265fa2)
2026-01-26 12:40:45 -08:00
Amin Ghadersohi
68e8ba7732 feat(mcp): PR2 - Add chart listing and info tools with core infrastructure (#35835)
(cherry picked from commit e1455057e7)
2026-01-26 12:40:45 -08:00
Amin Ghadersohi
aceb2f52f6 feat(mcp): PR1 - Add MCP service scaffold for Apache Superset (#35163)
(cherry picked from commit cc6a5dc29a)
2026-01-26 12:40:45 -08:00
Vitor Avila
e3fa444d1e chore: Docs and config improvements for Docker setup (#35896)
(cherry picked from commit 0a95f74f11)
2026-01-26 12:40:45 -08:00
Gabriel Torres Ruiz
0b6a5c5183 refactor(explore): improve focus management in adhoc filter editor (#35801) 2026-01-26 12:40:45 -08:00
Amin Ghadersohi
9e65482384 refactor(explore): extract session ID retrieval into overridable method (#35779)
(cherry picked from commit 6f50ddf710)
2026-01-26 12:40:45 -08:00
SBIN2010
72b9ee5d09 feat: show total in waterfall chart (#35876)
(cherry picked from commit 48ee0821d3)
2026-01-26 12:40:45 -08:00
Alexandru Soare
3d7ae46f7c feat(Chart): Save Chart State globally (#35343)
(cherry picked from commit 99b61143f6)
2026-01-26 12:40:45 -08:00
SBIN2010
9edf84304a feat: conditional formatting improvements add flag toAllRow and toTextColor in tables (#34762)
(cherry picked from commit 514d56d1ae)
2026-01-26 12:40:45 -08:00
Joe Li
b18351c9ed fix(frontend): resolve race condition in DatasetUsageTab pagination s… (#35691)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 79918a7939)
2026-01-26 12:40:45 -08:00
Geidō
bea413d2a2 fix(Themes): Local label inconsistent behaviors (#35663)
(cherry picked from commit fcfafebb29)
2026-01-26 12:40:45 -08:00
SkinnyPigeon
1cd27bf27f feat(reports): allow custom na values (#35481)
Co-authored-by: bito-code-review[bot] <188872107+bito-code-review[bot]@users.noreply.github.com>
Co-authored-by: Beto Dealmeida <roberto@dealmeida.net>
(cherry picked from commit 58758de93d)
2026-01-26 12:40:45 -08:00
Elizabeth Thompson
f79ac23776 test(tasks): Add tests for log_task_failure signal handler (#35721)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 1b6d57c3f3)
2026-01-26 12:40:45 -08:00
Elizabeth Thompson
d90ff786d6 test: add comprehensive unhappy path tests for export (#35718)
(cherry picked from commit 0b3fe3d60c)
2026-01-26 12:40:45 -08:00
Richard Fogaca Nienkotter
504234f575 feat: use in deck.gl custom tooltip instead of SafeMarkdown (#35665)
(cherry picked from commit 8c125d2553)
2026-01-26 12:40:45 -08:00
Joe Li
de0b1c2156 refactor(frontend): convert DatasourceEditor tests to TypeScript (#35606)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 4ddc3f14ed)
2026-01-26 12:40:45 -08:00
Quentin Leroy
6d7b050792 fix(config.py): reset HTML_SANITIZATION to True by default (#35603)
(cherry picked from commit 09772eeda0)
2026-01-26 12:40:45 -08:00
Gabriel Torres Ruiz
a1ec378a12 fix(theming): solve modal dark theme issues + styling and code improvements (#35539)
(cherry picked from commit e6bd03fe98)
2026-01-26 12:40:44 -08:00
Joe Li
773b6938d0 test(frontend): remove 3 duplicate JSX test files (#35590)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 35b5f8dcdc)
2026-01-26 12:40:44 -08:00
Levis Mbote
6910aa23f8 feat(dashboard): chart customization/dynamic group by in dashboards (#33831)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: amaannawab923 <amaannawab923@gmail.com>
(cherry picked from commit 97518544ee)
2026-01-26 12:40:44 -08:00
Elizabeth Thompson
fe94f65d1f fix(export): replace iframe with fetch to avoid CSP frame-src violations (#35584)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 3dcf85caef)
2026-01-26 12:40:44 -08:00
Gabriel Torres Ruiz
664881ff5f fix(theme-crud): add unsaved changes modal (#35254)
(cherry picked from commit a90928766b)
2026-01-26 12:40:44 -08:00
Elizabeth Thompson
5052e35aea fix(modals): use Modal.useModal hook for proper dark mode theming (#35198)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 8bb911bc91)
2026-01-26 12:40:44 -08:00
Kamil Gabryjelski
f86c2f15ae fix(explore): Remove query autotrigger (#35418)
(cherry picked from commit 0364933e8b)
2026-01-26 12:40:44 -08:00
Damian Pendrak
03995adc4d feat(db): custom database error messages (#34674)
(cherry picked from commit 19db0353a9)
2026-01-26 12:40:44 -08:00
Kamil Gabryjelski
163573e8c9 fix: Broken splitter in sql lab and some minor visual fixes (#35416)
(cherry picked from commit 88e5581d04)
2026-01-26 12:40:44 -08:00
Gabriel Torres Ruiz
d495df5934 feat(theming): add base theme config (#35220)
(cherry picked from commit 220480b627)
2026-01-26 12:40:44 -08:00
Joe Li
f6e3b87621 fix: resolve 6.0 release migration chain conflicts
This commit consolidates migration fixes to resolve conflicts between
4.2-release and 6.0-release branches:

- Correct merge migration to prevent KeyError d482d51c15ca
- Resolve multiple heads with 3-way merge migration
- Complete migration chain linkage to 4.2-release HEAD
- Restore 4.2-release migration chain compatibility

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
(cherry picked from commit 84e5cfef51211403f8d54ea8a79bffb4d4a53796)
(cherry picked from commit 912c2d2b1fbf035f9d5786c5d4cc34d8c93d8b75)
(cherry picked from commit 51da0e61c16d4a037b6650848208ae359e37ef7e)
2026-01-26 12:40:44 -08:00
JUST.in DO IT
e4b246cc03 chore(sqllab): remove unused json param (#35065)
(cherry picked from commit 0defcb604b)
2026-01-26 12:40:44 -08:00
Mehmet Salih Yavuz
96dc6aba33 fix(PropertiesModal): do not show validation errors while loading (#35215)
(cherry picked from commit cb88d886c7)
2026-01-26 12:40:44 -08:00
Rafael Benitez
85eaa90367 feat(themes): Adding SupersetText support to Themes Modal (#35248)
(cherry picked from commit 4b71adaa9c)
2026-01-26 12:40:44 -08:00
Mehmet Salih Yavuz
9ef9b9b827 chore(effect): add eslint plugin to reduce rerenders (#35223)
(cherry picked from commit 5fbda3af40)
2026-01-26 12:40:44 -08:00
Amin Ghadersohi
0f188a96f6 fix: Enable Playwright migration with graceful Selenium fallback (#35063)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit fe7f8062f3)
2026-01-26 12:40:43 -08:00
Damian Pendrak
00e446623f refactor(deckgl): update deck.gl charts to use new api (#34859)
(cherry picked from commit dce74014da)
2026-01-26 12:40:43 -08:00
Alexandru Soare
60975a767a feat(database): Adding per-user caching option in Security tab (#34842)
(cherry picked from commit 5901320933)
2026-01-26 12:40:43 -08:00
Mehmet Salih Yavuz
4baacf5694 chore(matrixify): Remove leftover option (#35195)
(cherry picked from commit 38297edc6b)
2026-01-26 12:40:43 -08:00
Kamil Gabryjelski
dbf99d99f9 chore: Bump ag grid to 34.2.0 (#35193)
(cherry picked from commit a889ae75fc)
2026-01-26 12:40:43 -08:00
Mehmet Salih Yavuz
b09afd03e0 feat(TimeTable): add other sparkline type options (#35180)
(cherry picked from commit b60be9655f)
2026-01-26 12:40:43 -08:00
Joe Li
738b4468c8 fix(tests): migrate Cypress control tests to React Testing Library (#35181)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 127f6b3d66)
2026-01-26 12:40:43 -08:00
Joe Li
8469bf3dc8 feat(playwright): Add Playwright CI Integration for Cypress Migration (SIP-178) (#35110)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 1187902e68)
2026-01-26 12:40:43 -08:00
Maxime Beauchemin
94ee1cc214 feat(matrixify): replace single toggle with separate horizontal/vertical layout controls (#35067)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Mehmet Salih Yavuz <salih.yavuz@proton.me>
(cherry picked from commit ad3eff9e90)
2026-01-26 12:40:43 -08:00
SBIN2010
c2048065ac feat(waterfall): add changes label series and grouping customize settings (#34847)
(cherry picked from commit 3e554674ff)
2026-01-26 12:40:43 -08:00
Amin Ghadersohi
89a36f74ef feat: Add BaseDAO improvements and test reorganization (#35018)
Co-authored-by: bito-code-review[bot] <188872107+bito-code-review[bot]@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit dced2f8564)
2026-01-26 12:40:43 -08:00
Maxime Beauchemin
d35efe3a76 feat: add optional garbage collection after requests (#35061)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit d0cc6f115b)
2026-01-26 12:40:43 -08:00
Hugh A. Miles II
1dc5b5bdb5 feat: Add Dashboard Filter Support for Alert Reports (#32196)
Co-authored-by: Elizabeth Thompson <eschutho@gmail.com>
Co-authored-by: Hugh A Miles II <hugh@Mac.home>
(cherry picked from commit 966e231f94)
2026-01-26 12:40:43 -08:00
Richard Fogaca Nienkotter
5663fb7fa9 feat(custom-tooltip): custom tooltip on deck.gl charts (#34276)
(cherry picked from commit a66737cb05)
2026-01-26 12:40:43 -08:00
Elizabeth Thompson
eaba081497 feat: Add comprehensive dark mode support for chart thumbnails and examples (#35111)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 7d0a472d1e)
2026-01-26 12:40:42 -08:00
Maxime Beauchemin
6888fa1e1b feat: Add ECharts options overrides to theme system (#34876)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit c2534f9155)
2026-01-26 12:40:42 -08:00
Rafael Benitez
faa74d377d fix(DashboardEditor): CSS template selector UI in dashboard properties modal restored (#35106)
(cherry picked from commit dea9068647)
2026-01-26 12:40:42 -08:00
SBIN2010
491377e4c1 feat(BoxPlot): add chart data zoom (#35097)
(cherry picked from commit 454ed1883f)
2026-01-26 12:40:42 -08:00
Devanjan Banerjee
ecaadac531 feat(Timeseries & MixedTimeseries): Force selected timegrain on timeseries intervals when the x-axis is of timestamp type (#34595)
(cherry picked from commit eb4351af83)
2026-01-26 12:40:42 -08:00
Mehmet Salih Yavuz
d6c21acdd8 feat(embedded): Change function signature of setupExtensions (#35062)
Co-authored-by: Michael S. Molina <70410625+michael-s-molina@users.noreply.github.com>
(cherry picked from commit 7a20a65a4d)
2026-01-26 12:40:42 -08:00
Gabriel Torres Ruiz
c335bcb9a0 feat(dataset): create usage tab for dataset (#34707)
(cherry picked from commit 2f64343186)
2026-01-26 12:40:42 -08:00
Amin Ghadersohi
6d4b17fcf1 fix(utils): Suppress pandas date parsing warnings in normalize_dttm_col (#35042)
(cherry picked from commit 15e4e8df94)
2026-01-26 12:40:42 -08:00
Elizabeth Thompson
cf18465e0d fix(utils): ensure webdriver timeout compatibility with urllib3 2.x (#34440)
(cherry picked from commit 385471c34d)
2026-01-26 12:40:42 -08:00
Beto Dealmeida
33363cc8b7 feat: allow create metric and add to folder in single request (#34993)
(cherry picked from commit 4e969d19d1)
2026-01-26 12:40:41 -08:00
Vitor Avila
3ebd40559c feat: Use dashboard name for screenshot download (#34988)
(cherry picked from commit ce74ae095d)
2026-01-26 12:40:41 -08:00
SBIN2010
5c5627c5a2 feat: add sort legend to legend section (#34911)
(cherry picked from commit 9424538bb1)
2026-01-26 12:40:41 -08:00
Maxime Beauchemin
1ea5e5af44 feat: add customizable brand spinners with theme integration (#34764)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Evan Rusackas <evan@preset.io>
(cherry picked from commit b0d3f0f0d4)
2026-01-26 12:40:41 -08:00
Danylo Korostil
2be38e4441 feat(api): dataset read API uuid support (#34836)
(cherry picked from commit 077724c2d2)
2026-01-26 12:40:41 -08:00
SBIN2010
ac8aa6bb03 feat(pie): add sort legend (#34323)
(cherry picked from commit dc7a8844eb)
2026-01-26 12:40:41 -08:00
Vitor Avila
a0956a25f4 fix: Chart execution for Databricks (#34906)
(cherry picked from commit 54f071138c)
2026-01-26 12:40:41 -08:00
Kamil Gabryjelski
ef6f34eaa6 perf: Use react-router to toggle fullscreen mode on dashboard (#34857)
(cherry picked from commit ce3b93d8a0)
2026-01-26 12:40:41 -08:00
Beto Dealmeida
ab1a49fb07 feat(bigquery): show materialized views (#34766)
(cherry picked from commit cb24737825)
2026-01-26 12:40:41 -08:00
Maxime Beauchemin
4bc83507e6 feat: refactor modals to use consistent design patterns (#34711)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit e8e1466185)
2026-01-26 12:40:41 -08:00
JUST.in DO IT
3259836e0b feat(sqllab): introduce splitter for adjusting sidebar and query panel (#34767)
(cherry picked from commit 63bb1d55a4)
2026-01-26 12:40:41 -08:00
Elizabeth Thompson
d31d307d22 chore: catch sqlalchemy error (#34768)
(cherry picked from commit 009b99bfbb)
2026-01-26 12:40:40 -08:00
Maxime Beauchemin
82f4769ea0 feat(validation): Add SQL expression validation in popovers (#34642)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 4683a0827d)
2026-01-26 12:40:40 -08:00
Beto Dealmeida
109fc05151 feat: improve perf of CSV uploads (#34603)
(cherry picked from commit a82e310600)
2026-01-26 12:40:40 -08:00
Maxime Beauchemin
c37a91b5cb feat(matrixify): implement matrix of any charts as core Superset feature (#34526)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit e6c8343fd0)
2026-01-26 12:40:40 -08:00
SBIN2010
36e8211306 feat: conditional formatting improvements in tables (#34330)
(cherry picked from commit 852adaa6cc)
2026-01-26 12:40:40 -08:00
Joe Li
e73229e138 test(dashboard): strengthen fontWeightStrong assertion for markdown bold (#35872)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 2db19008fb)
2026-01-26 12:40:29 -08:00
Enzo Martellucci
3a38eb5483 fix(view-in-sqllab): unable to open virtual dataset after discarding chart edits (#35931)
(cherry picked from commit 392b880b52)
2026-01-26 12:40:29 -08:00
Joe Li
61db201a16 test(useThemeMenuItems): fix race conditions by awaiting all userEvent calls (#35918)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 5224347c39)
2026-01-26 12:40:29 -08:00
Rafael Benitez
1dd37ed8c8 fix: pin remark-gfm to v3.0.1 for compatibility with react-markdown v8 (#36388)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit daec330127)
2026-01-26 12:40:29 -08:00
Joe Li
5796871919 fix(time-range-modal): time range modal for out of scope filter is not displayed correctly (#36996)
Cherry-picked from 54919c9 with adaptation for 6.0 branch:

Accepted:
- FilterControls.tsx: Fix for overflowedByIndex calculation that now considers
  filterBarOrientation - out-of-scope filters in vertical mode are in a Collapse
  panel and should not be marked as overflowed
- DateFilterLabel.test.tsx: New tests for isOverflowingFilterBar prop behavior

Rejected:
- FilterControls.test.tsx: Incompatible with 6.0 - uses ChartCustomizationType,
  ChartCustomizationDivider, and props that don't exist in this branch version

Original commit: 54919c942a

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 13:43:15 -08:00
Jean Massucatto
054040be85 fix(dataset-editor): add missing Data type label in calculated columns tab (#37165)
(cherry picked from commit 04c5517206)
2026-01-23 13:38:06 -08:00
Gabriel Torres Ruiz
c3a7048c10 fix(sqllab): add colorEditorSelection token for visible text selection (#36932) 2026-01-22 11:50:54 -08:00
Ramiro Aquino Romero
6b8409baf0 fix(api): nan is not properly handled for athena connections (#37071)
(cherry picked from commit fadab21493)
2026-01-22 11:07:10 -08:00
Rafael Benitez
0773e25383 fix: pin remark-gfm to v3.0.1 for compatibility with react-markdown v8 (#36388)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit daec330127)
2026-01-21 13:58:59 -08:00
Luis Sánchez
da63984a21 fix(chart): Horizontal bar chart value labels cut off (#36989) 2026-01-21 13:38:00 -08:00
Ramiro Aquino Romero
444f49c6cf fix(delete-filter): deleted native filters are still shown until [sc-96553] (#37012) 2026-01-20 10:58:39 -08:00
Luis Sánchez
9f359f9124 fix(timeseries): x-axis last month was hidden (#37181)
(cherry picked from commit f4597be341)
2026-01-19 11:41:57 -08:00
Jamile Celento
cfa0f03e88 fix(native-filters): enable Apply button when selecting Boolean FALSE value (#37017)
(cherry picked from commit 4393db57d9)
2026-01-19 09:32:10 -08:00
Geidō
682599d7de fix(Dashboard): Auto-apply filters with default values when extraForm… (#36927)
(cherry picked from commit 2900258e05)
2026-01-19 09:31:02 -08:00
Jean Massucatto
b4b900adce fix(calendar-heatmap): correct month display across timezones (#37064)
(cherry picked from commit 2e29e33dd8)
2026-01-19 08:43:26 -08:00
tiya-9975
1a8bea4072 fix(sunburst): make Show Total text theme-aware (#37177)
Co-authored-by: DarshCode123 <darshjain193@gmail.com>
Co-authored-by: SBIN2010 <Sbin2010@mail.ru>
(cherry picked from commit f984dca5cc)
2026-01-19 08:38:44 -08:00
Yousuf Ansari
82e172dd3e fix(mixed-timeseries): prevent duplicate legend entries (#37217)
(cherry picked from commit a77c2d550c)
2026-01-19 08:37:44 -08:00
Brandon Sovran
261944713c fix: Implement SIP-40 error styles for GAQ (#36596)
(cherry picked from commit 0f56e3b9ae)
2026-01-16 16:03:45 -08:00
Pedro Rodrigues
0d7947c7fc feat: add droppable area to tab empty state (#37210)
(cherry picked from commit 4b1d92e575)
2026-01-16 15:48:26 -08:00
Kamil Gabryjelski
bb7e56d8cc fix: HTML detection in tables (#37171)
(cherry picked from commit 54f19856de)
2026-01-16 10:42:52 -08:00
Kamil Gabryjelski
e643a47deb fix: Move head_custom_extra above csrf token input (#37173)
(cherry picked from commit ab8df1ab34)
2026-01-16 10:42:21 -08:00
Mehmet Salih Yavuz
2083622f18 fix(controls): Only initialize categorical control on numeric x axis (#37115)
(cherry picked from commit 6eb4db6930)
2026-01-15 16:55:26 -08:00
Reynold Morel
98c8ffa0df fix(dashboard): revert cell hover and active colors to grayscale (#36991)
(cherry picked from commit 0404c99e39)
2026-01-14 15:38:15 -08:00
Jonathan Alberth Quispe Fuentes
b183f04fa5 fix(table): keep d3-format semantics when applying currency formatting (#37039)
(cherry picked from commit ad3812edd7)
2026-01-13 11:01:33 -08:00
Damian Pendrak
3fcebdb1cb fix(deckgl): remove visibility condition in deckgl stroke color (#37029)
(cherry picked from commit 2a38ce001e)
2026-01-12 14:36:13 -08:00
ankitajhanwar2001
81149348f1 fix(sqlglot): use Athena dialect for awsathena parsing (#36747)
(cherry picked from commit d8f7ae83ee)
2026-01-12 14:36:13 -08:00
Amin Ghadersohi
7566a551ed fix(models): prevent SQLAlchemy and_() deprecation warning (#37020)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit 911d72c957)
2026-01-12 14:36:13 -08:00
Mehmet Salih Yavuz
e5192481c6 fix(reports): Use authenticated user as recipient for chart/dashboard reports (#36981)
(cherry picked from commit 4f5789abfe)
2026-01-12 14:36:13 -08:00
Mehmet Salih Yavuz
aa3b497262 fix(Tabs): prevent infinite rerenders with nested tabs (#37018)
(cherry picked from commit 0294c30c9e)
2026-01-12 14:35:43 -08:00
Levis Mbote
e67e602892 fix: handle undefined template variables safely in query rendering. (#35009)
(cherry picked from commit dfdf8e75d8)
2026-01-07 10:54:23 -08:00
Gabriel Torres Ruiz
fe9202ee0b fix(alerts): wrong alert trigger with custom query (#35871)
(cherry picked from commit 5edaed2e5b)
2026-01-07 10:53:46 -08:00
Evan Rusackas
c4fd5759af fix(security): enforce datasource access control in get_samples() (#36550)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 861e5cd013)
2026-01-07 10:52:24 -08:00
amaannawab923
977ff44851 fix(ag-grid): Ag Grid Date Filter timezone correction (#36270)
(cherry picked from commit d7d94ba640)
2026-01-07 10:51:51 -08:00
Joe Li
d3ba4c7b21 fix(dashboard): prevent table chart infinite reload loop (#36686)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
(cherry picked from commit c026ae2ce7)
2026-01-06 14:37:40 -08:00
Felipe López
16f1bb5b88 fix(SQLLab): remove error icon displayed when writing Jinja SQL even when the script is correct (#36422)
(cherry picked from commit cedc35e39f)
2026-01-06 11:51:55 -08:00
JUST.in DO IT
68c03f501c fix(trino): update query progress using cursor stats (#36872)
(cherry picked from commit 12a266fd2f)
2026-01-06 09:58:58 -08:00
Enzo Martellucci
cdb0317be8 fix(plugin-chart-table): remove column misalignment when no scrollbars are present (#36891)
(cherry picked from commit 740ddc03e2)
2026-01-05 11:59:00 -08:00
innovark
d3eec7772a fix(RightMenu): fix inconsistent icon alignment in RightMenu items (#36532)
(cherry picked from commit d07a452e9b)
2026-01-05 11:57:55 -08:00
innovark
0022644b84 fix(SavedQueries): unify query card actions styling across all home page cards (#36671)
(cherry picked from commit e5489bd30f)
2026-01-05 11:57:26 -08:00
Levis Mbote
7702515c53 fix(logout): clicking logout displays an error notification "invalid username or password" (#36490) 2026-01-05 11:56:26 -08:00
Luis Sánchez
6042099296 fix(TableChart): render cell bars for columns with NULL values (#36819) 2026-01-05 11:50:32 -08:00
Mehmet Salih Yavuz
0503983d59 fix: Clear database form errors (#36854) 2026-01-05 11:37:13 -08:00
Enzo Martellucci
668026eeac fix: SqlLab error when collapsing the left panel preview (#36858)
Co-authored-by: Diego Pucci <diegopucci.me@gmail.com>
2026-01-05 11:24:46 -08:00
Enzo Martellucci
3d644e6918 fix(chart-creation): use exact match when loading dataset from URL parameter (#36831)
(cherry picked from commit fe5d5fdae6)
2026-01-05 08:47:01 -08:00
Levis Mbote
747b4c0125 fix: fix error with dashboard filters when global async queries is enabled and user navigates quickly (#36639) 2026-01-05 08:45:54 -08:00
Mehmet Salih Yavuz
fee1f16bfe fix(TableCollection): only apply highlight class when defined (#36809)
(cherry picked from commit 28c802fb6c)
2025-12-29 13:11:06 -08:00
Enzo Martellucci
3b15ff3d83 fix: UI cut off (#36531)
Co-authored-by: Diego Pucci <diegopucci.me@gmail.com>
(cherry picked from commit 32c98d02d3)
2025-12-29 13:11:05 -08:00
Vitor Avila
9e9e8ce056 fix: Use is_active for guest users (#36716)
(cherry picked from commit 737a5162e4)
2025-12-17 13:35:28 -08:00
Yousuf Ansari
cc428c7a5c fix(echarts): use scroll legend for horizontal layouts to prevent overlap (#36306)
(cherry picked from commit 33a425bbbc)
2025-12-17 12:01:25 -08:00
SBIN2010
8a92092d7e fix: removed dashboard from main page in "All" tab, refreshes dashboard list (#35945) 2025-12-17 12:00:00 -08:00
Evan Rusackas
cffaffd769 fix(dashboard): import with overwrite flag replaces charts instead of merging (#36551)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 52c711b0bc)
2025-12-17 11:20:47 -08:00
Evan Rusackas
c5c72bbad7 fix(sql): handle backtick-quoted identifiers with base dialect (#36545)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit c7a4d4f2cc)
2025-12-16 15:25:27 -08:00
Alexandru Soare
4588d84929 fix(tab): Fix tabs in column not clickable (#36528)
(cherry picked from commit 8b1c41a012)
2025-12-16 15:24:35 -08:00
Evan Rusackas
844c3e1279 fix(api): Fix JWT authentication for /api/v1/me endpoints (#36410)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 1f5df7407f)
2025-12-16 15:22:35 -08:00
Elizabeth Thompson
8e70875d6b fix: add subdirectory deployment support for app icon and reports urls (#35098)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Daniel Gaspar <danielvazgaspar@gmail.com>
(cherry picked from commit b35b1d7633)
2025-12-15 14:17:22 -08:00
Luis Sánchez
03e5001e0e fix(SqlLab): enhance SQL formatting with Jinja template support. (#36277)
(cherry picked from commit e7c060466d)
2025-12-15 10:09:51 -08:00
Risheit Munshi
cbd27802a8 fix(chart): Display better hover text for country map charts (#36323)
Co-authored-by: askinner1 <144823527+askinner1@users.noreply.github.com>
Co-authored-by: codeant-ai-for-open-source[bot] <244253245+codeant-ai-for-open-source[bot]@users.noreply.github.com>
(cherry picked from commit 67cf287c03)
2025-12-15 09:59:53 -08:00
Shunki
df28ce4deb fix(roles): Add missing SQLLab permissions for estimate and format (#36263)
(cherry picked from commit 440cbc4c1f)
2025-12-15 09:17:06 -08:00
Sam Firke
1236a8582e fix(heatmap): y-axis sorts in order (#36302)
Co-authored-by: Evan Rusackas <evan@preset.io>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
(cherry picked from commit 3345eb32c5)
2025-12-08 15:42:23 -08:00
Enzo Martellucci
b1c57c1fc8 fix(Gauge): clearing previously set min and max values in a gauge chart sets the data labels to 0 (#36425)
Co-authored-by: Diego Pucci <diegopucci.me@gmail.com>
(cherry picked from commit 236e000398)
2025-12-08 15:41:30 -08:00
Elizabeth Thompson
66a7a0a690 fix(reports): simplify logging to focus on timing metrics (#36227)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Vitor Avila <vitorfragadeavila@gmail.com>
(cherry picked from commit c36ac53445)
2025-12-08 15:41:30 -08:00
Gabriel Torres Ruiz
3ce1687725 fix(echarts): pass vizType to enable theme overrides in all chart types (#36389)
(cherry picked from commit 1d8d30e5bb)
2025-12-08 15:30:04 -08:00
yousoph
3e42dd8511 fix: button text capitalization (#36444) 2025-12-08 13:48:10 -08:00
Joe Li
6a1c30e5e7 chore: update changelog for 6.0.0rc4 2025-12-04 10:55:36 -08:00
Felipe López
e763c96381 fix(SQLLab): most recent queries at the top in Query History without refreshing the page (#36359)
(cherry picked from commit 62d86aba14)
2025-12-03 10:17:30 -08:00
Beto Dealmeida
0753fd4c45 fix: is_column_reference check (#36382)
(cherry picked from commit d05ab91d11)
2025-12-02 13:15:39 -08:00
om pharate
3a537498f6 feat(controlPanel): add integer validation for rows per page setting (#36289)
(cherry picked from commit 01f032017f)
2025-12-01 14:46:28 -08:00
Daniel Vaz Gaspar
8f061d0c0a fix(log): remove unwanted info from logs REST API (#36269)
(cherry picked from commit bae716fa83)
2025-11-25 16:07:35 -08:00
Daniel Vaz Gaspar
e0e52086cd fix: remove unwanted info from tags REST API (#36266)
(cherry picked from commit cd36845d56)
2025-11-25 08:41:39 -08:00
Enzo Martellucci
2a21ef6dc9 fix: Columns bleeding into other cells (#36134)
Co-authored-by: Diego Pucci <diegopucci.me@gmail.com>
Co-authored-by: Geidō <60598000+geido@users.noreply.github.com>
(cherry picked from commit 062e4a2922)
2025-11-25 08:41:01 -08:00
Enzo Martellucci
72fbaa6677 fix: Table chart types headers are offset from the columns in the table (#36190)
Co-authored-by: Diego Pucci <diegopucci.me@gmail.com>
(cherry picked from commit ab8352ee66)
2025-11-25 08:40:15 -08:00
Enzo Martellucci
6d49d1e182 fix: Extra controls width for Area Chart on dashboards (#36133)
Co-authored-by: Diego Pucci <diegopucci.me@gmail.com>
(cherry picked from commit cac6ffcd3c)
2025-11-25 08:39:46 -08:00
Elizabeth Thompson
5b51c7e89e fix(screenshots): Only cache thumbnails when image generation succeeds (#36126)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 08c1d03479)
2025-11-25 08:38:39 -08:00
Beto Dealmeida
74f455f076 fix: adhoc column quoting (#36215)
(cherry picked from commit e303537e0c)
2025-11-21 13:43:04 -08:00
Daniel Vaz Gaspar
a911a50680 fix(sqllab): validate results backend writes and enhance 410 diagnostics (#36222)
(cherry picked from commit 348b19cb4c)
2025-11-21 11:18:33 -08:00
Enzo Martellucci
5b820699e8 fix(dashboard): adjust vertical spacing for numerical range filter to prevent overlaps (#36167)
(cherry picked from commit 6d359161bb)
2025-11-20 09:25:55 -08:00
Joe Li
c3308f4447 chore: update changelog for 6.0.0rc3 2025-11-19 16:07:14 -08:00
Beto Dealmeida
9cfd35d43a chore: bump duckdb et al. (#36171)
(cherry picked from commit 53207302f9)
2025-11-19 13:55:45 -08:00
Evan Rusackas
785a6d0237 chore(docs): config Kapa to use logo from the repo (#36177)
(cherry picked from commit cdbd5bf4f9)
2025-11-19 13:48:28 -08:00
Richard Fogaca Nienkotter
71be38f003 fix(dashboard): ensure charts re-render when visibility state changes (#36011)
(cherry picked from commit 4582f0e8d2)
2025-11-19 13:47:44 -08:00
Enzo Martellucci
f3db80bfee fix(datasets): prevent viewport overflow in dataset creation page (#36166)
(cherry picked from commit a268232ed6)
2025-11-18 14:23:20 -08:00
SBIN2010
6cc46750b9 fix: role list edit modal height (#36123)
(cherry picked from commit 43e9e1ec36)
2025-11-18 11:00:58 -08:00
Richard Fogaca Nienkotter
c9a7f2d02e fix(cache): apply dashboard filters to non-legacy visualizations (#36109)
(cherry picked from commit 8315804c85)
2025-11-18 11:00:20 -08:00
Richard Fogaca Nienkotter
3c5868c412 fix: 'save and go to dashboard' option was disabled after changing the chart type (#36122)
(cherry picked from commit a9fd600c52)
2025-11-18 10:59:13 -08:00
PolinaFam
4112fecc93 fix(translations): Fix Russian translations for EmptyState (#34055)
Co-authored-by: Polina Fam <pfam@ptsecurity.com>
(cherry picked from commit fb325a8f24)
2025-11-18 10:51:03 -08:00
Yuvraj Singh Chauhan
ea1ab05e8d fix(tags): ensure tag creation is compatible with MySQL by avoiding Markup objects (#36075)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
(cherry picked from commit 28bdec2c79)
2025-11-18 10:49:04 -08:00
Beto Dealmeida
0e3092dd56 fix(datasets): prevent double time filter application in virtual datasets (#35890)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 3b226038ba)
2025-11-18 10:48:18 -08:00
Gabriel Torres Ruiz
91814f3dfe fix(navbar): some styling + components inconsistencies (#36120)
(cherry picked from commit 9bff64824b)
2025-11-17 15:06:20 -08:00
Yong Le He
c9501fddb8 fix(dashboard): ensure world map chart uses correct country code format in crossfilter (#35919)
(cherry picked from commit fb8eb2a5c3)
2025-11-17 11:38:21 -08:00
Levis Mbote
fe58baa23c fix: fix crossfilter persisting after removal (#35998)
(cherry picked from commit 85413f2a65)
2025-11-17 11:35:58 -08:00
SBIN2010
19ebeea030 fix: opacity color formating (#36101) 2025-11-14 15:53:42 -08:00
Joe Li
18ed2290bc fix(table-chart): fix missing table header IDs (#35968)
Co-authored-by: Claude <noreply@anthropic.com>
2025-11-14 15:53:24 -08:00
Richard Fogaca Nienkotter
79ec265a30 fix: save button was enabled even no changes were made to the dashboard (#35817) 2025-11-14 14:24:47 -08:00
Janani Gurram
aab835a096 fix(histogram): add NULL handling for histogram (#35693)
Co-authored-by: Rachel Pan <r.pan@mail.utoronto.ca>
Co-authored-by: Rachel Pan <panrrachel@gmail.com>
Co-authored-by: Janani Gurram <68124448+JG-ctrl@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
(cherry picked from commit c955a5dc08)
2025-11-14 13:58:38 -08:00
Beto Dealmeida
b19372fe16 fix: RLS in virtual datasets (#36061)
(cherry picked from commit f3e620cd0f)
2025-11-14 13:58:26 -08:00
Enzo Martellucci
a083e189e2 fix(ace-editor-popover): main AntD popover closes when clicking autocomplete suggestions in Ace Editor (#35986)
(cherry picked from commit 9ef87e75d5)
2025-11-14 12:51:52 -08:00
Richard Fogaca Nienkotter
0f5918dbd9 fix(chart): align legend with chart grid in List mode for Top/Bottom orientations (#36077)
(cherry picked from commit 37d58a476c)
2025-11-14 12:24:03 -08:00
Richard Fogaca Nienkotter
3a54cade44 fix(dashboard): prevent tab content cutoff and excessive whitespace in empty tabs (#35834)
(cherry picked from commit 78f9debdd4)
2025-11-14 12:13:55 -08:00
Mehmet Salih Yavuz
cbdbc2c295 fix(dashboard): refresh tabs as they load when dashboard is refreshed (#35265)
(cherry picked from commit 74a590cb76)
2025-11-14 12:12:17 -08:00
Richard Fogaca Nienkotter
548480bd8e fix(explore): re-apply filters when 'Group remaining as Others' is enabled (#35937)
(cherry picked from commit 4a04d46118)
2025-11-13 22:12:28 -08:00
Vitor Avila
6179eb9ef4 fix: Use singlestoredb dialect for sqlglot (#36096)
(cherry picked from commit 6701d0ae0c)
2025-11-13 22:10:06 -08:00
Gabriel Torres Ruiz
15c4ee63b2 fix(navbar): Minor fixes in navbar spacings (#36091)
(cherry picked from commit 4515d18ddd)
2025-11-13 22:09:32 -08:00
Mehmet Salih Yavuz
89a36ea131 fix(sql): quote column names with spaces to prevent SQLGlot parsing errors (#35553)
(cherry picked from commit 306f4c14cf)
2025-11-13 22:08:42 -08:00
Levis Mbote
2d0017033c fix: fix tabs overflow in dashboards (#35984)
(cherry picked from commit bb2e2a5ed6)
2025-11-13 21:21:11 -08:00
Richard Fogaca Nienkotter
1a4ae81058 fix(dashboard): dashboard filter was incorrectly showing as out of scope (#35886)
Co-authored-by: Mehmet Salih Yavuz <salih.yavuz@proton.me>
(cherry picked from commit a45c0528da)
2025-11-13 19:41:20 -08:00
Richard Fogaca Nienkotter
c9d8baf9a1 fix(dashboard): align filter bar elements vertically in horizontal mode (#36036)
(cherry picked from commit d123249bd2)
2025-11-12 10:53:18 -08:00
Richard Fogaca Nienkotter
a2fcb64ef3 fix(sqllab): prevent unwanted tab switching when autocompleting table names on SQL Lab (#35992)
(cherry picked from commit 9fbfcf0ccd)
2025-11-12 10:42:01 -08:00
Richard Fogaca Nienkotter
8a84b17270 fix: saved query preview modal not highlighting active rows (#35866)
(cherry picked from commit 4376476ec4)
2025-11-12 10:41:06 -08:00
Mehmet Salih Yavuz
992cb83088 fix(permalink): exclude edit mode from dashboard permalink (#35889)
(cherry picked from commit e2e831e322)
2025-11-12 10:40:15 -08:00
Joe Li
8c43578b70 fix(explore): show validation errors in View Query modal (#35969)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 21d585d586)
2025-11-11 17:19:26 -08:00
Kamil Gabryjelski
933ec0a918 fix: Flakiness around scrolling during taking tiled screenshots with Playwright (#36051)
(cherry picked from commit 63dfd95aa2)
2025-11-10 11:56:32 -08:00
Mehmet Salih Yavuz
70117eb55f fix(date_parser): add check for time range timeshifts (#36039)
(cherry picked from commit c9f65cf1c2)
2025-11-10 10:08:45 -08:00
Elizabeth Thompson
8c22e61ef1 fix(reports): improve error handling for report schedule execution (#35800)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit c42e3c6837)
2025-11-10 10:08:39 -08:00
Elizabeth Thompson
bed186b32f fix(filters): preserve backend metric-based sorting (#35152)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 909bd877c9)
2025-11-07 12:06:02 -08:00
Vedant Prajapati
a52cfef8b1 fix(echarts): Series style hidden for line charts (#33677)
Co-authored-by: Vedant Prajapati <vedantprajapati@geotab.com>
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 258512fef2)
2025-11-07 12:04:11 -08:00
Kamil Gabryjelski
3b7a52d1eb fix: Ensure that Playwright tile height is always positive (#36027)
(cherry picked from commit 728bc2c632)
2025-11-07 12:03:10 -08:00
amaannawab923
d8c8430ed7 fix(Context-Menu): Fixing Context Menu for Table Chart with Html Content (#33791)
(cherry picked from commit 0307c71945)
2025-11-07 12:02:20 -08:00
Gabriel Torres Ruiz
bc3f146eaf fix(UI): spacings + UI fixes (#36010)
(cherry picked from commit c11be72ead)
2025-11-07 11:18:29 -08:00
Mehmet Salih Yavuz
1245a1e26a fix(SelectFilterPlugin): clear all clears all filters including dependent ones (#35303)
(cherry picked from commit af37e12de4)
2025-11-06 19:42:21 -08:00
Enzo Martellucci
446136b46c fix(view-in-sqllab): unable to open virtual dataset after discarding chart edits (#35931)
(cherry picked from commit 392b880b52)
2025-11-06 18:05:12 -08:00
ethan-l-geotab
33e53143e6 fix(chart list): Facepile shows correct users when saving chart properties (#33392)
(cherry picked from commit 14f20e644e)
2025-11-06 17:23:56 -08:00
Enzo Martellucci
706a04be7f fix(DatabaseModal): prevent errors when pasting text into supported database select (#35916)
(cherry picked from commit 1f960d5761)
2025-11-06 17:23:23 -08:00
Mehmet Salih Yavuz
2c86d1ae9c fix(explore): Overwriting a chart updates the form_data_key (#35888)
(cherry picked from commit 3f49938b79)
2025-11-06 16:04:45 -08:00
Mehmet Salih Yavuz
8bc1f98033 fix(TimeTable): Match calculations between filtered and non filtered states (#35619)
(cherry picked from commit 04231c86db)
2025-11-06 16:00:21 -08:00
Rafael Benitez
f7ebdd71e7 fix(dashboard): fix dataset search in filter config modal (#35488)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 53687ae659)
2025-11-06 14:23:45 -08:00
Mehmet Salih Yavuz
c48b5ad65e fix(DatasourceEditor): preserve calculated column order when editing sql (#35790)
(cherry picked from commit 7265567561)
2025-11-04 11:59:56 -08:00
Joe Li
8e4efe2cc2 test(useThemeMenuItems): fix race conditions by awaiting all userEvent calls (#35918)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 5224347c39)
2025-11-03 10:42:29 -08:00
Richard Fogaca Nienkotter
e818d0b11f fix(sqllab): align refresh buttons with select input fields (#35917)
(cherry picked from commit 27011d0239)
2025-11-03 10:42:03 -08:00
Joe Li
e0a4b98351 fix(explore): formatting the SQL in "View Query" pop-up doesn't format (#35898)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit be3690c22b)
2025-11-03 10:41:36 -08:00
Yuvraj Singh Chauhan
131359c78f fix(db2): update time grain expressions for DAY to use DATE function (#35848)
(cherry picked from commit 30d584afd1)
2025-10-31 09:52:37 -07:00
Ville Brofeldt
6267856b0d fix: set pandas 2.1 as requirement (#35912)
(cherry picked from commit f6f15f58ee)
2025-10-31 09:48:04 -07:00
Beto Dealmeida
ce21b04621 chore: bump shillelagh to 1.4.3 (#35895)
(cherry picked from commit 5fc934d859)
2025-10-30 12:30:15 -07:00
SBIN2010
1fdb3210f9 fix: displaying cell bars in table (#35885)
(cherry picked from commit dd857a2c7a)
2025-10-30 11:55:11 -07:00
Amin Ghadersohi
e21cb9a6d9 fix: add utc=True to pd.to_datetime for timezone-aware datetimes (#35587)
(cherry picked from commit 5c57c9c0b2)
2025-10-29 10:52:38 -07:00
Elizabeth Thompson
3f6f53569f fix(reports): Add celery task execution ID to email notification logs (#35807)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 61c68f7b8f)
2025-10-29 10:51:43 -07:00
Mehmet Salih Yavuz
87f36d2b2f fix(echarts): fix time shift color matching functionality (#35826)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 5218b4eea2)
2025-10-29 10:51:06 -07:00
innovark
36c14f81f3 fix: update Russian translations (#35750)
(cherry picked from commit 61758c07d2)
2025-10-28 13:34:26 -07:00
Joe Li
e5ee7a0a15 fix(theme): add fontWeightStrong to allowedAntdTokens to fix bold markdown rendering (#35821)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit bf830b2dd5)
2025-10-28 13:33:41 -07:00
Martyn Gigg
78a53484fc fix(sqllab): Fix CSV export button href in SQL Lab when application root is defined (#35118)
(cherry picked from commit 6704c0aaec)
2025-10-28 12:55:36 -07:00
Mehmet Salih Yavuz
5ecd067ed3 fix(SqlLab): South pane visual changes (#35601)
(cherry picked from commit 6e60a00d69)
2025-10-28 11:39:24 -07:00
ngokturkkarli
78983a6f25 fix(native-filters): prevent circular dependencies and improve dependency handling (#35317)
(cherry picked from commit 0bf34d4d6f)
2025-10-28 10:49:54 -07:00
Levis Mbote
4d996cec5e fix(database-modal): fix issue where commas could not be typed into DB configuration. (#35289)
(cherry picked from commit 19473af401)
2025-10-28 10:48:34 -07:00
Daniel Vaz Gaspar
41ac8d8d9c fix: unpin holidays and prophet (#35771)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 51aad52e6c)
2025-10-28 10:47:02 -07:00
Elizabeth Thompson
d1feafb400 fix(dashboard): handle invalid thumbnail BytesIO objects gracefully (#35808)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 7c9720e22b)
2025-10-28 10:45:05 -07:00
Marcos Amorim
877997ceda fix(alerts): improve Slack API rate limiting for large workspaces (#35622)
(cherry picked from commit c3b8c96db6)
2025-10-28 10:44:07 -07:00
Joe Li
26177314db docs(db_engine_specs): restructure feature table for GitHub rendering (#35809)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 93cb60b24e)
2025-10-28 10:42:28 -07:00
Gabriel Torres Ruiz
a3aef76427 fix(ag-grid): fix conditional formatting theme colors and module extensibility (#35605)
(cherry picked from commit 5e4a80e5d0)
2025-10-23 16:26:54 -07:00
Richard Fogaca Nienkotter
fc222eefb7 fix: edit dataset modal visual fixes (#35799)
(cherry picked from commit 1234533c67)
2025-10-23 11:01:48 -07:00
Mehmet Salih Yavuz
36bacf2ae4 fix(ThemeController): replace fetch with SupersetClient for proper auth (#35794)
(cherry picked from commit 7f0c0aea94)
2025-10-22 11:47:27 -07:00
Mehmet Salih Yavuz
bda2d8c145 fix(security): Add active property to guest user (#35454)
(cherry picked from commit 98fba1eefe)
2025-10-22 11:45:44 -07:00
Geidō
a30b212a37 fix(Actions): Improper spacing (#35724)
(cherry picked from commit bad03b1e76)
2025-10-21 14:32:26 -07:00
Erkka Tahvanainen
b07011872b fix(playwright): Download dashboard correctly (#35484)
Co-authored-by: Erkka Tahvanainen <erkka.tahvanainen@confidently.fi>
(cherry picked from commit d089a96163)
2025-10-20 15:52:31 -07:00
yousoph
23b02963b6 fix(charts): update axis title labels to sentence case (#35694)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 9ab0a0179d)
2025-10-17 13:29:02 -07:00
Sam Firke
80fce9a662 fix(auth): redirect anonymous attempts to view dashboard with next (#35345) 2025-10-17 12:53:08 -07:00
Beto Dealmeida
3bfd4efa21 fix(dataset): render default URL description properly in settings (#35669)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit f405174fcf)
2025-10-16 16:50:46 -07:00
Gabriel Torres Ruiz
151633a1fd fix(theme-crud): enable overwrite confirmation UI for theme imports (#35558)
(cherry picked from commit de1dd53186)
2025-10-15 18:23:00 -07:00
Gabriel Torres Ruiz
fe7823cc10 fix(table-chart): fix page size label visibility and improve header control wrapping (#35648)
(cherry picked from commit 58672dfab6)
2025-10-15 18:22:44 -07:00
Rafael Benitez
f7a64f05c5 fix(theme): align "Clear local theme" option with other theme menu items (#35651)
(cherry picked from commit 4b5629d1c8)
2025-10-15 18:22:30 -07:00
Elizabeth Thompson
35861f7ec0 fix: Log Celery task failures with a signal handler (#35595)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit ccc0e3dbb2)
2025-10-15 16:06:57 -07:00
innovark
7abe5c379e fix(d3-format): call setupFormatters synchronously to apply D3 format… (#35529)
(cherry picked from commit c38ba1daa8)
2025-10-14 14:22:24 -07:00
Damian Pendrak
36f23a003f fix(deckgl): scatterplot fix categorical color (#35537) 2025-10-14 14:19:36 -07:00
Luiz Otavio
412d9c8cbc fix(csv upload): Correctly casting to string numbers with floating points (e+) (#35586)
(cherry picked from commit 17ebbdd966)
2025-10-10 14:32:26 -07:00
Elizabeth Thompson
c799f5cedd fix(alerts): log execution_id instead of report schedule name in query timing (#35592)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit e437ae1f2f)
2025-10-10 12:30:56 -07:00
Mehmet Salih Yavuz
1d6d12cfb4 fix(tables): Dark mode scrollbar styles for webkit (#35338)
(cherry picked from commit 412587ad41)
2025-10-10 12:26:03 -07:00
Mehmet Salih Yavuz
b41ad89474 fix(Alerts): Correct icon sizes (#35572)
(cherry picked from commit 5a15c632ad)
2025-10-09 09:38:41 -07:00
Daniel Vaz Gaspar
52993e68e1 fix: dataset update with invalid SQL query (#35543)
(cherry picked from commit 50a5854b25)
2025-10-08 17:13:41 -07:00
Gabriel Torres Ruiz
2a474e017a fix(charts): fix legend theming and hollow symbols in dark mode (#35123)
(cherry picked from commit 7fd5a7668b)
2025-10-08 15:08:16 -07:00
Rafael Benitez
8d4a1cfc05 fix(chart): Fixes BigNumber gradient appearing blackish in light mode (#35527)
(cherry picked from commit f7b9d7a64b)
2025-10-07 10:56:17 -07:00
Mehmet Salih Yavuz
6c82d480a7 fix(explore): Include chart canvases in the screenshot (#35491)
(cherry picked from commit 89932fa0b2)
2025-10-07 10:55:47 -07:00
Daniel Vaz Gaspar
f6b050d270 fix: update chart with dashboards validation (#35523)
(cherry picked from commit 9d50f1b8a2)
2025-10-07 10:35:43 -07:00
Amin Ghadersohi
22c8551d64 fix(webdriver): add missing options object to WebDriver initialization (#35504)
(cherry picked from commit 77c3146829)
2025-10-06 13:43:08 -07:00
Vitor Avila
37e280f5bd fix: Support metric macro for embedded users (#35508)
Co-authored-by: Beto Dealmeida <roberto@dealmeida.net>
(cherry picked from commit 4545d55d30)
2025-10-06 13:42:40 -07:00
Rafael Benitez
bc1fda5a4a fix(explore): correct search icon in dashboard submenu (#35489)
(cherry picked from commit a7b158c7fa)
2025-10-06 13:42:07 -07:00
Mehmet Salih Yavuz
0a6b3de884 fix(Select): Prevent closing the select when clicking on a tag (#35487)
(cherry picked from commit d39c55e941)
2025-10-06 13:39:57 -07:00
Elizabeth Thompson
012765cd0b fix(loading): improve loading screen theming for dark mode support (#35129)
Co-authored-by: Claude <noreply@anthropic.com>
2025-10-06 11:44:32 -07:00
Tran Ngoc Tuan
b633bc5577 fix(security-manager): switch from deprecated get_session to session attribute (#35290)
(cherry picked from commit 04b1a45416)
2025-10-03 16:33:53 -07:00
Beto Dealmeida
d5fa2d86f0 fix(sqlglot): adhoc expressions (#35482)
(cherry picked from commit 139b5ae20c)
2025-10-03 11:28:20 -07:00
Mehmet Salih Yavuz
8dbbbbf136 fix(dashboard): Navigate to new dashboard when saved as a new one (#35339)
(cherry picked from commit 891f826143)
2025-10-03 11:27:41 -07:00
Mehmet Salih Yavuz
e61a0dd619 fix(theming): CRUD view padding (#35321)
(cherry picked from commit 0e2fb1d1a3)
2025-10-03 11:26:00 -07:00
amaannawab923
24a84a23f2 fix(ag-grid-table): remove enterprise features to use community version (#35453)
(cherry picked from commit 96170e43c0)
2025-10-03 11:25:32 -07:00
Beto Dealmeida
e4cbc5db4c fix(cache): ensure SQL is sanitized before cache key generation (#35419)
(cherry picked from commit 62dc5c0306)
2025-10-02 10:59:44 -07:00
Beto Dealmeida
e0e8d1d177 fix(pinot): more functions (#35451)
(cherry picked from commit 3202ff4b3f)
2025-10-02 10:57:56 -07:00
Gabriel Torres Ruiz
b47dc64cd5 fix(dashboard): exit markdown edit mode when clicking outside of element (#35336)
(cherry picked from commit 553204e613)
2025-10-02 10:57:35 -07:00
Rafael Benitez
61bf39f0d5 fix(dataset): sort by database in Dataset and Saved queries Issue (#35277)
(cherry picked from commit fe8348c03a)
2025-10-02 10:57:19 -07:00
Beto Dealmeida
efbfcd737d fix(pinot): SUBSTR function (#35427)
(cherry picked from commit 30021f8ede)
2025-10-02 10:57:00 -07:00
Beto Dealmeida
4c60bd1392 fix(pinot): DATE_SUB function (#35426)
(cherry picked from commit f3349388d0)
2025-10-02 10:56:46 -07:00
Antonio Rivero
6420d06fc0 fix(slice): Fix using isdigit when id passed as int (#35452)
(cherry picked from commit 449a89c214)
2025-10-02 10:56:23 -07:00
Beto Dealmeida
51396f0b94 fix(pinot): DATE_ADD function (#35424)
(cherry picked from commit 5428376662)
2025-10-02 10:56:08 -07:00
Beto Dealmeida
6bb13ef3b4 fix(pinot): dialect date truncation (#35420)
Co-authored-by: bito-code-review[bot] <188872107+bito-code-review[bot]@users.noreply.github.com>
(cherry picked from commit aa97d2fe03)
2025-10-01 13:15:17 -07:00
Beto Dealmeida
b842eeb893 fix: table quoting in DBs with supports_cross_catalog_queries=True (#35350)
(cherry picked from commit 13a164dd63)
2025-10-01 13:14:35 -07:00
Rafael Benitez
50e2a06306 fix(explore): close unsaved changes modal when discarding changes (#35307)
(cherry picked from commit d8688cf8b1)
2025-10-01 13:14:08 -07:00
Geidō
e80f44716c fix(SqlLab): Hit tableschemaview with a valid queryEditorId (#35341)
(cherry picked from commit a66c230058)
2025-10-01 13:13:29 -07:00
Beto Dealmeida
94d10af733 fix(pinot): restrict types in dialect (#35337)
(cherry picked from commit bf88d9bb1c)
2025-09-30 13:52:42 -07:00
Beto Dealmeida
8d49999af6 fix: adhoc orderby in explore (#35342)
(cherry picked from commit d51b35f61b)
2025-09-30 13:52:30 -07:00
Beto Dealmeida
927c94306e feat: sqlglot dialect for Pinot (#35333)
(cherry picked from commit 4e093a8e2a)
2025-09-30 10:55:26 -07:00
Mehmet Salih Yavuz
5074ee0af8 fix(doris): Don't set supports_cross_catalog_queries to true (#35332)
Co-authored-by: Beto Dealmeida <roberto@dealmeida.net>
(cherry picked from commit ef78d2af06)
2025-09-30 10:12:35 -07:00
Geidō
7ba76a85f4 fix: AceEditor Autocomplete Highlight (#35316)
(cherry picked from commit 90f281f585)
2025-09-29 16:14:53 -07:00
Elizabeth Thompson
d9646dedd9 fix(DatasourceModal): replace imperative modal updates with declarative state (#35256)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 82e2bc6181)
2025-09-29 14:17:28 -07:00
Gabriel Torres Ruiz
ac582322b8 fix(sqllab): fix blank bottom section in SQL Lab left panel (#35309)
(cherry picked from commit 784ff82847)
2025-09-29 09:45:29 -07:00
Mehmet Salih Yavuz
d2d99d4698 fix(DateFilterControl): remove modal overlay style to fix z-index issues (#35292)
(cherry picked from commit 027b25e6b8)
2025-09-29 09:42:26 -07:00
SBIN2010
76d13176a1 fix(table): New ad-hoc columns retain the name of previous columns (#35274)
(cherry picked from commit b652fab042)
2025-09-29 09:42:01 -07:00
Geidō
f6209e1ca9 fix: Cosmetic issues (#35122) 2025-09-25 16:34:27 -07:00
Mehmet Salih Yavuz
97649d7290 fix(BuilderComponentPane): navigation tabs padding (#35213)
(cherry picked from commit 7a9dbfe879)
2025-09-25 10:38:10 -07:00
Giulio Piccolo
df0f6f6ec3 fix(deck.gl): ensure min/max values are included in polygon map legend breakpoints (#35033)
Co-authored-by: bito-code-review[bot] <188872107+bito-code-review[bot]@users.noreply.github.com>
(cherry picked from commit 0de78d8203)
2025-09-25 10:38:00 -07:00
Beto Dealmeida
0a89b306e5 fix(SQL Lab): syncTable on new tabs (#35216)
(cherry picked from commit 94686ddfbe)
2025-09-24 14:10:52 -07:00
SBIN2010
7263133c52 fix(Mixed Chart): Tooltip incorrectly displays numbers with optional Y-axis format and showQueryIdentifiers set to true (#35224)
(cherry picked from commit ec322dfd8d)
2025-09-24 14:10:37 -07:00
Elizabeth Thompson
a4e3d21176 fix(dashboard): update header border to use colorBorder token (#35199)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit b6f6b75348)
2025-09-24 13:44:06 -07:00
Mehmet Salih Yavuz
485ff97b0f fix(ConditionalFormattingControl): icon color in dark mode (#35243)
(cherry picked from commit c601341520)
2025-09-23 12:01:22 -07:00
Levis Mbote
1621c70b68 fix(table-chart): fix cell bar visibility in dark theme (#35211)
(cherry picked from commit ce55cc7dd7)
2025-09-23 12:00:51 -07:00
Gabriel Torres Ruiz
13b7bbe9a4 feat(bug): defensive code to avoid accesing attribute of a NoneType object (#35219)
(cherry picked from commit 48e1b1ff2c)
2025-09-23 12:00:17 -07:00
Joe Li
886f525545 chore: Adds RC2 data to CHANGELOG.md 2025-09-22 12:30:01 -07:00
Beto Dealmeida
b76a0e1d2d chore: bump sqlglot to 27.15.2 (#35176)
(cherry picked from commit 5ec8f9d886)
2025-09-22 10:23:01 -07:00
Mehmet Salih Yavuz
542efcdb11 fix(SQLPopover): Use correct component (#35212)
(cherry picked from commit 076e477fd4)
2025-09-22 10:22:49 -07:00
SBIN2010
0ac7464649 fix: bug in tooltip timeseries chart in calculated total with annotation layer (#35179)
(cherry picked from commit 1e4bc6ee78)
2025-09-21 18:30:22 -07:00
Pat Buxton
e5bb8bf0ff fix: Bump pandas to 2.1.4 for python 3.12 (#34999)
(cherry picked from commit db178cf527)
2025-09-21 18:30:12 -07:00
SBIN2010
8306b66515 fix(Funnel): onInit overridden row_limit to default value on save chart (#35076)
(cherry picked from commit 23bb4f88c0)
2025-09-21 18:29:59 -07:00
Levis Mbote
9a0dc23755 fix(gantt-chart): fix Y-axis label visibility in dark theme (#35189)
(cherry picked from commit 4130b92966)
2025-09-21 18:29:28 -07:00
marun
5561f529f2 fix(CrudThemeProvider): Optimized theme loading logic (#35155)
(cherry picked from commit 1bf112a57a)
2025-09-21 18:29:03 -07:00
marun
b0ceb2a162 fix(embedded): resolve theme context error in Loading component (#35168)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 1f530d45cb)
2025-09-21 18:28:36 -07:00
Maxime Beauchemin
7fde43b476 fix(viz): resolve dark mode compatibility issues in BigNumber and Heatmap (#35151)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 05c6a1bf20)
2025-09-16 13:49:36 -07:00
SBIN2010
99519cd4ce fix: import bug template params (#35144)
(cherry picked from commit c193d6d6a1)
2025-09-16 13:49:05 -07:00
Joe Li
9525742b56 fix(deck.gl): restore legend display for Polygon charts with linear palette and fixed color schemes (#35142)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit fb840b8e71)
2025-09-16 13:48:25 -07:00
Elizabeth Thompson
ad7acecbf2 fix: Remove emotion-rgba from dependencies and codebase (#35124)
(cherry picked from commit 19ddcb7e5c)
2025-09-15 12:00:14 -07:00
Gabriel Torres Ruiz
a423f8ecda fix(ListView): implement AntD pagination for ListView component (#35057)
(cherry picked from commit 36daa2dc3f)
2025-09-12 18:56:26 -07:00
Mehmet Salih Yavuz
1265b3d3e5 fix(theming): Lighter text colors on dark mode (#35114)
(cherry picked from commit 95333e34b1)
2025-09-12 17:09:19 -07:00
Daniel Vaz Gaspar
b2fd9e2fb1 fix: Bump FAB to 5.X (#33055)
Co-authored-by: Joe Li <joe@preset.io>
(cherry picked from commit a9fb853e3e)
2025-09-12 17:07:53 -07:00
Michael S. Molina
f3163e1c27 fix: SQL Lab tab events (#35105)
(cherry picked from commit e729b2dbb4)
2025-09-12 16:18:10 -07:00
SBIN2010
8c1fdcb179 fix: page size options 'all' correct in table and remove PAGE_SIZE_OPTIONS in handlebars (#35095)
(cherry picked from commit 06261f262b)
2025-09-12 15:43:06 -07:00
Priyanshu Kumar
eb2b4bfc30 fix(pie): fixes pie chart other click error (#35086)
(cherry picked from commit b42060c880)
2025-09-12 15:42:54 -07:00
Gabriel Torres Ruiz
5baee67df7 fix(theming): replace error color with bolt icon for local themes (#35090)
(cherry picked from commit 7bf16d805d)
2025-09-12 15:42:44 -07:00
Rafael Benitez
e8562bc641 fix(templates): Restores templates files accidentally removed (#35094)
(cherry picked from commit 529adebe1b)
2025-09-12 15:41:52 -07:00
Rafael Benitez
dedc10065e fix(settingsMenu): Version (#35096)
(cherry picked from commit 5a2411fa64)
2025-09-12 15:40:53 -07:00
LisaHusband
4dedfac238 fix(drill-to-detail): ensure axis label filters map to original column names (#34694)
Co-authored-by: bito-code-review[bot] <188872107+bito-code-review[bot]@users.noreply.github.com>
(cherry picked from commit a7d349a5c6)
2025-09-10 10:05:24 -07:00
Mehmet Salih Yavuz
2c870e8528 fix(timeshifts): Add missing feature flag to enum (#35072)
(cherry picked from commit 912ed2ba80)
2025-09-10 10:04:45 -07:00
Nicolas
baee1ab82b fix(Table Chart): render null dates properly (#34558)
(cherry picked from commit 65376c7baf)
2025-09-10 10:04:05 -07:00
SBIN2010
a8cf0981fa fix(table): table search input placeholder (#35064)
(cherry picked from commit c5f220a9ff)
2025-09-09 10:08:09 -07:00
catpineapple
8768a3f55a fix(tests): one of integration test in TestSqlaTableModel does not support MySQL "concat" (#35007)
Co-authored-by: Mehmet Salih Yavuz <salih.yavuz@proton.me>
(cherry picked from commit 9efb80dbf4)
2025-09-08 14:12:21 -07:00
Luiz Otavio
cf1902a4cc fix: Upload CSV as Dataset (#34763)
(cherry picked from commit 1c2b9db4f0)
2025-09-08 14:12:10 -07:00
Gabriel Torres Ruiz
d94c92db01 fix(dashboard): normalize spacings and background colors (#35001)
(cherry picked from commit 0fce5ecfa5)
2025-09-08 12:01:18 -07:00
Rafael Benitez
acec8743c0 fix(theming): Icons in ExecutionLogList and Country map chart tooltip theme consistency (#34828)
(cherry picked from commit bef1f4d045)
2025-09-08 12:01:06 -07:00
SBIN2010
9918670315 fix: mixed timeseries chart add legend margin (#35036)
(cherry picked from commit 5a3182ce21)
2025-09-08 11:55:31 -07:00
Damian Pendrak
997e000f6b fix(chart): change "No query." to "Query cannot be loaded" in Multi Layer Deck.gl Chart (#34973)
(cherry picked from commit c65cb284e6)
2025-09-05 11:17:17 -07:00
JUST.in DO IT
428c97a1d6 fix(echarts): rename time series shifted for isTimeComparisonValue (#35022)
(cherry picked from commit bc54b7970a)
2025-09-05 11:15:50 -07:00
SBIN2010
7996359719 fix: display legend mixed timeseries chart (#35005)
(cherry picked from commit 031fb4b5a8)
2025-09-05 11:04:15 -07:00
Evan Rusackas
444b98b95e fix(sql): Add Impala dialect support to sqlglot parser (#34662)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Joe Li <joe@preset.io>
(cherry picked from commit 7fb7ac8bef)
2025-09-04 16:25:30 -07:00
Mehmet Salih Yavuz
b51eda51ce fix(theming): more visual bugs (#34987)
(cherry picked from commit 569a7b33a5)
2025-09-04 16:25:10 -07:00
Mehmet Salih Yavuz
8a3dcadf87 fix(RoleListEditModal): display user's other properties in table (#35017)
(cherry picked from commit 59df0d6f15)
2025-09-04 16:22:36 -07:00
catpineapple
07fd60fe20 fix: doris genericDataType modify (#35011)
(cherry picked from commit 2e51d02806)
2025-09-04 16:20:40 -07:00
sha174n
06ada5472e fix(deps): expand pyarrow version range to <19 (#34870)
(cherry picked from commit 8406a827dd)
2025-09-03 22:39:53 -07:00
Joe Li
22826ba876 fix(tests): resolve AlertReportModal checkmark test failures (#34995) 2025-09-03 22:29:11 -07:00
JUST.in DO IT
dbe0845dc0 fix(ui-core): Invalid postTransform process (#34874)
(cherry picked from commit 448a28545b)
2025-09-03 18:12:41 -07:00
JUST.in DO IT
0c045127e4 fix(sqllab): autocomplete and delete tabs (#34781)
(cherry picked from commit cefd046ea0)
2025-09-03 18:09:12 -07:00
Gabriel Torres Ruiz
f69bdf5475 fix(error-handling): jinja2 error handling improvements (#34803) 2025-09-03 17:52:08 -07:00
Vitor Avila
d5a523db25 fix(databricks): string escaper v2 (#34991)
(cherry picked from commit 0de5b28716)
2025-09-03 11:40:44 -07:00
Evan Rusackas
38b456bc8a fix(charts): Handle virtual dataset names without schema prefix correctly (#34760)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit b5ae402c12)
2025-09-02 13:41:41 -07:00
Evan Rusackas
e1efc87fdc fix(echarts): Display NULL values in categorical x-axis for bar charts (#34761)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 682cdcc3e0)
2025-09-02 13:41:09 -07:00
Mehmet Salih Yavuz
e84bdfaa6d fix(ChartCreation): Translate chart description (#34918)
(cherry picked from commit 5dba59b6a4)
2025-09-02 13:40:35 -07:00
Daniel Vaz Gaspar
930038d763 chore: bump FAB to 4.8.1 (#34838)
(cherry picked from commit 54af1cb2c8)
2025-09-02 13:37:46 -07:00
Daniel Vaz Gaspar
d30cd5dc2a fix: playwright feature flag evaluation (#34978)
(cherry picked from commit b2f8803486)
2025-09-02 11:23:27 -07:00
Gabriel Torres Ruiz
714a03e007 fix(TimeTable): use type-only export for TableChartProps to resolve webpack warnings (#34989)
(cherry picked from commit 744fa1f54c)
2025-09-02 11:22:43 -07:00
Gabriel Torres Ruiz
026e016720 fix(dashboard): table charts render correctly after tab switch and refresh (#34975)
(cherry picked from commit 6a4b1df3a2)
2025-09-02 11:22:01 -07:00
Beto Dealmeida
5442521e18 fix: Athena quoting (#34895)
(cherry picked from commit fad3cb3162)
2025-09-02 10:11:58 -07:00
Maxime Beauchemin
b8426b92c7 fix: revert mistake setting TALISMAN_ENABLED=False (#34909)
(cherry picked from commit bc9ec6ac63)
2025-09-02 10:10:03 -07:00
Gabriel Torres Ruiz
2f086475f8 fix(theming): fix TimeTable chart issues (#34868)
(cherry picked from commit d183969744)
2025-09-02 10:03:36 -07:00
Maxime Beauchemin
1c95ea5ab8 fix: complete theme management system import/export (#34850)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 4695be5cc5)
2025-09-02 10:03:08 -07:00
Kamil Gabryjelski
a3a2c494cc fix: Improve table layout and column sizing (#34887)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 175835138c)
2025-09-02 10:02:35 -07:00
Sam Firke
d6cc324798 fix(drilling): drill by pagination works with MSSQL data source, cont. (#34724)
(cherry picked from commit c5a84c0985)
2025-09-02 10:00:40 -07:00
Kamil Gabryjelski
5756d25a7c fix: Filter bar orientation submenu should not be highlighted (#34900)
(cherry picked from commit e463743fcf)
2025-08-29 10:28:36 -07:00
Joe Li
b16d6ed224 fix(ConfirmStatusChange): remove deprecated event.persist() to fix headless browser crashes (#34864)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit ebfb14c353)
2025-08-28 09:52:25 -07:00
Joe Li
18e8b064de fix(tests): Improve MessageChannel mocking to prevent worker force exits (#34878)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 7946ec003f)
2025-08-28 09:52:03 -07:00
Kamil Gabryjelski
0c0dfc0601 fix: SelectControl default sort numeric choices by value (#34858)
(cherry picked from commit 665a11f821)
2025-08-28 09:51:15 -07:00
Kamil Gabryjelski
c80b8fea85 fix: Undefined error when viewing query in Explore + visual fixes (#34869)
(cherry picked from commit 5566eb8dd6)
2025-08-28 09:50:37 -07:00
Joe Li
160a8fe16c fix(tests): Mock MessageChannel to prevent Jest hanging from rc-overflow (#34871)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 836540e8c9)
2025-08-27 23:19:01 -07:00
Kamil Gabryjelski
fc80861f47 fix: Remove the underline from the right section of main menu (#34855)
(cherry picked from commit b74a244950)
2025-08-27 12:01:38 -07:00
Kamil Gabryjelski
7169d9f2bd fix: DB icon sizes in database add modal (#34854)
(cherry picked from commit ab58b0a8a3)
2025-08-27 12:00:55 -07:00
Kamil Gabryjelski
37347525e7 fix(dashboard): Anchor link positions (#34843)
(cherry picked from commit 97b35a4640)
2025-08-27 12:00:10 -07:00
JUST.in DO IT
b6aa68dbfc fix(sqllab): Missing executed sql value in the result table (#34846)
(cherry picked from commit b89b0bdf5d)
2025-08-27 11:58:49 -07:00
Vitor Avila
e4f371b126 fix: Avoid dataset drill request if no perm (#34665)
(cherry picked from commit 9c9588cce6)
2025-08-27 11:58:18 -07:00
Vitor Avila
d0d816047c fix: Add dataset ID to file name on exports (#34782)
(cherry picked from commit 471d9fe737)
2025-08-27 11:57:07 -07:00
Rafael Benitez
2e28e22596 fix(theming): explore chart type style fixes, nav right menu spacing fixed (#34795)
(cherry picked from commit b381992a75)
2025-08-25 10:24:11 -07:00
Beto Dealmeida
a475d68693 fix: make get_image() always return BytesIO (#34801)
(cherry picked from commit 1204507d68)
2025-08-25 10:23:57 -07:00
Kamil Gabryjelski
dfd36f5a54 chore: Add instruction for LLMs to use antd theme tokens (#34800)
(cherry picked from commit c7779578f9)
2025-08-25 10:23:40 -07:00
Kamil Gabryjelski
ea5ebd2ec9 fix: Unexpected overflow ellipsis dots after status icon in Dashboard list (#34798)
(cherry picked from commit b225432c55)
2025-08-25 10:23:27 -07:00
Kamil Gabryjelski
d454a22f1c fix(echarts): Series labels hard to read in dark mode (#34815)
(cherry picked from commit 547f297171)
2025-08-25 10:23:14 -07:00
Joe Li
d01934d9d8 fix(Icons): Add missing data-test and aria-label attributes to custom icons (#34809)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 5c3c2599db)
2025-08-25 10:22:58 -07:00
Michael S. Molina
25775504b9 fix: User-provided Jinja template parameters causing SQL parsing errors (#34802)
(cherry picked from commit e1234b2264)
2025-08-23 11:17:15 -07:00
JUST.in DO IT
4cc6984ebf fix: customize column description limit size in db_engine_spec (#34808)
(cherry picked from commit 75af53dc3d)
2025-08-23 11:16:43 -07:00
Mehmet Salih Yavuz
548d9e6f7b fix(DetailsPanel): Applied filters colors (#34790)
(cherry picked from commit 2b2cc96f11)
2025-08-23 11:15:57 -07:00
Kamil Gabryjelski
1adaf20ccb fix(native-filters): Low contrast of empty state in dark mode (#34812)
(cherry picked from commit 59c01e016d)
2025-08-23 11:15:20 -07:00
Kamil Gabryjelski
7e9658fad6 fix: Low contrast in viz creator selected tag in dark mode (#34811)
(cherry picked from commit 3895b8b127)
2025-08-23 11:14:53 -07:00
Kamil Gabryjelski
5ff6679804 fix: Remove border around textarea in dashboard edit mode (#34814)
(cherry picked from commit da8c0f94e6)
2025-08-23 11:14:25 -07:00
Kamil Gabryjelski
0899496ca5 fix: Misaligned global controls in Table chart (#34799)
(cherry picked from commit 6908a733a0)
2025-08-23 11:13:35 -07:00
Gabriel Torres Ruiz
e2a469c32d fix(dashboard): enable undo/redo buttons for layout changes (#34777)
(cherry picked from commit ff1f7b64e2)
2025-08-23 11:11:46 -07:00
Maxime Beauchemin
2ffc1b95ba fix: Check migration status before initializing database-dependent features (#34679)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit c568d463b9)
2025-08-21 14:05:27 -07:00
Tomáš Karela Procházka
3b3aa1e302 fix: default value in run-server.sh (#34719)
(cherry picked from commit 179a6f2cfe)
2025-08-21 14:04:59 -07:00
Elizabeth Thompson
958b29acbc fix: catch no table error (#32640)
(cherry picked from commit 695a20d009)
2025-08-21 14:04:08 -07:00
Mehmet Salih Yavuz
f0cfd17dc5 fix(PivotExcelExport): select correct chart for export (#34793)
(cherry picked from commit e908775fb2)
2025-08-21 14:03:38 -07:00
Joe Li
ebfddb2b39 fix(tests): make SingleStore test_adjust_engine_params version-agnostic (#34780)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit af05396227)
2025-08-21 09:43:34 -07:00
amaannawab923
e10b6e8ae9 fix(webpack): Bump webpack dev-server to handle Errors on Firefox where error object is not defined (#34791)
(cherry picked from commit 277f03c207)
2025-08-21 09:42:35 -07:00
Evan Rusackas
18d4acdee9 fix(sqllab): Fix save query modal closing prematurely on new tabs (#34765)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 48699a7194)
2025-08-21 09:41:48 -07:00
PolinaFam
c199213e8e fix(translations): Fix translation of time-related strings like "7 seconds ago", "a minute ago", etc (#34051)
Co-authored-by: Polina Fam <pfam@ptsecurity.com>
(cherry picked from commit b45141b2a1)
2025-08-21 09:40:38 -07:00
Joe Li
91834bbede fix: Fix TypeError in Slice.get() method when using filter_by() with BinaryExpression (#34769)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
(cherry picked from commit 9de1706baa)
2025-08-20 11:24:12 -07:00
Evan Rusackas
7253c79959 fix(duckdb): Add support for DuckDB-specific numeric types (#34743)
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit a42185cd3b)
2025-08-20 11:04:06 -07:00
JUST.in DO IT
04738c716c fix(sqllab): Invisible grid table due to the invalid height (#34683)
(cherry picked from commit 89eb7b207c)
2025-08-20 11:03:42 -07:00
Michael S. Molina
928dbe43e0 fix: Users can't skip column sync when saving virtual datasets (#34757)
(cherry picked from commit f99022b242)
2025-08-19 09:51:22 -07:00
JUST.in DO IT
3f597a6551 fix(sqllab): Reduce flushing caused by ID updates (#34720)
(cherry picked from commit f8b9e3ace4)
2025-08-19 09:50:52 -07:00
JUST.in DO IT
3661482eb3 chore(saved_query): Copy link to clipboard before redirect to edit (#34567) (#34758)
(cherry picked from commit 9cbe5a90b8)
2025-08-19 09:50:25 -07:00
Mehmet Salih Yavuz
9443fe8b78 fix(RightMenu): Move RightMenu carets to the right side (#34756)
(cherry picked from commit f7fe617f4c)
2025-08-19 09:50:02 -07:00
Kamil Gabryjelski
453241eb33 fix: Highlight outline of numerical range and time range filters (#34705)
(cherry picked from commit 6969f2cf7a)
2025-08-19 09:49:32 -07:00
Joe Li
a5f7d236ac chore: Adds RC1 data to CHANGELOG.md and UPDATING.md 2025-08-18 14:38:54 -07:00
7883 changed files with 299369 additions and 1036317 deletions

View File

@@ -24,9 +24,7 @@ notifications:
discussions: notifications@superset.apache.org
github:
pull_requests:
del_branch_on_merge: true
allow_update_branch: true
del_branch_on_merge: true
description: "Apache Superset is a Data Visualization and Data Exploration Platform"
homepage: https://superset.apache.org/
labels:
@@ -77,17 +75,23 @@ github:
# combination here.
contexts:
- lint-check
- cypress-matrix-required
- cypress-matrix (0, chrome)
- cypress-matrix (1, chrome)
- cypress-matrix (2, chrome)
- cypress-matrix (3, chrome)
- cypress-matrix (4, chrome)
- cypress-matrix (5, chrome)
- dependency-review
- frontend-build
- playwright-tests-required
- playwright-tests (chromium)
- pre-commit (current)
- pre-commit (previous)
- test-mysql
- test-postgres-required
- test-postgres (current)
- test-postgres-hive
- test-postgres-presto
- test-sqlite
- unit-tests-required
- unit-tests (current)
required_pull_request_reviews:
dismiss_stale_reviews: false

View File

@@ -1,10 +0,0 @@
# JavaScript to TypeScript Migration Command
## Usage
```
/js-to-ts <core-filename>
```
- `<core-filename>` - Path to CORE file relative to `superset-frontend/` (e.g., `src/utils/common.js`, `src/middleware/loggerMiddleware.js`)
## Agent Instructions
**See:** [../projects/js-to-ts/AGENT.md](../projects/js-to-ts/AGENT.md) for complete migration guide.

View File

@@ -1,684 +0,0 @@
# JavaScript to TypeScript Migration Agent Guide
**Complete technical reference for converting JavaScript/JSX files to TypeScript/TSX in Apache Superset frontend.**
**Agent Role:** Atomic migration unit - migrate the core file + ALL related tests/mocks as one cohesive unit. Use `git mv` to preserve history, NO `git commit`. NO global import changes. Report results upon completion.
---
## 🎯 Migration Principles
1. **Atomic migration units** - Core file + all related tests/mocks migrate together
2. **Zero `any` types** - Use proper TypeScript throughout
3. **Leverage existing types** - Reuse established definitions
4. **Type inheritance** - Derivatives extend base component types
5. **Strategic placement** - File types for maximum discoverability
6. **Surgical improvements** - Enhance existing types during migration
---
## Step 0: Dependency Check (MANDATORY)
**Command:**
```bash
grep -E "from '\.\./.*\.jsx?'|from '\./.*\.jsx?'|from 'src/.*\.jsx?'" superset-frontend/{filename}
```
**Decision:**
- ✅ No matches → Proceed with atomic migration (core + tests + mocks)
- ❌ Matches found → EXIT with dependency report (see format below)
---
## Step 1: Identify Related Files (REQUIRED)
**Atomic Migration Scope:**
For core file `src/utils/example.js`, also migrate:
- `src/utils/example.test.js` / `src/utils/example.test.jsx`
- `src/utils/example.spec.js` / `src/utils/example.spec.jsx`
- `src/utils/__mocks__/example.js`
- Any other related test/mock files found by pattern matching
**Find all related test and mock files:**
```bash
# Pattern-based search for related files
basename=$(basename {filename} .js)
dirname=$(dirname superset-frontend/{filename})
# Find test files
find "$dirname" -name "${basename}.test.js" -o -name "${basename}.test.jsx"
find "$dirname" -name "${basename}.spec.js" -o -name "${basename}.spec.jsx"
# Find mock files
find "$dirname" -name "__mocks__/${basename}.js"
find "$dirname" -name "${basename}.mock.js"
```
**Migration Requirement:** All discovered related files MUST be migrated together as one atomic unit.
**Test File Creation:** If NO test files exist for the core file, CREATE a minimal test file using the following pattern:
- Location: Same directory as core file
- Name: `{basename}.test.ts` (e.g., `DebouncedMessageQueue.test.ts`)
- Content: Basic test structure importing and testing the main functionality
- Use proper TypeScript types in test file
---
## 🗺️ Type Reference Map
### From `@superset-ui/core`
```typescript
// Data & Query
QueryFormData, QueryData, JsonObject, AnnotationData, AdhocMetric
LatestQueryFormData, GenericDataType, DatasourceType, ExtraFormData
DataMaskStateWithId, NativeFilterScope, NativeFiltersState, NativeFilterTarget
// UI & Theme
FeatureFlagMap, LanguagePack, ColorSchemeConfig, SequentialSchemeConfig
```
### From `@superset-ui/chart-controls`
```typescript
Dataset, ColumnMeta, ControlStateMapping
```
### From Local Types (`src/types/`)
```typescript
// Authentication
User, UserWithPermissionsAndRoles, BootstrapUser, PermissionsAndRoles
// Dashboard
Dashboard, DashboardState, DashboardInfo, DashboardLayout, LayoutItem
ComponentType, ChartConfiguration, ActiveFilters
// Charts
Chart, ChartState, ChartStatus, ChartLinkedDashboard, Slice, SaveActionType
// Data
Datasource, Database, Owner, Role
// UI Components
TagType, FavoriteStatus, Filter, ImportResourceName
```
### From Domain Types
```typescript
// src/dashboard/types.ts
RootState, ChartsState, DatasourcesState, FilterBarOrientation
ChartCrossFiltersConfig, ActiveTabs, MenuKeys
// src/explore/types.ts
ExplorePageInitialData, ExplorePageState, ExploreResponsePayload, OptionSortType
// src/SqlLab/types.ts
[SQL Lab specific types]
```
---
## 🏗️ Type Organization Strategy
### Type Placement Hierarchy
1. **Component-Colocated** (90% of cases)
```typescript
// Same file as component
interface MyComponentProps {
title: string;
onClick: () => void;
}
```
2. **Feature-Shared**
```typescript
// src/[domain]/components/[Feature]/types.ts
export interface FilterConfiguration {
filterId: string;
targets: NativeFilterTarget[];
}
```
3. **Domain-Wide**
```typescript
// src/[domain]/types.ts
export interface ExploreFormData extends QueryFormData {
viz_type: string;
}
```
4. **Global**
```typescript
// src/types/[TypeName].ts
export interface ApiResponse<T> {
result: T;
count?: number;
}
```
### Type Discovery Commands
```bash
# Search existing types before creating
find superset-frontend/src -name "types.ts" -exec grep -l "[TypeConcept]" {} \;
grep -r "interface.*Props\|type.*Props" superset-frontend/src/
```
### Derivative Component Patterns
**Rule:** Components that extend others should extend their type interfaces.
```typescript
// ✅ Base component type
interface SelectProps {
value: string | number;
options: SelectOption[];
onChange: (value: string | number) => void;
disabled?: boolean;
}
// ✅ Derivative extends base
interface ChartSelectProps extends SelectProps {
charts: Chart[];
onChartSelect: (chart: Chart) => void;
}
// ✅ Derivative with modified props
interface DatabaseSelectProps extends Omit<SelectProps, 'value' | 'onChange'> {
value: number; // Narrowed type
onChange: (databaseId: number) => void; // Specific signature
}
```
**Common Patterns:**
- **Extension:** `extends BaseProps` - adds new props
- **Omission:** `Omit<BaseProps, 'prop'>` - removes props
- **Modification:** `Omit<BaseProps, 'prop'> & { prop: NewType }` - changes prop type
- **Restriction:** Override with narrower types (union → specific)
---
## 📋 Migration Recipe
### Step 2: File Conversion
```bash
# Use git mv to preserve history
git mv component.js component.ts
git mv Component.jsx Component.tsx
```
### Step 3: Import & Type Setup
```typescript
// Import order (enforced by linting)
import { FC, ReactNode } from 'react';
import { JsonObject, QueryFormData } from '@superset-ui/core';
import { Dataset } from '@superset-ui/chart-controls';
import type { Dashboard } from 'src/types/Dashboard';
```
### Step 4: Function & Component Typing
```typescript
// Functions with proper parameter/return types
export function processData(
data: Dataset[],
config: JsonObject
): ProcessedData[] {
// implementation
}
// Component props with inheritance
interface ComponentProps extends BaseProps {
data: Chart[];
onSelect: (id: number) => void;
}
const Component: FC<ComponentProps> = ({ data, onSelect }) => {
// implementation
};
```
### Step 5: State & Redux Typing
```typescript
// Hooks with specific types
const [data, setData] = useState<Chart[]>([]);
const [selected, setSelected] = useState<number | null>(null);
// Redux with existing RootState
const mapStateToProps = (state: RootState) => ({
charts: state.charts,
user: state.user,
});
```
---
## 🧠 Type Debugging Strategies (Real-World Learnings)
### The Evolution of Type Approaches
When you hit type errors, follow this debugging evolution:
#### 1. ❌ Idealized Union Types (First Attempt)
```typescript
// Looks clean but doesn't match reality
type DatasourceInput = Datasource | QueryEditor;
```
**Problem**: Real calling sites pass variations, not exact types.
#### 2. ❌ Overly Precise Types (Second Attempt)
```typescript
// Tried to match exact calling signatures
type DatasourceInput =
| IDatasource // From DatasourcePanel
| (QueryEditor & { columns: ColumnMeta[] }); // From SaveQuery
```
**Problem**: Too rigid, doesn't handle legacy variations.
#### 3. ✅ Flexible Interface (Final Solution)
```typescript
// Captures what the function actually needs
interface DatasourceInput {
name?: string | null; // Allow null for compatibility
datasource_name?: string | null; // Legacy variations
columns?: any[]; // Multiple column types accepted
database?: { id?: number };
// ... other optional properties
}
```
**Success**: Works with all calling sites, focuses on function needs.
### Type Debugging Process
1. **Start with compilation errors** - they show exact mismatches
2. **Examine actual usage** - look at calling sites, not idealized types
3. **Build flexible interfaces** - capture what functions need, not rigid contracts
4. **Iterate based on downstream validation** - let calling sites guide your types
---
## 🚨 Anti-Patterns to Avoid
```typescript
// ❌ Never use any
const obj: any = {};
// ✅ Use proper types
const obj: Record<string, JsonObject> = {};
// ❌ Don't recreate base component props
interface ChartSelectProps {
value: string; // Duplicated from SelectProps
onChange: () => void; // Duplicated from SelectProps
charts: Chart[]; // New prop
}
// ✅ Inherit and extend
interface ChartSelectProps extends SelectProps {
charts: Chart[]; // Only new props
}
// ❌ Don't create ad-hoc type variations
interface UserInfo {
name: string;
email: string;
}
// ✅ Extend existing types (DRY principle)
import { User } from 'src/types/bootstrapTypes';
type UserDisplayInfo = Pick<User, 'firstName' | 'lastName' | 'email'>;
// ❌ Don't create overly rigid unions
type StrictInput = ExactTypeA | ExactTypeB;
// ✅ Create flexible interfaces for function parameters
interface FlexibleInput {
// Focus on what the function actually needs
commonProperty: string;
optionalVariations?: any; // Allow for legacy variations
}
```
## 📍 DRY Type Guidelines (WHERE TYPES BELONG)
### Type Placement Rules
**CRITICAL**: Type variations must live close to where they belong, not scattered across files.
#### ✅ Proper Type Organization
```typescript
// ❌ Don't create one-off interfaces in utility files
// src/utils/datasourceUtils.ts
interface DatasourceInput { /* custom interface */ } // Wrong!
// ✅ Use existing types or extend them in their proper domain
// src/utils/datasourceUtils.ts
import { IDatasource } from 'src/explore/components/DatasourcePanel';
import { QueryEditor } from 'src/SqlLab/types';
// Create flexible interface that references existing types
interface FlexibleDatasourceInput {
// Properties that actually exist across variations
}
```
#### Type Location Hierarchy
1. **Domain Types**: `src/{domain}/types.ts` (dashboard, explore, SqlLab)
2. **Component Types**: Co-located with components
3. **Global Types**: `src/types/` directory
4. **Utility Types**: Only when they truly don't belong elsewhere
#### ✅ DRY Type Patterns
```typescript
// ✅ Extend existing domain types
interface SaveQueryData extends Pick<QueryEditor, 'sql' | 'dbId' | 'catalog'> {
columns: ColumnMeta[]; // Add what's needed
}
// ✅ Create flexible interfaces for cross-domain utilities
interface CrossDomainInput {
// Common properties that exist across different source types
name?: string | null; // Accommodate legacy null values
// Only include properties the function actually uses
}
```
---
## 🎯 PropTypes Auto-Generation (Elegant Approach)
**IMPORTANT**: Superset has `babel-plugin-typescript-to-proptypes` configured to automatically generate PropTypes from TypeScript interfaces. Use this instead of manual PropTypes duplication!
### ❌ Manual PropTypes Duplication (Avoid This)
```typescript
export interface MyComponentProps {
title: string;
count?: number;
}
// 8+ lines of manual PropTypes duplication 😱
const propTypes = PropTypes.shape({
title: PropTypes.string.isRequired,
count: PropTypes.number,
});
export default propTypes;
```
### ✅ Auto-Generated PropTypes (Use This)
```typescript
import { InferProps } from 'prop-types';
export interface MyComponentProps {
title: string;
count?: number;
}
// Single validator function - babel plugin auto-generates PropTypes! ✨
export default function MyComponentValidator(props: MyComponentProps) {
return null; // PropTypes auto-assigned by babel-plugin-typescript-to-proptypes
}
// Optional: For consumers needing PropTypes type inference
export type MyComponentPropsInferred = InferProps<typeof MyComponentValidator>;
```
### Migration Pattern for Type-Only Files
**When migrating type-only files with manual PropTypes:**
1. **Keep the TypeScript interfaces** (single source of truth)
2. **Replace manual PropTypes** with validator function
3. **Remove PropTypes imports** and manual shape definitions
4. **Add InferProps import** if type inference needed
**Example Migration:**
```typescript
// Before: 25+ lines with manual PropTypes duplication
export interface AdhocFilterType { /* ... */ }
const adhocFilterTypePropTypes = PropTypes.oneOfType([...]);
// After: 3 lines with auto-generation
export interface AdhocFilterType { /* ... */ }
export default function AdhocFilterValidator(props: { filter: AdhocFilterType }) {
return null; // Auto-generated PropTypes by babel plugin
}
```
### Component PropTypes Pattern
**For React components, the babel plugin works automatically:**
```typescript
interface ComponentProps {
title: string;
onClick: () => void;
}
const MyComponent: FC<ComponentProps> = ({ title, onClick }) => {
// Component implementation
};
// PropTypes automatically generated by babel plugin - no manual work needed!
export default MyComponent;
```
### Auto-Generation Benefits
- ✅ **Single source of truth**: TypeScript interfaces drive PropTypes
- ✅ **No duplication**: Eliminate 15-20 lines of manual PropTypes code
- ✅ **Automatic updates**: Changes to TypeScript automatically update PropTypes
- ✅ **Type safety**: Compile-time checking ensures PropTypes match interfaces
- ✅ **Backward compatibility**: Existing JavaScript components continue working
### Babel Plugin Configuration
The plugin is already configured in `babel.config.js`:
```javascript
['babel-plugin-typescript-to-proptypes', { loose: true }]
```
**No additional setup required** - just use TypeScript interfaces and the plugin handles the rest!
---
## 🧪 Test File Migration Patterns
### Test File Priority
- **Always migrate test files** alongside production files
- **Test files are often leaf nodes** - good starting candidates
- **Create tests if missing** - Leverage new TypeScript types for better test coverage
### Test-Specific Type Patterns
```typescript
// Mock interfaces for testing
interface MockStore {
getState: () => Partial<RootState>; // Partial allows minimal mocking
}
// Type-safe mocking for complex objects
const mockDashboardInfo: Partial<DashboardInfo> as DashboardInfo = {
id: 123,
json_metadata: '{}',
};
// Sinon stub typing
let postStub: sinon.SinonStub;
beforeEach(() => {
postStub = sinon.stub(SupersetClient, 'post');
});
// Use stub reference instead of original method
expect(postStub.callCount).toBe(1);
expect(postStub.getCall(0).args[0].endpoint).toMatch('/api/');
```
### Test Migration Recipe
1. **Migrate production file first** (if both need migration)
2. **Update test imports** to point to `.ts/.tsx` files
3. **Add proper mock typing** using `Partial<T> as T` pattern
4. **Fix stub typing** - Use stub references, not original methods
5. **Verify all tests pass** with TypeScript compilation
---
## 🔧 Type Conflict Resolution
### Multiple Type Definitions Issue
**Problem**: Same type name defined in multiple files causes compilation errors.
**Example**: `DashboardInfo` defined in both:
- `src/dashboard/reducers/types.ts` (minimal)
- `src/dashboard/components/Header/types.ts` (different shape)
- `src/dashboard/types.ts` (complete - used by RootState)
### Resolution Strategy
1. **Identify the authoritative type**:
```bash
# Find which type is used by RootState/main interfaces
grep -r "DashboardInfo" src/dashboard/types.ts
```
2. **Use import from authoritative source**:
```typescript
// ✅ Import from main domain types
import { RootState, DashboardInfo } from 'src/dashboard/types';
// ❌ Don't import from component-specific files
import { DashboardInfo } from 'src/dashboard/components/Header/types';
```
3. **Mock complex types in tests**:
```typescript
// For testing - provide minimal required fields
const mockInfo: Partial<DashboardInfo> as DashboardInfo = {
id: 123,
json_metadata: '{}',
// Only provide fields actually used in test
};
```
### Type Hierarchy Discovery Commands
```bash
# Find all definitions of a type
grep -r "interface.*TypeName\|type.*TypeName" src/
# Find import usage patterns
grep -r "import.*TypeName" src/
# Check what RootState uses
grep -A 10 -B 10 "TypeName" src/*/types.ts
```
---
## Agent Constraints (CRITICAL)
1. **Use git mv** - Run `git mv file.js file.ts` to preserve git history, but NO `git commit`
2. **NO global import changes** - Don't update imports across codebase
3. **Type files OK** - Can modify existing type files to improve/align types
4. **Single-File TypeScript Validation** (CRITICAL) - tsc has known issues with multi-file compilation:
- **Core Issue**: TypeScript's `tsc` has documented problems validating multiple files simultaneously in complex projects
- **Solution**: ALWAYS validate files one at a time using individual `tsc` calls
- **Command Pattern**: `cd superset-frontend && npx tscw --noEmit --allowJs --composite false --project tsconfig.json {single-file-path}`
- **Why**: Multi-file validation can produce false positives, miss real errors, and conflict during parallel agent execution
5. **Downstream Impact Validation** (CRITICAL) - Your migration affects calling sites:
- **Find downstream files**: `find superset-frontend/src -name "*.tsx" -o -name "*.ts" | xargs grep -l "your-core-filename" 2>/dev/null || echo "No files found"`
- **Validate each downstream file individually**: `cd superset-frontend && npx tscw --noEmit --allowJs --composite false --project tsconfig.json {each-downstream-file}`
- **Fix type mismatches** you introduced in calling sites
- **NEVER ignore downstream errors** - they indicate your types don't match reality
6. **Avoid Project-Wide Validation During Migration**:
- **NEVER use `npm run type`** during parallel agent execution - produces unreliable results
- **Single-file validation is authoritative** - trust individual file checks over project-wide scans
6. **ESLint validation** - Run `npm run eslint -- --fix {file}` for each migrated file to auto-fix formatting/linting issues
6. Zero `any` types - use proper TypeScript types
7. Search existing types before creating new ones
8. Follow patterns from this guide
---
## Success Report Format
```
SUCCESS: Atomic Migration of {core-filename}
## Files Migrated (Atomic Unit)
- Core: {core-filename} → {core-filename.ts/tsx}
- Tests: {list-of-test-files} → {list-of-test-files.ts/tsx} OR "CREATED: {basename}.test.ts"
- Mocks: {list-of-mock-files} → {list-of-mock-files.ts}
- Type files modified: {list-of-type-files}
## Types Created/Improved
- {TypeName}: {location} ({scope}) - {rationale}
- {ExistingType}: enhanced in {location} - {improvement-description}
## Documentation Recommendations
- ADD_TO_DIRECTORY: {TypeName} - {reason}
- NO_DOCUMENTATION: {TypeName} - {reason}
## Quality Validation
- **Single-File TypeScript Validation**: ✅ PASS - Core files individually validated
- Core file: `npx tscw --noEmit --allowJs --composite false --project tsconfig.json {core-file}`
- Test files: `npx tscw --noEmit --allowJs --composite false --project tsconfig.json {test-file}` (if exists)
- **Downstream Impact Check**: ✅ PASS - Found {N} files importing this module, all validate individually
- Downstream files: {list-of-files-that-import-your-module}
- Individual validation: `npx tscw --noEmit --allowJs --composite false --project tsconfig.json {each-downstream-file}`
- **ESLint validation**: ✅ PASS (using `npm run eslint -- --fix {files}` to auto-fix formatting)
- **Zero any types**: ✅ PASS
- **Local imports resolved**: ✅ PASS
- **Functionality preserved**: ✅ PASS
- **Tests pass** (if test file): ✅ PASS
- **Follow-up action required**: {YES/NO}
## Validation Strategy Notes
- **Single-file approach used**: Avoided multi-file tsc validation due to known TypeScript compilation issues
- **Project-wide validation skipped**: `npm run type` not used during parallel migration to prevent false positives
## Migration Learnings
- Type conflicts encountered: {describe any multiple type definitions}
- Mock patterns used: {describe test mocking approaches}
- Import hierarchy decisions: {note authoritative type sources used}
- PropTypes strategy: {AUTO_GENERATED via babel plugin | MANUAL_DUPLICATION_REMOVED | N/A}
## Improvement Suggestions for Documentation
- AGENT.md enhancement: {suggest additions to migration guide}
- Common pattern identified: {note reusable patterns for future migrations}
```
---
## Dependency Block Report Format
```
DEPENDENCY_BLOCK: Cannot migrate {filename}
## Blocking Dependencies
- {path}: {type} - {usage} - {priority}
## Impact Analysis
- Estimated types: {number}
- Expected locations: {list}
- Cross-domain: {YES/NO}
## Recommended Order
{ordered-list}
```
---
## 📚 Quick Reference
**Type Utilities:**
- `Record<K, V>` - Object with specific key/value types
- `Partial<T>` - All properties optional
- `Pick<T, K>` - Subset of properties
- `Omit<T, K>` - Exclude specific properties
- `NonNullable<T>` - Exclude null/undefined
**Event Types:**
- `MouseEvent<HTMLButtonElement>`
- `ChangeEvent<HTMLInputElement>`
- `FormEvent<HTMLFormElement>`
**React Types:**
- `FC<Props>` - Functional component
- `ReactNode` - Any renderable content
- `CSSProperties` - Style objects
---
**Remember:** Every type should add value and clarity. The goal is meaningful type safety that catches bugs and improves developer experience.

View File

@@ -1,199 +0,0 @@
# JS-to-TS Coordinator Workflow
**Role:** Strategic migration coordination - select leaf-node files, trigger agents, review results, handle integration, manage dependencies.
---
## 1. Core File Selection Strategy
**Target ONLY Core Files**: Coordinators identify core files (production code), agents handle related tests/mocks atomically.
**File Analysis Commands**:
```bash
# Find CORE files with no JS/JSX dependencies (exclude tests/mocks) - SIZE PRIORITIZED
find superset-frontend/src -name "*.js" -o -name "*.jsx" | grep -v "test\|spec\|mock" | xargs wc -l | sort -n | head -20
# Alternative: Get file sizes in lines with paths
find superset-frontend/src -name "*.js" -o -name "*.jsx" | grep -v "test\|spec\|mock" | while read file; do
lines=$(wc -l < "$file")
echo "$lines $file"
done | sort -n | head -20
# Check dependencies for core files only (start with smallest)
for file in <core-files-sorted-by-size>; do
echo "=== $file ($(wc -l < "$file") lines) ==="
grep -E "from '\.\./.*\.jsx?'|from '\./.*\.jsx?'|from 'src/.*\.jsx?'" "$file" || echo "✅ LEAF CANDIDATE"
done
# Identify heavily imported files (migrate last)
grep -r "from.*utils/common" superset-frontend/src/ | wc -l
# Quick leaf analysis with size priority
find superset-frontend/src -name "*.js" -o -name "*.jsx" | grep -v "test\|spec\|mock" | head -30 | while read file; do
deps=$(grep -E "from '\.\./.*\.jsx?'|from '\./.*\.jsx?'|from 'src/.*\.jsx?'" "$file" | wc -l)
lines=$(wc -l < "$file")
if [ "$deps" -eq 0 ]; then
echo "✅ LEAF: $lines lines - $file"
fi
done | sort -n
```
**Priority Order** (Smallest files first for easier wins):
1. **Small leaf files** (<50 lines) - No JS/JSX imports, quick TypeScript conversion
2. **Medium leaf files** (50-200 lines) - Self-contained utilities and helpers
3. **Small dependency files** (<100 lines) - Import only already-migrated files
4. **Larger components** (200+ lines) - Complex but well-contained functionality
5. **Core foundational files** (utils/common.js, controls.jsx) - migrate last regardless of size
**Size-First Benefits**:
- Faster completion builds momentum
- Earlier validation of migration patterns
- Easier rollback if issues arise
- Better success rate for agent learning
**Migration Unit**: Each agent call migrates:
- 1 core file (primary target)
- All related `*.test.js/jsx` files
- All related `*.mock.js` files
- All related `__mocks__/` files
---
## 2. Task Creation & Agent Control
### Task Triggering
When triggering the `/js-to-ts` command:
- **Task Title**: Use the core filename as the task title (e.g., "DebouncedMessageQueue.js migration", "hostNamesConfig.js migration")
- **Task Description**: Include the full relative path to help agent locate the file
- **Reference**: Point agent to [AGENT.md](./AGENT.md) for technical instructions
### Post-Processing Workflow
After each agent completes:
1. **Review Agent Report**: Always read and analyze the complete agent report
2. **Share Summary**: Provide user with key highlights from agent's work:
- Files migrated (core + tests/mocks)
- Types created or improved
- Any validation issues or coordinator actions needed
3. **Quality Assessment**: Evaluate agent's TypeScript implementation against criteria:
-**Type Usage**: Proper types used, no `any` types
-**Type Filing**: Types placed in correct hierarchy (component → feature → domain → global)
-**Side Effects**: No unintended changes to other files
-**Import Alignment**: Proper .ts/.tsx import extensions
4. **Integration Decision**:
- **COMMIT**: If agent work is complete and high quality
- **FIX & COMMIT**: If minor issues need coordinator fixes
- **ROLLBACK**: If major issues require complete rework
5. **Next Action**: Ask user preference - commit this work or trigger next migration
---
## 3. Integration Decision Framework
**Automatic Integration** ✅:
- `npm run type` passes without errors
- Agent created clean TypeScript with proper types
- Types appropriately filed in hierarchy
**Coordinator Integration** (Fix Side-Effects) 🔧:
- `npm run type` fails BUT agent's work is high quality
- Good type usage, proper patterns, well-organized
- Side-effects are manageable TypeScript compilation errors
- **Coordinator Action**: Integrate the change, then fix global compilation issues
**Rollback Only** ❌:
- Agent introduced `any` types or poor type choices
- Types poorly organized or conflicting with existing patterns
- Fundamental approach issues requiring complete rework
**Integration Process**:
1. **Review**: Agent already used `git mv` to preserve history
2. **Fix Side-Effects**: Update dependent files with proper import extensions
3. **Resolve Types**: Fix any cascading type issues across codebase
4. **Validate**: Ensure `npm run type` passes after fixes
---
## 4. Common Integration Patterns
**Common Side-Effects (Expect These)**:
- **Type import conflicts**: Multiple definitions of same type name
- **Mock object typing**: Tests need complete type satisfaction
- **Stub method references**: Use stub vars instead of original methods
**Coordinator Fixes (Standard Process)**:
1. **Import Resolution**:
```bash
# Find authoritative type source
grep -r "TypeName" src/*/types.ts
# Import from domain types (src/dashboard/types.ts) not component types
```
2. **Test Mock Completion**:
```typescript
// Use Partial<T> as T pattern for minimal mocking
const mockDashboard: Partial<DashboardInfo> as DashboardInfo = {
id: 123,
json_metadata: '{}',
};
```
3. **Stub Reference Fixes**:
```typescript
// ✅ Use stub variable
expect(postStub.callCount).toBe(1);
// ❌ Don't use original method
expect(SupersetClient.post.callCount).toBe(1);
```
4. **Validation Commands**:
```bash
npm run type # TypeScript compilation
npm test -- filename # Test functionality
git status # Should show rename, not add/delete
```
---
## 5. File Categories for Planning
### Leaf Files (Start Here)
**Self-contained files with minimal JS/JSX dependencies**:
- Test files (80 files) - Usually only import the file being tested
- Utility files without internal dependencies
- Components importing only external libraries
### Heavily Imported Files (Migrate Last)
**Core files that many others depend on**:
- `utils/common.js` - Core utility functions
- `utils/reducerUtils.js` - Redux helpers
- `@superset-ui/core` equivalent files
- Major state management files (`explore/store.js`, `dashboard/actions/`)
### Complex Components (Middle Priority)
**Large files requiring careful type analysis**:
- `components/Datasource/DatasourceEditor.jsx` (1,809 lines)
- `explore/components/controls/AnnotationLayerControl/AnnotationLayer.jsx` (1,031 lines)
- `explore/components/ExploreViewContainer/index.jsx` (911 lines)
---
## 6. Success Metrics & Continuous Improvement
**Per-File Gates**:
- ✅ `npm run type` passes after each migration
- ✅ Zero `any` types introduced
- ✅ All imports properly typed
- ✅ Types filed in correct hierarchy
**Linear Scheduling**:
When agents report `DEPENDENCY_BLOCK`:
- Queue dependencies in linear order
- Process one file at a time to avoid conflicts
- Handle cascading type changes between files
**After Each Migration**:
1. **Update guides** with new patterns discovered
2. **Document coordinator fixes** that become common
3. **Enhance agent instructions** based on recurring issues
4. **Track success metrics** - automatic vs coordinator integration rates

View File

@@ -1,76 +0,0 @@
# JavaScript to TypeScript Migration Project
Progressive migration of 219 JS/JSX files to TypeScript in Apache Superset frontend.
## 📁 Project Documentation
- **[AGENT.md](./AGENT.md)** - Complete technical migration guide for agents (includes type reference, patterns, validation)
- **[COORDINATOR.md](./COORDINATOR.md)** - Strategic workflow for coordinators (file selection, task management, integration)
## 🎯 Quick Start
**For Agents:** Read [AGENT.md](./AGENT.md) for complete migration instructions
**For Coordinators:** Read [COORDINATOR.md](./COORDINATOR.md) for workflow and [AGENT.md](./AGENT.md) for supervision
**Command:** `/js-to-ts <filename>` - See [../../commands/js-to-ts.md](../../commands/js-to-ts.md)
## 📊 Migration Progress
**Scope**: 219 files total (112 JS + 107 JSX)
- Production files: 139 (63%)
- Test files: 80 (37%)
**Strategy**: Leaf-first migration with dependency-aware coordination
### Completed Migrations ✅
1. **roundDecimal** - `plugins/legacy-plugin-chart-map-box/src/utils/roundDecimal.js`
- Migrated core + test files
- Added proper TypeScript function signature with optional precision parameter
- All tests pass
2. **timeGrainSqlaAnimationOverrides** - `src/explore/controlPanels/timeGrainSqlaAnimationOverrides.js`
- Migrated to TypeScript with ControlPanelState and Dataset types
- Added TimeGrainOverrideState interface for return type
- Used type guards for safe property access
3. **DebouncedMessageQueue** - `src/utils/DebouncedMessageQueue.js`
- Migrated to TypeScript with proper generics
- Created DebouncedMessageQueueOptions interface
- **CREATED test file** with 4 comprehensive test cases
- Excellent class property typing with private/readonly modifiers
**Files Migrated**: 3/219 (1.4%)
**Tests Created**: 2 (roundDecimal had existing, DebouncedMessageQueue created)
### Next Candidates (Leaf Nodes) 🎯
**Identified leaf files with no JS/JSX dependencies:**
- `src/utils/hostNamesConfig.js` - Domain configuration utility
- `src/explore/controlPanels/Separator.js` - Control panel configuration
- `src/middleware/loggerMiddleware.js` - Logging middleware
**Migration Quality**: All completed migrations have:
- ✅ Zero `any` types
- ✅ Proper TypeScript compilation
- ✅ ESLint validation passed
- ✅ Test coverage (created where missing)
---
## 📈 Success Metrics
**Per-File Gates**:
-`npm run type` passes after each migration
- ✅ Zero `any` types introduced
- ✅ All imports properly typed
- ✅ Types filed in correct hierarchy
**Overall Progress**:
- **Automatic Integration Rate**: 100% (3/3 migrations required no coordinator fixes)
- **Test Coverage**: Improved (1 new test file created)
- **Type Safety**: Enhanced with proper interfaces and generics
---
*This is a claudette-managed progressive refactor. All documentation and coordination resources are organized under `.claude/projects/js-to-ts/`*

View File

@@ -1,15 +0,0 @@
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "jq -r '.tool_input.command // \"\"' | grep -qE '^git commit' && cd \"$CLAUDE_PROJECT_DIR\" && echo '🔍 Running pre-commit before commit...' && pre-commit run || true"
}
]
}
]
}
}

View File

@@ -1,5 +1,5 @@
# Keep this in sync with the base image in the main Dockerfile (ARG PY_VER)
FROM python:3.11.13-trixie AS base
FROM python:3.11.13-bookworm AS base
# Install system dependencies that Superset needs
# This layer will be cached across Codespace sessions

View File

@@ -13,7 +13,7 @@
"features": {
"ghcr.io/devcontainers/features/docker-in-docker:2": {
"moby": false,
"moby": true,
"dockerDashComposeVersion": "v2"
},
"ghcr.io/devcontainers/features/node:1": {

View File

@@ -1,41 +0,0 @@
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Auto-configure Docker Compose for multi-instance support
# Requires direnv: https://direnv.net/
#
# Install: brew install direnv (or apt install direnv)
# Setup: Add 'eval "$(direnv hook bash)"' to ~/.bashrc (or ~/.zshrc)
# Allow: Run 'direnv allow' in this directory once
# Generate unique project name from directory
export COMPOSE_PROJECT_NAME=$(basename "$PWD" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g')
# Find available ports sequentially to avoid collisions
_is_free() { ! lsof -i ":$1" &>/dev/null 2>&1; }
_p=80; while ! _is_free $_p; do ((_p++)); done; export NGINX_PORT=$_p
_p=8088; while ! _is_free $_p; do ((_p++)); done; export SUPERSET_PORT=$_p
_p=9000; while ! _is_free $_p; do ((_p++)); done; export NODE_PORT=$_p
_p=8080; while ! _is_free $_p || [ $_p -eq $NGINX_PORT ]; do ((_p++)); done; export WEBSOCKET_PORT=$_p
_p=8081; while ! _is_free $_p || [ $_p -eq $WEBSOCKET_PORT ]; do ((_p++)); done; export CYPRESS_PORT=$_p
_p=5432; while ! _is_free $_p; do ((_p++)); done; export DATABASE_PORT=$_p
_p=6379; while ! _is_free $_p; do ((_p++)); done; export REDIS_PORT=$_p
unset _p _is_free
echo "🐳 Superset configured: http://localhost:$SUPERSET_PORT (dev: localhost:$NODE_PORT)"

32
.github/CODEOWNERS vendored
View File

@@ -1,5 +1,7 @@
# Notify all committers of DB migration changes, per SIP-59
# https://github.com/apache/superset/issues/13351
/superset/migrations/ @mistercrunch @michael-s-molina @betodealmeida @eschutho @sadpandajoe
# Notify some committers of changes in the components
@@ -10,43 +12,21 @@
# Notify Helm Chart maintainers about changes in it
/helm/superset/ @dpgaspar @villebro @nytai @michael-s-molina @mistercrunch @rusackas @Antonio-RiveroMartnez @hainenber
/helm/superset/ @craig-rueda @dpgaspar @villebro @nytai @michael-s-molina @mistercrunch @rusackas @Antonio-RiveroMartnez
# Notify E2E test maintainers of changes
/superset-frontend/playwright/ @sadpandajoe @geido @eschutho @rusackas @mistercrunch
/superset-frontend/cypress-base/ @sadpandajoe @geido @eschutho @rusackas @mistercrunch
/superset-frontend/cypress-base/ @sadpandajoe @geido @eschutho @rusackas @betodealmeida @mistercrunch
# Notify PMC members of changes to GitHub Actions
/.github/ @villebro @geido @eschutho @rusackas @betodealmeida @nytai @mistercrunch @kgabryje @sha174n @dpgaspar @sadpandajoe @hainenber
# Notify PMC members of changes to CI-executed scripts (supply-chain risk:
# scripts/ files run directly in CI workflows and can execute arbitrary code)
/scripts/ @villebro @geido @eschutho @rusackas @betodealmeida @nytai @mistercrunch @kgabryje @dpgaspar @sha174n @sadpandajoe @hainenber
/.github/ @villebro @geido @eschutho @rusackas @betodealmeida @nytai @mistercrunch @craig-rueda @kgabryje @dpgaspar
# Notify PMC members of changes to required GitHub Actions
/.asf.yaml @villebro @geido @eschutho @rusackas @betodealmeida @nytai @mistercrunch @kgabryje @dpgaspar @sha174n @Antonio-RiveroMartnez
/.asf.yaml @villebro @geido @eschutho @rusackas @betodealmeida @nytai @mistercrunch @craig-rueda @kgabryje @dpgaspar @Antonio-RiveroMartnez
# Maps are a finicky contribution process we care about
**/*.geojson @villebro @rusackas
**/*.ipynb @villebro @rusackas
/superset-frontend/plugins/legacy-plugin-chart-country-map/ @villebro @rusackas
# Notify translation maintainers of changes to translations
/superset/translations/ @sfirke @rusackas @villebro @sadpandajoe @hainenber
# Notify PMC members of changes to extension-related files
/docs/developer_portal/extensions/ @michael-s-molina @villebro @rusackas
/superset-core/ @michael-s-molina @villebro @geido @eschutho @rusackas @kgabryje
/superset-extensions-cli/ @michael-s-molina @villebro @geido @eschutho @rusackas @kgabryje
/superset/core/ @michael-s-molina @villebro @geido @eschutho @rusackas @kgabryje
/superset/extensions/ @michael-s-molina @villebro @geido @eschutho @rusackas @kgabryje
/superset-frontend/src/packages/superset-core/ @michael-s-molina @villebro @geido @eschutho @rusackas @kgabryje
/superset-frontend/src/core/ @michael-s-molina @villebro @geido @eschutho @rusackas @kgabryje
/superset-frontend/src/extensions/ @michael-s-molina @villebro @geido @eschutho @rusackas @kgabryje

View File

@@ -41,8 +41,8 @@ body:
label: Superset version
options:
- master / latest-dev
- "6.1.0"
- "6.0.0"
- "5.0.0"
- "4.1.3"
validations:
required: true
- type: dropdown
@@ -50,8 +50,9 @@ body:
attributes:
label: Python version
options:
- "3.9"
- "3.10"
- "3.11"
- "3.12"
- Not applicable
- I don't know
validations:

38
.github/SECURITY.md vendored Normal file
View File

@@ -0,0 +1,38 @@
# Security Policy
This is a project of the [Apache Software Foundation](https://apache.org) and follows the
ASF [vulnerability handling process](https://apache.org/security/#vulnerability-handling).
## Reporting Vulnerabilities
**⚠️ Please do not file GitHub issues for security vulnerabilities as they are public! ⚠️**
Apache Software Foundation takes a rigorous standpoint in annihilating the security issues
in its software projects. Apache Superset is highly sensitive and forthcoming to issues
pertaining to its features and functionality.
If you have any concern or believe you have found a vulnerability in Apache Superset,
please get in touch with the Apache Superset Security Team privately at
e-mail address [security@superset.apache.org](mailto:security@superset.apache.org).
More details can be found on the ASF website at
[ASF vulnerability reporting process](https://apache.org/security/#reporting-a-vulnerability)
We kindly ask you to include the following information in your report:
- Apache Superset version that you are using
- A sanitized copy of your `superset_config.py` file or any config overrides
- Detailed steps to reproduce the vulnerability
Note that Apache Superset is not responsible for any third-party dependencies that may
have security issues. Any vulnerabilities found in third-party dependencies should be
reported to the maintainers of those projects. Results from security scans of Apache
Superset dependencies found on its official Docker image can be remediated at release time
by extending the image itself.
**Your responsible disclosure and collaboration are invaluable.**
## Extra Information
- [Apache Superset documentation](https://superset.apache.org/docs/security)
- [Common Vulnerabilities and Exposures by release](https://superset.apache.org/docs/security/cves)
- [How Security Vulnerabilities are Reported & Handled in Apache Superset (Blog)](https://preset.io/blog/how-security-vulnerabilities-are-reported-and-handled-in-apache-superset/)

View File

@@ -1,27 +1,24 @@
name: Change Detector
description: Detects file changes for pull request and push events
name: 'Change Detector'
description: 'Detects file changes for pull request and push events'
inputs:
token:
description: GitHub token for authentication
description: 'GitHub token for authentication'
required: true
outputs:
python:
description: Whether Python-related files were changed
description: 'Whether Python-related files were changed'
value: ${{ steps.change-detector.outputs.python }}
frontend:
description: Whether frontend-related files were changed
description: 'Whether frontend-related files were changed'
value: ${{ steps.change-detector.outputs.frontend }}
docker:
description: Whether docker-related files were changed
description: 'Whether docker-related files were changed'
value: ${{ steps.change-detector.outputs.docker }}
docs:
description: Whether docs-related files were changed
description: 'Whether docs-related files were changed'
value: ${{ steps.change-detector.outputs.docs }}
superset-extensions-cli:
description: Whether superset-extensions-cli package-related files were changed
value: ${{ steps.change-detector.outputs.superset-extensions-cli }}
runs:
using: composite
using: 'composite'
steps:
- name: Detect file changes
id: change-detector

View File

@@ -10,7 +10,7 @@ jobs:
steps:
- name: Check if the PR is a draft
id: check-draft
uses: actions/github-script@v8
uses: actions/github-script@v6
with:
script: |
const isDraft = context.payload.pull_request.draft;

View File

@@ -24,39 +24,32 @@ runs:
- name: Interpret Python Version
id: set-python-version
shell: bash
env:
INPUT_PYTHON_VERSION: ${{ inputs.python-version }}
run: |
if [ "$INPUT_PYTHON_VERSION" = "current" ]; then
RESOLVED_VERSION="3.11"
elif [ "$INPUT_PYTHON_VERSION" = "next" ]; then
if [ "${{ inputs.python-version }}" = "current" ]; then
echo "PYTHON_VERSION=3.11" >> $GITHUB_ENV
elif [ "${{ inputs.python-version }}" = "next" ]; then
# currently disabled in GHA matrixes because of library compatibility issues
RESOLVED_VERSION="3.12"
elif printf '%s' "$INPUT_PYTHON_VERSION" | grep -Eq '^[0-9]+\.[0-9]+(\.[0-9]+)?$'; then
RESOLVED_VERSION="$INPUT_PYTHON_VERSION"
echo "PYTHON_VERSION=3.12" >> $GITHUB_ENV
elif [ "${{ inputs.python-version }}" = "previous" ]; then
echo "PYTHON_VERSION=3.10" >> $GITHUB_ENV
else
echo "Invalid python-version: '$INPUT_PYTHON_VERSION'" >&2
exit 1
echo "PYTHON_VERSION=${{ inputs.python-version }}" >> $GITHUB_ENV
fi
echo "python-version=$RESOLVED_VERSION" >> "$GITHUB_OUTPUT"
- name: Set up Python ${{ steps.set-python-version.outputs.python-version }}
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
- name: Set up Python ${{ env.PYTHON_VERSION }}
uses: actions/setup-python@v5
with:
python-version: ${{ steps.set-python-version.outputs.python-version }}
python-version: ${{ env.PYTHON_VERSION }}
cache: ${{ inputs.cache }}
- name: Install dependencies
env:
INPUT_INSTALL_SUPERSET: ${{ inputs.install-superset }}
INPUT_REQUIREMENTS_TYPE: ${{ inputs.requirements-type }}
run: |
if [ "$INPUT_INSTALL_SUPERSET" = "true" ]; then
if [ "${{ inputs.install-superset }}" = "true" ]; then
sudo apt-get update && sudo apt-get -y install libldap2-dev libsasl2-dev
pip install --upgrade pip setuptools wheel uv
if [ "$INPUT_REQUIREMENTS_TYPE" = "dev" ]; then
if [ "${{ inputs.requirements-type }}" = "dev" ]; then
uv pip install --system -r requirements/development.txt
elif [ "$INPUT_REQUIREMENTS_TYPE" = "base" ]; then
elif [ "${{ inputs.requirements-type }}" = "base" ]; then
uv pip install --system -r requirements/base.txt
fi

View File

@@ -26,25 +26,16 @@ runs:
- name: Set up QEMU
if: ${{ inputs.build == 'true' }}
uses: docker/setup-qemu-action@06116385d9baf250c9f4dcb4858b16962ea869c3 # v4.1.0
with:
# Pin the binfmt image to a specific QEMU release. The default
# (`tonistiigi/binfmt:latest`) is a moving target, and drift across
# QEMU's x86_64→aarch64 translator has been the proximate cause of
# intermittent `exit code: 132` (SIGILL) failures during the arm64
# leg of the multi-platform docker build — newer Node native modules
# emit instructions QEMU's user-mode emulation occasionally drops on
# the floor. Pinning a known-good release stabilises that path.
image: tonistiigi/binfmt:qemu-v8.1.5
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
if: ${{ inputs.build == 'true' }}
uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4.1.0
uses: docker/setup-buildx-action@v3
- name: Try to login to DockerHub
if: ${{ inputs.login-to-dockerhub == 'true' }}
continue-on-error: true
uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0
uses: docker/login-action@v3
with:
username: ${{ inputs.dockerhub-user }}
password: ${{ inputs.dockerhub-token }}

View File

@@ -10,21 +10,19 @@ runs:
steps:
- name: Setup Node Env
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install supersetbot from npm
if: ${{ inputs.from-npm == 'true' }}
shell: bash
# zizmor: ignore[adhoc-packages] - supersetbot is a first-party Apache CLI (apache-superset/supersetbot) installed globally as a tool; a global CLI install has no application manifest/lockfile context
run: npm install -g supersetbot
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
if: ${{ inputs.from-npm == 'false' }}
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@v4
with:
persist-credentials: false
repository: apache-superset/supersetbot
path: supersetbot
@@ -32,7 +30,6 @@ runs:
if: ${{ inputs.from-npm == 'false' }}
shell: bash
working-directory: supersetbot
# zizmor: ignore[adhoc-packages] - installs the locally packed supersetbot tarball built from the trusted apache-superset/supersetbot checkout; no lockfile applies to a global CLI install
run: |
# simple trick to install globally with dependencies
npm pack

View File

@@ -1 +1 @@
../AGENTS.md
../LLMS.md

409
.github/dependabot.yml vendored
View File

@@ -1,149 +1,370 @@
version: 2
enable-beta-ecosystems: true
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "daily"
cooldown:
default-days: 7
interval: "monthly"
- package-ecosystem: "npm"
ignore:
# TODO: remove below entries once the application supports React >= 19.0.0
- dependency-name: "react"
update-types: ["version-update:semver-major"]
- dependency-name: "react-dom"
update-types: ["version-update:semver-major"]
- dependency-name: "@types/react"
update-types: ["version-update:semver-major"]
- dependency-name: "@types/react-dom"
update-types: ["version-update:semver-major"]
- dependency-name: "react-icons"
# not until React >= 18.0.0
- dependency-name: "storybook"
- dependency-name: "@storybook*"
# remark-gfm v4+ requires react-markdown v9+, which needs React 18
- dependency-name: "remark-gfm"
- dependency-name: "react-markdown"
# JSDOM v30 doesn't play well with Jest v30
# Source: https://jestjs.io/blog#known-issues
# GH thread: https://github.com/jsdom/jsdom/issues/3492
- dependency-name: "jest-environment-jsdom"
# `@swc/plugin-transform-imports` doesn't work with current Webpack-SWC hybrid setup
# See https://github.com/apache/superset/pull/37384#issuecomment-3793991389
# TODO: remove the plugin once Lodash usage has been migrated to a more readily tree-shakeable alternative
- dependency-name: "@swc/plugin-transform-imports"
# `just-handlerbars-helpers` library in plugin-chart-handlebars requires `currencyformatter`` to be < 2
- dependency-name: "currencyformatter.js"
update-types: ["version-update:semver-major"]
# TODO: remove below clause once https://github.com/pmmmwh/react-refresh-webpack-plugin/pull/940 lands onto a future release
# and confirm the issue https://github.com/apache/superset/issues/39600 is fixed
- dependency-name: "react-checkbox-tree"
update-types: ["version-update:semver-major"]
# Babel 8 (7.x -> 8.x) is blocked on the surrounding ecosystem: @emotion/babel-plugin
# (NodePath#hoist), babel-plugin-jsx-remove-data-test-id (t.jSXOpeningElement), and
# ts-jest all rely on Babel APIs removed in v8 and have not shipped Babel 8 support.
# Ignore the coordinated major bump until the ecosystem catches up; it must be done
# as a single manual upgrade anyway. TODO: remove when Babel 8 support is viable.
- dependency-name: "@babel/*"
update-types: ["version-update:semver-major"]
directory: "/superset-frontend/"
schedule:
interval: "daily"
interval: "monthly"
labels:
- npm
- dependabot
groups:
rjsf:
patterns:
- "@rjsf/*"
typescript-eslint:
patterns:
- "@typescript-eslint/*"
- "typescript-eslint"
babel:
patterns:
- "@babel/*"
deckgl:
patterns:
- "@deck.gl/*"
lumagl:
patterns:
- "@luma.gl/*"
storybook:
patterns:
- "@storybook/*"
- "storybook"
- "eslint-plugin-storybook"
open-pull-requests-limit: 30
versioning-strategy: increase
cooldown:
default-days: 7
- package-ecosystem: "pip"
directory: "/"
# NOTE: `uv` support is in beta, more details here:
# https://github.com/dependabot/dependabot-core/pull/10040#issuecomment-2696978430
- package-ecosystem: "uv"
directory: "requirements/"
open-pull-requests-limit: 10
# Bump the lower bound to the new version, not just widen the upper
# bound. Without this, a `sqlglot>=28.10.0, <29` constraint upgraded
# to `<30` would keep the stale lower bound forever, dragging
# transitively-resolved versions with it. See #40186 (review thread).
versioning-strategy: increase
schedule:
interval: "weekly"
labels:
- pip
- uv
- dependabot
cooldown:
default-days: 7
- package-ecosystem: "npm"
directory: ".github/actions"
schedule:
interval: "daily"
interval: "monthly"
open-pull-requests-limit: 10
versioning-strategy: increase
cooldown:
default-days: 7
- package-ecosystem: "npm"
directory: "/docs/"
schedule:
interval: "daily"
groups:
storybook:
patterns:
- "@storybook/*"
- "storybook"
docusaurus:
patterns:
- "@docusaurus/*"
docusaurus-openapi:
patterns:
- "docusaurus-plugin-openapi-docs"
- "docusaurus-theme-openapi-docs"
typescript-eslint:
patterns:
- "@typescript-eslint/*"
- "typescript-eslint"
interval: "monthly"
open-pull-requests-limit: 10
versioning-strategy: increase
cooldown:
default-days: 7
- package-ecosystem: "npm"
directory: "/superset-websocket/"
schedule:
interval: "daily"
interval: "monthly"
labels:
- npm
- dependabot
versioning-strategy: increase
cooldown:
default-days: 7
- package-ecosystem: "npm"
directory: "/superset-websocket/utils/client-ws-app/"
schedule:
interval: "daily"
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 10
versioning-strategy: increase
cooldown:
default-days: 7
# Now for all of our plugins and packages!
- package-ecosystem: "npm"
directory: "/superset-frontend/plugins/legacy-plugin-chart-calendar/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/plugins/legacy-plugin-chart-histogram/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/plugins/legacy-plugin-chart-partition/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/plugins/legacy-plugin-chart-world-map/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/plugins/plugin-chart-pivot-table/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/plugins/legacy-plugin-chart-chord/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/plugins/legacy-plugin-chart-horizon/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/plugins/legacy-plugin-chart-rose/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/plugins/legacy-preset-chart-deckgl/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/plugins/plugin-chart-table/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/plugins/legacy-plugin-chart-country-map/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/plugins/legacy-plugin-chart-map-box/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/plugins/legacy-plugin-chart-sankey/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/plugins/legacy-preset-chart-nvd3/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/plugins/plugin-chart-word-cloud/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/plugins/legacy-plugin-chart-event-flow/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/plugins/legacy-plugin-chart-paired-t-test/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/plugins/legacy-plugin-chart-sankey-loop/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/plugins/plugin-chart-echarts/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/plugins/preset-chart-xy/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/plugins/legacy-plugin-chart-heatmap/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/plugins/legacy-plugin-chart-parallel-coordinates/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/plugins/legacy-plugin-chart-sunburst/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/plugins/plugin-chart-handlebars/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/packages/generator-superset/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/packages/superset-ui-chart-controls/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/packages/superset-ui-core/"
ignore:
# not until React >= 18.0.0
- dependency-name: "react-markdown"
- dependency-name: "remark-gfm"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/packages/superset-ui-demo/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase
- package-ecosystem: "npm"
directory: "/superset-frontend/packages/superset-ui-switchboard/"
schedule:
interval: "monthly"
labels:
- npm
- dependabot
open-pull-requests-limit: 5
versioning-strategy: increase

15
.github/labeler.yml vendored
View File

@@ -17,11 +17,6 @@
- any-glob-to-any-file:
- 'superset/migrations/**'
"risk:ci-script":
- changed-files:
- any-glob-to-any-file:
- 'scripts/**'
############################################
# Dependencies
############################################
@@ -77,11 +72,6 @@
- any-glob-to-any-file:
- 'superset/translations/zh/**'
"i18n:czech":
- changed-files:
- any-glob-to-any-file:
- 'superset/translations/cs/**'
"i18n:traditional-chinese":
- changed-files:
- any-glob-to-any-file:
@@ -127,11 +117,6 @@
- any-glob-to-any-file:
- 'superset/translations/sk/**'
"i18n:latvian":
- changed-files:
- any-glob-to-any-file:
- 'superset/translations/lv/**'
"i18n:ukrainian":
- changed-files:
- any-glob-to-any-file:

View File

@@ -20,6 +20,10 @@ set -e
GITHUB_WORKSPACE=${GITHUB_WORKSPACE:-.}
ASSETS_MANIFEST="$GITHUB_WORKSPACE/superset/static/assets/manifest.json"
# Rounded job start time, used to create a unique Cypress build id for
# parallelization so we can manually rerun a job after 20 minutes
NONCE=$(echo "$(date "+%Y%m%d%H%M") - ($(date +%M)%20)" | bc)
# Echo only when not in parallel mode
say() {
if [[ $(echo "$INPUT_PARALLEL" | tr '[:lower:]' '[:upper:]') != 'TRUE' ]]; then
@@ -55,15 +59,6 @@ build-assets() {
say "::endgroup::"
}
build-embedded-sdk() {
cd "$GITHUB_WORKSPACE/superset-embedded-sdk"
say "::group::Build embedded SDK bundle for E2E tests"
npm ci
npm run build
say "::endgroup::"
}
build-instrumented-assets() {
cd "$GITHUB_WORKSPACE/superset-frontend"
@@ -114,7 +109,7 @@ testdata() {
say "::group::Load test data"
# must specify PYTHONPATH to make `tests.superset_test_config` importable
export PYTHONPATH="$GITHUB_WORKSPACE"
uv pip install --system -e .
pip install -e .
superset db upgrade
superset load_test_users
superset load_examples --load-test-data
@@ -127,25 +122,11 @@ playwright_testdata() {
say "::group::Load all examples for Playwright tests"
# must specify PYTHONPATH to make `tests.superset_test_config` importable
export PYTHONPATH="$GITHUB_WORKSPACE"
uv pip install --system -e .
pip install -e .
superset db upgrade
superset load_test_users
superset load_examples
superset init
# Enable DML on the examples database so Playwright tests can create/drop
# temporary tables via SQL Lab without depending on external data sources.
superset shell <<'PYEOF'
import sys
from superset.extensions import db
from superset.models.core import Database
examples_db = db.session.query(Database).filter_by(database_name='examples').first()
if not examples_db:
sys.exit('ERROR: examples database not found. load_examples may have failed.')
examples_db.allow_dml = True
db.session.commit()
print('Enabled allow_dml on examples database')
PYEOF
say "::endgroup::"
}
@@ -180,13 +161,10 @@ cypress-run-all() {
local APP_ROOT=$2
cd "$GITHUB_WORKSPACE/superset-frontend/cypress-base"
# Start the Superset backend via gunicorn (not `flask run`). The Flask
# development server is single-threaded and has no crash-recovery, so
# heavy tests (dashboard import/export, SQL Lab) can knock it offline
# for the rest of the run — surfacing as `ECONNREFUSED` / `socket hang up`
# / `Missing CSRF token` cascades. Gunicorn gives us multiple workers,
# a request timeout, and worker-recycling under load.
local serverlog="${HOME}/superset-cypress.log"
# Start Flask and run it in background
# --no-debugger means disable the interactive debugger on the 500 page
# so errors can print to stderr.
local flasklog="${HOME}/flask.log"
local port=8081
CYPRESS_BASE_URL="http://localhost:${port}"
if [ -n "$APP_ROOT" ]; then
@@ -195,58 +173,8 @@ cypress-run-all() {
fi
export CYPRESS_BASE_URL
# Mirrors the args in docker/entrypoints/run-server.sh (1 worker × 20
# gthread threads) to keep parity with production. Multi-worker
# configurations expose timing-sensitive races in the SQL Lab → Explore
# navigation flow under E2E. We diverge from the entrypoint on:
# --timeout 120: heavy dashboard import/export specs exceed the 60s
# default
# --max-requests / --max-requests-jitter: recycle the worker under
# test load to avoid leaks accumulating across the run
# superset.app:create_app(): explicit factory so we don't depend on
# FLASK_APP being exported
nohup gunicorn \
--bind "127.0.0.1:$port" \
--workers 1 \
--worker-class gthread \
--threads 20 \
--timeout 120 \
--max-requests 500 \
--max-requests-jitter 50 \
--access-logfile - \
--error-logfile - \
"superset.app:create_app()" \
>"$serverlog" 2>&1 </dev/null &
local serverPid=$!
# Ensure the backend is cleaned up and its log is emitted even when the
# test runner fails under `set -e`.
trap '
echo "::group::gunicorn log for Cypress run"
cat "'"$serverlog"'" || true
echo "::endgroup::"
kill '"$serverPid"' 2>/dev/null || true
' EXIT
# Wait for the backend to be ready before launching Cypress; otherwise
# the first spec can race the server bind and see connection errors.
local timeout=60
say "Waiting for gunicorn server to start on port $port..."
while [ $timeout -gt 0 ]; do
if curl -f "http://localhost:${port}${APP_ROOT}/health" >/dev/null 2>&1; then
say "gunicorn server is ready"
break
fi
sleep 1
timeout=$((timeout - 1))
done
if [ $timeout -eq 0 ]; then
echo "::error::gunicorn server failed to start within 60 seconds"
echo "::group::Server startup log"
cat "$serverlog"
echo "::endgroup::"
return 1
fi
nohup flask run --no-debugger -p $port >"$flasklog" 2>&1 </dev/null &
local flaskProcessId=$!
USE_DASHBOARD_FLAG=''
if [ "$USE_DASHBOARD" = "true" ]; then
@@ -258,6 +186,13 @@ cypress-run-all() {
# memoryMonitorPid=$!
python ../../scripts/cypress_run.py --parallelism $PARALLELISM --parallelism-id $PARALLEL_ID --group $PARALLEL_ID --retries 5 $USE_DASHBOARD_FLAG
# kill $memoryMonitorPid
# After job is done, print out Flask log for debugging
echo "::group::Flask log for default run"
cat "$flasklog"
echo "::endgroup::"
# make sure the program exits
kill $flaskProcessId
}
playwright-install() {
@@ -275,55 +210,29 @@ playwright-run() {
local APP_ROOT=$1
local TEST_PATH=$2
# Start the Superset backend via gunicorn from the project root.
# See cypress-run-all() above for the rationale — the Flask dev server
# cannot survive the dashboard import/export tests under load.
# Start Flask from the project root (same as Cypress)
cd "$GITHUB_WORKSPACE"
local serverlog="${HOME}/superset-playwright.log"
local flasklog="${HOME}/flask-playwright.log"
local port=8081
# Use 127.0.0.1 explicitly: `flask run` binds IPv4 only, and Node's DNS
# resolution for `localhost` can return `::1` first (IPv6), which then
# refuses against the IPv4 listener and surfaces as
# `connect ECONNREFUSED ::1:<port>` in API helpers driven from Node
# (e.g., the embedded test app's exposed token fetcher).
PLAYWRIGHT_BASE_URL="http://127.0.0.1:${port}"
PLAYWRIGHT_BASE_URL="http://localhost:${port}"
if [ -n "$APP_ROOT" ]; then
export SUPERSET_APP_ROOT=$APP_ROOT
PLAYWRIGHT_BASE_URL=${PLAYWRIGHT_BASE_URL}${APP_ROOT}/
fi
export PLAYWRIGHT_BASE_URL
# See cypress-run-all() above for the args rationale (1 worker × 20
# gthread threads matching docker/entrypoints/run-server.sh, plus a
# 120s timeout and request-recycling for heavy E2E load).
nohup gunicorn \
--bind "127.0.0.1:$port" \
--workers 1 \
--worker-class gthread \
--threads 20 \
--timeout 120 \
--max-requests 500 \
--max-requests-jitter 50 \
--access-logfile - \
--error-logfile - \
"superset.app:create_app()" \
>"$serverlog" 2>&1 </dev/null &
local serverPid=$!
nohup flask run --no-debugger -p $port >"$flasklog" 2>&1 </dev/null &
local flaskProcessId=$!
# Ensure cleanup on exit (and emit the server log on failure)
trap '
echo "::group::gunicorn log for Playwright run"
cat "'"$serverlog"'" || true
echo "::endgroup::"
kill '"$serverPid"' 2>/dev/null || true
' EXIT
# Ensure cleanup on exit
trap "kill $flaskProcessId 2>/dev/null || true" EXIT
# Wait for server to be ready with health check
local timeout=60
say "Waiting for gunicorn server to start on port $port..."
say "Waiting for Flask server to start on port $port..."
while [ $timeout -gt 0 ]; do
if curl -f ${PLAYWRIGHT_BASE_URL}/health >/dev/null 2>&1; then
say "gunicorn server is ready"
say "Flask server is ready"
break
fi
sleep 1
@@ -331,9 +240,9 @@ playwright-run() {
done
if [ $timeout -eq 0 ]; then
echo "::error::gunicorn server failed to start within 60 seconds"
echo "::group::Server startup log"
cat "$serverlog"
echo "::error::Flask server failed to start within 60 seconds"
echo "::group::Flask startup log"
cat "$flasklog"
echo "::endgroup::"
return 1
fi
@@ -348,6 +257,7 @@ playwright-run() {
if ! find "playwright/tests/${TEST_PATH}" -name "*.spec.ts" -type f 2>/dev/null | grep -q .; then
echo "No test files found in ${TEST_PATH} - skipping test run"
say "::endgroup::"
kill $flaskProcessId
return 0
fi
echo "Running tests: ${TEST_PATH}"
@@ -364,6 +274,13 @@ playwright-run() {
fi
say "::endgroup::"
# After job is done, print out Flask log for debugging
echo "::group::Flask log for Playwright run"
cat "$flasklog"
echo "::endgroup::"
# make sure the program exits
kill $flaskProcessId
return $status
}
@@ -387,3 +304,26 @@ monitor_memory() {
sleep 2
done
}
cypress-run-applitools() {
cd "$GITHUB_WORKSPACE/superset-frontend/cypress-base"
local flasklog="${HOME}/flask.log"
local port=8081
local cypress="./node_modules/.bin/cypress run"
local browser=${CYPRESS_BROWSER:-chrome}
export CYPRESS_BASE_URL="http://localhost:${port}"
nohup flask run --no-debugger -p $port >"$flasklog" 2>&1 </dev/null &
local flaskProcessId=$!
$cypress --spec "cypress/applitools/**/*" --browser "$browser" --headless
say "::group::Flask log for default run"
cat "$flasklog"
say "::endgroup::"
# make sure the program exits
kill $flaskProcessId
}

View File

@@ -23,15 +23,16 @@ on:
jobs:
bump-python-package:
runs-on: ubuntu-26.04
runs-on: ubuntu-24.04
permissions:
actions: write
contents: write
pull-requests: write
checks: write
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v4
with:
persist-credentials: true
ref: master
@@ -40,9 +41,9 @@ jobs:
uses: ./.github/actions/setup-supersetbot/
- name: Set up Python ${{ inputs.python-version }}
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
uses: actions/setup-python@v5
with:
python-version: "3.11"
python-version: "3.10"
- name: Install uv
run: pip install uv
@@ -50,31 +51,27 @@ jobs:
- name: supersetbot bump-python -p "${{ github.event.inputs.package }}"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
INPUT_PACKAGE: ${{ github.event.inputs.package }}
INPUT_GROUP: ${{ github.event.inputs.group }}
INPUT_EXTRA_FLAGS: ${{ github.event.inputs.extra-flags }}
INPUT_LIMIT: ${{ github.event.inputs.limit }}
run: |
git config --global user.email "action@github.com"
git config --global user.name "GitHub Action"
PACKAGE_OPT=""
if [ -n "${INPUT_PACKAGE}" ]; then
PACKAGE_OPT="-p ${INPUT_PACKAGE}"
if [ -n "${{ github.event.inputs.package }}" ]; then
PACKAGE_OPT="-p ${{ github.event.inputs.package }}"
fi
GROUP_OPT=""
if [ -n "${INPUT_GROUP}" ]; then
GROUP_OPT="-g ${INPUT_GROUP}"
if [ -n "${{ github.event.inputs.group }}" ]; then
GROUP_OPT="-g ${{ github.event.inputs.group }}"
fi
EXTRA_FLAGS="${INPUT_EXTRA_FLAGS}"
EXTRA_FLAGS="${{ github.event.inputs.extra-flags }}"
supersetbot bump-python \
--verbose \
--use-current-repo \
--include-subpackages \
--limit ${INPUT_LIMIT} \
--limit ${{ github.event.inputs.limit }} \
$PACKAGE_OPT \
$GROUP_OPT \
$EXTRA_FLAGS

43
.github/workflows/cancel_duplicates.yml vendored Normal file
View File

@@ -0,0 +1,43 @@
name: Cancel Duplicates
on:
workflow_run:
workflows:
- "Miscellaneous"
types:
- requested
jobs:
cancel-duplicate-runs:
name: Cancel duplicate workflow runs
runs-on: ubuntu-24.04
permissions:
actions: write
contents: read
steps:
- name: Check number of queued tasks
id: check_queued
env:
GITHUB_TOKEN: ${{ github.token }}
GITHUB_REPO: ${{ github.repository }}
run: |
get_count() {
echo $(curl -s -H "Authorization: token $GITHUB_TOKEN" \
"https://api.github.com/repos/$GITHUB_REPO/actions/runs?status=$1" | \
jq ".total_count")
}
count=$(( `get_count queued` + `get_count in_progress` ))
echo "Found $count unfinished jobs."
echo "count=$count" >> $GITHUB_OUTPUT
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
if: steps.check_queued.outputs.count >= 20
uses: actions/checkout@v4
- name: Cancel duplicate workflow runs
if: steps.check_queued.outputs.count >= 20
env:
GITHUB_TOKEN: ${{ github.token }}
GITHUB_REPOSITORY: ${{ github.repository }}
run: |
pip install click requests typing_extensions python-dateutil
python ./scripts/cancel_github_workflows.py

View File

@@ -8,10 +8,6 @@ on:
pull_request:
types: [synchronize, opened, reopened, ready_for_review]
permissions:
contents: read
pull-requests: read
# cancel previous workflow jobs for PRs
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
@@ -19,10 +15,10 @@ concurrency:
jobs:
check-python-deps:
runs-on: ubuntu-26.04
runs-on: ubuntu-22.04
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v4
with:
persist-credentials: false
submodules: recursive
@@ -38,19 +34,6 @@ jobs:
if: steps.check.outputs.python
uses: ./.github/actions/setup-backend/
# Authenticate the Docker daemon so the python:slim pull in
# uv-pip-compile.sh uses our (much higher) authenticated rate limit
# instead of the shared-runner anonymous one. Best-effort: on fork PRs the
# secrets are unavailable, so this no-ops and the pull falls back to
# anonymous (covered by the retry loop in the script).
- name: Login to Docker Hub
if: steps.check.outputs.python
continue-on-error: true
uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0
with:
username: ${{ secrets.DOCKERHUB_USER }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Run uv
if: steps.check.outputs.python
run: ./scripts/uv-pip-compile.sh

View File

@@ -19,17 +19,15 @@ concurrency:
jobs:
check_db_migration_conflict:
name: Check DB migration conflict
runs-on: ubuntu-26.04
runs-on: ubuntu-24.04
permissions:
contents: read
pull-requests: write
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
uses: actions/checkout@v4
- name: Check and notify
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
uses: actions/github-script@v7
with:
github-token: ${{ github.token }}
script: |
@@ -71,7 +69,7 @@ jobs:
`❗ @${pull.user.login} Your base branch \`${currentBranch}\` has ` +
'also updated `superset/migrations`.\n' +
'\n' +
'**Please consider rebasing your branch and [resolving potential db migration conflicts](https://superset.apache.org/docs/contributing/development#merging-db-migrations).**',
'**Please consider rebasing your branch and [resolving potential db migration conflicts](https://github.com/apache/superset/blob/master/CONTRIBUTING.md#merging-db-migrations).**',
});
}
}

82
.github/workflows/claude.yml vendored Normal file
View File

@@ -0,0 +1,82 @@
name: Claude PR Assistant
on:
issue_comment:
types: [created]
pull_request_review_comment:
types: [created]
jobs:
check-permissions:
if: |
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
(github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude'))
runs-on: ubuntu-latest
outputs:
allowed: ${{ steps.check.outputs.allowed }}
steps:
- name: Check if user is allowed
id: check
run: |
# List of allowed users
ALLOWED_USERS="mistercrunch,rusackas"
# Get the commenter's username
COMMENTER="${{ github.event.comment.user.login }}"
echo "Checking permissions for user: $COMMENTER"
# Check if user is in allowed list
if [[ ",$ALLOWED_USERS," == *",$COMMENTER,"* ]]; then
echo "allowed=true" >> $GITHUB_OUTPUT
echo "✅ User $COMMENTER is allowed to use Claude"
else
echo "allowed=false" >> $GITHUB_OUTPUT
echo "❌ User $COMMENTER is not allowed to use Claude"
fi
deny-access:
needs: check-permissions
if: needs.check-permissions.outputs.allowed == 'false'
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
steps:
- name: Comment access denied
uses: actions/github-script@v7
with:
script: |
const message = `👋 Hi @${{ github.event.comment.user.login || github.event.review.user.login || github.event.issue.user.login }}!
Thanks for trying to use Claude Code, but currently only certain team members have access to this feature.
If you believe you should have access, please contact a project maintainer.`;
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: message
});
claude-code-action:
needs: check-permissions
if: needs.check-permissions.outputs.allowed == 'true'
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
issues: write
id-token: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Run Claude PR Action
uses: anthropics/claude-code-action@beta
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
timeout_minutes: "60"

View File

@@ -15,39 +15,12 @@ concurrency:
cancel-in-progress: true
jobs:
changes:
runs-on: ubuntu-26.04
timeout-minutes: 10
permissions:
contents: read
pull-requests: read
outputs:
python: ${{ steps.check.outputs.python }}
frontend: ${{ steps.check.outputs.frontend }}
steps:
- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
- name: Check for file changes
id: check
uses: ./.github/actions/change-detector/
with:
token: ${{ secrets.GITHUB_TOKEN }}
analyze:
name: Analyze
needs: changes
# Skip on PRs that touch neither code group (e.g. docs-only) so the
# analysis runners don't spin up. push/schedule runs always proceed:
# the change-detector returns "all changed" for non-PR events.
if: needs.changes.outputs.python == 'true' || needs.changes.outputs.frontend == 'true'
runs-on: ubuntu-26.04
timeout-minutes: 30
runs-on: ubuntu-24.04
permissions:
actions: read
contents: read
pull-requests: read
security-events: write
strategy:
@@ -58,13 +31,17 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v4
- name: Check for file changes
id: check
uses: ./.github/actions/change-detector/
with:
persist-credentials: false
token: ${{ secrets.GITHUB_TOKEN }}
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
@@ -75,6 +52,7 @@ jobs:
# queries: security-extended,security-and-quality
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: github/codeql-action/analyze@v3
with:
category: "/language:${{matrix.language}}"

View File

@@ -24,14 +24,12 @@ permissions:
jobs:
dependency-review:
if: github.event_name == 'pull_request'
runs-on: ubuntu-26.04
runs-on: ubuntu-24.04
steps:
- name: "Checkout Repository"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
uses: actions/checkout@v4
- name: "Dependency Review"
uses: actions/dependency-review-action@a1d282b36b6f3519aa1f3fc636f609c47dddb294 # v5.0.0
uses: actions/dependency-review-action@v4
continue-on-error: true
with:
fail-on-severity: critical
@@ -41,19 +39,21 @@ jobs:
# pkg:npm/store2@2.14.2
# adding an exception for an ambigious license on store2, which has been resolved in
# the latest version. It's MIT: https://github.com/nbubna/store/blob/master/LICENSE-MIT
# pkg:npm/applitools/*
# adding exception for all applitools modules (eyes-cypress and its dependencies),
# which has an explicit OSS license approved by ASF
# license: https://applitools.com/legal/open-source-terms-of-use/
# pkg:npm/node-forge@1.3.1
# selecting BSD-3-Clause licensing terms for node-forge to ensure compatibility with Apache
allow-dependencies-licenses: pkg:npm/rgbcolor, pkg:npm/jszip@3.10.1
allow-dependencies-licenses: pkg:npm/store2@2.14.2, pkg:npm/applitools/core, pkg:npm/applitools/core-base, pkg:npm/applitools/css-tree, pkg:npm/applitools/ec-client, pkg:npm/applitools/eg-socks5-proxy-server, pkg:npm/applitools/eyes, pkg:npm/applitools/eyes-cypress, pkg:npm/applitools/nml-client, pkg:npm/applitools/tunnel-client, pkg:npm/applitools/utils, pkg:npm/node-forge@1.3.1, pkg:npm/rgbcolor, pkg:npm/jszip@3.10.1
python-dependency-liccheck:
# NOTE: Configuration for liccheck lives in our pyproject.yml.
# You cannot use a liccheck.ini file in this workflow.
runs-on: ubuntu-26.04
runs-on: ubuntu-22.04
steps:
- name: "Checkout Repository"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
uses: actions/checkout@v4
- name: Setup Python
uses: ./.github/actions/setup-backend/

View File

@@ -9,57 +9,27 @@ on:
branches:
- "master"
permissions:
contents: read
pull-requests: read
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
cancel-in-progress: true
jobs:
changes:
runs-on: ubuntu-26.04
timeout-minutes: 10
permissions:
contents: read
pull-requests: read
outputs:
python: ${{ steps.check.outputs.python }}
frontend: ${{ steps.check.outputs.frontend }}
docker: ${{ steps.check.outputs.docker }}
steps:
- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
- name: Check for file changes
id: check
uses: ./.github/actions/change-detector/
with:
token: ${{ secrets.GITHUB_TOKEN }}
setup_matrix:
runs-on: ubuntu-26.04
timeout-minutes: 5
runs-on: ubuntu-24.04
outputs:
matrix_config: ${{ steps.set_matrix.outputs.matrix_config }}
steps:
- id: set_matrix
run: |
MATRIX_CONFIG=$(if [ "${{ github.event_name }}" == "pull_request" ]; then echo '["dev", "lean"]'; else echo '["dev", "lean", "websocket", "dockerize", "py311", "py312"]'; fi)
MATRIX_CONFIG=$(if [ "${{ github.event_name }}" == "pull_request" ]; then echo '["dev", "lean"]'; else echo '["dev", "lean", "py310", "websocket", "dockerize", "py311"]'; fi)
echo "matrix_config=${MATRIX_CONFIG}" >> $GITHUB_OUTPUT
echo $GITHUB_OUTPUT
docker-build:
name: docker-build
needs: [setup_matrix, changes]
if: >-
needs.changes.outputs.python == 'true' ||
needs.changes.outputs.frontend == 'true' ||
needs.changes.outputs.docker == 'true'
runs-on: ubuntu-26.04
timeout-minutes: 60
needs: setup_matrix
runs-on: ubuntu-24.04
strategy:
matrix:
build_preset: ${{fromJson(needs.setup_matrix.outputs.matrix_config)}}
@@ -70,30 +40,20 @@ jobs:
IMAGE_TAG: apache/superset:GHA-${{ matrix.build_preset }}-${{ github.run_id }}
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v4
with:
persist-credentials: false
- name: Free up disk space
shell: bash
run: |
# Reclaim large preinstalled toolchains we don't use. The image
# build, and especially the docker-compose sanity check (which
# rebuilds from scratch whenever the registry cache image
# apache/superset-cache is unavailable), can otherwise exhaust the
# runner's root disk and fail with "no space left on device".
echo "Disk before cleanup:"; df -h /
sudo rm -rf \
/usr/share/dotnet \
/usr/local/lib/android \
/opt/ghc \
/usr/local/.ghcup \
/opt/hostedtoolcache/CodeQL \
/usr/local/share/boost || true
echo "Disk after cleanup:"; df -h /
- name: Check for file changes
id: check
uses: ./.github/actions/change-detector/
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Docker Environment
if: steps.check.outputs.python || steps.check.outputs.frontend || steps.check.outputs.docker
uses: ./.github/actions/setup-docker
with:
dockerhub-user: ${{ secrets.DOCKERHUB_USER }}
@@ -101,63 +61,40 @@ jobs:
build: "true"
- name: Setup supersetbot
if: steps.check.outputs.python || steps.check.outputs.frontend || steps.check.outputs.docker
uses: ./.github/actions/setup-supersetbot/
- name: Build Docker Image
if: steps.check.outputs.python || steps.check.outputs.frontend || steps.check.outputs.docker
shell: bash
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BUILD_PRESET: ${{ matrix.build_preset }}
run: |
# Single platform builds in pull_request context to speed things up
if [ "$GITHUB_EVENT_NAME" = "push" ]; then
if [ "${{ github.event_name }}" = "push" ]; then
PLATFORM_ARG="--platform linux/arm64 --platform linux/amd64"
# can only --load images in single-platform builds
PUSH_OR_LOAD="--push"
elif [ "$GITHUB_EVENT_NAME" = "pull_request" ]; then
elif [ "${{ github.event_name }}" = "pull_request" ]; then
PLATFORM_ARG="--platform linux/amd64"
PUSH_OR_LOAD="--load"
fi
# Retry to absorb transient Docker Hub registry errors (base-image
# pull timeouts, 504/401 on push, ECONNRESET) that otherwise fail
# the whole job. buildx reuses the buildkit layer cache from the
# failed attempt, so a retry mostly re-does just the failed push.
#
# supersetbot's "dev"/"lean" presets pin their own --build-arg
# PY_VER, which lands ahead of --extra-flags on the assembled
# buildx command line; docker/buildx keeps the last value for a
# repeated --build-arg key, so appending PY_VER here overrides
# supersetbot's pin and keeps the build on the Dockerfile's own
# supported Python version.
for attempt in 1 2 3; do
if supersetbot docker \
$PUSH_OR_LOAD \
--preset "$BUILD_PRESET" \
--context "$EVENT" \
--context-ref "$RELEASE" $FORCE_LATEST \
--extra-flags "--build-arg PY_VER=3.11.14-slim-trixie --build-arg INCLUDE_CHROMIUM=false --tag $IMAGE_TAG" \
$PLATFORM_ARG; then
break
fi
if [ "$attempt" -eq 3 ]; then
echo "::error::supersetbot docker build failed after 3 attempts"
exit 1
fi
echo "::warning::Build attempt ${attempt} failed; retrying in 30s..."
sleep 30
done
supersetbot docker \
$PUSH_OR_LOAD \
--preset ${{ matrix.build_preset }} \
--context "$EVENT" \
--context-ref "$RELEASE" $FORCE_LATEST \
--extra-flags "--build-arg INCLUDE_CHROMIUM=false --tag $IMAGE_TAG" \
$PLATFORM_ARG
# in the context of push (using multi-platform build), we need to pull the image locally
- name: Docker pull
if: github.event_name == 'push'
run: |
for i in 1 2 3; do
docker pull $IMAGE_TAG && break
[ $i -lt 3 ] && sleep 30
done
if: github.event_name == 'push' && (steps.check.outputs.python || steps.check.outputs.frontend || steps.check.outputs.docker)
run: docker pull $IMAGE_TAG
- name: Print docker stats
if: steps.check.outputs.python || steps.check.outputs.frontend || steps.check.outputs.docker
run: |
echo "SHA: ${{ github.sha }}"
echo "IMAGE: $IMAGE_TAG"
@@ -165,12 +102,10 @@ jobs:
docker history $IMAGE_TAG
- name: docker-compose sanity check
if: matrix.build_preset == 'dev'
if: (steps.check.outputs.python || steps.check.outputs.frontend || steps.check.outputs.docker) && (matrix.build_preset == 'dev' || matrix.build_preset == 'lean')
shell: bash
env:
BUILD_PRESET: ${{ matrix.build_preset }}
run: |
export SUPERSET_BUILD_TARGET=$BUILD_PRESET
export SUPERSET_BUILD_TARGET=${{ matrix.build_preset }}
# This should reuse the CACHED image built in the previous steps
docker compose build superset-init --build-arg DEV_MODE=false --build-arg INCLUDE_CHROMIUM=false
docker compose up superset-init --exit-code-from superset-init
@@ -178,31 +113,20 @@ jobs:
docker-compose-image-tag:
# Run this job only on pushes to master (not for PRs)
# goal is to check that building the latest image works, not required for all PR pushes
needs: changes
if: github.event_name == 'push' && github.ref == 'refs/heads/master' && needs.changes.outputs.docker == 'true'
runs-on: ubuntu-26.04
timeout-minutes: 30
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
runs-on: ubuntu-24.04
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v4
with:
persist-credentials: false
- name: Free up disk space
shell: bash
run: |
# The sanity check rebuilds the image from scratch whenever the
# registry cache image apache/superset-cache is unavailable, which
# can exhaust the runner's root disk ("no space left on device").
echo "Disk before cleanup:"; df -h /
sudo rm -rf \
/usr/share/dotnet \
/usr/local/lib/android \
/opt/ghc \
/usr/local/.ghcup \
/opt/hostedtoolcache/CodeQL \
/usr/local/share/boost || true
echo "Disk after cleanup:"; df -h /
- name: Check for file changes
id: check
uses: ./.github/actions/change-detector/
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Docker Environment
if: steps.check.outputs.docker
uses: ./.github/actions/setup-docker
with:
dockerhub-user: ${{ secrets.DOCKERHUB_USER }}
@@ -210,6 +134,7 @@ jobs:
build: "false"
install-docker-compose: "true"
- name: docker-compose sanity check
if: steps.check.outputs.docker
shell: bash
run: |
docker compose -f docker-compose-image-tag.yml up superset-init --exit-code-from superset-init

View File

@@ -6,33 +6,34 @@ on:
- "master"
- "[0-9].[0-9]*"
permissions:
contents: read
jobs:
config:
runs-on: ubuntu-24.04
outputs:
has-secrets: ${{ steps.check.outputs.has-secrets }}
steps:
- name: "Check for secrets"
id: check
shell: bash
run: |
if [ -n "${{ (secrets.NPM_TOKEN != '') || '' }}" ]; then
echo "has-secrets=1" >> "$GITHUB_OUTPUT"
fi
build:
# Publishing uses npm trusted publishing (OIDC), so there is no NPM_TOKEN to
# gate on. Restrict to the canonical repo: forks cannot mint a valid OIDC
# token for this package and must not publish.
if: github.repository == 'apache/superset'
runs-on: ubuntu-26.04
permissions:
contents: read
id-token: write # required for npm trusted publishing (OIDC)
needs: config
if: needs.config.outputs.has-secrets
runs-on: ubuntu-24.04
defaults:
run:
working-directory: superset-embedded-sdk
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
persist-credentials: false
# Note: registry-url is intentionally omitted. When set, actions/setup-node
# writes an .npmrc with `_authToken=${NODE_AUTH_TOKEN}` and a placeholder
# token, which makes npm attempt token auth and skip the OIDC
# trusted-publishing exchange. With no .npmrc auth line, npm authenticates
# via OIDC against the default registry (registry.npmjs.org).
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version-file: "./superset-embedded-sdk/.nvmrc"
node-version-file: './superset-embedded-sdk/.nvmrc'
registry-url: 'https://registry.npmjs.org'
- run: npm ci
- run: npm run ci:release
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

View File

@@ -6,9 +6,6 @@ on:
- "superset-embedded-sdk/**"
types: [synchronize, opened, reopened, ready_for_review]
permissions:
contents: read
# cancel previous workflow jobs for PRs
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
@@ -16,18 +13,16 @@ concurrency:
jobs:
embedded-sdk-test:
runs-on: ubuntu-26.04
runs-on: ubuntu-24.04
defaults:
run:
working-directory: superset-embedded-sdk
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
persist-credentials: false
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version-file: "./superset-embedded-sdk/.nvmrc"
registry-url: "https://registry.npmjs.org"
node-version-file: './superset-embedded-sdk/.nvmrc'
registry-url: 'https://registry.npmjs.org'
- run: npm ci
- run: npm test
- run: npm run build

View File

@@ -0,0 +1,75 @@
name: Cleanup ephemeral envs (PR close)
on:
pull_request_target:
types: [closed]
jobs:
config:
runs-on: ubuntu-24.04
outputs:
has-secrets: ${{ steps.check.outputs.has-secrets }}
steps:
- name: "Check for secrets"
id: check
shell: bash
run: |
if [ -n "${{ (secrets.AWS_ACCESS_KEY_ID != '' && secrets.AWS_SECRET_ACCESS_KEY != '') || '' }}" ]; then
echo "has-secrets=1" >> "$GITHUB_OUTPUT"
fi
ephemeral-env-cleanup:
needs: config
if: needs.config.outputs.has-secrets
name: Cleanup ephemeral envs
runs-on: ubuntu-24.04
permissions:
pull-requests: write
steps:
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-west-2
- name: Describe ECS service
id: describe-services
run: |
echo "active=$(aws ecs describe-services --cluster superset-ci --services pr-${{ github.event.number }}-service | jq '.services[] | select(.status == "ACTIVE") | any')" >> $GITHUB_OUTPUT
- name: Delete ECS service
if: steps.describe-services.outputs.active == 'true'
id: delete-service
run: |
aws ecs delete-service \
--cluster superset-ci \
--service pr-${{ github.event.number }}-service \
--force
- name: Login to Amazon ECR
if: steps.describe-services.outputs.active == 'true'
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
- name: Delete ECR image tag
if: steps.describe-services.outputs.active == 'true'
id: delete-image-tag
run: |
aws ecr batch-delete-image \
--registry-id $(echo "${{ steps.login-ecr.outputs.registry }}" | grep -Eo "^[0-9]+") \
--repository-name superset-ci \
--image-ids imageTag=pr-${{ github.event.number }}
- name: Comment (success)
if: steps.describe-services.outputs.active == 'true'
uses: actions/github-script@v7
with:
github-token: ${{github.token}}
script: |
github.rest.issues.createComment({
issue_number: ${{ github.event.number }},
owner: context.repo.owner,
repo: context.repo.repo,
body: 'Ephemeral environment shutdown and build artifacts deleted.'
})

333
.github/workflows/ephemeral-env.yml vendored Normal file
View File

@@ -0,0 +1,333 @@
name: Ephemeral env workflow
# Example manual trigger:
# gh workflow run ephemeral-env.yml --ref fix_ephemerals --field label_name="testenv-up" --field issue_number=666
on:
pull_request_target:
types:
- labeled
workflow_dispatch:
inputs:
label_name:
description: 'Label name to simulate label-based /testenv trigger'
required: true
default: 'testenv-up'
issue_number:
description: 'Issue or PR number'
required: true
jobs:
ephemeral-env-label:
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}-label
cancel-in-progress: true
name: Evaluate ephemeral env label trigger
runs-on: ubuntu-24.04
permissions:
pull-requests: write
outputs:
slash-command: ${{ steps.eval-label.outputs.result }}
feature-flags: ${{ steps.eval-feature-flags.outputs.result }}
sha: ${{ steps.get-sha.outputs.sha }}
env:
DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
steps:
- name: Check for the "testenv-up" label
id: eval-label
run: |
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
LABEL_NAME="${{ github.event.inputs.label_name }}"
else
LABEL_NAME="${{ github.event.label.name }}"
fi
echo "Evaluating label: $LABEL_NAME"
if [[ "$LABEL_NAME" == "testenv-up" ]]; then
echo "result=up" >> $GITHUB_OUTPUT
else
echo "result=noop" >> $GITHUB_OUTPUT
fi
- name: Get event SHA
id: get-sha
if: steps.eval-label.outputs.result == 'up'
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
let prSha;
// If event is workflow_dispatch, use the issue_number from inputs
if (context.eventName === "workflow_dispatch") {
const prNumber = "${{ github.event.inputs.issue_number }}";
if (!prNumber) {
console.log("No PR number found.");
return;
}
// Fetch PR details using the provided issue_number
const { data: pr } = await github.rest.pulls.get({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: prNumber
});
prSha = pr.head.sha;
} else {
// If it's not workflow_dispatch, use the PR head sha from the event
prSha = context.payload.pull_request.head.sha;
}
console.log(`PR SHA: ${prSha}`);
core.setOutput("sha", prSha);
- name: Looking for feature flags in PR description
uses: actions/github-script@v7
id: eval-feature-flags
if: steps.eval-label.outputs.result == 'up'
with:
script: |
const description = context.payload.pull_request
? context.payload.pull_request.body || ''
: context.payload.inputs.pr_description || '';
const pattern = /FEATURE_(\w+)=(\w+)/g;
let results = [];
[...description.matchAll(pattern)].forEach(match => {
const config = {
name: `SUPERSET_FEATURE_${match[1]}`,
value: match[2],
};
results.push(config);
});
return results;
- name: Reply with confirmation comment
uses: actions/github-script@v7
if: steps.eval-label.outputs.result == 'up'
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const action = '${{ steps.eval-label.outputs.result }}';
const user = context.actor;
const runId = context.runId;
const workflowUrl = `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${runId}`;
const issueNumber = context.payload.pull_request
? context.payload.pull_request.number
: context.payload.inputs.issue_number;
if (!issueNumber) {
throw new Error("Issue number is not available.");
}
const body = `@${user} Processing your ephemeral environment request [here](${workflowUrl}).` +
` Action: **${action}**.` +
` More information on [how to use or configure ephemeral environments]` +
`(https://superset.apache.org/docs/contributing/howtos/#github-ephemeral-environments)`;
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
body,
});
ephemeral-docker-build:
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}-build
cancel-in-progress: true
needs: ephemeral-env-label
if: needs.ephemeral-env-label.outputs.slash-command == 'up'
name: ephemeral-docker-build
runs-on: ubuntu-24.04
steps:
- name: "Checkout ${{ github.ref }} ( ${{ needs.ephemeral-env-label.outputs.sha }} : ${{steps.get-sha.outputs.sha}} )"
uses: actions/checkout@v4
with:
ref: ${{ needs.ephemeral-env-label.outputs.sha }}
persist-credentials: false
- name: Setup Docker Environment
uses: ./.github/actions/setup-docker
with:
dockerhub-user: ${{ secrets.DOCKERHUB_USER }}
dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }}
build: "true"
install-docker-compose: "false"
- name: Setup supersetbot
uses: ./.github/actions/setup-supersetbot/
- name: Build ephemeral env image
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
supersetbot docker \
--push \
--load \
--preset ci \
--platform linux/amd64 \
--context-ref "$RELEASE" \
--extra-flags "--build-arg INCLUDE_CHROMIUM=false"
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-west-2
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
- name: Load, tag and push image to ECR
id: push-image
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
ECR_REPOSITORY: superset-ci
IMAGE_TAG: apache/superset:${{ needs.ephemeral-env-label.outputs.sha }}-ci
PR_NUMBER: ${{ github.event.inputs.issue_number || github.event.pull_request.number }}
run: |
docker tag $IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:pr-$PR_NUMBER-ci
docker push -a $ECR_REGISTRY/$ECR_REPOSITORY
ephemeral-env-up:
needs: [ephemeral-env-label, ephemeral-docker-build]
if: needs.ephemeral-env-label.outputs.slash-command == 'up'
name: Spin up an ephemeral environment
runs-on: ubuntu-24.04
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-west-2
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
- name: Check target image exists in ECR
id: check-image
continue-on-error: true
env:
PR_NUMBER: ${{ github.event.inputs.issue_number || github.event.pull_request.number }}
run: |
aws ecr describe-images \
--registry-id $(echo "${{ steps.login-ecr.outputs.registry }}" | grep -Eo "^[0-9]+") \
--repository-name superset-ci \
--image-ids imageTag=pr-$PR_NUMBER-ci
- name: Fail on missing container image
if: steps.check-image.outcome == 'failure'
uses: actions/github-script@v7
with:
github-token: ${{ github.token }}
script: |
const errMsg = '@${{ github.event.comment.user.login }} Container image not yet published for this PR. Please try again when build is complete.';
github.rest.issues.createComment({
issue_number: ${{ github.event.inputs.issue_number || github.event.pull_request.number }},
owner: context.repo.owner,
repo: context.repo.repo,
body: errMsg
});
core.setFailed(errMsg);
- name: Fill in the new image ID in the Amazon ECS task definition
id: task-def
uses: aws-actions/amazon-ecs-render-task-definition@v1
with:
task-definition: .github/workflows/ecs-task-definition.json
container-name: superset-ci
image: ${{ steps.login-ecr.outputs.registry }}/superset-ci:pr-${{ github.event.inputs.issue_number || github.event.pull_request.number }}-ci
- name: Update env vars in the Amazon ECS task definition
run: |
cat <<< "$(jq '.containerDefinitions[0].environment += ${{ needs.ephemeral-env-label.outputs.feature-flags }}' < ${{ steps.task-def.outputs.task-definition }})" > ${{ steps.task-def.outputs.task-definition }}
- name: Describe ECS service
id: describe-services
run: |
echo "active=$(aws ecs describe-services --cluster superset-ci --services pr-${{ github.event.inputs.issue_number || github.event.pull_request.number }}-service | jq '.services[] | select(.status == "ACTIVE") | any')" >> $GITHUB_OUTPUT
- name: Create ECS service
id: create-service
if: steps.describe-services.outputs.active != 'true'
env:
ECR_SUBNETS: subnet-0e15a5034b4121710,subnet-0e8efef4a72224974
ECR_SECURITY_GROUP: sg-092ff3a6ae0574d91
PR_NUMBER: ${{ github.event.inputs.issue_number || github.event.pull_request.number }}
run: |
aws ecs create-service \
--cluster superset-ci \
--service-name pr-$PR_NUMBER-service \
--task-definition superset-ci \
--launch-type FARGATE \
--desired-count 1 \
--platform-version LATEST \
--network-configuration "awsvpcConfiguration={subnets=[$ECR_SUBNETS],securityGroups=[$ECR_SECURITY_GROUP],assignPublicIp=ENABLED}" \
--tags key=pr,value=$PR_NUMBER key=github_user,value=${{ github.actor }}
- name: Deploy Amazon ECS task definition
id: deploy-task
uses: aws-actions/amazon-ecs-deploy-task-definition@v2
with:
task-definition: ${{ steps.task-def.outputs.task-definition }}
service: pr-${{ github.event.inputs.issue_number || github.event.pull_request.number }}-service
cluster: superset-ci
wait-for-service-stability: true
wait-for-minutes: 10
- name: List tasks
id: list-tasks
run: |
echo "task=$(aws ecs list-tasks --cluster superset-ci --service-name pr-${{ github.event.inputs.issue_number || github.event.pull_request.number }}-service | jq '.taskArns | first')" >> $GITHUB_OUTPUT
- name: Get network interface
id: get-eni
run: |
echo "eni=$(aws ecs describe-tasks --cluster superset-ci --tasks ${{ steps.list-tasks.outputs.task }} | jq '.tasks[0].attachments[0].details | map(select(.name=="networkInterfaceId"))[0].value')" >> $GITHUB_OUTPUT
- name: Get public IP
id: get-ip
run: |
echo "ip=$(aws ec2 describe-network-interfaces --network-interface-ids ${{ steps.get-eni.outputs.eni }} | jq -r '.NetworkInterfaces | first | .Association.PublicIp')" >> $GITHUB_OUTPUT
- name: Comment (success)
if: ${{ success() }}
uses: actions/github-script@v7
with:
github-token: ${{github.token}}
script: |
const issue_number = context.payload.inputs?.issue_number || context.issue.number;
github.rest.issues.createComment({
issue_number: issue_number,
owner: context.repo.owner,
repo: context.repo.repo,
body: `@${{ github.actor }} Ephemeral environment spinning up at http://${{ steps.get-ip.outputs.ip }}:8080. Credentials are 'admin'/'admin'. Please allow several minutes for bootstrapping and startup.`
});
- name: Comment (failure)
if: ${{ failure() }}
uses: actions/github-script@v7
with:
github-token: ${{github.token}}
script: |
const issue_number = context.payload.inputs?.issue_number || context.issue.number;
github.rest.issues.createComment({
issue_number: issue_number,
owner: context.repo.owner,
repo: context.repo.repo,
body: '@${{ github.event.inputs.user_login || github.event.comment.user.login }} Ephemeral environment creation failed. Please check the Actions logs for details.'
})

View File

@@ -6,12 +6,9 @@ on:
- "master"
- "[0-9].[0-9]*"
permissions:
contents: read
jobs:
config:
runs-on: ubuntu-26.04
runs-on: ubuntu-24.04
outputs:
has-secrets: ${{ steps.check.outputs.has-secrets }}
steps:
@@ -19,25 +16,23 @@ jobs:
id: check
shell: bash
run: |
if [ -n "${FOSSA_API_KEY}" ]; then
if [ -n "${{ (secrets.FOSSA_API_KEY != '' ) || '' }}" ]; then
echo "has-secrets=1" >> "$GITHUB_OUTPUT"
fi
env:
FOSSA_API_KEY: ${{ (secrets.FOSSA_API_KEY != '' ) || '' }}
license_check:
needs: config
if: needs.config.outputs.has-secrets
name: Generate Report
runs-on: ubuntu-26.04
runs-on: ubuntu-24.04
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v4
with:
persist-credentials: false
submodules: recursive
- name: Setup Java
uses: actions/setup-java@03ad4de0992f5dab5e18fcb136590ce7c4a0ac95 # v5.6.0
uses: actions/setup-java@v4
with:
distribution: "temurin"
java-version: "11"

View File

@@ -6,44 +6,23 @@ on:
- "master"
- "[0-9].[0-9]*"
pull_request:
branches:
- "**"
permissions:
contents: read
# cancel previous workflow jobs for PRs
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
cancel-in-progress: true
types: [synchronize, opened, reopened, ready_for_review]
jobs:
validate-all-ghas:
runs-on: ubuntu-26.04
permissions:
contents: read
# Required for the zizmor action to upload its SARIF results to
# GitHub code scanning (advanced-security is enabled by default).
security-events: write
runs-on: ubuntu-24.04
steps:
- name: Checkout Repository
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
uses: actions/setup-node@v4
with:
node-version: "20"
node-version: '20'
- name: Install Dependencies
# Versions are pinned to avoid ad-hoc, unpinned package installs.
# Bump deliberately when upgrading.
# zizmor: ignore[adhoc-packages] - @action-validator is a global CLI tool installed to validate the repo's workflows; a global CLI install has no application manifest/lockfile context, and the versions are pinned above
run: npm install -g @action-validator/core@0.6.0 @action-validator/cli@0.6.0
run: npm install -g @action-validator/core @action-validator/cli --save-dev
- name: Run Script
run: bash .github/workflows/github-action-validator.sh
- name: Check for security issues on GHA workflows
uses: zizmorcore/zizmor-action@6599ee8b7a49aef6a770f63d261d214911a7ce02 # v0.6.0

View File

@@ -1,115 +0,0 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
name: Hold Label CI Gate
on:
pull_request:
types: [labeled, unlabeled]
permissions: {}
jobs:
cancel-on-hold:
name: Cancel CI runs when hold label applied
if: github.event.action == 'labeled' && startsWith(github.event.label.name, 'hold')
runs-on: ubuntu-26.04
permissions:
actions: write
pull-requests: read
steps:
- name: Cancel in-progress workflow runs
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const { owner, repo } = context.repo;
const sha = context.payload.pull_request.head.sha;
const { data: { workflow_runs: runs } } =
await github.rest.actions.listWorkflowRunsForRepo({
owner,
repo,
head_sha: sha,
per_page: 100,
});
const active = runs.filter(r =>
['in_progress', 'queued', 'waiting', 'requested', 'pending'].includes(r.status)
);
core.info(`Found ${active.length} active run(s) to cancel for SHA ${sha}`);
for (const run of active) {
try {
await github.rest.actions.cancelWorkflowRun({
owner,
repo,
run_id: run.id,
});
core.info(`Cancelled run ${run.id} (${run.name})`);
} catch (err) {
core.warning(`Could not cancel run ${run.id}: ${err.message}`);
}
}
rerun-on-unhold:
name: Re-run CI when hold label removed
if: github.event.action == 'unlabeled' && startsWith(github.event.label.name, 'hold')
runs-on: ubuntu-24.04
permissions:
actions: write
pull-requests: read
steps:
- name: Re-trigger cancelled workflow runs
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const { owner, repo } = context.repo;
const sha = context.payload.pull_request.head.sha;
// Check that no other hold* labels remain on the PR
const labels = context.payload.pull_request.labels.map(l => l.name);
const stillHeld = labels.some(l => l.startsWith('hold'));
if (stillHeld) {
core.info('PR still has a hold label — skipping re-run.');
return;
}
const { data: { workflow_runs: runs } } =
await github.rest.actions.listWorkflowRunsForRepo({
owner,
repo,
head_sha: sha,
per_page: 100,
});
const cancelled = runs.filter(r => r.conclusion === 'cancelled');
core.info(`Found ${cancelled.length} cancelled run(s) to re-trigger for SHA ${sha}`);
for (const run of cancelled) {
try {
await github.rest.actions.reRunWorkflow({
owner,
repo,
run_id: run.id,
});
core.info(`Re-triggered run ${run.id} (${run.name})`);
} catch (err) {
core.warning(`Could not re-run ${run.id}: ${err.message}`);
}
}

View File

@@ -9,14 +9,15 @@ on:
jobs:
superbot-orglabel:
runs-on: ubuntu-26.04
runs-on: ubuntu-24.04
permissions:
contents: read
pull-requests: write
issues: write
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v4
with:
persist-credentials: false

View File

@@ -2,19 +2,14 @@ name: "Pull Request Labeler"
on:
- pull_request_target
# cancel previous workflow jobs for PRs
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
cancel-in-progress: true
jobs:
labeler:
permissions:
contents: read
pull-requests: write
runs-on: ubuntu-26.04
runs-on: ubuntu-24.04
steps:
- uses: actions/labeler@b8dd2d9be0f68b860e7dae5dae7d772984eacd6d # v6.2.0
- uses: actions/labeler@v5
with:
sync-labels: true

View File

@@ -6,34 +6,32 @@ on:
jobs:
latest-release:
name: Add/update tag to new release
runs-on: ubuntu-26.04
runs-on: ubuntu-24.04
permissions:
contents: write
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
submodules: recursive
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@v4
with:
persist-credentials: false
submodules: recursive
- name: Check for latest tag
id: latest-tag
env:
RELEASE_TAG_NAME: ${{ github.event.release.tag_name }}
run: |
source ./scripts/tag_latest_release.sh "$RELEASE_TAG_NAME" --dry-run
- name: Check for latest tag
id: latest-tag
run: |
source ./scripts/tag_latest_release.sh $(echo ${{ github.event.release.tag_name }}) --dry-run
- name: Configure Git
run: |
git config user.name "$GITHUB_ACTOR"
git config user.email "$GITHUB_ACTOR@users.noreply.github.com"
- name: Configure Git
run: |
git config user.name "$GITHUB_ACTOR"
git config user.email "$GITHUB_ACTOR@users.noreply.github.com"
- name: Run latest-tag
uses: ./.github/actions/latest-tag
if: steps.latest-tag.outputs.SKIP_TAG != 'true'
with:
description: Superset latest release
tag-name: latest
env:
GITHUB_TOKEN: ${{ github.token }}
- name: Run latest-tag
uses: ./.github/actions/latest-tag
if: (! ${{ steps.latest-tag.outputs.SKIP_TAG }} )
with:
description: Superset latest release
tag-name: latest
env:
GITHUB_TOKEN: ${{ github.token }}

View File

@@ -4,9 +4,6 @@ on:
pull_request:
types: [synchronize, opened, reopened, ready_for_review]
permissions:
contents: read
# cancel previous workflow jobs for PRs
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
@@ -15,17 +12,17 @@ concurrency:
jobs:
license_check:
name: License Check
runs-on: ubuntu-26.04
runs-on: ubuntu-24.04
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v4
with:
persist-credentials: false
submodules: recursive
- name: Setup Java
uses: actions/setup-java@03ad4de0992f5dab5e18fcb136590ce7c4a0ac95 # v5.6.0
uses: actions/setup-java@v4
with:
distribution: "temurin"
java-version: "11"
distribution: 'temurin'
java-version: '11'
- name: Run license check
run: ./scripts/check_license.sh

View File

@@ -4,23 +4,17 @@ on:
pull_request:
types: [labeled, unlabeled, opened, reopened, synchronize]
permissions:
pull-requests: read
# Let each label event run to completion. Cancelling in-progress runs leaves
# CANCELLED entries in the PR's check-suite rollup, which poisons GitHub's
# `status:success` search filter even though all real CI passed. The job is
# a tiny no-op github-script call, so the wasted compute is negligible.
# cancel previous workflow jobs for PRs
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
cancel-in-progress: false
cancel-in-progress: true
jobs:
check-hold-label:
runs-on: ubuntu-26.04
runs-on: ubuntu-24.04
steps:
- name: Check for 'hold' label
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
uses: actions/github-script@v7
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |

View File

@@ -8,26 +8,15 @@ on:
# Possible values: https://help.github.com/en/actions/reference/events-that-trigger-workflows#pull-request-event-pull_request
types: [opened, edited, reopened, synchronize]
# Serialize runs per PR without cancelling: the `edited` trigger means a PR
# opened and then edited has two queued runs for the same head SHA. On
# first-time-contributor PRs those runs start together when a maintainer
# approves workflows, and cancel-in-progress lets the older run cancel the
# newer one — leaving a permanently-cancelled required check on the head SHA
# that blocks merging until manually re-run. This job takes seconds, so let
# queued runs complete instead.
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
cancel-in-progress: false
jobs:
lint-check:
runs-on: ubuntu-26.04
runs-on: ubuntu-24.04
permissions:
contents: read
pull-requests: write
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v4
with:
persist-credentials: false
submodules: recursive
@@ -37,5 +26,6 @@ jobs:
on-failed-regex-fail-action: true
on-failed-regex-request-changes: false
on-failed-regex-create-review: false
on-failed-regex-comment: "Please format your PR title to match: `%regex%`!"
on-failed-regex-comment:
"Please format your PR title to match: `%regex%`!"
repo-token: "${{ github.token }}"

View File

@@ -7,14 +7,6 @@ on:
- "[0-9].[0-9]*"
pull_request:
types: [synchronize, opened, reopened, ready_for_review]
# Nightly full-tree sweep. Per-PR runs only lint changed files, so a change
# that invalidates an untouched file (e.g. a type change that breaks an
# importing test) can pass every PR yet leave master red. This catches that.
schedule:
- cron: "0 6 * * *"
permissions:
contents: read
# cancel previous workflow jobs for PRs
concurrency:
@@ -23,41 +15,34 @@ concurrency:
jobs:
pre-commit:
runs-on: ubuntu-26.04
timeout-minutes: 20
runs-on: ubuntu-24.04
strategy:
matrix:
# Run the full version spread on push (master/release) and nightly,
# but only the current version on PRs — lint/format/type results
# rarely differ across patch versions, so 3x per PR is wasteful.
python-version: ${{ github.event_name == 'pull_request' && fromJSON('["current"]') || fromJSON('["current", "next"]') }}
python-version: ["current", "previous", "next"]
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v4
with:
persist-credentials: false
submodules: recursive
# Full history so we can diff a PR/push against its base commit to
# determine changed files (see "Determine changed files" below).
fetch-depth: 0
- name: Setup Python
uses: ./.github/actions/setup-backend/
with:
python-version: ${{ matrix.python-version }}
- name: Setup Go
uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6.5.0
uses: actions/setup-go@v5
- name: Install helm-docs
# Previously `brew install norwoodj/tap/helm-docs`, but Homebrew now
# refuses to install from untrusted third-party taps ("Skipping
# norwoodj/tap because it is not trusted"), which breaks CI. Install the
# pinned binary directly with Go instead — this matches apache/superset
# upstream and keeps the version aligned with the helm-docs pre-commit
# hook rev in .pre-commit-config.yaml.
run: go install github.com/norwoodj/helm-docs/cmd/helm-docs@v1.14.2
- name: Setup Node.js
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
uses: actions/setup-node@v4
with:
node-version-file: "superset-frontend/.nvmrc"
cache: "npm"
cache-dependency-path: "superset-frontend/package-lock.json"
node-version: '20'
- name: Install Frontend Dependencies
run: |
@@ -70,113 +55,24 @@ jobs:
yarn install --immutable
- name: Cache pre-commit environments
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
uses: actions/cache@v4
with:
path: ~/.cache/pre-commit
key: pre-commit-v2-${{ runner.os }}-py${{ matrix.python-version }}-${{ hashFiles('.pre-commit-config.yaml') }}
restore-keys: |
pre-commit-v2-${{ runner.os }}-py${{ matrix.python-version }}-
- name: Determine changed files
id: changed_files
env:
EVENT_NAME: ${{ github.event_name }}
BEFORE_SHA: ${{ github.event.before }}
run: |
set -euo pipefail
# Scheduled runs check the whole tree (see the pre-commit step).
if [ "${EVENT_NAME}" = "schedule" ]; then
echo "mode=all" >> "$GITHUB_OUTPUT"
exit 0
fi
# Resolve the commit to diff against.
base=""
if [ "${EVENT_NAME}" = "pull_request" ]; then
# HEAD is the PR merge commit, so its first parent is the current
# tip of the base branch. github.event.pull_request.base.sha is
# NOT that: GitHub freezes it at PR creation, so on a long-lived
# PR it points at the original branch point and the diff picks up
# all of the base branch's churn since then — thousands of paths,
# enough for the CHANGED_FILES env var below to exceed the
# kernel's per-variable size limit and kill the step with
# "Argument list too long" before bash even starts.
base="$(git rev-parse HEAD^1 2>/dev/null || true)"
elif [ -n "${BEFORE_SHA:-}" ] && \
[ "${BEFORE_SHA}" != "0000000000000000000000000000000000000000" ]; then
base="${BEFORE_SHA}"
fi
# Fail closed: if the diff base can't be resolved, check every file
# instead of silently checking nothing. Previously an empty file list
# made `pre-commit run --files` a no-op that still reported success,
# which let unlinted code reach master.
if [ -z "${base}" ] || ! git cat-file -e "${base}^{commit}" 2>/dev/null; then
echo "::notice::Could not resolve a diff base; falling back to --all-files."
echo "mode=all" >> "$GITHUB_OUTPUT"
exit 0
fi
# Files present in HEAD that changed since the base (drop deletions).
files="$(git diff --name-only --diff-filter=ACMRT "${base}...HEAD")"
# Env vars have a hard per-variable size limit (E2BIG at step
# start). A PR that legitimately touches thousands of files is
# better served by --all-files anyway.
if [ "$(printf '%s' "${files}" | wc -c)" -gt 100000 ]; then
echo "::notice::Changed-file list too large to pass via env; falling back to --all-files."
echo "mode=all" >> "$GITHUB_OUTPUT"
exit 0
fi
if [ -z "${files}" ]; then
echo "mode=none" >> "$GITHUB_OUTPUT"
else
echo "mode=files" >> "$GITHUB_OUTPUT"
{
echo "files<<__CHANGED_FILES_EOF__"
echo "${files}"
echo "__CHANGED_FILES_EOF__"
} >> "$GITHUB_OUTPUT"
fi
- name: pre-commit
env:
MODE: ${{ steps.changed_files.outputs.mode }}
CHANGED_FILES: ${{ steps.changed_files.outputs.files }}
run: |
set +e # Don't exit immediately on failure
export SKIP=type-checking-frontend
case "${MODE}" in
all)
echo " Running pre-commit on all files."
pre-commit run --all-files
;;
files)
echo " Running pre-commit on changed files:"
echo "${CHANGED_FILES}"
# shellcheck disable=SC2086
pre-commit run --files ${CHANGED_FILES}
;;
none)
echo " No source files changed; nothing for pre-commit to check."
exit 0
;;
*)
echo "⚠️ Unrecognized changed-files mode '${MODE}'; checking all files."
pre-commit run --all-files
;;
esac
export SKIP=eslint-frontend,type-checking-frontend
pre-commit run --all-files
PRE_COMMIT_EXIT_CODE=$?
git diff --quiet --exit-code
GIT_DIFF_EXIT_CODE=$?
if [ "${PRE_COMMIT_EXIT_CODE}" -ne 0 ] || [ "${GIT_DIFF_EXIT_CODE}" -ne 0 ]; then
if [ "${PRE_COMMIT_EXIT_CODE}" -ne 0 ]; then
echo "❌ Pre-commit check failed (exit code: ${PRE_COMMIT_EXIT_CODE})."
echo "🔍 Modified files:"
git diff --name-only
echo "❌ Pre-commit check failed (exit code: ${EXIT_CODE})."
else
echo "❌ Git working directory is dirty."
echo "📌 This likely means that pre-commit made changes that were not committed."

70
.github/workflows/prefer-typescript.yml vendored Normal file
View File

@@ -0,0 +1,70 @@
name: Prefer TypeScript
on:
push:
branches:
- "master"
- "[0-9].[0-9]*"
paths:
- "superset-frontend/src/**"
pull_request:
types: [synchronize, opened, reopened, ready_for_review]
paths:
- "superset-frontend/src/**"
# cancel previous workflow jobs for PRs
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
cancel-in-progress: true
jobs:
prefer_typescript:
if: github.ref == 'ref/heads/master' && github.event_name == 'pull_request'
name: Prefer TypeScript
runs-on: ubuntu-24.04
permissions:
contents: read
pull-requests: write
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@v4
with:
persist-credentials: false
submodules: recursive
- name: Get changed files
id: changed
uses: ./.github/actions/file-changes-action
with:
githubToken: ${{ github.token }}
- name: Determine if a .js or .jsx file was added
id: check
run: |
js_files_added() {
jq -r '
map(
select(
endswith(".js") or endswith(".jsx")
)
) | join("\n")
' ${HOME}/files_added.json
}
echo "js_files_added=$(js_files_added)" >> $GITHUB_OUTPUT
- if: steps.check.outputs.js_files_added
name: Add Comment to PR
uses: ./.github/actions/comment-on-pr
continue-on-error: true
env:
GITHUB_TOKEN: ${{ github.token }}
with:
msg: |
### WARNING: Prefer TypeScript
Looks like your PR contains new `.js` or `.jsx` files:
```
${{steps.check.outputs.js_files_added}}
```
As decided in [SIP-36](https://github.com/apache/superset/issues/9101), all new frontend code should be written in TypeScript. Please convert above files to TypeScript then re-request review.

View File

@@ -6,12 +6,9 @@ on:
- "master"
- "[0-9].[0-9]*"
permissions:
contents: read
jobs:
config:
runs-on: ubuntu-26.04
runs-on: ubuntu-24.04
outputs:
has-secrets: ${{ steps.check.outputs.has-secrets }}
steps:
@@ -19,23 +16,18 @@ jobs:
id: check
shell: bash
run: |
if [ -n "${NPM_TOKEN}" ]; then
if [ -n "${{ (secrets.NPM_TOKEN != '' && secrets.GH_PERSONAL_ACCESS_TOKEN != '') || '' }}" ]; then
echo "has-secrets=1" >> "$GITHUB_OUTPUT"
fi
env:
NPM_TOKEN: ${{ (secrets.NPM_TOKEN != '' && secrets.GH_PERSONAL_ACCESS_TOKEN != '') || '' }}
build:
needs: config
if: needs.config.outputs.has-secrets
name: Bump version and publish package(s)
runs-on: ubuntu-26.04
permissions:
contents: write
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- uses: actions/checkout@v4
with:
persist-credentials: false
# pulls all commits (needed for lerna / semantic release to correctly version)
fetch-depth: 0
- name: Get tags and filter trigger tags
@@ -50,13 +42,13 @@ jobs:
- name: Install Node.js
if: env.HAS_TAGS
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
uses: actions/setup-node@v4
with:
node-version-file: "./superset-frontend/.nvmrc"
node-version-file: './superset-frontend/.nvmrc'
- name: Cache npm
if: env.HAS_TAGS
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
uses: actions/cache@v4
with:
path: ~/.npm # npm cache files are stored in `~/.npm` on Linux/macOS
key: ${{ runner.OS }}-node-${{ hashFiles('**/package-lock.json') }}
@@ -70,7 +62,7 @@ jobs:
run: echo "dir=$(npm config get cache)" >> $GITHUB_OUTPUT
- name: Cache npm
if: env.HAS_TAGS
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
uses: actions/cache@v4
id: npm-cache # use this to check for `cache-hit` (`steps.npm-cache.outputs.cache-hit != 'true'`)
with:
path: ${{ steps.npm-cache-dir-path.outputs.dir }}

View File

@@ -1,177 +0,0 @@
name: Scheduled Docker image refresh
# Re-runs the Docker image build against the latest published release on a
# weekly cadence. The code being built doesn't change — but the base image
# layers (python:*-slim-trixie and its OS packages) DO get upstream
# security patches between Superset releases, and those patches don't
# reach our published images unless we rebuild.
#
# Without this workflow, `apache/superset:<latest>` lags behind upstream
# Debian/Python base patches by whatever interval falls between Superset
# releases (typically 36 weeks). With it, the lag drops to at most one
# week regardless of release cadence.
#
# This is a security-hygiene cron, not a release. It overwrites the
# existing tags for the most recent release (e.g. `apache/superset:5.0.0`
# and `apache/superset:latest`) with bit-for-bit-equivalent contents
# layered on a refreshed base. Image digests change; everything users
# actually pin against (image content, code, deps) does not.
on:
schedule:
# Mondays at 06:00 UTC — gives the weekend for upstream patches to
# settle and surfaces failures at the start of the work week so a
# human can react.
- cron: "0 6 * * 1"
# Manual trigger so operators can force a refresh on demand (e.g.
# immediately after a high-severity base-image CVE drops).
workflow_dispatch: {}
permissions:
contents: read
# Serialize with itself and with the release publisher (tag-release.yml) —
# both push to the same Docker Hub tags, so a race could end with stale
# layers winning. Both workflows must declare this group for the lock to work.
concurrency:
group: docker-publish-latest-release
cancel-in-progress: false
jobs:
config:
runs-on: ubuntu-26.04
outputs:
has-secrets: ${{ steps.check.outputs.has-secrets }}
latest-release: ${{ steps.latest.outputs.tag }}
force-latest: ${{ steps.latest.outputs.force-latest }}
steps:
- name: Check for Docker Hub secrets
id: check
shell: bash
run: |
if [ -n "${DOCKERHUB_USER}" ]; then
echo "has-secrets=1" >> "$GITHUB_OUTPUT"
fi
env:
DOCKERHUB_USER: ${{ (secrets.DOCKERHUB_USER != '' && secrets.DOCKERHUB_TOKEN != '') || '' }}
- name: Look up latest published release
id: latest
shell: bash
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
REPOSITORY: ${{ github.repository }}
run: |
# `releases/latest` returns the latest non-prerelease, non-draft
# release — which is exactly what `apache/superset:latest`
# should reflect.
TAG=$(gh api "repos/${REPOSITORY}/releases/latest" --jq .tag_name)
if [ -z "$TAG" ] || [ "$TAG" = "null" ]; then
echo "::error::Could not determine latest release tag"
exit 1
fi
echo "Latest release: $TAG"
echo "tag=$TAG" >> "$GITHUB_OUTPUT"
# Only move `:latest` when the release flagged "latest" is also the
# highest semver release. This guards against a mis-click leaving an
# older maintenance release (e.g. a 5.x patch shipped after 6.0 GA)
# marked latest, which would otherwise roll `:latest` back a major
# version on the next cron run. If it isn't the newest, we still
# refresh that release's own version tag but leave `:latest` alone.
HIGHEST=$(gh api --paginate "repos/${REPOSITORY}/releases" \
--jq '.[] | select(.draft|not) | select(.prerelease|not) | .tag_name' \
| sed 's/^v//' | sort -V | tail -n1)
if [ "${TAG#v}" = "$HIGHEST" ]; then
echo "force-latest=1" >> "$GITHUB_OUTPUT"
else
echo "::warning::Latest-flagged release $TAG is not the highest semver ($HIGHEST); refreshing its version tag but leaving :latest untouched"
fi
docker-rebuild:
needs: config
if: needs.config.outputs.has-secrets == '1'
name: docker-rebuild
runs-on: ubuntu-26.04
strategy:
# Mirror the same matrix the release publisher uses so every variant
# operators consume from Docker Hub gets the refreshed base.
matrix:
build_preset: ["dev", "lean", "websocket", "dockerize", "py311", "py312"]
fail-fast: false
steps:
- name: "Checkout release tag: ${{ needs.config.outputs.latest-release }}"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ needs.config.outputs.latest-release }}
fetch-depth: 0
persist-credentials: false
- name: Setup Docker Environment
uses: ./.github/actions/setup-docker
with:
dockerhub-user: ${{ secrets.DOCKERHUB_USER }}
dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }}
install-docker-compose: "false"
build: "true"
- name: Use Node.js 20
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: 20
- name: Setup supersetbot
uses: ./.github/actions/setup-supersetbot/
- name: Rebuild and push
env:
DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BUILD_PRESET: ${{ matrix.build_preset }}
LATEST_RELEASE: ${{ needs.config.outputs.latest-release }}
FORCE_LATEST_FLAG: ${{ needs.config.outputs.force-latest == '1' && '--force-latest' || '' }}
run: |
# Reuses the same supersetbot invocation as the release
# publisher (`tag-release.yml`), so the resulting tags are
# identical to what a manual release dispatch would produce —
# just with a freshly-pulled base image layer underneath.
# `--force-latest` is only passed when the config job confirmed the
# fetched release is the newest one (see FORCE_LATEST_FLAG above).
supersetbot docker \
--push \
--preset "$BUILD_PRESET" \
--context release \
--context-ref "$LATEST_RELEASE" \
$FORCE_LATEST_FLAG \
--platform "linux/arm64" \
--platform "linux/amd64"
# The whole point of this cron is catching base-image CVEs, so a silent
# failure is the expensive case — a red X in the Actions tab nobody is
# watching on a Monday. File a tracked issue when any rebuild leg fails so
# a missed security refresh surfaces instead of sitting unnoticed.
notify-on-failure:
needs: [config, docker-rebuild]
if: failure() && needs.config.outputs.has-secrets == '1'
runs-on: ubuntu-26.04
permissions:
contents: read
issues: write
steps:
- name: Open a tracking issue
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
REPOSITORY: ${{ github.repository }}
LATEST_RELEASE: ${{ needs.config.outputs.latest-release }}
RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
run: |
gh issue create \
--repo "$REPOSITORY" \
--title "Scheduled Docker image refresh failed for ${LATEST_RELEASE}" \
--label "infra:container" \
--label "bug" \
--body "The weekly Docker base-image refresh failed for release \`${LATEST_RELEASE}\`. Published images may be missing upstream base-layer security patches until this is resolved.
Failed run: ${RUN_URL}"

View File

@@ -1,37 +0,0 @@
name: 🎪 Showtime Cleanup
# Scheduled cleanup of expired environments
on:
schedule:
- cron: '0 */6 * * *' # Every 6 hours
# Manual trigger for testing
workflow_dispatch:
# Common environment variables
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_REGION: ${{ vars.AWS_REGION || 'us-west-2' }}
GITHUB_ORG: ${{ github.repository_owner }}
GITHUB_REPO: ${{ github.event.repository.name }}
jobs:
cleanup-expired:
name: Clean up expired showtime environments
runs-on: ubuntu-latest
permissions:
contents: read
issues: write # delete orphaned showtime label definitions (label CRUD is the issues API)
pull-requests: write
steps:
- name: Install Superset Showtime
run: pip install superset-showtime
- name: Cleanup expired environments and orphaned labels
run: |
echo "Cleaning up environments respecting TTL labels, and pruning orphaned 🎪 labels"
python -m showtime cleanup --respect-ttl --force

View File

@@ -1,191 +0,0 @@
name: 🎪 Superset Showtime
# Ultra-simple: just sync on any PR state change
on:
# zizmor: ignore[dangerous-triggers] - required to react to PR label changes; PR code is
# only checked out and built after the maintainer-authorization gate (write/admin actors)
pull_request_target:
types: [labeled, unlabeled, synchronize, closed]
# Manual testing
workflow_dispatch:
inputs:
pr_number:
description: "PR number to sync"
required: true
type: number
sha:
description: "Specific SHA to deploy (optional, defaults to latest)"
required: false
type: string
# Common environment variables for all jobs (non-sensitive only)
env:
AWS_REGION: us-west-2
GITHUB_ORG: ${{ github.repository_owner }}
GITHUB_REPO: ${{ github.event.repository.name }}
GITHUB_ACTOR: ${{ github.actor }}
jobs:
sync:
name: 🎪 Sync PR to desired state
runs-on: ubuntu-latest
timeout-minutes: 90
permissions:
contents: read
pull-requests: write
steps:
- name: Security Check - Authorize Maintainers Only
id: auth
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
script: |
const actor = context.actor;
console.log(`🔍 Checking authorization for ${actor}`);
// Early exit for workflow_dispatch - assume authorized since it's manually triggered
if (context.eventName === 'workflow_dispatch') {
console.log(`✅ Workflow dispatch event - assuming authorized for ${actor}`);
core.setOutput('authorized', 'true');
return;
}
const { data: permission } = await github.rest.repos.getCollaboratorPermissionLevel({
owner: context.repo.owner,
repo: context.repo.repo,
username: actor
});
console.log(`📊 Permission level for ${actor}: ${permission.permission}`);
const authorized = ['write', 'admin'].includes(permission.permission);
// If this is a synchronize event from unauthorized user, check if Showtime is active and set blocked label
if (!authorized && context.eventName === 'pull_request_target' && context.payload.action === 'synchronize') {
console.log(`🔒 Synchronize event detected - checking if Showtime is active`);
// Check if PR has any circus tent labels (Showtime is in use)
const { data: issue } = await github.rest.issues.get({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number
});
const hasCircusLabels = issue.labels.some(label => label.name.startsWith('🎪 '));
if (hasCircusLabels) {
console.log(`🎪 Circus labels found - setting blocked label to prevent auto-deployment`);
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number,
labels: ['🎪 🔒 showtime-blocked']
});
console.log(`✅ Blocked label set - Showtime will detect and skip operations`);
} else {
console.log(` No circus labels found - Showtime not in use, skipping block`);
}
}
if (!authorized) {
console.log(`🚨 Unauthorized user ${actor} - skipping all operations`);
core.setOutput('authorized', 'false');
return;
}
console.log(`✅ Authorized maintainer: ${actor}`);
core.setOutput('authorized', 'true');
- name: Install Superset Showtime
if: steps.auth.outputs.authorized == 'true'
run: |
echo "::notice::Maintainer $GITHUB_ACTOR triggered deploy for PR ${PULL_REQUEST_NUMBER}"
pip install --upgrade superset-showtime
showtime version
env:
PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number || github.event.inputs.pr_number }}
- name: Check what actions are needed
if: steps.auth.outputs.authorized == 'true'
id: check
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
INPUT_PR_NUMBER: ${{ github.event.inputs.pr_number }}
INPUT_SHA: ${{ github.event.inputs.sha }}
run: |
# Bulletproof PR number extraction
if [[ -n "${{ github.event.pull_request.number }}" ]]; then
PR_NUM="${{ github.event.pull_request.number }}"
elif [[ -n "${INPUT_PR_NUMBER}" ]]; then
PR_NUM="${INPUT_PR_NUMBER}"
else
echo "❌ No PR number found in event or inputs"
exit 1
fi
echo "Using PR number: $PR_NUM"
# Run sync check-only with optional SHA override
if [[ -n "${INPUT_SHA}" ]]; then
OUTPUT=$(python -m showtime sync $PR_NUM --check-only --sha "${INPUT_SHA}")
else
OUTPUT=$(python -m showtime sync $PR_NUM --check-only)
fi
echo "$OUTPUT"
# Extract the outputs we need for conditional steps
BUILD=$(echo "$OUTPUT" | grep "build_needed=" | cut -d'=' -f2)
SYNC=$(echo "$OUTPUT" | grep "sync_needed=" | cut -d'=' -f2)
PR_NUM_OUT=$(echo "$OUTPUT" | grep "pr_number=" | cut -d'=' -f2)
TARGET_SHA=$(echo "$OUTPUT" | grep "target_sha=" | cut -d'=' -f2)
echo "build_needed=$BUILD" >> $GITHUB_OUTPUT
echo "sync_needed=$SYNC" >> $GITHUB_OUTPUT
echo "pr_number=$PR_NUM_OUT" >> $GITHUB_OUTPUT
echo "target_sha=$TARGET_SHA" >> $GITHUB_OUTPUT
- name: Checkout PR code (only if build needed)
if: steps.auth.outputs.authorized == 'true' && steps.check.outputs.build_needed == 'true'
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ steps.check.outputs.target_sha }}
persist-credentials: false
# Building fork PR code is Showtime's purpose: deploys are gated on the
# maintainer-authorization step above (write/admin actors only), so this
# checkout is an explicit, authorized opt-in rather than an automatic one.
allow-unsafe-pr-checkout: true
- name: Setup Docker Environment (only if build needed)
if: steps.auth.outputs.authorized == 'true' && steps.check.outputs.build_needed == 'true'
uses: ./.github/actions/setup-docker
with:
dockerhub-user: ${{ secrets.DOCKERHUB_USER }}
dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }}
build: "true"
install-docker-compose: "false"
- name: Execute sync (handles everything)
if: steps.auth.outputs.authorized == 'true' && steps.check.outputs.sync_needed == 'true'
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
CHECK_PR_NUMBER: ${{ steps.check.outputs.pr_number }}
CHECK_TARGET_SHA: ${{ steps.check.outputs.target_sha }}
run: |
PR_NUM="$CHECK_PR_NUMBER"
TARGET_SHA="$CHECK_TARGET_SHA"
if [[ -n "$TARGET_SHA" ]]; then
python -m showtime sync $PR_NUM --sha "$TARGET_SHA"
else
python -m showtime sync $PR_NUM
fi

View File

@@ -1,71 +0,0 @@
name: Superset App CLI tests
on:
push:
branches:
- "master"
- "[0-9].[0-9]*"
pull_request:
types: [synchronize, opened, reopened, ready_for_review]
permissions:
contents: read
pull-requests: read
# cancel previous workflow jobs for PRs
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
cancel-in-progress: true
jobs:
test-load-examples:
runs-on: ubuntu-26.04
env:
PYTHONPATH: ${{ github.workspace }}
SUPERSET_CONFIG: tests.integration_tests.superset_test_config
REDIS_PORT: 16379
SUPERSET__SQLALCHEMY_DATABASE_URI: postgresql+psycopg2://superset:superset@127.0.0.1:15432/superset
services:
postgres:
image: postgres:17-alpine
env:
POSTGRES_USER: superset
POSTGRES_PASSWORD: superset
ports:
# Use custom ports for services to avoid accidentally connecting to
# GitHub action runner's default installations
- 15432:5432
redis:
image: redis:7-alpine
ports:
- 16379:6379
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
submodules: recursive
- name: Check for file changes
id: check
uses: ./.github/actions/change-detector/
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Python
if: steps.check.outputs.python
uses: ./.github/actions/setup-backend/
- name: Setup Postgres
if: steps.check.outputs.python
uses: ./.github/actions/cached-dependencies
with:
run: setup-postgres
- name: superset init
if: steps.check.outputs.python
run: |
uv pip install --system -e .
superset db upgrade
superset load_test_users
- name: superset load_examples
if: steps.check.outputs.python
run: |
# load examples without test data
superset load_examples --load-big-data

View File

@@ -0,0 +1,91 @@
name: Applitools Cypress
on:
schedule:
- cron: "0 1 * * *"
jobs:
config:
runs-on: ubuntu-24.04
outputs:
has-secrets: ${{ steps.check.outputs.has-secrets }}
steps:
- name: "Check for secrets"
id: check
shell: bash
run: |
if [ -n "${{ (secrets.APPLITOOLS_API_KEY != '' && secrets.APPLITOOLS_API_KEY != '') || '' }}" ]; then
echo "has-secrets=1" >> "$GITHUB_OUTPUT"
fi
cypress-applitools:
needs: config
if: needs.config.outputs.has-secrets
runs-on: ubuntu-24.04
strategy:
fail-fast: false
matrix:
browser: ["chrome"]
env:
SUPERSET_ENV: development
SUPERSET_CONFIG: tests.integration_tests.superset_test_config
SUPERSET__SQLALCHEMY_DATABASE_URI: postgresql+psycopg2://superset:superset@127.0.0.1:15432/superset
PYTHONPATH: ${{ github.workspace }}
REDIS_PORT: 16379
GITHUB_TOKEN: ${{ github.token }}
APPLITOOLS_APP_NAME: Superset
APPLITOOLS_API_KEY: ${{ secrets.APPLITOOLS_API_KEY }}
APPLITOOLS_BATCH_ID: ${{ github.sha }}
APPLITOOLS_BATCH_NAME: Superset Cypress
services:
postgres:
image: postgres:16-alpine
env:
POSTGRES_USER: superset
POSTGRES_PASSWORD: superset
ports:
- 15432:5432
redis:
image: redis:7-alpine
ports:
- 16379:6379
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@v4
with:
persist-credentials: false
submodules: recursive
ref: master
- name: Setup Python
uses: ./.github/actions/setup-backend/
- name: Import test data
uses: ./.github/actions/cached-dependencies
with:
run: testdata
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version-file: './superset-frontend/.nvmrc'
- name: Install npm dependencies
uses: ./.github/actions/cached-dependencies
with:
run: npm-install
- name: Build javascript packages
uses: ./.github/actions/cached-dependencies
with:
run: build-instrumented-assets
- name: Setup Postgres
if: steps.check.outcome == 'failure'
uses: ./.github/actions/cached-dependencies
with:
run: setup-postgres
- name: Install cypress
uses: ./.github/actions/cached-dependencies
with:
run: cypress-install
- name: Run Cypress
uses: ./.github/actions/cached-dependencies
env:
CYPRESS_BROWSER: ${{ matrix.browser }}
with:
run: cypress-run-applitools

View File

@@ -0,0 +1,52 @@
name: Applitools Storybook
on:
schedule:
- cron: "0 0 * * *"
env:
APPLITOOLS_APP_NAME: Superset
APPLITOOLS_API_KEY: ${{ secrets.APPLITOOLS_API_KEY }}
APPLITOOLS_BATCH_ID: ${{ github.sha }}
APPLITOOLS_BATCH_NAME: Superset Storybook
jobs:
config:
runs-on: ubuntu-24.04
outputs:
has-secrets: ${{ steps.check.outputs.has-secrets }}
steps:
- name: "Check for secrets"
id: check
shell: bash
run: |
if [ -n "${{ (secrets.APPLITOOLS_API_KEY != '' && secrets.APPLITOOLS_API_KEY != '') || '' }}" ]; then
echo "has-secrets=1" >> "$GITHUB_OUTPUT"
fi
cron:
needs: config
if: needs.config.outputs.has-secrets
runs-on: ubuntu-24.04
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@v4
with:
persist-credentials: false
submodules: recursive
ref: master
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version-file: './superset-frontend/.nvmrc'
- name: Install eyes-storybook dependencies
uses: ./.github/actions/cached-dependencies
with:
run: eyes-storybook-dependencies
- name: Install NPM dependencies
uses: ./.github/actions/cached-dependencies
with:
run: npm-install
- name: Run Applitools Eyes-Storybook
working-directory: ./superset-frontend
run: npx eyes-storybook -u https://superset-storybook.netlify.app/

67
.github/workflows/superset-cli.yml vendored Normal file
View File

@@ -0,0 +1,67 @@
name: Superset CLI tests
on:
push:
branches:
- "master"
- "[0-9].[0-9]*"
pull_request:
types: [synchronize, opened, reopened, ready_for_review]
# cancel previous workflow jobs for PRs
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
cancel-in-progress: true
jobs:
test-load-examples:
runs-on: ubuntu-24.04
env:
PYTHONPATH: ${{ github.workspace }}
SUPERSET_CONFIG: tests.integration_tests.superset_test_config
REDIS_PORT: 16379
SUPERSET__SQLALCHEMY_DATABASE_URI: postgresql+psycopg2://superset:superset@127.0.0.1:15432/superset
services:
postgres:
image: postgres:16-alpine
env:
POSTGRES_USER: superset
POSTGRES_PASSWORD: superset
ports:
# Use custom ports for services to avoid accidentally connecting to
# GitHub action runner's default installations
- 15432:5432
redis:
image: redis:7-alpine
ports:
- 16379:6379
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@v4
with:
persist-credentials: false
submodules: recursive
- name: Check for file changes
id: check
uses: ./.github/actions/change-detector/
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Python
if: steps.check.outputs.python
uses: ./.github/actions/setup-backend/
- name: Setup Postgres
if: steps.check.outputs.python
uses: ./.github/actions/cached-dependencies
with:
run: setup-postgres
- name: superset init
if: steps.check.outputs.python
run: |
pip install -e .
superset db upgrade
superset load_test_users
- name: superset load_examples
if: steps.check.outputs.python
run: |
# load examples without test data
superset load_examples --load-big-data

View File

@@ -1,14 +1,6 @@
name: Docs Deployment
on:
# Deploy after integration tests complete on master
# zizmor: ignore[dangerous-triggers] - runs in base-branch context after a trusted upstream workflow; scoped to master
workflow_run:
workflows: ["Python-Integration"]
types: [completed]
branches: [master]
# Also allow manual trigger and direct pushes to docs
push:
paths:
- "docs/**"
@@ -18,22 +10,9 @@ on:
workflow_dispatch: {}
# Serialize deploys: the action pushes to apache/superset-site without
# rebasing, so concurrent runs race on the final push and the loser fails
# with `! [rejected] asf-site -> asf-site (fetch first)`. Cancel any
# in-progress run as soon as a newer one starts — the destination repo
# isn't touched until the final push step, so canceling mid-build is safe,
# and the freshest content always wins.
concurrency:
group: docs-deploy-asf-site
cancel-in-progress: true
permissions:
contents: read
jobs:
config:
runs-on: ubuntu-26.04
runs-on: ubuntu-24.04
outputs:
has-secrets: ${{ steps.check.outputs.has-secrets }}
steps:
@@ -41,40 +20,31 @@ jobs:
id: check
shell: bash
run: |
if [ -n "${SUPERSET_SITE_BUILD}" ]; then
if [ -n "${{ (secrets.SUPERSET_SITE_BUILD != '' && secrets.SUPERSET_SITE_BUILD != '') || '' }}" ]; then
echo "has-secrets=1" >> "$GITHUB_OUTPUT"
fi
env:
SUPERSET_SITE_BUILD: ${{ (secrets.SUPERSET_SITE_BUILD != '' && secrets.SUPERSET_SITE_BUILD != '') || '' }}
build-deploy:
needs: config
# For workflow_run triggers, only deploy when the triggering run originated
# from this repository (not a fork), ensuring the checked-out code and any
# local actions executed with deploy credentials are trusted.
if: >-
needs.config.outputs.has-secrets &&
(github.event_name != 'workflow_run' ||
github.event.workflow_run.head_repository.full_name == github.repository)
if: needs.config.outputs.has-secrets
name: Build & Deploy
runs-on: ubuntu-26.04
runs-on: ubuntu-24.04
steps:
- name: "Checkout ${{ github.event.workflow_run.head_sha || github.sha }}"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@v4
with:
ref: ${{ github.event.workflow_run.head_sha || github.sha }}
persist-credentials: false
submodules: recursive
- name: Set up Node.js
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
uses: actions/setup-node@v4
with:
node-version-file: "./docs/.nvmrc"
node-version-file: './docs/.nvmrc'
- name: Setup Python
uses: ./.github/actions/setup-backend/
- uses: actions/setup-java@03ad4de0992f5dab5e18fcb136590ce7c4a0ac95 # v5.6.0
- uses: actions/setup-java@v4
with:
distribution: "zulu"
java-version: "21"
distribution: 'zulu'
java-version: '21'
- name: Install Graphviz
run: sudo apt-get install -y graphviz
- name: Compute Entity Relationship diagram (ERD)
@@ -88,35 +58,6 @@ jobs:
working-directory: docs
run: |
yarn install --check-cache
- name: Download database diagnostics (if triggered by integration tests)
if: github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success'
uses: dawidd6/action-download-artifact@b6e2e70617bc3265edd6dab6c906732b2f1ae151 # v21
continue-on-error: true
with:
workflow: superset-python-integrationtest.yml
run_id: ${{ github.event.workflow_run.id }}
name: database-diagnostics
path: docs/src/data/
- name: Try to download latest diagnostics (for push/dispatch triggers)
if: github.event_name != 'workflow_run'
uses: dawidd6/action-download-artifact@b6e2e70617bc3265edd6dab6c906732b2f1ae151 # v21
continue-on-error: true
with:
workflow: superset-python-integrationtest.yml
name: database-diagnostics
path: docs/src/data/
branch: master
search_artifacts: true
if_no_artifact_found: warn
- name: Use diagnostics artifact if available
working-directory: docs
run: |
if [ -f "src/data/databases-diagnostics.json" ]; then
echo "Using fresh diagnostics from integration tests"
mv src/data/databases-diagnostics.json src/data/databases.json
else
echo "Using committed databases.json (no artifact found)"
fi
- name: yarn build
working-directory: docs
run: |
@@ -130,5 +71,5 @@ jobs:
destination-github-username: "apache"
destination-repository-name: "superset-site"
target-branch: "asf-site"
commit-message: "deploying docs: ${{ github.event.head_commit.message || 'triggered by integration tests' }} (apache/superset@${{ github.event.workflow_run.head_sha || github.sha }})"
commit-message: "deploying docs: ${{ github.event.head_commit.message }} (apache/superset@${{ github.sha }})"
user-email: dev@superset.apache.org

View File

@@ -4,43 +4,29 @@ on:
pull_request:
paths:
- "docs/**"
- "superset/db_engine_specs/**"
- ".github/workflows/superset-docs-verify.yml"
types: [synchronize, opened, reopened, ready_for_review]
# zizmor: ignore[dangerous-triggers] - runs in base-branch context and only consumes artifacts from the trusted upstream workflow
workflow_run:
workflows: ["Python-Integration"]
types: [completed]
# cancel previous workflow jobs for PRs
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.event.workflow_run.head_sha || github.run_id }}
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
cancel-in-progress: true
permissions:
contents: read
jobs:
linkinator:
# See docs here: https://github.com/marketplace/actions/linkinator
# Only run on pull_request, not workflow_run
if: github.event_name == 'pull_request'
name: Link Checking
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
- uses: actions/checkout@v4
# Do not bump this linkinator-action version without opening
# an ASF Infra ticket to allow the new version first!
- uses: JustinBeckwith/linkinator-action@af984b9f30f63e796ae2ea5be5e07cb587f1bbd9 # v2.3
- uses: JustinBeckwith/linkinator-action@v1.11.0
continue-on-error: true # This will make the job advisory (non-blocking, no red X)
with:
paths: "**/*.md, **/*.mdx"
paths: "**/*.md, **/*.mdx, !superset-frontend/CHANGELOG.md"
linksToSkip: >-
^https://github.com/apache/(superset|incubator-superset)/(pull|issues)/\d+,
^https://github.com/apache/(superset|incubator-superset)/commit/[a-f0-9]+,
superset-frontend/.*CHANGELOG\.md,
^https://github.com/apache/(superset|incubator-superset)/(pull|issue)/\d+,
http://localhost:8088/,
http://127.0.0.1:3000/,
http://localhost:9001/,
@@ -55,91 +41,32 @@ jobs:
http://theiconic.com.au/,
https://dev.mysql.com/doc/refman/5.7/en/innodb-limits.html,
^https://img\.shields\.io/.*,
https://vkusvill.ru/,
https://www.linkedin.com/in/mark-thomas-b16751158/,
https://theiconic.com.au/,
https://wattbewerb.de/,
https://timbr.ai/,
https://opensource.org/license/apache-2-0,
https://vkusvill.ru/
https://www.linkedin.com/in/mark-thomas-b16751158/
https://theiconic.com.au/
https://wattbewerb.de/
https://timbr.ai/
https://opensource.org/license/apache-2-0
https://www.plaidcloud.com/
build-on-pr:
# Build docs when PR changes docs/** (uses committed databases.json)
if: github.event_name == 'pull_request'
name: Build (PR trigger)
runs-on: ubuntu-26.04
build-deploy:
name: Build & Deploy
runs-on: ubuntu-24.04
defaults:
run:
working-directory: docs
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v4
with:
persist-credentials: false
submodules: recursive
- name: Set up Node.js
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
uses: actions/setup-node@v4
with:
node-version-file: "./docs/.nvmrc"
node-version-file: './docs/.nvmrc'
- name: yarn install
run: |
yarn install --check-cache
- name: Lint docs links
# Fast source-level check for bare relative internal links
# like `[Foo](../foo)` that Docusaurus's onBrokenLinks
# setting can't catch. Runs in seconds; fails fast before
# the expensive build step.
run: |
yarn lint:docs-links
- name: yarn typecheck
run: |
yarn typecheck
- name: yarn build
run: |
yarn build
build-after-tests:
# Build docs after integration tests complete (uses fresh diagnostics)
# Only runs if integration tests succeeded
if: >
github.event_name == 'workflow_run' &&
github.event.workflow_run.conclusion == 'success' &&
github.event.workflow_run.head_repository.full_name == github.repository
name: Build (after integration tests)
runs-on: ubuntu-26.04
defaults:
run:
working-directory: docs
steps:
- name: "Checkout PR head: ${{ github.event.workflow_run.head_sha }}"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ github.event.workflow_run.head_sha }}
persist-credentials: false
submodules: recursive
- name: Set up Node.js
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version-file: "./docs/.nvmrc"
- name: yarn install
run: |
yarn install --check-cache
- name: Download database diagnostics from integration tests
uses: dawidd6/action-download-artifact@b6e2e70617bc3265edd6dab6c906732b2f1ae151 # v21
with:
workflow: superset-python-integrationtest.yml
run_id: ${{ github.event.workflow_run.id }}
name: database-diagnostics
path: docs/src/data/
if_no_artifact_found: "warning"
- name: Use fresh diagnostics
run: |
if [ -f "src/data/databases-diagnostics.json" ]; then
echo "Using fresh diagnostics from integration tests"
mv src/data/databases-diagnostics.json src/data/databases.json
else
echo "Warning: No diagnostics artifact found, using committed data"
fi
- name: yarn typecheck
run: |
yarn typecheck

View File

@@ -10,48 +10,26 @@ on:
workflow_dispatch:
inputs:
use_dashboard:
description: "Use Cypress Dashboard (true/false) [paid service - trigger manually when needed]. You MUST provide a branch and/or PR number below for this to work."
description: 'Use Cypress Dashboard (true/false) [paid service - trigger manually when needed]. You MUST provide a branch and/or PR number below for this to work.'
required: false
default: "false"
default: 'false'
ref:
description: "The branch or tag to checkout"
description: 'The branch or tag to checkout'
required: false
default: ""
default: ''
pr_id:
description: "The pull request ID to checkout"
description: 'The pull request ID to checkout'
required: false
default: ""
default: ''
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
cancel-in-progress: true
jobs:
changes:
runs-on: ubuntu-26.04
timeout-minutes: 10
permissions:
contents: read
pull-requests: read
outputs:
python: ${{ steps.check.outputs.python }}
frontend: ${{ steps.check.outputs.frontend }}
steps:
- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
- name: Check for file changes
id: check
uses: ./.github/actions/change-detector/
with:
token: ${{ secrets.GITHUB_TOKEN }}
cypress-matrix:
needs: changes
if: (needs.changes.outputs.python == 'true' || needs.changes.outputs.frontend == 'true') && github.event.pull_request.draft == false
runs-on: ubuntu-26.04
timeout-minutes: 30
# Somehow one test flakes on 24.04 for unknown reasons, this is the only GHA left on 22.04
runs-on: ubuntu-22.04
permissions:
contents: read
pull-requests: read
@@ -62,14 +40,9 @@ jobs:
# https://github.com/cypress-io/github-action/issues/48
fail-fast: false
matrix:
parallel_id: [0, 1]
parallel_id: [0, 1, 2, 3, 4, 5]
browser: ["chrome"]
app_root: ${{ github.event_name == 'push' && fromJSON('["", "/app/prefix"]') || fromJSON('[""]') }}
# The /app/prefix variant (push events only) is smoke-tested on a single
# shard rather than the full matrix, so exclude it from the other shards.
exclude:
- parallel_id: 1
app_root: "/app/prefix"
app_root: ["", "/app/prefix"]
env:
SUPERSET_ENV: development
SUPERSET_CONFIG: tests.integration_tests.superset_test_config
@@ -81,7 +54,7 @@ jobs:
USE_DASHBOARD: ${{ github.event.inputs.use_dashboard == 'true' || 'false' }}
services:
postgres:
image: postgres:17-alpine
image: postgres:16-alpine
env:
POSTGRES_USER: superset
POSTGRES_PASSWORD: superset
@@ -96,60 +69,71 @@ jobs:
# Conditional checkout based on context
- name: Checkout for push or pull_request event
if: github.event_name == 'push' || github.event_name == 'pull_request'
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v4
with:
persist-credentials: false
submodules: recursive
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
- name: Checkout using ref (workflow_dispatch)
if: github.event_name == 'workflow_dispatch' && github.event.inputs.ref != ''
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v4
with:
persist-credentials: false
ref: ${{ github.event.inputs.ref }}
submodules: recursive
- name: Checkout using PR ID (workflow_dispatch)
if: github.event_name == 'workflow_dispatch' && github.event.inputs.pr_id != ''
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v4
with:
persist-credentials: false
ref: refs/pull/${{ github.event.inputs.pr_id }}/merge
submodules: recursive
# -------------------------------------------------------
- name: Check for file changes
id: check
uses: ./.github/actions/change-detector/
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Python
uses: ./.github/actions/setup-backend/
if: steps.check.outputs.python || steps.check.outputs.frontend
- name: Setup postgres
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
with:
run: setup-postgres
- name: Import test data
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
with:
run: testdata
- name: Setup Node.js
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: actions/setup-node@v4
with:
node-version-file: "./superset-frontend/.nvmrc"
cache: "npm"
cache-dependency-path: "superset-frontend/package-lock.json"
node-version-file: './superset-frontend/.nvmrc'
- name: Install npm dependencies
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
with:
run: npm-install
- name: Build javascript packages
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
with:
run: build-instrumented-assets
- name: Install cypress
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
with:
run: cypress-install
- name: Run Cypress
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
env:
CYPRESS_BROWSER: ${{ matrix.browser }}
PARALLEL_ID: ${{ matrix.parallel_id }}
PARALLELISM: 2
PARALLELISM: 6
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
NODE_OPTIONS: "--max-old-space-size=4096"
with:
@@ -157,23 +141,19 @@ jobs:
- name: Set safe app root
if: failure()
id: set-safe-app-root
env:
APP_ROOT: ${{ matrix.app_root }}
run: |
APP_ROOT="${{ matrix.app_root }}"
SAFE_APP_ROOT=${APP_ROOT//\//_}
echo "safe_app_root=$SAFE_APP_ROOT" >> $GITHUB_OUTPUT
- name: Upload Artifacts
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
uses: actions/upload-artifact@v4
if: failure()
with:
path: ${{ github.workspace }}/superset-frontend/cypress-base/cypress/screenshots
name: cypress-artifact-${{ github.run_id }}-${{ github.job }}-${{ matrix.browser }}-${{ matrix.parallel_id }}--${{ steps.set-safe-app-root.outputs.safe_app_root }}
playwright-tests:
needs: changes
if: needs.changes.outputs.python == 'true' || needs.changes.outputs.frontend == 'true'
runs-on: ubuntu-26.04
timeout-minutes: 30
runs-on: ubuntu-22.04
permissions:
contents: read
pull-requests: read
@@ -181,7 +161,7 @@ jobs:
fail-fast: false
matrix:
browser: ["chromium"]
app_root: ${{ github.event_name == 'push' && fromJSON('["", "/app/prefix"]') || fromJSON('[""]') }}
app_root: ["", "/app/prefix"]
env:
SUPERSET_ENV: development
SUPERSET_CONFIG: tests.integration_tests.superset_test_config
@@ -191,7 +171,7 @@ jobs:
GITHUB_TOKEN: ${{ github.token }}
services:
postgres:
image: postgres:17-alpine
image: postgres:16-alpine
env:
POSTGRES_USER: superset
POSTGRES_PASSWORD: superset
@@ -206,59 +186,66 @@ jobs:
# Conditional checkout based on context (same as Cypress workflow)
- name: Checkout for push or pull_request event
if: github.event_name == 'push' || github.event_name == 'pull_request'
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v5
with:
persist-credentials: false
submodules: recursive
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
- name: Checkout using ref (workflow_dispatch)
if: github.event_name == 'workflow_dispatch' && github.event.inputs.ref != ''
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v5
with:
persist-credentials: false
ref: ${{ github.event.inputs.ref }}
submodules: recursive
- name: Checkout using PR ID (workflow_dispatch)
if: github.event_name == 'workflow_dispatch' && github.event.inputs.pr_id != ''
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v5
with:
persist-credentials: false
ref: refs/pull/${{ github.event.inputs.pr_id }}/merge
submodules: recursive
# -------------------------------------------------------
- name: Check for file changes
id: check
uses: ./.github/actions/change-detector/
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Python
uses: ./.github/actions/setup-backend/
if: steps.check.outputs.python || steps.check.outputs.frontend
- name: Setup postgres
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
with:
run: setup-postgres
- name: Import test data
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
with:
run: playwright_testdata
- name: Setup Node.js
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: actions/setup-node@v5
with:
node-version-file: "./superset-frontend/.nvmrc"
cache: "npm"
cache-dependency-path: "superset-frontend/package-lock.json"
node-version-file: './superset-frontend/.nvmrc'
- name: Install npm dependencies
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
with:
run: npm-install
- name: Build javascript packages
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
with:
run: build-instrumented-assets
- name: Build embedded SDK
uses: ./.github/actions/cached-dependencies
with:
run: build-embedded-sdk
- name: Install Playwright
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
with:
run: playwright-install
- name: Run Playwright (Required Tests)
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
env:
NODE_OPTIONS: "--max-old-space-size=4096"
@@ -267,76 +254,15 @@ jobs:
- name: Set safe app root
if: failure()
id: set-safe-app-root
env:
APP_ROOT: ${{ matrix.app_root }}
run: |
APP_ROOT="${{ matrix.app_root }}"
SAFE_APP_ROOT=${APP_ROOT//\//_}
echo "safe_app_root=$SAFE_APP_ROOT" >> $GITHUB_OUTPUT
- name: Upload Playwright Artifacts
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
uses: actions/upload-artifact@v4
if: failure()
with:
path: |
${{ github.workspace }}/superset-frontend/playwright-results/
${{ github.workspace }}/superset-frontend/test-results/
name: playwright-artifact-${{ github.run_id }}-${{ github.job }}-${{ matrix.browser }}--${{ steps.set-safe-app-root.outputs.safe_app_root }}
# Stable required-status-check anchors. cypress-matrix and playwright-tests
# are matrix jobs gated on change detection (python || frontend). On a PR
# that touches neither — e.g. a docs-only PR — they are skipped at the job
# level, which happens before matrix expansion, so the per-combination
# contexts (`cypress-matrix (0, chrome)`, `playwright-tests (chromium)`) are
# never produced and branch protection waits on them forever. These
# always-running jobs report a single stable context that passes when the
# underlying matrix job succeeded or was skipped, and fails only on a real
# failure. Require these in .asf.yaml instead of the matrix-expanded names.
#
# A matrix job reads as "skipped" in two distinct cases, and only the first
# is a legitimate pass: (a) change detection succeeded and gated the job off
# (docs-only PR); (b) the `changes` job itself failed or was cancelled, in
# which case GHA skips its dependents too. Accepting (b) would let a broken
# change-detector report a false green, so each anchor first requires
# `changes` to have succeeded before honouring a skip.
cypress-matrix-required:
needs: [changes, cypress-matrix]
if: always()
runs-on: ubuntu-26.04
timeout-minutes: 5
permissions: {}
steps:
- name: Check cypress-matrix result
env:
CHANGES: ${{ needs.changes.result }}
RESULT: ${{ needs.cypress-matrix.result }}
run: |
if [ "$CHANGES" != "success" ]; then
echo "change detection did not succeed (result: $CHANGES); refusing to pass on a skipped matrix"
exit 1
fi
if [ "$RESULT" != "success" ] && [ "$RESULT" != "skipped" ]; then
echo "cypress-matrix did not pass (result: $RESULT)"
exit 1
fi
echo "cypress-matrix result: $RESULT (changes: $CHANGES)"
playwright-tests-required:
needs: [changes, playwright-tests]
if: always()
runs-on: ubuntu-26.04
timeout-minutes: 5
permissions: {}
steps:
- name: Check playwright-tests result
env:
CHANGES: ${{ needs.changes.result }}
RESULT: ${{ needs.playwright-tests.result }}
run: |
if [ "$CHANGES" != "success" ]; then
echo "change detection did not succeed (result: $CHANGES); refusing to pass on a skipped matrix"
exit 1
fi
if [ "$RESULT" != "success" ] && [ "$RESULT" != "skipped" ]; then
echo "playwright-tests did not pass (result: $RESULT)"
exit 1
fi
echo "playwright-tests result: $RESULT (changes: $CHANGES)"

View File

@@ -1,71 +0,0 @@
name: Superset Extensions CLI Package Tests
on:
push:
branches:
- "master"
- "[0-9].[0-9]*"
pull_request:
types: [synchronize, opened, reopened, ready_for_review]
permissions:
contents: read
pull-requests: read
# cancel previous workflow jobs for PRs
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
cancel-in-progress: true
jobs:
test-superset-extensions-cli-package:
runs-on: ubuntu-26.04
timeout-minutes: 30
strategy:
matrix:
# Full version spread on push (master/release) + nightly; current only
# on PRs to cut runner cost (cross-version breaks are caught at merge).
python-version: ${{ github.event_name == 'pull_request' && fromJSON('["current"]') || fromJSON('["current", "next"]') }}
defaults:
run:
working-directory: superset-extensions-cli
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
submodules: recursive
- name: Check for file changes
id: check
uses: ./.github/actions/change-detector/
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Python
if: steps.check.outputs.superset-extensions-cli
uses: ./.github/actions/setup-backend/
with:
python-version: ${{ matrix.python-version }}
requirements-type: dev
- name: Run pytest with coverage
if: steps.check.outputs.superset-extensions-cli
run: |
pytest --cov=superset_extensions_cli --cov-report=xml --cov-report=term-missing --cov-report=html -v --tb=short
- name: Upload coverage reports to Codecov
if: steps.check.outputs.superset-extensions-cli
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
with:
file: ./coverage.xml
flags: superset-extensions-cli
name: superset-extensions-cli-coverage
fail_ci_if_error: false
- name: Upload HTML coverage report
if: steps.check.outputs.superset-extensions-cli
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: superset-extensions-cli-coverage-html
path: htmlcov/

View File

@@ -16,18 +16,14 @@ concurrency:
env:
TAG: apache/superset:GHA-${{ github.run_id }}
permissions:
contents: read
jobs:
frontend-build:
runs-on: ubuntu-26.04
timeout-minutes: 30
runs-on: ubuntu-24.04
outputs:
should-run: ${{ steps.check.outputs.frontend }}
steps:
- name: Checkout Code
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v4
with:
persist-credentials: false
fetch-depth: 0
@@ -51,21 +47,21 @@ jobs:
git show -s --format=raw HEAD
docker buildx build \
-t $TAG \
--cache-from=type=registry,ref=apache/superset-cache:3.11-slim-trixie \
--cache-from=type=registry,ref=apache/superset-cache:3.10-slim-bookworm \
--target superset-node-ci \
.
- name: Save Docker Image as Artifact
if: steps.check.outputs.frontend
run: |
docker save $TAG | zstd -3 --threads=0 > docker-image.tar.zst
docker save $TAG | gzip > docker-image.tar.gz
- name: Upload Docker Image Artifact
if: steps.check.outputs.frontend
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
uses: actions/upload-artifact@v4
with:
name: docker-image
path: docker-image.tar.zst
path: docker-image.tar.gz
sharded-jest-tests:
needs: frontend-build
@@ -74,17 +70,15 @@ jobs:
matrix:
shard: [1, 2, 3, 4, 5, 6, 7, 8]
fail-fast: false
runs-on: ubuntu-26.04
timeout-minutes: 20
runs-on: ubuntu-24.04
steps:
- name: Download Docker Image Artifact
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
uses: actions/download-artifact@v4
with:
name: docker-image
- name: Load Docker Image
run: |
zstd -d < docker-image.tar.zst | docker load
run: docker load < docker-image.tar.gz
- name: npm run test with coverage
run: |
@@ -93,10 +87,10 @@ jobs:
-v ${{ github.workspace }}/superset-frontend/coverage:/app/superset-frontend/coverage \
--rm $TAG \
bash -c \
"npm run test -- --coverage --shard=${{ matrix.shard }}/8 --coverageReporters=json"
"npm run test -- --coverage --shard=${{ matrix.shard }}/8 --coverageReporters=json-summary"
- name: Upload Coverage Artifact
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
uses: actions/upload-artifact@v4
with:
name: coverage-artifacts-${{ matrix.shard }}
path: superset-frontend/coverage
@@ -104,106 +98,72 @@ jobs:
report-coverage:
needs: [sharded-jest-tests]
if: needs.frontend-build.outputs.should-run == 'true'
runs-on: ubuntu-26.04
timeout-minutes: 15
permissions:
id-token: write
runs-on: ubuntu-24.04
steps:
- name: Checkout Code
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
fetch-depth: 0
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
- name: Download Coverage Artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
uses: actions/download-artifact@v4
with:
pattern: coverage-artifacts-*
path: coverage/
- name: Reorganize test result reports
run: |
find coverage/
for i in {1..8}; do
mv coverage/coverage-artifacts-${i}/coverage-final.json coverage/coverage-shard-${i}.json
done
shell: bash
- name: Show Files
run: find coverage/
- name: Merge Code Coverage
run: npx nyc merge coverage/ merged-output/coverage-summary.json
- name: Upload Code Coverage
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
uses: codecov/codecov-action@v5
with:
flags: javascript
use_oidc: true
token: ${{ secrets.CODECOV_TOKEN }}
verbose: true
disable_search: true
files: merged-output/coverage-summary.json
slug: apache/superset
lint-frontend:
needs: frontend-build
if: needs.frontend-build.outputs.should-run == 'true'
runs-on: ubuntu-26.04
timeout-minutes: 20
runs-on: ubuntu-24.04
steps:
- name: Download Docker Image Artifact
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
uses: actions/download-artifact@v4
with:
name: docker-image
- name: Load Docker Image
run: |
zstd -d < docker-image.tar.zst | docker load
docker load < docker-image.tar.gz
- name: lint
- name: eslint
run: |
docker run --rm $TAG bash -c \
"npm i && npm run lint"
"npm i && npm run eslint -- . --quiet"
- name: tsc
run: |
docker run --rm $TAG bash -c \
"npm i && npm run plugins:build && npm run type"
"npm run type"
validate-frontend:
needs: frontend-build
if: needs.frontend-build.outputs.should-run == 'true'
runs-on: ubuntu-26.04
timeout-minutes: 20
runs-on: ubuntu-24.04
steps:
- name: Download Docker Image Artifact
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
uses: actions/download-artifact@v4
with:
name: docker-image
- name: Load Docker Image
run: |
zstd -d < docker-image.tar.zst | docker load
run: docker load < docker-image.tar.gz
- name: Build Plugins Packages
run: |
docker run --rm $TAG bash -c \
"npm run plugins:build"
test-storybook:
needs: frontend-build
if: needs.frontend-build.outputs.should-run == 'true'
runs-on: ubuntu-26.04
timeout-minutes: 25
steps:
- name: Download Docker Image Artifact
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
with:
name: docker-image
- name: Load Docker Image
run: |
zstd -d < docker-image.tar.zst | docker load
- name: Build Storybook and Run Tests
- name: Build Plugins Storybook
run: |
docker run --rm $TAG bash -c \
"npm run build-storybook && npx playwright install-deps && npx playwright install chromium && npm run test-storybook:ci"
"npm run plugins:build-storybook"

View File

@@ -1,67 +0,0 @@
name: "Helm: lint and test charts"
on:
pull_request:
types: [opened, reopened, synchronize]
paths:
- "helm/**"
permissions:
contents: read
# Serialize runs per PR without cancelling: when a first-time contributor's
# queued runs are approved together, cancel-in-progress lets an older run
# cancel a newer one, leaving a permanently-cancelled required check on the
# head SHA. Queued runs are cheap here, so let them all complete.
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
cancel-in-progress: false
jobs:
lint-test:
runs-on: ubuntu-26.04
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
submodules: recursive
fetch-depth: 0
- name: Set up Helm
uses: azure/setup-helm@9bc31f4ebc9c6b171d7bfbaa5d006ae7abdb4310 # v5.0.1
with:
version: v3.21.3
- name: Setup Python
uses: ./.github/actions/setup-backend/
with:
install-superset: "false"
- name: Set up chart-testing
uses: ./.github/actions/chart-testing-action
- name: Run chart-testing (list-changed)
id: list-changed
run: |
changed=$(ct list-changed --print-config)
if [[ -n "$changed" ]]; then
echo "changed=true" >> $GITHUB_OUTPUT
fi
env:
CT_CHART_DIRS: helm
CT_SINCE: HEAD
- name: Run chart-testing (lint)
run: ct lint --print-config
env:
CT_CHART_DIRS: helm
CT_LINT_CONF: lintconf.yaml
CT_SINCE: HEAD
CT_CHART_REPOS: bitnami=https://charts.bitnami.com/bitnami
- name: Set up helm-unittest
run: helm plugin install https://github.com/helm-unittest/helm-unittest --version v1.1.1
- name: Run helm-unittest
run: helm unittest helm/superset

View File

@@ -0,0 +1,55 @@
name: "Helm: lint and test charts"
on:
pull_request:
types: [opened, edited, reopened, synchronize]
paths:
- "helm/**"
# cancel previous workflow jobs for PRs
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
cancel-in-progress: true
jobs:
lint-test:
runs-on: ubuntu-24.04
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@v4
with:
persist-credentials: false
submodules: recursive
fetch-depth: 0
- name: Set up Helm
uses: azure/setup-helm@v4
with:
version: v3.16.4
- name: Setup Python
uses: ./.github/actions/setup-backend/
with:
install-superset: 'false'
- name: Set up chart-testing
uses: ./.github/actions/chart-testing-action
- name: Run chart-testing (list-changed)
id: list-changed
run: |
changed=$(ct list-changed --print-config)
if [[ -n "$changed" ]]; then
echo "changed=true" >> $GITHUB_OUTPUT
fi
env:
CT_CHART_DIRS: helm
CT_SINCE: HEAD
- name: Run chart-testing (lint)
run: ct lint --print-config
env:
CT_CHART_DIRS: helm
CT_LINT_CONF: lintconf.yaml
CT_SINCE: HEAD
CT_CHART_REPOS: bitnami=https://charts.bitnami.com/bitnami

View File

@@ -20,7 +20,7 @@ on:
jobs:
release:
runs-on: ubuntu-26.04
runs-on: ubuntu-24.04
permissions:
contents: write
pull-requests: write
@@ -29,7 +29,7 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v4
with:
ref: ${{ inputs.ref || github.ref_name }}
persist-credentials: true
@@ -42,7 +42,7 @@ jobs:
git config user.email "$GITHUB_ACTOR@users.noreply.github.com"
- name: Install Helm
uses: azure/setup-helm@9bc31f4ebc9c6b171d7bfbaa5d006ae7abdb4310 # v5.0.1
uses: azure/setup-helm@v4
with:
version: v3.5.4
@@ -62,8 +62,6 @@ jobs:
run: echo "branch_name=helm-publish-${GITHUB_SHA:0:7}" >> $GITHUB_ENV
- name: Force recreate branch from gh-pages
env:
BRANCH_NAME: ${{ env.branch_name }}
run: |
# Ensure a clean working directory
git reset --hard
@@ -75,13 +73,13 @@ jobs:
git fetch origin gh-pages
# Check out and reset the target branch based on gh-pages
git checkout -B "$BRANCH_NAME" origin/gh-pages
git checkout -B ${{ env.branch_name }} origin/gh-pages
# Remove submodules from the branch
git submodule deinit -f --all
# Force push to the remote branch
git push origin "$BRANCH_NAME" --force
git push origin ${{ env.branch_name }} --force
# Return to the original branch
git checkout local_gha_temp
@@ -103,10 +101,10 @@ jobs:
CR_RELEASE_NAME_TEMPLATE: "superset-helm-chart-{{ .Version }}"
- name: Open Pull Request
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
uses: actions/github-script@v7
with:
script: |
const branchName = process.env.BRANCH_NAME;
const branchName = '${{ env.branch_name }}';
const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/');
if (!branchName) {

View File

@@ -10,46 +10,23 @@ on:
workflow_dispatch:
inputs:
ref:
description: "The branch or tag to checkout"
description: 'The branch or tag to checkout'
required: false
default: ""
default: ''
pr_id:
description: "The pull request ID to checkout"
description: 'The pull request ID to checkout'
required: false
default: ""
default: ''
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
cancel-in-progress: true
jobs:
changes:
runs-on: ubuntu-26.04
timeout-minutes: 10
permissions:
contents: read
pull-requests: read
outputs:
python: ${{ steps.check.outputs.python }}
frontend: ${{ steps.check.outputs.frontend }}
steps:
- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
- name: Check for file changes
id: check
uses: ./.github/actions/change-detector/
with:
token: ${{ secrets.GITHUB_TOKEN }}
# NOTE: Required Playwright tests are in superset-e2e.yml (E2E / playwright-tests)
# This workflow contains only experimental tests that run in shadow mode
playwright-tests-experimental:
needs: changes
if: needs.changes.outputs.python == 'true' || needs.changes.outputs.frontend == 'true'
runs-on: ubuntu-26.04
timeout-minutes: 30
runs-on: ubuntu-22.04
continue-on-error: true
permissions:
contents: read
@@ -68,7 +45,7 @@ jobs:
GITHUB_TOKEN: ${{ github.token }}
services:
postgres:
image: postgres:17-alpine
image: postgres:16-alpine
env:
POSTGRES_USER: superset
POSTGRES_PASSWORD: superset
@@ -83,78 +60,71 @@ jobs:
# Conditional checkout based on context (same as Cypress workflow)
- name: Checkout for push or pull_request event
if: github.event_name == 'push' || github.event_name == 'pull_request'
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v5
with:
persist-credentials: false
submodules: recursive
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
- name: Checkout using ref (workflow_dispatch)
if: github.event_name == 'workflow_dispatch' && github.event.inputs.ref != ''
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v5
with:
persist-credentials: false
ref: ${{ github.event.inputs.ref }}
submodules: recursive
- name: Checkout using PR ID (workflow_dispatch)
if: github.event_name == 'workflow_dispatch' && github.event.inputs.pr_id != ''
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v5
with:
persist-credentials: false
ref: refs/pull/${{ github.event.inputs.pr_id }}/merge
submodules: recursive
# -------------------------------------------------------
- name: Check for file changes
id: check
uses: ./.github/actions/change-detector/
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Python
uses: ./.github/actions/setup-backend/
if: steps.check.outputs.python || steps.check.outputs.frontend
- name: Setup postgres
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
with:
run: setup-postgres
- name: Import test data
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
with:
run: playwright_testdata
- name: Setup Node.js
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: actions/setup-node@v4
with:
node-version-file: "./superset-frontend/.nvmrc"
cache: "npm"
cache-dependency-path: "superset-frontend/package-lock.json"
node-version-file: './superset-frontend/.nvmrc'
- name: Install npm dependencies
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
with:
run: npm-install
- name: Build javascript packages
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
with:
run: build-instrumented-assets
- name: Build embedded SDK
uses: ./.github/actions/cached-dependencies
with:
run: build-embedded-sdk
- name: Install Playwright
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
with:
run: playwright-install
- name: Run Playwright (Experimental Tests)
if: steps.check.outputs.python || steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
env:
NODE_OPTIONS: "--max-old-space-size=4096"
with:
run: playwright-run "${{ matrix.app_root }}" experimental/
- name: Run Playwright (Embedded Tests)
uses: ./.github/actions/cached-dependencies
env:
NODE_OPTIONS: "--max-old-space-size=4096"
# Scope embedded-only env vars to this step. Setting them at the job
# level enabled the EMBEDDED_SUPERSET feature flag inside Flask for
# the preceding "Required Tests" and "Experimental Tests" steps too,
# which loads extra handlers and destabilizes the werkzeug dev
# server under the 2-worker Playwright load. Required Tests should
# match master's Flask configuration.
SUPERSET_FEATURE_EMBEDDED_SUPERSET: "true"
INCLUDE_EMBEDDED: "true"
with:
run: playwright-run "${{ matrix.app_root }}" embedded
- name: Set safe app root
if: failure()
id: set-safe-app-root
@@ -163,7 +133,7 @@ jobs:
SAFE_APP_ROOT=${APP_ROOT//\//_}
echo "safe_app_root=$SAFE_APP_ROOT" >> $GITHUB_OUTPUT
- name: Upload Playwright Artifacts
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
uses: actions/upload-artifact@v4
if: failure()
with:
path: |

View File

@@ -1,11 +1,6 @@
# Python integration tests
name: Python-Integration
# Least-privilege default for GITHUB_TOKEN. Jobs that need more (e.g. OIDC for
# codecov uploads) opt in via their own job-level `permissions:` block.
permissions:
contents: read
on:
push:
branches:
@@ -19,32 +14,8 @@ concurrency:
cancel-in-progress: true
jobs:
changes:
runs-on: ubuntu-26.04
timeout-minutes: 10
permissions:
contents: read
pull-requests: read
outputs:
python: ${{ steps.check.outputs.python }}
steps:
- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
- name: Check for file changes
id: check
uses: ./.github/actions/change-detector/
with:
token: ${{ secrets.GITHUB_TOKEN }}
test-mysql:
needs: changes
if: needs.changes.outputs.python == 'true'
runs-on: ubuntu-26.04
timeout-minutes: 45
permissions:
id-token: write
runs-on: ubuntu-24.04
env:
PYTHONPATH: ${{ github.workspace }}
SUPERSET_CONFIG: tests.integration_tests.superset_test_config
@@ -54,8 +25,6 @@ jobs:
services:
mysql:
image: mysql:8.0
# Authenticated pulls use our higher Docker Hub rate limit. Empty on
# fork PRs (secrets unavailable) -> runner falls back to anonymous.
env:
MYSQL_ROOT_PASSWORD: root
ports:
@@ -72,70 +41,43 @@ jobs:
- 16379:6379
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v4
with:
persist-credentials: false
submodules: recursive
- name: Check for file changes
id: check
uses: ./.github/actions/change-detector/
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Python
uses: ./.github/actions/setup-backend/
if: steps.check.outputs.python
- name: Setup MySQL
if: steps.check.outputs.python
uses: ./.github/actions/cached-dependencies
with:
run: setup-mysql
- name: Start Celery worker
if: steps.check.outputs.python
uses: ./.github/actions/cached-dependencies
with:
run: celery-worker
- name: Python integration tests (MySQL)
if: steps.check.outputs.python
run: |
./scripts/python_tests.sh
- name: Upload code coverage
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
uses: codecov/codecov-action@v5
with:
flags: python,mysql
token: ${{ secrets.CODECOV_TOKEN }}
verbose: true
use_oidc: true
slug: apache/superset
- name: Generate database diagnostics for docs
env:
SUPERSET_CONFIG: tests.integration_tests.superset_test_config
SUPERSET__SQLALCHEMY_DATABASE_URI: |
mysql+mysqldb://superset:superset@127.0.0.1:13306/superset?charset=utf8mb4&binary_prefix=true
run: |
python -c "
import json
from superset.app import create_app
from superset.db_engine_specs.lib import generate_yaml_docs
app = create_app()
with app.app_context():
docs = generate_yaml_docs()
# Wrap in the expected format
output = {
'generated': '$(date -Iseconds)',
'databases': docs
}
with open('databases-diagnostics.json', 'w') as f:
json.dump(output, f, indent=2, default=str)
print(f'Generated diagnostics for {len(docs)} databases')
"
- name: Upload database diagnostics artifact
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: database-diagnostics
path: databases-diagnostics.json
retention-days: 7
test-postgres:
needs: changes
if: needs.changes.outputs.python == 'true'
runs-on: ubuntu-26.04
timeout-minutes: 45
permissions:
id-token: write
runs-on: ubuntu-24.04
strategy:
matrix:
# Full version spread on push (master/release) + nightly; current only
# on PRs to cut runner cost (cross-version breaks are caught at merge).
python-version: ${{ github.event_name == 'pull_request' && fromJSON('["current"]') || fromJSON('["current", "next"]') }}
python-version: ["current", "previous", "next"]
env:
PYTHONPATH: ${{ github.workspace }}
SUPERSET_CONFIG: tests.integration_tests.superset_test_config
@@ -143,7 +85,7 @@ jobs:
SUPERSET__SQLALCHEMY_DATABASE_URI: postgresql+psycopg2://superset:superset@127.0.0.1:15432/superset
services:
postgres:
image: postgres:17-alpine
image: postgres:16-alpine
env:
POSTGRES_USER: superset
POSTGRES_PASSWORD: superset
@@ -157,41 +99,44 @@ jobs:
- 16379:6379
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v4
with:
persist-credentials: false
submodules: recursive
- name: Check for file changes
id: check
uses: ./.github/actions/change-detector/
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Python
uses: ./.github/actions/setup-backend/
if: steps.check.outputs.python
with:
python-version: ${{ matrix.python-version }}
- name: Setup Postgres
if: steps.check.outputs.python
uses: ./.github/actions/cached-dependencies
with:
run: |
setup-postgres
- name: Start Celery worker
if: steps.check.outputs.python
uses: ./.github/actions/cached-dependencies
with:
run: celery-worker
- name: Python integration tests (PostgreSQL)
if: steps.check.outputs.python
run: |
./scripts/python_tests.sh
- name: Upload code coverage
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
uses: codecov/codecov-action@v5
with:
flags: python,postgres
token: ${{ secrets.CODECOV_TOKEN }}
verbose: true
use_oidc: true
slug: apache/superset
test-sqlite:
needs: changes
if: needs.changes.outputs.python == 'true'
runs-on: ubuntu-26.04
timeout-minutes: 45
permissions:
id-token: write
runs-on: ubuntu-24.04
env:
PYTHONPATH: ${{ github.workspace }}
SUPERSET_CONFIG: tests.integration_tests.superset_test_config
@@ -207,51 +152,37 @@ jobs:
- 16379:6379
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v4
with:
persist-credentials: false
submodules: recursive
- name: Check for file changes
id: check
uses: ./.github/actions/change-detector/
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Python
uses: ./.github/actions/setup-backend/
if: steps.check.outputs.python
- name: Install dependencies
if: steps.check.outputs.python
uses: ./.github/actions/cached-dependencies
with:
run: |
# sqlite needs this working directory
mkdir ${{ github.workspace }}/.temp
- name: Start Celery worker
if: steps.check.outputs.python
uses: ./.github/actions/cached-dependencies
with:
run: celery-worker
- name: Python integration tests (SQLite)
if: steps.check.outputs.python
run: |
./scripts/python_tests.sh
- name: Upload code coverage
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
uses: codecov/codecov-action@v5
with:
flags: python,sqlite
token: ${{ secrets.CODECOV_TOKEN }}
verbose: true
use_oidc: true
slug: apache/superset
# Stable required-status-check anchor for the matrix-based test-postgres job.
# It is gated on change detection, so on non-Python PRs it is skipped and
# never produces its `test-postgres (current)` context (a job-level skip
# happens before matrix expansion). This always-running job reports a single
# context branch protection can require: it passes when test-postgres
# succeeded or was skipped, and fails only on a real failure.
test-postgres-required:
needs: [changes, test-postgres]
if: always()
runs-on: ubuntu-26.04
timeout-minutes: 5
steps:
- name: Check test-postgres result
env:
RESULT: ${{ needs.test-postgres.result }}
run: |
if [ "$RESULT" != "success" ] && [ "$RESULT" != "skipped" ]; then
echo "test-postgres did not pass (result: $RESULT)"
exit 1
fi
echo "test-postgres result: $RESULT"

View File

@@ -15,32 +15,8 @@ concurrency:
cancel-in-progress: true
jobs:
changes:
runs-on: ubuntu-26.04
timeout-minutes: 10
permissions:
contents: read
pull-requests: read
outputs:
python: ${{ steps.check.outputs.python }}
steps:
- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
- name: Check for file changes
id: check
uses: ./.github/actions/change-detector/
with:
token: ${{ secrets.GITHUB_TOKEN }}
test-postgres-presto:
needs: changes
if: needs.changes.outputs.python == 'true'
runs-on: ubuntu-26.04
timeout-minutes: 45
permissions:
id-token: write
runs-on: ubuntu-24.04
env:
PYTHONPATH: ${{ github.workspace }}
SUPERSET_CONFIG: tests.integration_tests.superset_test_config
@@ -49,7 +25,7 @@ jobs:
SUPERSET__SQLALCHEMY_EXAMPLES_URI: presto://localhost:15433/memory/default
services:
postgres:
image: postgres:17-alpine
image: postgres:16-alpine
env:
POSTGRES_USER: superset
POSTGRES_PASSWORD: superset
@@ -72,38 +48,43 @@ jobs:
- 16379:6379
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v4
with:
persist-credentials: false
submodules: recursive
- name: Check for file changes
id: check
uses: ./.github/actions/change-detector/
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Python
uses: ./.github/actions/setup-backend/
if: steps.check.outputs.python == 'true'
- name: Setup Postgres
if: steps.check.outputs.python
uses: ./.github/actions/cached-dependencies
with:
run: setup-postgres
run: |
echo "${{ steps.check.outputs.python }}"
setup-postgres
- name: Start Celery worker
if: steps.check.outputs.python
uses: ./.github/actions/cached-dependencies
with:
run: celery-worker
- name: Python unit tests (PostgreSQL)
if: steps.check.outputs.python
run: |
./scripts/python_tests.sh -m 'chart_data_flow or sql_json_flow'
- name: Upload code coverage
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
uses: codecov/codecov-action@v5
with:
flags: python,presto
token: ${{ secrets.CODECOV_TOKEN }}
verbose: true
use_oidc: true
slug: apache/superset
test-postgres-hive:
needs: changes
if: needs.changes.outputs.python == 'true'
runs-on: ubuntu-26.04
timeout-minutes: 45
permissions:
id-token: write
runs-on: ubuntu-24.04
env:
PYTHONPATH: ${{ github.workspace }}
SUPERSET_CONFIG: tests.integration_tests.superset_test_config
@@ -113,7 +94,7 @@ jobs:
UPLOAD_FOLDER: /tmp/.superset/uploads/
services:
postgres:
image: postgres:17-alpine
image: postgres:16-alpine
env:
POSTGRES_USER: superset
POSTGRES_PASSWORD: superset
@@ -127,34 +108,45 @@ jobs:
- 16379:6379
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v4
with:
persist-credentials: false
submodules: recursive
- name: Check for file changes
id: check
uses: ./.github/actions/change-detector/
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Create csv upload directory
if: steps.check.outputs.python
run: sudo mkdir -p /tmp/.superset/uploads
- name: Give write access to the csv upload directory
if: steps.check.outputs.python
run: sudo chown -R $USER:$USER /tmp/.superset
- name: Start hadoop and hive
if: steps.check.outputs.python
run: docker compose -f scripts/databases/hive/docker-compose.yml up -d
- name: Setup Python
uses: ./.github/actions/setup-backend/
if: steps.check.outputs.python
- name: Setup Postgres
if: steps.check.outputs.python
uses: ./.github/actions/cached-dependencies
with:
run: setup-postgres
- name: Start Celery worker
if: steps.check.outputs.python
uses: ./.github/actions/cached-dependencies
with:
run: celery-worker
- name: Python unit tests (PostgreSQL)
if: steps.check.outputs.python
run: |
uv pip install --system -e .[hive]
pip install -e .[hive]
./scripts/python_tests.sh -m 'chart_data_flow or sql_json_flow'
- name: Upload code coverage
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
uses: codecov/codecov-action@v5
with:
flags: python,hive
token: ${{ secrets.CODECOV_TOKEN }}
verbose: true
use_oidc: true
slug: apache/superset

View File

@@ -1,11 +1,6 @@
# Python unit tests
name: Python-Unit
# Least-privilege default for GITHUB_TOKEN. Jobs that need more (e.g. OIDC for
# codecov uploads) opt in via their own job-level `permissions:` block.
permissions:
contents: read
on:
push:
branches:
@@ -20,94 +15,46 @@ concurrency:
cancel-in-progress: true
jobs:
changes:
runs-on: ubuntu-26.04
timeout-minutes: 10
permissions:
contents: read
pull-requests: read
outputs:
python: ${{ steps.check.outputs.python }}
unit-tests:
runs-on: ubuntu-24.04
strategy:
matrix:
python-version: ["previous", "current", "next"]
env:
PYTHONPATH: ${{ github.workspace }}
steps:
- name: Checkout
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@v4
with:
persist-credentials: false
submodules: recursive
- name: Check for file changes
id: check
uses: ./.github/actions/change-detector/
with:
token: ${{ secrets.GITHUB_TOKEN }}
unit-tests:
needs: changes
if: needs.changes.outputs.python == 'true'
runs-on: ubuntu-26.04
timeout-minutes: 30
permissions:
id-token: write
strategy:
matrix:
# Full version spread on push (master/release) + nightly; current only
# on PRs to cut runner cost (cross-version breaks are caught at merge).
python-version: ${{ github.event_name == 'pull_request' && fromJSON('["current"]') || fromJSON('["current", "next"]') }}
env:
PYTHONPATH: ${{ github.workspace }}
# Promotes the SQLAlchemy 2.0 deprecation warnings already locked in as
# errors via pytest.ini's `filterwarnings` to actually run in CI, so a
# regression on those fails the build instead of relying on a
# contributor remembering to set this locally. See the migration
# battleplan: https://github.com/apache/superset/discussions/40273
SQLALCHEMY_WARN_20: "1"
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
submodules: recursive
- name: Setup Python
uses: ./.github/actions/setup-backend/
if: steps.check.outputs.python
with:
python-version: ${{ matrix.python-version }}
- name: Python unit tests
if: steps.check.outputs.python
env:
SUPERSET_TESTENV: true
SUPERSET_SECRET_KEY: not-a-secret
run: |
pytest --durations-min=0.5 --cov-report= --cov=superset ./tests/common ./tests/unit_tests --cache-clear --maxfail=50
- name: Python 100% coverage unit tests
if: steps.check.outputs.python
env:
SUPERSET_TESTENV: true
SUPERSET_SECRET_KEY: not-a-secret
run: |
pytest --durations-min=0.5 --cov=superset/sql/ ./tests/unit_tests/sql/ --cache-clear --cov-fail-under=100
pytest --durations-min=0.5 --cov=superset/semantic_layers/ ./tests/unit_tests/semantic_layers/ --cache-clear --cov-fail-under=100
- name: Upload code coverage
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
uses: codecov/codecov-action@v5
with:
flags: python,unit
token: ${{ secrets.CODECOV_TOKEN }}
verbose: true
use_oidc: true
slug: apache/superset
# Stable required-status-check anchor. `unit-tests` is a matrix job gated on
# change detection, so on non-Python PRs it is skipped and never produces its
# `unit-tests (current)` context (a job-level skip happens before matrix
# expansion). This always-running job reports a single context that branch
# protection can require: it passes when unit-tests succeeded or was skipped,
# and fails only on a real failure.
unit-tests-required:
needs: [changes, unit-tests]
if: always()
runs-on: ubuntu-26.04
timeout-minutes: 5
steps:
- name: Check unit-tests result
env:
RESULT: ${{ needs.unit-tests.result }}
run: |
if [ "$RESULT" != "success" ] && [ "$RESULT" != "skipped" ]; then
echo "unit-tests did not pass (result: $RESULT)"
exit 1
fi
echo "unit-tests result: $RESULT"

View File

@@ -1,88 +0,0 @@
name: Translation Regression Comment
on:
# zizmor: ignore[dangerous-triggers] - runs in base-branch context and only consumes the uploaded artifact; never checks out PR code (see note below)
workflow_run:
workflows: ["Translations"]
types: [completed]
# This workflow posts a PR comment when the Translations workflow detects a
# regression. It uses the workflow_run trigger so that it always runs in the
# base-branch context and can safely be granted write permissions, even for
# PRs from forks.
#
# IMPORTANT: This workflow must NEVER check out code from the PR branch.
# All data comes from the artifact uploaded by the Translations workflow.
permissions:
pull-requests: write
actions: read
jobs:
post-comment:
runs-on: ubuntu-26.04
# Only act when the Translations workflow failed (which means a regression
# was detected — the workflow exits 1 on regression).
if: github.event.workflow_run.conclusion == 'failure'
steps:
- name: Download regression artifact
id: download
continue-on-error: true
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
with:
name: translation-regression
run-id: ${{ github.event.workflow_run.id }}
github-token: ${{ secrets.GITHUB_TOKEN }}
path: /tmp/translation-regression
- name: Post or update PR comment
if: steps.download.outcome == 'success'
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
with:
script: |
const fs = require('fs');
const prNumberFile = '/tmp/translation-regression/pr-number.txt';
const reportFile = '/tmp/translation-regression/regression-report.md';
if (!fs.existsSync(prNumberFile) || !fs.existsSync(reportFile)) {
console.log('Artifact files not found, skipping comment.');
return;
}
const prNumber = parseInt(fs.readFileSync(prNumberFile, 'utf8').trim(), 10);
if (!prNumber) {
console.log('Could not parse PR number, skipping comment.');
return;
}
const report = fs.readFileSync(reportFile, 'utf8');
const marker = '<!-- translation-regression-bot -->';
const body = `${marker}\n${report}`;
const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
});
const existing = comments.find(c => c.body && c.body.includes(marker));
if (existing) {
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: existing.id,
body,
});
console.log(`Updated existing comment ${existing.id} on PR #${prNumber}`);
} else {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
body,
});
console.log(`Created new comment on PR #${prNumber}`);
}

View File

@@ -8,10 +8,6 @@ on:
pull_request:
types: [synchronize, opened, reopened, ready_for_review]
permissions:
contents: read
pull-requests: read
# cancel previous workflow jobs for PRs
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
@@ -19,13 +15,10 @@ concurrency:
jobs:
frontend-check-translations:
runs-on: ubuntu-26.04
permissions:
contents: read
pull-requests: read
runs-on: ubuntu-24.04
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v4
with:
persist-credentials: false
submodules: recursive
@@ -38,11 +31,9 @@ jobs:
- name: Setup Node.js
if: steps.check.outputs.frontend
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
uses: actions/setup-node@v4
with:
node-version-file: "./superset-frontend/.nvmrc"
cache: "npm"
cache-dependency-path: "superset-frontend/package-lock.json"
node-version-file: './superset-frontend/.nvmrc'
- name: Install dependencies
if: steps.check.outputs.frontend
uses: ./.github/actions/cached-dependencies
@@ -55,17 +46,13 @@ jobs:
npm run build-translation
babel-extract:
runs-on: ubuntu-26.04
permissions:
contents: read
pull-requests: read
runs-on: ubuntu-24.04
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v4
with:
persist-credentials: false
submodules: recursive
- name: Check for file changes
id: check
uses: ./.github/actions/change-detector/
@@ -73,83 +60,8 @@ jobs:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Python
if: steps.check.outputs.python == 'true' || steps.check.outputs.frontend == 'true'
if: steps.check.outputs.python
uses: ./.github/actions/setup-backend/
- name: Install gettext tools
if: steps.check.outputs.python == 'true' || steps.check.outputs.frontend == 'true'
run: sudo apt-get update && sudo apt-get install -y gettext
# Fetch the base ref so we can compare PR-introduced regressions
# against a fair baseline (also runs babel_update against the base
# source) — this isolates the PR's contribution from any pre-existing
# drift on the base branch.
- name: Fetch base ref and create comparison worktree
if: steps.check.outputs.python == 'true' || steps.check.outputs.frontend == 'true'
env:
PR_BASE_REF: ${{ github.event.pull_request.base.ref }}
run: |
# For PRs use the base branch; for direct pushes compare against the previous commit.
BASE_REF="$PR_BASE_REF"
if [ -n "$BASE_REF" ]; then
git fetch --depth=1 origin "$BASE_REF"
else
git fetch --depth=2 origin "$GITHUB_REF"
fi
git worktree add /tmp/base-worktree FETCH_HEAD
# Run babel_update against BASE source + BASE translations. Any drift
# already present on the base branch (source strings that have changed
# without .po updates) shows up here as fuzzies — and will also show
# up in the PR run, so it cancels out in the comparison.
- name: Baseline — run babel_update against BASE source
if: steps.check.outputs.python == 'true' || steps.check.outputs.frontend == 'true'
working-directory: /tmp/base-worktree
- name: Test babel extraction
if: steps.check.outputs.python
run: ./scripts/translations/babel_update.sh
- name: Record baseline translation counts
if: steps.check.outputs.python == 'true' || steps.check.outputs.frontend == 'true'
run: |
python scripts/translations/check_translation_regression.py \
--count \
--translations-dir /tmp/base-worktree/superset/translations \
> /tmp/before.json
# Run babel_update against the PR source and PR translations. This keeps
# committed .po fixes in play while the base babel_update above still
# cancels out translation drift already present on the base branch.
- name: Run babel_update against PR source
if: steps.check.outputs.python == 'true' || steps.check.outputs.frontend == 'true'
run: ./scripts/translations/babel_update.sh
- name: Check for translation regression
id: regression
if: steps.check.outputs.python == 'true' || steps.check.outputs.frontend == 'true'
continue-on-error: true
run: |
python scripts/translations/check_translation_regression.py \
--compare /tmp/before.json \
--report /tmp/regression-report.md
# Save the PR number so the comment workflow can post the report without
# needing write permissions on this pull_request-triggered job.
- name: Save PR number for comment workflow
if: >-
github.event_name == 'pull_request' &&
steps.regression.outcome == 'failure'
run: echo "${{ github.event.pull_request.number }}" > /tmp/pr-number.txt
- name: Upload regression artifact
if: >-
github.event_name == 'pull_request' &&
steps.regression.outcome == 'failure'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: translation-regression
path: |
/tmp/regression-report.md
/tmp/pr-number.txt
- name: Fail if regression detected
if: steps.regression.outcome == 'failure'
run: exit 1

View File

@@ -11,9 +11,6 @@ on:
- "superset-websocket/**"
types: [synchronize, opened, reopened, ready_for_review]
permissions:
contents: read
# cancel previous workflow jobs for PRs
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
@@ -21,17 +18,12 @@ concurrency:
jobs:
app-checks:
runs-on: ubuntu-26.04
timeout-minutes: 20
runs-on: ubuntu-24.04
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v4
with:
persist-credentials: false
- name: Setup Node.js
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version-file: './superset-websocket/.nvmrc'
- name: Install dependencies
working-directory: ./superset-websocket
run: npm ci

View File

@@ -9,13 +9,13 @@ on:
workflow_dispatch:
inputs:
comment_body:
description: "Comment Body"
description: 'Comment Body'
required: true
type: string
jobs:
supersetbot:
runs-on: ubuntu-26.04
runs-on: ubuntu-24.04
if: >
github.event_name == 'workflow_dispatch' ||
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '@supersetbot'))
@@ -26,7 +26,7 @@ jobs:
steps:
- name: Quickly add thumbs up!
if: github.event_name == 'issue_comment' && contains(github.event.comment.body, '@supersetbot')
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
uses: actions/github-script@v7
with:
script: |
const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/')
@@ -38,7 +38,7 @@ jobs:
});
- name: "Checkout ( ${{ github.sha }} )"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v4
with:
persist-credentials: false

View File

@@ -1,60 +0,0 @@
name: Sync requirements for Python dependency PRs
on:
pull_request:
types: [opened, synchronize]
permissions:
contents: write
pull-requests: read
jobs:
sync-python-dep-requirements:
# This action is limited for (1) PRs authored by Dependabot and (2) upstream repo due to write back to remote
if: github.repository == 'apache/superset' && github.event.pull_request.user.login == 'dependabot[bot]' && github.event.pull_request.head.repo.fork == false
runs-on: ubuntu-26.04
steps:
- name: Fetch Dependabot metadata
id: dependabot-metadata
shell: bash
env:
BRANCH_NAME: ${{ github.head_ref }}
run: |
# Get current branch name, extract the package ecosystem and return as GHA step output
packageEcosystem=$(echo "$BRANCH_NAME" | cut -d'/' -f2)
echo "package-ecosystem=$packageEcosystem" >> $GITHUB_OUTPUT
# zizmor: ignore[artipacked] - required persisted credentials to push synced requirement changes back to remote
- name: Checkout source code
if: ${{ steps.dependabot-metadata.outputs.package-ecosystem == 'pip' }}
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
ref: ${{ github.event.pull_request.head.sha }}
persist-credentials: true
# Authenticate the Docker daemon so the python:slim pull in
# uv-pip-compile.sh uses our (much higher) authenticated rate limit
# instead of the shared-runner anonymous one.
- name: Login to Docker Hub
if: ${{ steps.dependabot-metadata.outputs.package-ecosystem == 'pip' }}
continue-on-error: true
uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0
with:
username: ${{ secrets.DOCKERHUB_USER }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Sync requirements in containerized environment
if: ${{ steps.dependabot-metadata.outputs.package-ecosystem == 'pip' }}
run: ./scripts/uv-pip-compile.sh
- name: Push changes to remote PRs
if: ${{ steps.dependabot-metadata.outputs.package-ecosystem == 'pip' }}
run: |
git config user.name 'github-actions[bot]'
git config user.email '41898282+github-actions[bot]@users.noreply.github.com'
git add requirements
git diff --cached --quiet && exit 0
git commit --signoff --message "build(deps): sync pinned requirements for Dependabot pip PRs"
git push origin "HEAD:refs/heads/${GITHUB_EVENT_PULL_REQUEST_HEAD_REF}"
env:
GITHUB_EVENT_PULL_REQUEST_HEAD_REF: ${{ github.event.pull_request.head.ref }}

View File

@@ -16,23 +16,14 @@ on:
force-latest:
required: true
type: choice
default: "false"
default: 'false'
description: Whether to force a latest tag on the release
options:
- "true"
- "false"
permissions:
contents: read
# Serialize with the scheduled Docker image refresh — both workflows push
# to the same Docker Hub tags and must not race on apache/superset:latest.
concurrency:
group: docker-publish-latest-release
cancel-in-progress: false
- 'true'
- 'false'
jobs:
config:
runs-on: ubuntu-26.04
runs-on: ubuntu-24.04
outputs:
has-secrets: ${{ steps.check.outputs.has-secrets }}
steps:
@@ -40,29 +31,24 @@ jobs:
id: check
shell: bash
run: |
if [ -n "${DOCKERHUB_USER}" ]; then
if [ -n "${{ (secrets.DOCKERHUB_USER != '' && secrets.DOCKERHUB_TOKEN != '') || '' }}" ]; then
echo "has-secrets=1" >> "$GITHUB_OUTPUT"
fi
env:
DOCKERHUB_USER: ${{ (secrets.DOCKERHUB_USER != '' && secrets.DOCKERHUB_TOKEN != '') || '' }}
docker-release:
needs: config
if: needs.config.outputs.has-secrets
name: docker-release
runs-on: ubuntu-26.04
permissions:
contents: write
runs-on: ubuntu-24.04
strategy:
matrix:
build_preset:
["dev", "lean", "websocket", "dockerize", "py311", "py312"]
build_preset: ["dev", "lean", "py310", "websocket", "dockerize", "py311"]
fail-fast: false
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v4
with:
persist-credentials: false
fetch-depth: 0
- name: Setup Docker Environment
@@ -74,11 +60,9 @@ jobs:
build: "true"
- name: Use Node.js 20
# zizmor: ignore[cache-poisoning] - node only runs the supersetbot CLI; no dependency cache is enabled
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
uses: actions/setup-node@v4
with:
node-version: 20
package-manager-cache: false
- name: Setup supersetbot
uses: ./.github/actions/setup-supersetbot/
@@ -88,21 +72,17 @@ jobs:
DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
INPUT_RELEASE: ${{ github.event.inputs.release }}
INPUT_FORCE_LATEST: ${{ github.event.inputs.force-latest }}
INPUT_GIT_REF: ${{ github.event.inputs.git-ref }}
GITHUB_EVENT_RELEASE_TAG_NAME: ${{ github.event.release.tag_name }}
run: |
RELEASE="${GITHUB_EVENT_RELEASE_TAG_NAME}"
RELEASE="${{ github.event.release.tag_name }}"
FORCE_LATEST=""
EVENT="${{github.event_name}}"
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
# in the case of a manually-triggered run, read release from input
RELEASE="${INPUT_RELEASE}"
if [ "${INPUT_FORCE_LATEST}" = "true" ]; then
RELEASE="${{ github.event.inputs.release }}"
if [ "${{ github.event.inputs.force-latest }}" = "true" ]; then
FORCE_LATEST="--force-latest"
fi
git checkout "${INPUT_GIT_REF}"
git checkout "${{ github.event.inputs.git-ref }}"
EVENT="release"
fi
@@ -120,23 +100,21 @@ jobs:
update-prs-with-release-info:
needs: config
if: needs.config.outputs.has-secrets
runs-on: ubuntu-26.04
runs-on: ubuntu-24.04
permissions:
contents: read
pull-requests: write
steps:
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
uses: actions/checkout@v4
with:
persist-credentials: false
fetch-depth: 0
- name: Use Node.js 20
# zizmor: ignore[cache-poisoning] - node only runs the supersetbot CLI; no dependency cache is enabled
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
uses: actions/setup-node@v4
with:
node-version: 20
package-manager-cache: false
- name: Setup supersetbot
uses: ./.github/actions/setup-supersetbot/
@@ -144,15 +122,13 @@ jobs:
- name: Label the PRs with the right release-related labels
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
INPUT_RELEASE: ${{ github.event.inputs.release }}
GITHUB_EVENT_RELEASE_TAG_NAME: ${{ github.event.release.tag_name }}
run: |
export GITHUB_ACTOR=""
git fetch --all --tags
git checkout master
RELEASE="${GITHUB_EVENT_RELEASE_TAG_NAME}"
RELEASE="${{ github.event.release.tag_name }}"
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
# in the case of a manually-triggered run, read release from input
RELEASE="${INPUT_RELEASE}"
RELEASE="${{ github.event.inputs.release }}"
fi
supersetbot release-label $RELEASE

View File

@@ -6,12 +6,9 @@ on:
- master
- "[0-9].[0-9]*"
permissions:
contents: read
jobs:
config:
runs-on: ubuntu-26.04
runs-on: ubuntu-24.04
outputs:
has-secrets: ${{ steps.check.outputs.has-secrets }}
steps:
@@ -19,27 +16,23 @@ jobs:
id: check
shell: bash
run: |
if [ -n "${GSHEET_KEY}" ]; then
if [ -n "${{ (secrets.GSHEET_KEY != '' ) || '' }}" ]; then
echo "has-secrets=1" >> "$GITHUB_OUTPUT"
fi
env:
GSHEET_KEY: ${{ (secrets.GSHEET_KEY != '' ) || '' }}
process-and-upload:
needs: config
if: needs.config.outputs.has-secrets
runs-on: ubuntu-26.04
runs-on: ubuntu-24.04
name: Generate Reports
steps:
- name: Checkout Repository
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
uses: actions/setup-node@v4
with:
node-version-file: "./superset-frontend/.nvmrc"
node-version-file: './superset-frontend/.nvmrc'
- name: Install Dependencies
run: npm ci

View File

@@ -1,29 +1,22 @@
name: Welcome New Contributor
on:
# zizmor: ignore[dangerous-triggers] - posts a welcome comment only; does not check out or execute PR-provided code
pull_request_target:
types: [opened]
jobs:
welcome:
runs-on: ubuntu-26.04
if: github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR'
runs-on: ubuntu-24.04
permissions:
pull-requests: write
steps:
- name: Welcome Message
uses: actions/first-interaction@1c4688942c71f71d4f5502a26ea67c331730fa4d # v3.1.0
uses: actions/first-interaction@v2
continue-on-error: true
with:
repo_token: ${{ github.token }}
issue_message: |-
Congrats on opening your first issue and thank you for contributing to Superset! :tada: :heart:
Please read our [New Contributor Welcome & Expectations](https://github.com/apache/superset/wiki/New-Contributor-Welcome-&-Expectations) guide.
pr_message: |-
repo-token: ${{ github.token }}
pr-message: |-
Congrats on making your first PR and thank you for contributing to Superset! :tada: :heart:
Please read our [New Contributor Welcome & Expectations](https://github.com/apache/superset/wiki/New-Contributor-Welcome-&-Expectations) guide.
We hope to see you in our [Slack](https://apache-superset.slack.com/) community too! Not signed up? Use our [Slack App](http://bit.ly/join-superset-slack) to self-register.

14
.gitignore vendored
View File

@@ -33,7 +33,6 @@ cover
.env
.envrc
.idea
.roo
.mypy_cache
.python-version
.tox
@@ -44,7 +43,7 @@ _modules
_static
build
app.db
*.egg-info/
apache_superset.egg-info/
changelog.sh
dist
dump.rdb
@@ -61,7 +60,6 @@ tmp
rat-results.txt
superset/app/
superset-websocket/config.json
.direnv
*.log
# Node.js, webpack artifacts, storybook
@@ -69,11 +67,15 @@ superset-websocket/config.json
*.js.map
node_modules
npm-debug.log*
superset/static/*
superset/static/assets/*
!superset/static/assets/.gitkeep
superset/static/uploads/*
!superset/static/uploads/.gitkeep
superset/static/version_info.json
superset-frontend/**/esm/*
superset-frontend/**/lib/*
superset-frontend/**/storybook-static/*
superset-frontend/migration-storybook.log
yarn-error.log
*.map
*.min.js
@@ -115,8 +117,6 @@ release.json
superset/translations/**/messages.json
# these mo binary files are generated by `pybabel compile`
superset/translations/**/messages.mo
# cross-language index generated by scripts/translations/build_translation_index.py
superset/translations/translation_index.json
docker/requirements-local.txt
@@ -138,6 +138,4 @@ PROJECT.md
.claude_rc*
.claude/settings.local.json
.env.local
oxc-custom-build/
*.code-workspace
*.duckdb

3
.gitmodules vendored
View File

@@ -21,6 +21,9 @@
[submodule ".github/actions/pr-lint-action"]
path = .github/actions/pr-lint-action
url = https://github.com/morrisoncole/pr-lint-action
[submodule ".github/actions/file-changes-action"]
path = .github/actions/file-changes-action
url = https://github.com/trilom/file-changes-action
[submodule ".github/actions/cached-dependencies"]
path = .github/actions/cached-dependencies
url = https://github.com/apache-superset/cached-dependencies

153
.pre-commit-config.yaml Executable file → Normal file
View File

@@ -23,18 +23,15 @@ repos:
rev: v1.15.0
hooks:
- id: mypy
name: mypy (main)
args: [--check-untyped-defs]
exclude: ^superset-extensions-cli/
additional_dependencies: [
types-cachetools,
types-simplejson,
types-python-dateutil,
types-requests,
# types-redis is intentionally absent: redis-py ships its own
# bundled types (py.typed, since 4.6+/5.x), while the stub
# package is unmaintained (frozen at the 4.6.0.x API surface).
# Installing the stub would shadow the accurate inline types.
# types-redis 4.6.0.5 is failing mypy
# because of https://github.com/python/typeshed/pull/10531
types-redis==4.6.0.4,
types-pytz,
types-croniter,
types-PyYAML,
@@ -42,65 +39,41 @@ repos:
types-paramiko,
types-Markdown,
]
- id: mypy
name: mypy (superset-extensions-cli)
args: [--check-untyped-defs]
files: ^superset-extensions-cli/
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v5.0.0
hooks:
- id: check-docstring-first
- id: check-added-large-files
exclude: ^.*\.(geojson)$|^docs/static/img/screenshots/.*|^superset-frontend/CHANGELOG\.md$|^superset/examples/.*/data\.parquet$|^superset/translations/.*\.po$
exclude: ^.*\.(geojson)$|^docs/static/img/screenshots/.*|^superset-frontend/CHANGELOG\.md$
- id: check-yaml
exclude: ^helm/superset/templates/
- id: debug-statements
- id: end-of-file-fixer
exclude: .*/lerna\.json$|^docs/static/img/logos/
exclude: .*/lerna\.json$
- id: trailing-whitespace
exclude: ^.*\.(snap)
args: ["--markdown-linebreak-ext=md"]
- repo: local
hooks:
- id: prettier-frontend
name: prettier (frontend)
entry: bash -c 'cd superset-frontend && files=(); for f in "$@"; do files+=("${f#superset-frontend/}"); done; npx prettier --write -- "${files[@]}"' --
language: system
pass_filenames: true
files: ^superset-frontend/.*\.(js|jsx|ts|tsx|css|scss|sass|json)$
- repo: local
hooks:
- id: oxlint-frontend
name: oxlint (frontend)
entry: ./scripts/oxlint.sh
language: system
pass_filenames: true
files: ^superset-frontend/.*\.(js|jsx|ts|tsx)$
- id: custom-rules-frontend
name: custom rules (frontend)
entry: ./scripts/check-custom-rules.sh
language: system
pass_filenames: true
files: ^superset-frontend/.*\.(js|jsx|ts|tsx)$
- id: stylelint-frontend
name: stylelint (frontend css-in-js)
entry: ./scripts/stylelint.sh
language: system
pass_filenames: true
files: ^superset-frontend/.*\.(js|jsx|ts|tsx)$
- id: eslint-docs
name: eslint (docs)
entry: bash -c 'cd docs && FILES=$(printf "%s\n" "$@" | sed "s|^docs/||" | tr "\n" " ") && yarn eslint --fix --quiet $FILES'
language: system
pass_filenames: true
files: ^docs/.*\.(js|jsx|ts|tsx)$
- id: type-checking-frontend
name: Type-Checking (Frontend)
entry: ./scripts/check-type.js package=superset-frontend excludeDeclarationDir=cypress-base
language: system
files: ^superset-frontend\/.*\.(js|jsx|ts|tsx)$
exclude: ^superset-frontend/cypress-base\/
require_serial: true
- id: eslint-frontend
name: eslint (frontend)
entry: ./scripts/eslint.sh
language: system
pass_filenames: true
files: ^superset-frontend/.*\.(js|jsx|ts|tsx)$
- id: eslint-docs
name: eslint (docs)
entry: bash -c 'cd docs && FILES=$(echo "$@" | sed "s|docs/||g") && yarn eslint --fix --ext .js,.jsx,.ts,.tsx --quiet $FILES'
language: system
pass_filenames: true
files: ^docs/.*\.(js|jsx|ts|tsx)$
- id: type-checking-frontend
name: Type-Checking (Frontend)
entry: ./scripts/check-type.js package=superset-frontend excludeDeclarationDir=cypress-base
language: system
files: ^superset-frontend\/.*\.(js|jsx|ts|tsx)$
exclude: ^superset-frontend/cypress-base\/
require_serial: true
# blacklist unsafe functions like make_url (see #19526)
- repo: https://github.com/skorokithakis/blacklist-pre-commit-hook
rev: e2f070289d8eddcaec0b580d3bde29437e7c8221
@@ -114,65 +87,29 @@ repos:
files: helm
verbose: false
args: ["--log-level", "error"]
# Using local hooks ensures ruff version matches requirements/development.txt
- repo: local
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.9.7
hooks:
- id: ruff-format
name: ruff-format
entry: ruff format
language: system
types: [python]
- id: ruff
name: ruff
entry: ruff check --fix --show-fixes
language: system
types: [python]
args: [--fix]
- repo: local
hooks:
- id: pylint
name: pylint with custom Superset plugins
entry: bash
language: system
types: [python]
exclude: ^(tests/|superset/migrations/|scripts/|RELEASING/|docker/)
args:
- -c
- |
TARGET_BRANCH=${GITHUB_BASE_REF:-master}
# Only fetch if we're not in CI (CI already has all refs)
if [ -z "$CI" ]; then
git fetch --no-recurse-submodules origin "$TARGET_BRANCH" 2>/dev/null || true
fi
BASE=$(git merge-base origin/"$TARGET_BRANCH" HEAD 2>/dev/null) || BASE="HEAD"
files=$(git diff --name-only --diff-filter=ACM "$BASE"..HEAD 2>/dev/null | grep '^superset/.*\.py$' || true)
if [ -n "$files" ]; then
pylint --rcfile=.pylintrc --load-plugins=superset.extensions.pylint --reports=no $files
else
echo "No Python files to lint."
fi
- id: db-engine-spec-metadata
name: database engine spec metadata validation
entry: python superset/db_engine_specs/lint_metadata.py --strict
language: system
files: ^superset/db_engine_specs/.*\.py$
exclude: ^superset/db_engine_specs/(base|lib|lint_metadata|__init__)\.py$
pass_filenames: false
- repo: local
hooks:
- id: feature-flags-sync
name: feature flags documentation sync
entry: bash -c 'python scripts/extract_feature_flags.py > docs/static/feature-flags.json.tmp && if ! diff -q docs/static/feature-flags.json docs/static/feature-flags.json.tmp > /dev/null 2>&1; then mv docs/static/feature-flags.json.tmp docs/static/feature-flags.json && echo "Updated docs/static/feature-flags.json" && exit 1; else rm docs/static/feature-flags.json.tmp; fi'
language: system
files: ^superset/config\.py$
pass_filenames: false
- id: zizmor
name: zizmor (GHA security audit)
entry: zizmor
language: python
additional_dependencies: [zizmor==1.25.2]
files: ^\.github/
types: [yaml]
pass_filenames: false
# Advisory until pre-existing findings are resolved; remove
# --no-exit-codes to make this hook blocking.
args: [--no-exit-codes, .github/]
- id: pylint
name: pylint with custom Superset plugins
entry: bash
language: system
types: [python]
exclude: ^(tests/|superset/migrations/|scripts/|RELEASING/|docker/)
args:
- -c
- |
TARGET_BRANCH=${GITHUB_BASE_REF:-master}
git fetch origin "$TARGET_BRANCH"
BASE=$(git merge-base origin/"$TARGET_BRANCH" HEAD)
files=$(git diff --name-only --diff-filter=ACM "$BASE"..HEAD | grep '^superset/.*\.py$' || true)
if [ -n "$files" ]; then
pylint --rcfile=.pylintrc --load-plugins=superset.extensions.pylint --reports=no $files
else
echo "No Python files to lint."
fi

View File

@@ -7,12 +7,10 @@
.codecov.yml
.eslintrc
.eslintignore
.stylelintignore
.flake8
.nvmrc
.prettierrc
.rat-excludes
.swcrc
.*log
.*pyc
.*lock
@@ -34,8 +32,6 @@ apache_superset.egg-info
# json and csv in general cannot have comments
.*json
.*csv
# jinja templates often need to be as-is
.*j2
# Generated doc files
env/*
docs/.htaccess*
@@ -44,9 +40,6 @@ _build/*
_static/*
.buildinfo
searchindex.js
# auto-generated by docs/scripts/convert-api-sidebar.mjs from openapi.json
sidebar.js
sidebar.ts
# auto generated
requirements/*
# vendorized
@@ -71,20 +64,22 @@ temporary_superset_ui/*
# skip license checks for auto-generated test snapshots
.*snap
# docs third-party logos (database logos, org logos, etc.)
databases/*
logos/*
# docs overrides for third party logos we don't have the rights to
google-big-query.svg
google-sheets.svg
ibm-db2.svg
postgresql.svg
snowflake.svg
ydb.svg
loading.svg
# docs-related
erd.puml
erd.svg
intro_header.txt
TODO.md
# for LLMs
llm-context.md
llms.txt
AGENTS.md
LLMS.md
CLAUDE.md
CURSOR.md

307
AGENTS.md
View File

@@ -1,307 +0,0 @@
# LLM Context Guide for Apache Superset
Apache Superset is a data visualization platform with Flask/Python backend and React/TypeScript frontend.
## ⚠️ CRITICAL: Always Run Pre-commit Before Pushing
**ALWAYS run `pre-commit run --all-files` before pushing commits.** CI will fail if pre-commit checks don't pass. This is non-negotiable.
```bash
# Stage your changes first
git add .
# Run pre-commit on all files
pre-commit run --all-files
# If there are auto-fixes, stage them and commit
git add .
git commit --amend # or new commit
```
Common pre-commit failures:
- **Formatting** - black, prettier, eslint will auto-fix
- **Type errors** - mypy failures need manual fixes
- **Linting** - ruff, pylint issues need manual fixes
## ⚠️ CRITICAL: Ongoing Refactors (What NOT to Do)
**These migrations are actively happening - avoid deprecated patterns:**
### Frontend Modernization
- **NO `any` types** - Use proper TypeScript types
- **NO JavaScript files** - Convert to TypeScript (.ts/.tsx)
- **Use @superset-ui/core** - Don't import Ant Design directly, prefer Ant Design component wrappers from @superset-ui/core/components
- **Use antd theming tokens** - Prefer antd tokens over legacy theming tokens
- **Avoid custom css and styles** - Follow antd best practices and avoid styling and custom CSS whenever possible
### Testing Strategy Migration
- **Prefer unit tests** over integration tests
- **Prefer integration tests** over end-to-end tests
- **Use Playwright for E2E tests** - Migrating from Cypress
- **Cypress is deprecated** - Will be removed once migration is completed
- **Use Jest + React Testing Library** for component testing
- **Use `test()` instead of `describe()`** - Follow [avoid nesting when testing](https://kentcdodds.com/blog/avoid-nesting-when-youre-testing) principles
### Backend Type Safety
- **Add type hints** - All new Python code needs proper typing
- **MyPy compliance** - Run `pre-commit run mypy` to validate
- **SQLAlchemy typing** - Use proper model annotations
### UUID Migration
- **Prefer UUIDs over auto-incrementing IDs** - New models should use UUID primary keys
- **External API exposure** - Use UUIDs in public APIs instead of internal integer IDs
- **Existing models** - Add UUID fields alongside integer IDs for gradual migration
## Security and Threat Model
Before evaluating any code path for security issues, read [`SECURITY.md`](SECURITY.md). It is the canonical, authoritative source for Apache Superset's security model and is referenced by both human reporters and automated scanners.
In short, the test for whether a finding is in scope is one question:
> *Does it let a principal perform an action the role and capability matrix in `SECURITY.md` does not entitle them to?*
If yes, it is in scope. If no, it is not.
The three trust boundaries are:
1. **The Admin role** is a fully trusted operational principal. Anything an Admin can do through documented configuration, API, or UI is an intended capability, not a vulnerability.
2. **The operator** owns deployment-time decisions (secrets, network exposure, feature-flag selection, connector and codec choices, notification destinations, third-party plugins). Misconfiguration at this layer is a deployment defect, not a Superset vulnerability.
3. **The codebase** is responsible for enforcing the role and capability matrix wherever it exposes functionality to a principal: API routes, command and DAO layers, UI handlers, background jobs, and any other entry point. A missing or incorrect enforcement check is in scope no matter where it lives.
The security model assumes that operator-controlled infrastructure, including the metadata database, cache backends, message brokers, secret stores, and deployment environment, remains within the operator's trust boundary. Vulnerabilities must demonstrate a security boundary violation by an attacker who does not already control those systems.
Route-level authorization in this codebase uses one of three Flask-AppBuilder decorators depending on the route type:
- `@protect()` for REST API routes (`ModelRestApi` / `BaseApi`)
- `@has_access_api` for legacy view routes
- `@has_access` for legacy HTML view routes
Object-level authorization via `security_manager.raise_for_access(...)` applies to data-bearing resources: dashboards, charts, datasets and datasources, queries, database and table access, and query contexts. Other resources (annotations, tags, CSS templates, reports, RLS rules, and similar) rely on the route-level decorator plus DAO `base_filters` for ownership scoping; the absence of `raise_for_access` on these resources is by design, not a finding. Code that omits the per-object gate on a route that returns or mutates a specific data-bearing object is in scope; code that follows the correct pattern for its resource class can still contain injection, SSRF, XSS, or other classes of finding unrelated to authorization, which are evaluated separately.
The full role and capability matrix, in-scope and out-of-scope class lists, and CVE aggregation rules are in [`SECURITY.md`](SECURITY.md). Defer to that document for any specifics.
**Requirements for findings filed by automated tooling**
Automated scanners (LLM-based code scanners, static analyzers, dependency tools) that file findings against this codebase must, in each finding, name:
1. The specific role and capability matrix row in [`SECURITY.md`](SECURITY.md) the finding believes is violated.
2. The principal the finding assumes the attacker holds (Public, Gamma, sql_lab, Alpha, Admin, Embedded guest token, or a custom role with explicit capability grants).
Findings that cannot identify both should be filed as questions, not vulnerabilities. This requirement exists to ensure every reported issue is testable against the published security model and to keep speculative or pattern-match-only reports out of the triage queue.
## Key Directories
```
superset/
├── superset/ # Python backend (Flask, SQLAlchemy)
│ ├── views/api/ # REST API endpoints
│ ├── models/ # Database models
│ └── connectors/ # Database connections
├── superset-frontend/src/ # React TypeScript frontend
│ ├── components/ # Reusable components
│ ├── explore/ # Chart builder
│ ├── dashboard/ # Dashboard interface
│ └── SqlLab/ # SQL editor
├── superset-frontend/packages/
│ └── superset-ui-core/ # UI component library (USE THIS)
├── tests/ # Python/integration tests
├── docs/ # Documentation (UPDATE FOR CHANGES)
└── UPDATING.md # Breaking changes log
```
## Code Standards
### TypeScript Frontend
- **Avoid `any` types** - Use proper TypeScript, reuse existing types
- **Functional components** with hooks
- **@superset-ui/core** for UI components (not direct antd)
- **Jest** for testing (NO Enzyme)
- **Redux** for global state where it exists, hooks for local
### Python Backend
- **Type hints required** for all new code
- **MyPy compliant** - run `pre-commit run mypy`
- **SQLAlchemy models** with proper typing
- **pytest** for testing
### Apache License Headers
- **New files require ASF license headers** - When creating new code files, include the standard Apache Software Foundation license header
- **LLM instruction files are excluded** - Files like AGENTS.md, CLAUDE.md, etc. are in `.rat-excludes` to avoid header token overhead
### Code Comments
- **Avoid time-specific language** - Don't use words like "now", "currently", "today" in code comments as they become outdated
- **Write timeless comments** - Comments should remain accurate regardless of when they're read
## Documentation Requirements
- **docs/**: Update for any user-facing changes
- **UPDATING.md**: Add breaking changes here
- **Docstrings**: Required for new functions/classes
## Developer Portal: Storybook-to-MDX Documentation
The Developer Portal auto-generates MDX documentation from Storybook stories. **Stories are the single source of truth.**
### Core Philosophy
- **Fix issues in the STORY, not the generator** - When something doesn't render correctly, update the story file first
- **Generator should be lightweight** - It extracts and passes through data; avoid special cases
- **Stories define everything** - Props, controls, galleries, examples all come from story metadata
### Story Requirements for Docs Generation
- Use `export default { title: '...' }` (inline), not `const meta = ...; export default meta;`
- Name interactive stories `Interactive${ComponentName}` (e.g., `InteractiveButton`)
- Define `args` for default prop values
- Define `argTypes` at the story level (not meta level) with control types and descriptions
- Use `parameters.docs.gallery` for size×style variant grids
- Use `parameters.docs.sampleChildren` for components that need children
- Use `parameters.docs.liveExample` for custom live code blocks
- Use `parameters.docs.staticProps` for complex object props that can't be parsed inline
### Generator Location
- Script: `docs/scripts/generate-superset-components.mjs`
- Wrapper: `docs/src/components/StorybookWrapper.jsx`
- Output: `docs/developer_portal/components/`
## Architecture Patterns
### Security & Features
- **Security model**: see the top-level [Security and Threat Model](#security-and-threat-model) section and [`SECURITY.md`](SECURITY.md)
- **RBAC**: Role-based access via Flask-AppBuilder
- **Feature flags**: Control feature rollouts
- **Row-level security**: SQL-based data access control
## Test Utilities
### Python Test Helpers
- **`SupersetTestCase`** - Base class in `tests/integration_tests/base_tests.py`
- **`@with_config`** - Config mocking decorator
- **`@with_feature_flags`** - Feature flag testing
- **`login_as()`, `login_as_admin()`** - Authentication helpers
- **`create_dashboard()`, `create_slice()`** - Data setup utilities
### TypeScript Test Helpers
- **`superset-frontend/spec/helpers/testing-library.tsx`** - Custom render() with providers
- **`createWrapper()`** - Redux/Router/Theme wrapper
- **`selectOption()`** - Select component helper
- **React Testing Library** - NO Enzyme (removed)
### Test Database Patterns
- **Mock patterns**: Use `MagicMock()` for config objects, avoid `AsyncMock` for synchronous code
- **API tests**: Update expected columns when adding new model fields
### Running Tests
```bash
# Frontend
npm run test # All tests
npm run test -- filename.test.tsx # Single file
# E2E Tests (Playwright - NEW)
npm run playwright:test # All Playwright tests
npm run playwright:ui # Interactive UI mode
npm run playwright:headed # See browser during tests
npx playwright test tests/auth/login.spec.ts # Single file
npm run playwright:debug tests/auth/login.spec.ts # Debug specific file
# E2E Tests (Cypress - DEPRECATED)
cd superset-frontend/cypress-base
npm run cypress-run-chrome # All Cypress tests (headless)
npm run cypress-debug # Interactive Cypress UI
# Backend
pytest # All tests
pytest tests/unit_tests/specific_test.py # Single file
pytest tests/unit_tests/ # Directory
# If pytest fails with database/setup issues, ask the user to run test environment setup
```
## Environment Validation
**Quick Setup Check (run this first):**
```bash
# Verify Superset is running
curl -f http://localhost:8088/health || echo "❌ Setup required - see https://superset.apache.org/docs/contributing/development#working-with-llms"
```
**If health checks fail:**
"It appears you aren't set up properly. Please refer to the [Working with LLMs](https://superset.apache.org/docs/contributing/development#working-with-llms) section in the development docs for setup instructions."
**Key Project Files:**
- `superset-frontend/package.json` - Frontend build scripts (`npm run dev` on port 9000, `npm run test`, `npm run lint`)
- `pyproject.toml` - Python tooling (ruff, mypy configs)
- `requirements/` folder - Python dependencies (base.txt, development.txt)
## SQLAlchemy Query Best Practices
- **Use negation operator**: `~Model.field` instead of `== False` to avoid ruff E712 errors
- **Example**: `~Model.is_active` instead of `Model.is_active == False`
## Pull Request Guidelines
**When creating pull requests:**
1. **Read the current PR template**: Always check `.github/PULL_REQUEST_TEMPLATE.md` for the latest format
2. **Use the template sections**: Include all sections from the template (SUMMARY, BEFORE/AFTER, TESTING INSTRUCTIONS, ADDITIONAL INFORMATION)
3. **Follow PR title conventions**: Use [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/)
- Format: `type(scope): description`
- Example: `fix(dashboard): load charts correctly`
- Types: `fix`, `feat`, `docs`, `style`, `refactor`, `perf`, `test`, `chore`
**Important**: Always reference the actual template file at `.github/PULL_REQUEST_TEMPLATE.md` instead of using cached content, as the template may be updated over time.
## Pre-commit Validation
**Use pre-commit hooks for quality validation:**
```bash
# Install hooks
pre-commit install
# IMPORTANT: Stage your changes first!
git add . # Pre-commit only checks staged files
# Quick validation (faster than --all-files)
pre-commit run # Staged files only
pre-commit run mypy # Python type checking
pre-commit run prettier # Code formatting
pre-commit run eslint # Frontend linting
```
**Important pre-commit usage notes:**
- **Stage files first**: Run `git add .` before `pre-commit run` to check only changed files (much faster)
- **Virtual environment**: Activate your Python virtual environment before running pre-commit
```bash
# Common virtual environment locations (yours may differ):
source .venv/bin/activate # if using .venv
source venv/bin/activate # if using venv
source ~/venvs/superset/bin/activate # if using a central location
```
If you get a "command not found" error, ask the user which virtual environment to activate
- **Auto-fixes**: Some hooks auto-fix issues (e.g., trailing whitespace). Re-run after fixes are applied
## Common File Patterns
### API Structure
- **`/api.py`** - REST endpoints with decorators and OpenAPI docstrings
- **`/schemas.py`** - Marshmallow validation schemas for OpenAPI spec
- **`/commands/`** - Business logic classes with @transaction() decorators
- **`/models/`** - SQLAlchemy database models
- **OpenAPI docs**: Auto-generated at `/swagger/v1` from docstrings and schemas
### Migration Files
- **Location**: `superset/migrations/versions/`
- **Naming**: `YYYY-MM-DD_HH-MM_hash_description.py`
- **Utilities**: Use helpers from `superset.migrations.shared.utils` for database compatibility
- **Pattern**: Import utilities instead of raw SQLAlchemy operations
## Platform-Specific Instructions
- **[CLAUDE.md](CLAUDE.md)** - For Claude/Anthropic tools
- **[.github/copilot-instructions.md](.github/copilot-instructions.md)** - For GitHub Copilot
- **[GEMINI.md](GEMINI.md)** - For Google Gemini tools
- **[GPT.md](GPT.md)** - For OpenAI/ChatGPT tools
- **[.cursor/rules/dev-standard.mdc](.cursor/rules/dev-standard.mdc)** - For Cursor editor
---
**LLM Note**: This codebase is actively modernizing toward full TypeScript and type safety. Always run `pre-commit run` to validate changes. Follow the ongoing refactors section to avoid deprecated patterns.

View File

@@ -47,7 +47,5 @@ under the License.
- [4.1.1](./CHANGELOG/4.1.1.md)
- [4.1.2](./CHANGELOG/4.1.2.md)
- [4.1.3](./CHANGELOG/4.1.3.md)
- [4.1.4](./CHANGELOG/4.1.4.md)
- [5.0.0](./CHANGELOG/5.0.0.md)
- [6.0.0](./CHANGELOG/6.0.0.md)
- [6.1.0](./CHANGELOG/6.1.0.md)

View File

@@ -1,33 +0,0 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
## Change Log
### 4.1.4 (Thu Jul 24 08:30:04 2025 -0300)
**Database Migrations**
**Features**
**Fixes**
- [#34289](https://github.com/apache/superset/pull/34289) fix: Saved queries list break if one query can't be parsed (@michael-s-molina)
- [#33059](https://github.com/apache/superset/pull/33059) fix: Adds missing __init__ file to commands/logs (@michael-s-molina)
**Others**
- [#32236](https://github.com/apache/superset/pull/32236) chore(deps): bump cryptography from 43.0.3 to 44.0.1 (@dependabot[bot])

File diff suppressed because it is too large Load Diff

View File

@@ -1 +1 @@
AGENTS.md
LLMS.md

View File

@@ -5,7 +5,7 @@
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
@@ -16,23 +16,9 @@
specific language governing permissions and limitations
under the License.
-->
# Contributing to Apache Superset
Contributions are welcome and are greatly appreciated! Every
little bit helps, and credit will always be given.
## Developer Portal
All developer and contribution documentation has moved to the Apache Superset Developer Portal:
**[📚 View the Developer Portal →](https://superset.apache.org/developer_portal/)**
The Developer Portal includes comprehensive guides for:
- [Contributing Overview](https://superset.apache.org/developer_portal/contributing/overview)
- [Development Setup](https://superset.apache.org/developer_portal/contributing/development-setup)
- [Submitting Pull Requests](https://superset.apache.org/developer_portal/contributing/submitting-pr)
- [Contribution Guidelines](https://superset.apache.org/developer_portal/contributing/guidelines)
- [Code Review Process](https://superset.apache.org/developer_portal/contributing/code-review)
- [Development How-tos](https://superset.apache.org/developer_portal/contributing/howtos)
Source for the Developer Portal documentation is [located here](https://github.com/apache/superset/tree/master/docs/developer_portal).
All matters related to contributions have moved to [this section of
the official Superset documentation](https://superset.apache.org/docs/contributing/). Source for the documentation is
[located here](https://github.com/apache/superset/tree/master/docs/docs).

View File

@@ -18,7 +18,7 @@
######################################################################
# Node stage to deal with static asset construction
######################################################################
ARG PY_VER=3.11.14-slim-trixie
ARG PY_VER=3.11.13-slim-bookworm
# If BUILDPLATFORM is null, set it to 'amd64' (or leave as is otherwise).
ARG BUILDPLATFORM=${BUILDPLATFORM:-amd64}
@@ -29,7 +29,7 @@ ARG BUILD_TRANSLATIONS="false"
######################################################################
# superset-node-ci used as a base for building frontend assets and CI
######################################################################
FROM --platform=${BUILDPLATFORM} node:24-trixie-slim AS superset-node-ci
FROM --platform=${BUILDPLATFORM} node:20-bookworm-slim AS superset-node-ci
ARG BUILD_TRANSLATIONS
ENV BUILD_TRANSLATIONS=${BUILD_TRANSLATIONS}
ARG DEV_MODE="false" # Skip frontend build in dev mode
@@ -55,13 +55,6 @@ WORKDIR /app/superset-frontend
RUN mkdir -p /app/superset/static/assets \
/app/superset/translations
# Harden `npm ci` against transient npm-registry network blips (e.g. ECONNRESET),
# which otherwise fail the entire multi-platform image build with no retry.
ENV npm_config_fetch_retries=5 \
npm_config_fetch_retry_mintimeout=20000 \
npm_config_fetch_retry_maxtimeout=120000 \
npm_config_fetch_timeout=600000
# Mount package files and install dependencies if not in dev mode
# NOTE: we mount packages and plugins as they are referenced in package.json as workspaces
# ideally we'd COPY only their package.json. Here npm ci will be cached as long
@@ -71,7 +64,7 @@ RUN --mount=type=bind,source=./superset-frontend/package.json,target=./package.j
--mount=type=bind,source=./superset-frontend/package-lock.json,target=./package-lock.json \
--mount=type=cache,target=/root/.cache \
--mount=type=cache,target=/root/.npm \
if [ "${DEV_MODE}" = "false" ]; then \
if [ "$DEV_MODE" = "false" ]; then \
npm ci; \
else \
echo "Skipping 'npm ci' in dev mode"; \
@@ -87,7 +80,7 @@ FROM superset-node-ci AS superset-node
# Build the frontend if not in dev mode
RUN --mount=type=cache,target=/root/.npm \
if [ "${DEV_MODE}" = "false" ]; then \
if [ "$DEV_MODE" = "false" ]; then \
echo "Running 'npm run ${BUILD_CMD}'"; \
npm run ${BUILD_CMD}; \
else \
@@ -98,10 +91,11 @@ RUN --mount=type=cache,target=/root/.npm \
COPY superset/translations /app/superset/translations
# Build translations if enabled, then cleanup localization files
RUN if [ "${BUILD_TRANSLATIONS}" = "true" ]; then \
RUN if [ "$BUILD_TRANSLATIONS" = "true" ]; then \
npm run build-translation; \
fi; \
rm -rf /app/superset/translations/*/*/*.[po,mo];
rm -rf /app/superset/translations/*/*/*.po; \
rm -rf /app/superset/translations/*/*/*.mo;
######################################################################
@@ -112,15 +106,15 @@ FROM python:${PY_VER} AS python-base
ARG SUPERSET_HOME="/app/superset_home"
ENV SUPERSET_HOME=${SUPERSET_HOME}
RUN mkdir -p ${SUPERSET_HOME}
RUN mkdir -p $SUPERSET_HOME
RUN useradd --user-group -d ${SUPERSET_HOME} -m --no-log-init --shell /bin/bash superset \
&& chmod -R 1777 ${SUPERSET_HOME} \
&& chown -R superset:superset ${SUPERSET_HOME}
&& chmod -R 1777 $SUPERSET_HOME \
&& chown -R superset:superset $SUPERSET_HOME
# Some bash scripts needed throughout the layers
COPY --chmod=755 docker/*.sh /app/docker/
RUN pip install --no-cache-dir --upgrade uv
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
# Using uv as it's faster/simpler than pip
RUN uv venv /app/.venv
@@ -140,10 +134,11 @@ RUN --mount=type=cache,target=/root/.cache/uv \
. /app/.venv/bin/activate && /app/docker/pip-install.sh --requires-build-essential -r requirements/translations.txt
COPY superset/translations/ /app/translations_mo/
RUN if [ "${BUILD_TRANSLATIONS}" = "true" ]; then \
pybabel compile --use-fuzzy -d /app/translations_mo || true; \
RUN if [ "$BUILD_TRANSLATIONS" = "true" ]; then \
pybabel compile -d /app/translations_mo | true; \
fi; \
rm -f /app/translations_mo/*/*/*.[po,json]
rm -f /app/translations_mo/*/*/*.po; \
rm -f /app/translations_mo/*/*/*.json;
######################################################################
# Python APP common layer
@@ -161,7 +156,7 @@ ENV SUPERSET_HOME="/app/superset_home" \
COPY --chmod=755 docker/entrypoints /app/docker/entrypoints
WORKDIR /app
# Set up necessary directories
# Set up necessary directories and user
RUN mkdir -p \
${PYTHONPATH} \
superset/static \
@@ -177,11 +172,11 @@ ENV PLAYWRIGHT_BROWSERS_PATH=/usr/local/share/playwright-browsers
ARG INCLUDE_CHROMIUM="false"
ARG INCLUDE_FIREFOX="false"
RUN --mount=type=cache,target=${SUPERSET_HOME}/.cache/uv \
if [ "${INCLUDE_CHROMIUM}" = "true" ] || [ "${INCLUDE_FIREFOX}" = "true" ]; then \
if [ "$INCLUDE_CHROMIUM" = "true" ] || [ "$INCLUDE_FIREFOX" = "true" ]; then \
uv pip install playwright && \
playwright install-deps && \
if [ "${INCLUDE_CHROMIUM}" = "true" ]; then playwright install chromium; fi && \
if [ "${INCLUDE_FIREFOX}" = "true" ]; then playwright install firefox; fi; \
if [ "$INCLUDE_CHROMIUM" = "true" ]; then playwright install chromium; fi && \
if [ "$INCLUDE_FIREFOX" = "true" ]; then playwright install firefox; fi; \
else \
echo "Skipping browser installation"; \
fi
@@ -203,14 +198,8 @@ RUN /app/docker/apt-install.sh \
libecpg-dev \
libldap2-dev
# Create data directory for DuckDB examples database
# The database file will be created at runtime when examples are loaded from Parquet files
RUN mkdir -p /app/data && chown -R superset:superset /app/data
# Copy compiled things from previous stages
COPY --from=superset-node /app/superset/static/assets superset/static/assets
# Copy service.worker.js optionall as it doesn't exist when DEV_MODE=true
COPY --from=superset-node /app/superset/static/service-worker.j[s] superset/static/service-worker.js
# TODO, when the next version comes out, use --exclude superset/translations
COPY superset superset
@@ -232,10 +221,6 @@ FROM python-common AS lean
# Install Python dependencies using docker/pip-install.sh
COPY requirements/base.txt requirements/
# Copy superset-core package needed for editable install in base.txt
COPY superset-core superset-core
RUN --mount=type=cache,target=${SUPERSET_HOME}/.cache/uv \
/app/docker/pip-install.sh --requires-build-essential -r requirements/base.txt
# Install the superset package
@@ -258,11 +243,6 @@ RUN /app/docker/apt-install.sh \
# Copy development requirements and install them
COPY requirements/*.txt requirements/
# Copy local packages needed for editable installs in development.txt
COPY superset-core superset-core
COPY superset-extensions-cli superset-extensions-cli
# Install Python dependencies using docker/pip-install.sh
RUN --mount=type=cache,target=${SUPERSET_HOME}/.cache/uv \
/app/docker/pip-install.sh --requires-build-essential -r requirements/development.txt
@@ -280,15 +260,6 @@ USER superset
######################################################################
FROM lean AS ci
USER root
RUN uv pip install .[postgres,duckdb]
USER superset
CMD ["/app/docker/entrypoints/docker-ci.sh"]
######################################################################
# Showtime image - lean + DuckDB for examples database
######################################################################
FROM lean AS showtime
USER root
RUN uv pip install .[duckdb]
RUN uv pip install .[postgres]
USER superset
CMD ["/app/docker/entrypoints/docker-ci.sh"]

View File

@@ -1 +1 @@
AGENTS.md
LLMS.md

2
GPT.md
View File

@@ -1 +1 @@
AGENTS.md
LLMS.md

View File

@@ -16,20 +16,8 @@ KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
# Installing Apache Superset
# INSTALL / BUILD instructions for Apache Superset
For comprehensive installation instructions, please see the Apache Superset documentation:
**[📚 Installation Guide →](https://superset.apache.org/docs/installation/installation-methods)**
The documentation covers:
- [Docker Compose](https://superset.apache.org/docs/installation/docker-compose) (recommended for development)
- [Kubernetes / Helm](https://superset.apache.org/docs/installation/kubernetes)
- [PyPI](https://superset.apache.org/docs/installation/pypi)
- [Docker Builds](https://superset.apache.org/docs/installation/docker-builds)
- [Architecture Overview](https://superset.apache.org/docs/installation/architecture)
## Building from Source
For building from a source release tarball, see the Dockerfile at:
`RELEASING/Dockerfile.from_local_tarball`
At this time, the docker file at RELEASING/Dockerfile.from_local_tarball
constitutes the recipe on how to get to a working release from a source
release tarball.

207
LLMS.md Normal file
View File

@@ -0,0 +1,207 @@
# LLM Context Guide for Apache Superset
Apache Superset is a data visualization platform with Flask/Python backend and React/TypeScript frontend.
## ⚠️ CRITICAL: Ongoing Refactors (What NOT to Do)
**These migrations are actively happening - avoid deprecated patterns:**
### Frontend Modernization
- **NO `any` types** - Use proper TypeScript types
- **NO JavaScript files** - Convert to TypeScript (.ts/.tsx)
- **Use @superset-ui/core** - Don't import Ant Design directly, prefer Ant Design component wrappers from @superset-ui/core/components
- **Use antd theming tokens** - Prefer antd tokens over legacy theming tokens
- **Avoid custom css and styles** - Follow antd best practices and avoid styling and custom CSS whenever possible
### Testing Strategy Migration
- **Prefer unit tests** over integration tests
- **Prefer integration tests** over end-to-end tests
- **Use Playwright for E2E tests** - Migrating from Cypress
- **Cypress is deprecated** - Will be removed once migration is completed
- **Use Jest + React Testing Library** for component testing
- **Use `test()` instead of `describe()`** - Follow [avoid nesting when testing](https://kentcdodds.com/blog/avoid-nesting-when-youre-testing) principles
### Backend Type Safety
- **Add type hints** - All new Python code needs proper typing
- **MyPy compliance** - Run `pre-commit run mypy` to validate
- **SQLAlchemy typing** - Use proper model annotations
### UUID Migration
- **Prefer UUIDs over auto-incrementing IDs** - New models should use UUID primary keys
- **External API exposure** - Use UUIDs in public APIs instead of internal integer IDs
- **Existing models** - Add UUID fields alongside integer IDs for gradual migration
## Key Directories
```
superset/
├── superset/ # Python backend (Flask, SQLAlchemy)
│ ├── views/api/ # REST API endpoints
│ ├── models/ # Database models
│ └── connectors/ # Database connections
├── superset-frontend/src/ # React TypeScript frontend
│ ├── components/ # Reusable components
│ ├── explore/ # Chart builder
│ ├── dashboard/ # Dashboard interface
│ └── SqlLab/ # SQL editor
├── superset-frontend/packages/
│ └── superset-ui-core/ # UI component library (USE THIS)
├── tests/ # Python/integration tests
├── docs/ # Documentation (UPDATE FOR CHANGES)
└── UPDATING.md # Breaking changes log
```
## Code Standards
### TypeScript Frontend
- **Avoid `any` types** - Use proper TypeScript, reuse existing types
- **Functional components** with hooks
- **@superset-ui/core** for UI components (not direct antd)
- **Jest** for testing (NO Enzyme)
- **Redux** for global state where it exists, hooks for local
### Python Backend
- **Type hints required** for all new code
- **MyPy compliant** - run `pre-commit run mypy`
- **SQLAlchemy models** with proper typing
- **pytest** for testing
### Apache License Headers
- **New files require ASF license headers** - When creating new code files, include the standard Apache Software Foundation license header
- **LLM instruction files are excluded** - Files like LLMS.md, CLAUDE.md, etc. are in `.rat-excludes` to avoid header token overhead
## Documentation Requirements
- **docs/**: Update for any user-facing changes
- **UPDATING.md**: Add breaking changes here
- **Docstrings**: Required for new functions/classes
## Architecture Patterns
### Security & Features
- **RBAC**: Role-based access via Flask-AppBuilder
- **Feature flags**: Control feature rollouts
- **Row-level security**: SQL-based data access control
## Test Utilities
### Python Test Helpers
- **`SupersetTestCase`** - Base class in `tests/integration_tests/base_tests.py`
- **`@with_config`** - Config mocking decorator
- **`@with_feature_flags`** - Feature flag testing
- **`login_as()`, `login_as_admin()`** - Authentication helpers
- **`create_dashboard()`, `create_slice()`** - Data setup utilities
### TypeScript Test Helpers
- **`superset-frontend/spec/helpers/testing-library.tsx`** - Custom render() with providers
- **`createWrapper()`** - Redux/Router/Theme wrapper
- **`selectOption()`** - Select component helper
- **React Testing Library** - NO Enzyme (removed)
### Test Database Patterns
- **Mock patterns**: Use `MagicMock()` for config objects, avoid `AsyncMock` for synchronous code
- **API tests**: Update expected columns when adding new model fields
### Running Tests
```bash
# Frontend
npm run test # All tests
npm run test -- filename.test.tsx # Single file
# E2E Tests (Playwright - NEW)
npm run playwright:test # All Playwright tests
npm run playwright:ui # Interactive UI mode
npm run playwright:headed # See browser during tests
npx playwright test tests/auth/login.spec.ts # Single file
npm run playwright:debug tests/auth/login.spec.ts # Debug specific file
# E2E Tests (Cypress - DEPRECATED)
cd superset-frontend/cypress-base
npm run cypress-run-chrome # All Cypress tests (headless)
npm run cypress-debug # Interactive Cypress UI
# Backend
pytest # All tests
pytest tests/unit_tests/specific_test.py # Single file
pytest tests/unit_tests/ # Directory
# If pytest fails with database/setup issues, ask the user to run test environment setup
```
## Environment Validation
**Quick Setup Check (run this first):**
```bash
# Verify Superset is running
curl -f http://localhost:8088/health || echo "❌ Setup required - see https://superset.apache.org/docs/contributing/development#working-with-llms"
```
**If health checks fail:**
"It appears you aren't set up properly. Please refer to the [Working with LLMs](https://superset.apache.org/docs/contributing/development#working-with-llms) section in the development docs for setup instructions."
**Key Project Files:**
- `superset-frontend/package.json` - Frontend build scripts (`npm run dev` on port 9000, `npm run test`, `npm run lint`)
- `pyproject.toml` - Python tooling (ruff, mypy configs)
- `requirements/` folder - Python dependencies (base.txt, development.txt)
## SQLAlchemy Query Best Practices
- **Use negation operator**: `~Model.field` instead of `== False` to avoid ruff E712 errors
- **Example**: `~Model.is_active` instead of `Model.is_active == False`
## Pre-commit Validation
**Use pre-commit hooks for quality validation:**
```bash
# Install hooks
pre-commit install
# IMPORTANT: Stage your changes first!
git add . # Pre-commit only checks staged files
# Quick validation (faster than --all-files)
pre-commit run # Staged files only
pre-commit run mypy # Python type checking
pre-commit run prettier # Code formatting
pre-commit run eslint # Frontend linting
```
**Important pre-commit usage notes:**
- **Stage files first**: Run `git add .` before `pre-commit run` to check only changed files (much faster)
- **Virtual environment**: Activate your Python virtual environment before running pre-commit
```bash
# Common virtual environment locations (yours may differ):
source .venv/bin/activate # if using .venv
source venv/bin/activate # if using venv
source ~/venvs/superset/bin/activate # if using a central location
```
If you get a "command not found" error, ask the user which virtual environment to activate
- **Auto-fixes**: Some hooks auto-fix issues (e.g., trailing whitespace). Re-run after fixes are applied
## Common File Patterns
### API Structure
- **`/api.py`** - REST endpoints with decorators and OpenAPI docstrings
- **`/schemas.py`** - Marshmallow validation schemas for OpenAPI spec
- **`/commands/`** - Business logic classes with @transaction() decorators
- **`/models/`** - SQLAlchemy database models
- **OpenAPI docs**: Auto-generated at `/swagger/v1` from docstrings and schemas
### Migration Files
- **Location**: `superset/migrations/versions/`
- **Naming**: `YYYY-MM-DD_HH-MM_hash_description.py`
- **Utilities**: Use helpers from `superset.migrations.shared.utils` for database compatibility
- **Pattern**: Import utilities instead of raw SQLAlchemy operations
## Platform-Specific Instructions
- **[CLAUDE.md](CLAUDE.md)** - For Claude/Anthropic tools
- **[.github/copilot-instructions.md](.github/copilot-instructions.md)** - For GitHub Copilot
- **[GEMINI.md](GEMINI.md)** - For Google Gemini tools
- **[GPT.md](GPT.md)** - For OpenAI/ChatGPT tools
- **[.cursor/rules/dev-standard.mdc](.cursor/rules/dev-standard.mdc)** - For Cursor editor
---
**LLM Note**: This codebase is actively modernizing toward full TypeScript and type safety. Always run `pre-commit run` to validate changes. Follow the ongoing refactors section to avoid deprecated patterns.

View File

@@ -15,22 +15,19 @@
# limitations under the License.
#
# Python version installed; we need 3.11-3.12
PYTHON=`command -v python3.11 || command -v python3.12`
# Python version installed; we need 3.10-3.11
PYTHON=`command -v python3.11 || command -v python3.10`
.PHONY: install superset venv pre-commit up down logs ps nuke ports open
.PHONY: install superset venv pre-commit
install: superset pre-commit
superset:
# Bootstrap uv (the project's installer) into the active environment
pip install uv
# Install external dependencies
uv pip install -r requirements/development.txt
pip install -r requirements/development.txt
# Install Superset in editable (development) mode
uv pip install -e .
pip install -e .
# Create an admin user in your metadata database
superset fab create-admin \
@@ -55,14 +52,11 @@ superset:
update: update-py update-js
update-py:
# Bootstrap uv (the project's installer) into the active environment
pip install uv
# Install external dependencies
uv pip install -r requirements/development.txt
pip install -r requirements/development.txt
# Install Superset in editable (development) mode
uv pip install -e .
pip install -e .
# Initialize the database
superset db upgrade
@@ -76,7 +70,7 @@ update-js:
venv:
# Create a virtual environment and activate it (recommended)
if ! [ -x "${PYTHON}" ]; then echo "You need Python 3.11 or 3.12 installed"; exit 1; fi
if ! [ -x "${PYTHON}" ]; then echo "You need Python 3.10 or 3.11 installed"; exit 1; fi
test -d venv || ${PYTHON} -m venv venv # setup a python3 virtualenv
. venv/bin/activate
@@ -85,8 +79,7 @@ activate:
pre-commit:
# setup pre commit dependencies
pip install uv
uv pip install -r requirements/development.txt
pip3 install -r requirements/development.txt
pre-commit install
format: py-format js-format
@@ -98,7 +91,7 @@ js-format:
cd superset-frontend; npm run prettier
flask-app:
flask run -p 8088 --reload --debugger
flask run -p 8088 --with-threads --reload --debugger
node-app:
cd superset-frontend; npm run dev-server
@@ -119,28 +112,3 @@ report-celery-beat:
admin-user:
superset fab create-admin
# Docker Compose with auto-assigned ports (for running multiple instances)
up:
./scripts/docker-compose-up.sh
up-detached:
./scripts/docker-compose-up.sh -d
down:
./scripts/docker-compose-up.sh down
logs:
./scripts/docker-compose-up.sh logs -f
ps:
./scripts/docker-compose-up.sh ps
nuke:
./scripts/docker-compose-up.sh nuke
ports:
./scripts/docker-compose-up.sh ports
open:
./scripts/docker-compose-up.sh open

150
README.md
View File

@@ -23,12 +23,8 @@ under the License.
[![Latest Release on Github](https://img.shields.io/github/v/release/apache/superset?sort=semver)](https://github.com/apache/superset/releases/latest)
[![Build Status](https://github.com/apache/superset/actions/workflows/superset-python-unittest.yml/badge.svg)](https://github.com/apache/superset/actions)
[![PyPI version](https://badge.fury.io/py/apache_superset.svg)](https://badge.fury.io/py/apache_superset)
[![Coverage Status](https://codecov.io/github/apache/superset/coverage.svg?branch=master)](https://codecov.io/github/apache/superset)
[![PyPI](https://img.shields.io/pypi/pyversions/apache_superset.svg?maxAge=2592000)](https://pypi.python.org/pypi/apache_superset)
[![GitHub Stars](https://img.shields.io/github/stars/apache/superset?style=social)](https://github.com/apache/superset/stargazers)
[![Contributors](https://img.shields.io/github/contributors/apache/superset)](https://github.com/apache/superset/graphs/contributors)
[![Last Commit](https://img.shields.io/github/last-commit/apache/superset)](https://github.com/apache/superset/commits/master)
[![Open Issues](https://img.shields.io/github/issues/apache/superset)](https://github.com/apache/superset/issues)
[![Open PRs](https://img.shields.io/github/issues-pr/apache/superset)](https://github.com/apache/superset/pulls)
[![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](http://bit.ly/join-superset-slack)
[![Documentation](https://img.shields.io/badge/docs-apache.org-blue.svg)](https://superset.apache.org)
@@ -48,18 +44,14 @@ under the License.
A modern, enterprise-ready business intelligence web application.
### Documentation
- **[User Guide](https://superset.apache.org/user-docs/)** — For analysts and business users. Explore data, build charts, create dashboards, and connect databases.
- **[Administrator Guide](https://superset.apache.org/admin-docs/)** — Install, configure, and operate Superset. Covers security, scaling, and database drivers.
- **[Developer Guide](https://superset.apache.org/developer-docs/)** — Contribute to Superset or build on its REST API and extension framework.
[**Why Superset?**](#why-superset) |
[**Supported Databases**](#supported-databases) |
[**Installation and Configuration**](#installation-and-configuration) |
[**Release Notes**](https://github.com/apache/superset/blob/master/RELEASING/README.md#release-notes-for-recent-releases) |
[**Get Involved**](#get-involved) |
[**Contributor Guide**](#contributor-guide) |
[**Resources**](#resources) |
[**Organizations Using Superset**](https://superset.apache.org/inTheWild)
[**Organizations Using Superset**](https://github.com/apache/superset/blob/master/RESOURCES/INTHEWILD.md)
## Why Superset?
@@ -93,7 +85,7 @@ Superset provides:
**Craft Beautiful, Dynamic Dashboards**
<kbd><img title="View Dashboards" src="https://superset.apache.org/img/screenshots/dashboard.jpg"/></kbd><br/>
<kbd><img title="View Dashboards" src="https://superset.apache.org/img/screenshots/slack_dash.jpg"/></kbd><br/>
**No-Code Chart Builder**
@@ -105,77 +97,51 @@ Superset provides:
## Supported Databases
Superset can query data from any SQL-speaking datastore or data engine (Presto, Trino, Athena, [and more](https://superset.apache.org/docs/databases)) that has a Python DB-API driver and a SQLAlchemy dialect.
Superset can query data from any SQL-speaking datastore or data engine (Presto, Trino, Athena, [and more](https://superset.apache.org/docs/configuration/databases)) that has a Python DB-API driver and a SQLAlchemy dialect.
Here are some of the major database solutions that are supported:
<!-- SUPPORTED_DATABASES_START -->
<p align="center">
<a href="https://superset.apache.org/docs/databases/supported/amazon-athena" title="Amazon Athena"><img src="docs/static/img/databases/amazon-athena.jpg" alt="Amazon Athena" width="76" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/amazon-dynamodb" title="Amazon DynamoDB"><img src="docs/static/img/databases/aws.png" alt="Amazon DynamoDB" width="40" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/amazon-redshift" title="Amazon Redshift"><img src="docs/static/img/databases/redshift.png" alt="Amazon Redshift" width="100" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/apache-doris" title="Apache Doris"><img src="docs/static/img/databases/doris.png" alt="Apache Doris" width="103" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/apache-drill" title="Apache Drill"><img src="docs/static/img/databases/apache-drill.png" alt="Apache Drill" width="81" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/apache-druid" title="Apache Druid"><img src="docs/static/img/databases/druid.png" alt="Apache Druid" width="117" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/apache-hive" title="Apache Hive"><img src="docs/static/img/databases/apache-hive.svg" alt="Apache Hive" width="44" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/apache-impala" title="Apache Impala"><img src="docs/static/img/databases/apache-impala.png" alt="Apache Impala" width="21" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/apache-kylin" title="Apache Kylin"><img src="docs/static/img/databases/apache-kylin.png" alt="Apache Kylin" width="44" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/apache-pinot" title="Apache Pinot"><img src="docs/static/img/databases/apache-pinot.svg" alt="Apache Pinot" width="76" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/apache-solr" title="Apache Solr"><img src="docs/static/img/databases/apache-solr.png" alt="Apache Solr" width="79" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/apache-spark-sql" title="Apache Spark SQL"><img src="docs/static/img/databases/apache-spark.png" alt="Apache Spark SQL" width="75" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/ascend" title="Ascend"><img src="docs/static/img/databases/ascend.webp" alt="Ascend" width="117" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/aurora-mysql-data-api" title="Aurora MySQL (Data API)"><img src="docs/static/img/databases/mysql.png" alt="Aurora MySQL (Data API)" width="77" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/aurora-postgresql-data-api" title="Aurora PostgreSQL (Data API)"><img src="docs/static/img/databases/postgresql.svg" alt="Aurora PostgreSQL (Data API)" width="76" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/azure-data-explorer" title="Azure Data Explorer"><img src="docs/static/img/databases/kusto.png" alt="Azure Data Explorer" width="40" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/azure-synapse" title="Azure Synapse"><img src="docs/static/img/databases/azure.svg" alt="Azure Synapse" width="40" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/clickhouse" title="ClickHouse"><img src="docs/static/img/databases/clickhouse.png" alt="ClickHouse" width="150" height="37" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/cloudflare-d1" title="Cloudflare D1"><img src="docs/static/img/databases/cloudflare.png" alt="Cloudflare D1" width="40" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/cockroachdb" title="CockroachDB"><img src="docs/static/img/databases/cockroachdb.png" alt="CockroachDB" width="150" height="24" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/couchbase" title="Couchbase"><img src="docs/static/img/databases/couchbase.svg" alt="Couchbase" width="150" height="35" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/cratedb" title="CrateDB"><img src="docs/static/img/databases/cratedb.svg" alt="CrateDB" width="180" height="24" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/databend" title="Databend"><img src="docs/static/img/databases/databend.png" alt="Databend" width="100" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/databricks" title="Databricks"><img src="docs/static/img/databases/databricks.png" alt="Databricks" width="152" height="24" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/denodo" title="Denodo"><img src="docs/static/img/databases/denodo.png" alt="Denodo" width="138" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/dremio" title="Dremio"><img src="docs/static/img/databases/dremio.png" alt="Dremio" width="126" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/duckdb" title="DuckDB"><img src="docs/static/img/databases/duckdb.png" alt="DuckDB" width="52" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/elasticsearch" title="Elasticsearch"><img src="docs/static/img/databases/elasticsearch.png" alt="Elasticsearch" width="40" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/exasol" title="Exasol"><img src="docs/static/img/databases/exasol.png" alt="Exasol" width="72" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/firebird" title="Firebird"><img src="docs/static/img/databases/firebird.png" alt="Firebird" width="100" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/firebolt" title="Firebolt"><img src="docs/static/img/databases/firebolt.png" alt="Firebolt" width="100" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/google-bigquery" title="Google BigQuery"><img src="docs/static/img/databases/google-big-query.svg" alt="Google BigQuery" width="76" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/google-sheets" title="Google Sheets"><img src="docs/static/img/databases/google-sheets.svg" alt="Google Sheets" width="76" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/greenplum" title="Greenplum"><img src="docs/static/img/databases/greenplum.png" alt="Greenplum" width="124" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/hologres" title="Hologres"><img src="docs/static/img/databases/hologres.png" alt="Hologres" width="44" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/ibm-db2" title="IBM Db2"><img src="docs/static/img/databases/ibm-db2.svg" alt="IBM Db2" width="91" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/ibm-netezza-performance-server" title="IBM Netezza Performance Server"><img src="docs/static/img/databases/netezza.png" alt="IBM Netezza Performance Server" width="40" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/mariadb" title="MariaDB"><img src="docs/static/img/databases/mariadb.png" alt="MariaDB" width="150" height="37" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/microsoft-sql-server" title="Microsoft SQL Server"><img src="docs/static/img/databases/msql.png" alt="Microsoft SQL Server" width="50" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/monetdb" title="MonetDB"><img src="docs/static/img/databases/monet-db.png" alt="MonetDB" width="100" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/mongodb" title="MongoDB"><img src="docs/static/img/databases/mongodb.png" alt="MongoDB" width="150" height="38" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/motherduck" title="MotherDuck"><img src="docs/static/img/databases/motherduck.png" alt="MotherDuck" width="40" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/oceanbase" title="OceanBase"><img src="docs/static/img/databases/oceanbase.svg" alt="OceanBase" width="175" height="24" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/oracle" title="Oracle"><img src="docs/static/img/databases/oraclelogo.png" alt="Oracle" width="111" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/presto" title="Presto"><img src="docs/static/img/databases/presto-og.png" alt="Presto" width="127" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/risingwave" title="RisingWave"><img src="docs/static/img/databases/risingwave.svg" alt="RisingWave" width="147" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/sap-hana" title="SAP HANA"><img src="docs/static/img/databases/sap-hana.png" alt="SAP HANA" width="137" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/sap-sybase" title="SAP Sybase"><img src="docs/static/img/databases/sybase.png" alt="SAP Sybase" width="100" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/shillelagh" title="Shillelagh"><img src="docs/static/img/databases/shillelagh.png" alt="Shillelagh" width="40" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/singlestore" title="SingleStore"><img src="docs/static/img/databases/singlestore.png" alt="SingleStore" width="150" height="31" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/snowflake" title="Snowflake"><img src="docs/static/img/databases/snowflake.svg" alt="Snowflake" width="76" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/sqlite" title="SQLite"><img src="docs/static/img/databases/sqlite.png" alt="SQLite" width="84" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/starrocks" title="StarRocks"><img src="docs/static/img/databases/starrocks.png" alt="StarRocks" width="149" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/superset-meta-database" title="Superset meta database"><img src="docs/static/img/databases/superset.svg" alt="Superset meta database" width="150" height="39" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/tdengine" title="TDengine"><img src="docs/static/img/databases/tdengine.png" alt="TDengine" width="140" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/teradata" title="Teradata"><img src="docs/static/img/databases/teradata.png" alt="Teradata" width="124" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/timescaledb" title="TimescaleDB"><img src="docs/static/img/databases/timescale.png" alt="TimescaleDB" width="150" height="36" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/trino" title="Trino"><img src="docs/static/img/databases/trino.png" alt="Trino" width="89" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/vertica" title="Vertica"><img src="docs/static/img/databases/vertica.png" alt="Vertica" width="128" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/ydb" title="YDB"><img src="docs/static/img/databases/ydb.svg" alt="YDB" width="110" height="40" /></a> &nbsp;
<a href="https://superset.apache.org/docs/databases/supported/yugabytedb" title="YugabyteDB"><img src="docs/static/img/databases/yugabyte.png" alt="YugabyteDB" width="150" height="26" /></a>
<img src="https://superset.apache.org/img/databases/redshift.png" alt="redshift" border="0" width="200"/>
<img src="https://superset.apache.org/img/databases/google-biquery.png" alt="google-bigquery" border="0" width="200"/>
<img src="https://superset.apache.org/img/databases/snowflake.png" alt="snowflake" border="0" width="200"/>
<img src="https://superset.apache.org/img/databases/trino.png" alt="trino" border="0" width="150" />
<img src="https://superset.apache.org/img/databases/presto.png" alt="presto" border="0" width="200"/>
<img src="https://superset.apache.org/img/databases/databricks.png" alt="databricks" border="0" width="160" />
<img src="https://superset.apache.org/img/databases/druid.png" alt="druid" border="0" width="200" />
<img src="https://superset.apache.org/img/databases/firebolt.png" alt="firebolt" border="0" width="200" />
<img src="https://superset.apache.org/img/databases/timescale.png" alt="timescale" border="0" width="200" />
<img src="https://superset.apache.org/img/databases/postgresql.png" alt="postgresql" border="0" width="200" />
<img src="https://superset.apache.org/img/databases/mysql.png" alt="mysql" border="0" width="200" />
<img src="https://superset.apache.org/img/databases/mssql-server.png" alt="mssql-server" border="0" width="200" />
<img src="https://superset.apache.org/img/databases/ibm-db2.svg" alt="db2" border="0" width="220" />
<img src="https://superset.apache.org/img/databases/sqlite.png" alt="sqlite" border="0" width="200" />
<img src="https://superset.apache.org/img/databases/sybase.png" alt="sybase" border="0" width="200" />
<img src="https://superset.apache.org/img/databases/mariadb.png" alt="mariadb" border="0" width="200" />
<img src="https://superset.apache.org/img/databases/vertica.png" alt="vertica" border="0" width="200" />
<img src="https://superset.apache.org/img/databases/oracle.png" alt="oracle" border="0" width="200" />
<img src="https://superset.apache.org/img/databases/firebird.png" alt="firebird" border="0" width="200" />
<img src="https://superset.apache.org/img/databases/greenplum.png" alt="greenplum" border="0" width="200" />
<img src="https://superset.apache.org/img/databases/clickhouse.png" alt="clickhouse" border="0" width="200" />
<img src="https://superset.apache.org/img/databases/exasol.png" alt="exasol" border="0" width="160" />
<img src="https://superset.apache.org/img/databases/monet-db.png" alt="monet-db" border="0" width="200" />
<img src="https://superset.apache.org/img/databases/apache-kylin.png" alt="apache-kylin" border="0" width="80"/>
<img src="https://superset.apache.org/img/databases/hologres.png" alt="hologres" border="0" width="80"/>
<img src="https://superset.apache.org/img/databases/netezza.png" alt="netezza" border="0" width="80"/>
<img src="https://superset.apache.org/img/databases/pinot.png" alt="pinot" border="0" width="200" />
<img src="https://superset.apache.org/img/databases/teradata.png" alt="teradata" border="0" width="200" />
<img src="https://superset.apache.org/img/databases/yugabyte.png" alt="yugabyte" border="0" width="200" />
<img src="https://superset.apache.org/img/databases/databend.png" alt="databend" border="0" width="200" />
<img src="https://superset.apache.org/img/databases/starrocks.png" alt="starrocks" border="0" width="200" />
<img src="https://superset.apache.org/img/databases/doris.png" alt="doris" border="0" width="200" />
<img src="https://superset.apache.org/img/databases/oceanbase.svg" alt="oceanbase" border="0" width="220" />
<img src="https://superset.apache.org/img/databases/sap-hana.png" alt="sap-hana" border="0" width="220" />
<img src="https://superset.apache.org/img/databases/denodo.png" alt="denodo" border="0" width="200" />
<img src="https://superset.apache.org/img/databases/ydb.svg" alt="ydb" border="0" width="200" />
<img src="https://superset.apache.org/img/databases/tdengine.png" alt="TDengine" border="0" width="200" />
</p>
<!-- SUPPORTED_DATABASES_END -->
**A more comprehensive list of supported databases** along with the configuration instructions can be found [here](https://superset.apache.org/docs/databases).
**A more comprehensive list of supported databases** along with the configuration instructions can be found [here](https://superset.apache.org/docs/configuration/databases).
Want to add support for your datastore or data engine? Read more [here](https://superset.apache.org/docs/frequently-asked-questions#does-superset-work-with-insert-database-engine-here) about the technical requirements.
@@ -189,25 +155,20 @@ Try out Superset's [quickstart](https://superset.apache.org/docs/quickstart/) gu
- [Join our community's Slack](http://bit.ly/join-superset-slack)
and please read our [Slack Community Guidelines](https://github.com/apache/superset/blob/master/CODE_OF_CONDUCT.md#slack-community-guidelines)
- [Join our dev@superset.apache.org Mailing list](https://lists.apache.org/list.html?dev@superset.apache.org). To join, simply send an email to [dev-subscribe@superset.apache.org](mailto:dev-subscribe@superset.apache.org)
- Follow us on social media:
[X](https://x.com/apachesuperset) |
[LinkedIn](https://www.linkedin.com/company/apache-superset) |
[Bluesky](https://bsky.app/profile/apachesuperset.bsky.social) |
[Reddit](https://reddit.com/r/apache-superset)
- If you want to help troubleshoot GitHub Issues involving the numerous database drivers that Superset supports, please consider adding your name and the databases you have access to on the [Superset Database Familiarity Rolodex](https://docs.google.com/spreadsheets/d/1U1qxiLvOX0kBTUGME1AHHi6Ywel6ECF8xk_Qy-V9R8c/edit#gid=0)
- Join Superset's Town Hall and [Operational Model](https://preset.io/blog/the-superset-operational-model-wants-you/) recurring meetings. Meeting info is available on the [Superset Community Calendar](https://superset.apache.org/community)
## Contributor Guide
Interested in contributing? Check out our
[Developer Guide](https://superset.apache.org/developer-docs/)
[CONTRIBUTING.md](https://github.com/apache/superset/blob/master/CONTRIBUTING.md)
to find resources around contributing along with a detailed guide on
how to set up a development environment.
## Resources
- [Superset "In the Wild"](https://superset.apache.org/inTheWild) - see who's using Superset, and [add your organization](https://github.com/apache/superset/edit/master/RESOURCES/INTHEWILD.yaml) to the list!
- [Feature Flags](https://superset.apache.org/docs/configuration/feature-flags) - the status of Superset's Feature Flags.
- [Superset "In the Wild"](https://github.com/apache/superset/blob/master/RESOURCES/INTHEWILD.md) - open a PR to add your org to the list!
- [Feature Flags](https://github.com/apache/superset/blob/master/RESOURCES/FEATURE_FLAGS.md) - the status of Superset's Feature Flags.
- [Standard Roles](https://github.com/apache/superset/blob/master/RESOURCES/STANDARD_ROLES.md) - How RBAC permissions map to roles.
- [Superset Wiki](https://github.com/apache/superset/wiki) - Tons of additional community resources: best practices, community content and other information.
- [Superset SIPs](https://github.com/orgs/apache/projects/170) - The status of Superset's SIPs (Superset Improvement Proposals) for both consensus and implementation status.
@@ -247,13 +208,16 @@ Understanding the Superset Points of View
- [Superset API](https://superset.apache.org/docs/rest-api)
<!--
The OSS Insight "Repo Activity" widget (https://next.ossinsight.io/) was
intentionally removed. This README is rendered on the ASF-hosted website
(superset.apache.org), so its contents are subject to ASF's third-party
content and CSP rules. OSS Insight has no Data Processing Agreement (DPA)
with the ASF, so we cannot embed its images/widgets here. Do not re-add it.
-->
## Repo Activity
<a href="https://next.ossinsight.io/widgets/official/compose-last-28-days-stats?repo_id=39464018" target="_blank" align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://next.ossinsight.io/widgets/official/compose-last-28-days-stats/thumbnail.png?repo_id=39464018&image_size=auto&color_scheme=dark" width="655" height="auto" />
<img alt="Performance Stats of apache/superset - Last 28 days" src="https://next.ossinsight.io/widgets/official/compose-last-28-days-stats/thumbnail.png?repo_id=39464018&image_size=auto&color_scheme=light" width="655" height="auto" />
</picture>
</a>
<!-- Made with [OSS Insight](https://ossinsight.io/) -->
<!-- telemetry/analytics pixel: -->
<img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=bc1c90cd-bc04-4e11-8c7b-289fb2839492" />

View File

@@ -14,7 +14,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
FROM python:3.11-slim-trixie
FROM python:3.10-slim-bookworm
RUN useradd --user-group --create-home --no-log-init --shell /bin/bash superset

View File

@@ -14,7 +14,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
FROM python:3.11-slim-trixie
FROM python:3.10-slim-bookworm
RUN useradd --user-group --create-home --no-log-init --shell /bin/bash superset

View File

@@ -14,7 +14,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
FROM python:3.11-slim-trixie
FROM python:3.10-slim-bookworm
ARG VERSION
RUN git clone --depth 1 --branch ${VERSION} https://github.com/apache/superset.git /superset

View File

@@ -14,7 +14,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
FROM python:3.11-slim-trixie
FROM python:3.10-slim-bookworm
RUN apt-get update -y
RUN apt-get install -y \

View File

@@ -458,7 +458,7 @@ cd ../
sed -i '' "s/version_string = .*/version_string = \"$SUPERSET_VERSION\"/" setup.py
# build the python distribution
python -m build
python setup.py sdist
```
Publish to PyPI
@@ -469,10 +469,6 @@ an account first if you don't have one, and reference your username
while requesting access to push packages.
```bash
# Run this first to make sure you are uploading the right version.
# Pypi does not allow you to delete or retract once uplaoded.
twine check dist/*
twine upload dist/*
```
@@ -522,8 +518,6 @@ takes the version (ie `3.1.1`), the git reference (any SHA, tag or branch
reference), and whether to force the `latest` Docker tag on the
generated images.
**NOTE:** If the docker image isn't built, you'll need to run this [GH action](https://github.com/apache/superset/actions/workflows/tag-release.yml) where you provide it the tag sha.
### Npm Release
You might want to publish the latest @superset-ui release to npm

View File

@@ -92,7 +92,7 @@ Some of the new features in this release are disabled by default. Each has a fea
| Feature | Feature Flag | Dependencies | Documentation
| --- | --- | --- | --- |
| Global Async Queries | `GLOBAL_ASYNC_QUERIES: True` | Redis 5.0+, celery workers configured and running | [Extra documentation](https://superset.apache.org/docs/contributing/misc#async-chart-queries)
| Global Async Queries | `GLOBAL_ASYNC_QUERIES: True` | Redis 5.0+, celery workers configured and running | [Extra documentation](https://github.com/apache/superset/blob/master/CONTRIBUTING.md#async-chart-queries )
| Dashboard Native Filters | `DASHBOARD_NATIVE_FILTERS: True` | |
| Alerts & Reporting | `ALERT_REPORTS: True` | [Celery workers configured & celery beat process](https://superset.apache.org/docs/installation/async-queries-celery) |
| Homescreen Thumbnails | `THUMBNAILS: TRUE, THUMBNAIL_CACHE_CONFIG: CacheConfig = { "CACHE_TYPE": "null", "CACHE_NO_NULL_WARNING": True}`| selenium, pillow 7, celery |

View File

@@ -56,33 +56,8 @@ def verify_sha512(filename: str) -> str:
# Part 2: Verify RSA key - this is the same as running `gpg --verify {release}.asc {release}` and comparing the RSA key and email address against the KEYS file # noqa: E501
KEYS_URL = "https://downloads.apache.org/superset/KEYS"
def ensure_keys_imported() -> None:
"""Import the Apache Superset KEYS file into the local GPG keyring.
Without this, `gpg --verify` returns "No public key" and the signature
cannot actually be verified — only the key ID in the signature metadata
is visible.
"""
try:
keys = requests.get(KEYS_URL, timeout=30)
except requests.RequestException as exc:
print(f"Warning: could not fetch KEYS file for import: {exc}")
return
if keys.status_code != 200:
print(f"Warning: could not fetch KEYS file (HTTP {keys.status_code})")
return
subprocess.run( # noqa: S603
["gpg", "--import"], # noqa: S607
input=keys.content,
capture_output=True,
)
def get_gpg_info(filename: str) -> tuple[Optional[str], Optional[str]]:
"""Run the GPG verify command and extract RSA/EDDSA key and email address."""
"""Run the GPG verify command and extract RSA key and email address."""
asc_filename = filename + ".asc"
result = subprocess.run( # noqa: S603
["gpg", "--verify", asc_filename, filename], # noqa: S607
@@ -90,50 +65,25 @@ def get_gpg_info(filename: str) -> tuple[Optional[str], Optional[str]]:
)
output = result.stderr.decode()
# If no public key was available, import KEYS and retry so that
# `Good signature from "Name <email>"` appears in the output.
if "No public key" in output:
ensure_keys_imported()
result = subprocess.run( # noqa: S603
["gpg", "--verify", asc_filename, filename], # noqa: S607
capture_output=True, # noqa: S607
)
output = result.stderr.decode()
rsa_key = re.search(r"RSA key ([0-9A-F]+)", output)
eddsa_key = re.search(r"EDDSA key ([0-9A-F]+)", output)
# Try multiple patterns — `Good signature from` is the most reliable
# source of the email; `issuer` is a fallback for older gpg output.
email_patterns = (
r'Good signature from ".*?<([^>]+)>"',
r'aka ".*?<([^>]+)>"',
r'issuer "([^"]+)"',
)
email_result: Optional[str] = None
for pattern in email_patterns:
match = re.search(pattern, output)
if match:
email_result = match.group(1)
break
email = re.search(r'issuer "([^"]+)"', output)
rsa_key_result = rsa_key.group(1) if rsa_key else None
eddsa_key_result = eddsa_key.group(1) if eddsa_key else None
email_result = email.group(1) if email else None
key_result = rsa_key_result or eddsa_key_result
# Debugging:
if key_result:
print("RSA or EDDSA Key found")
else:
print("Warning: No RSA or EDDSA key found in GPG verification output.")
if email_result:
print(f"Email found: {email_result}")
print("email found")
else:
print("Warning: No email address found in GPG verification output.")
if "No public key" in output:
print(
"Hint: public key is not in your keyring. Import it with:\n"
f" curl -s {KEYS_URL} | gpg --import"
)
return key_result, email_result

103
RESOURCES/FEATURE_FLAGS.md Normal file
View File

@@ -0,0 +1,103 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
# Superset Feature Flags
This is a list of the current Superset optional features. See config.py for default values. These features can be turned on/off by setting your preferred values in superset_config.py to True/False respectively
## In Development
These features are considered **unfinished** and should only be used on development environments.
[//]: # "PLEASE KEEP THE LIST SORTED ALPHABETICALLY"
- ALERT_REPORT_TABS
- DATE_RANGE_TIMESHIFTS_ENABLED
- ENABLE_ADVANCED_DATA_TYPES
- PRESTO_EXPAND_DATA
- SHARE_QUERIES_VIA_KV_STORE
- TAGGING_SYSTEM
- CHART_PLUGINS_EXPERIMENTAL
## In Testing
These features are **finished** but currently being tested. They are usable, but may still contain some bugs.
[//]: # "PLEASE KEEP THE LIST SORTED ALPHABETICALLY"
- ALERT_REPORTS: [(docs)](https://superset.apache.org/docs/configuration/alerts-reports)
- ALLOW_FULL_CSV_EXPORT
- CACHE_IMPERSONATION
- CONFIRM_DASHBOARD_DIFF
- DYNAMIC_PLUGINS
- DATE_FORMAT_IN_EMAIL_SUBJECT: [(docs)](https://superset.apache.org/docs/configuration/alerts-reports#commons)
- ENABLE_SUPERSET_META_DB: [(docs)](https://superset.apache.org/docs/configuration/databases/#querying-across-databases)
- ESTIMATE_QUERY_COST
- GLOBAL_ASYNC_QUERIES [(docs)](https://github.com/apache/superset/blob/master/CONTRIBUTING.md#async-chart-queries)
- IMPERSONATE_WITH_EMAIL_PREFIX
- PLAYWRIGHT_REPORTS_AND_THUMBNAILS
- RLS_IN_SQLLAB
- SSH_TUNNELING [(docs)](https://superset.apache.org/docs/configuration/setup-ssh-tunneling)
- USE_ANALAGOUS_COLORS
## Stable
These features flags are **safe for production**. They have been tested and will be supported for the at least the current major version cycle.
[//]: # "PLEASE KEEP THESE LISTS SORTED ALPHABETICALLY"
### Flags on the path to feature launch and flag deprecation/removal
- DASHBOARD_VIRTUALIZATION
### Flags retained for runtime configuration
Currently some of our feature flags act as dynamic configurations that can changed
on the fly. This acts in contradiction with the typical ephemeral feature flag use case,
where the flag is used to mature a feature, and eventually deprecated once the feature is
solid. Eventually we'll likely refactor these under a more formal "dynamic configurations" managed
independently. This new framework will also allow for non-boolean configurations.
- ALERTS_ATTACH_REPORTS
- ALLOW_ADHOC_SUBQUERY
- DASHBOARD_RBAC [(docs)](https://superset.apache.org/docs/using-superset/creating-your-first-dashboard#manage-access-to-dashboards)
- DATAPANEL_CLOSED_BY_DEFAULT
- DRILL_BY
- DRUID_JOINS
- EMBEDDABLE_CHARTS
- EMBEDDED_SUPERSET
- ENABLE_TEMPLATE_PROCESSING
- ESCAPE_MARKDOWN_HTML
- LISTVIEWS_DEFAULT_CARD_VIEW
- SCHEDULED_QUERIES [(docs)](https://superset.apache.org/docs/configuration/alerts-reports)
- SLACK_ENABLE_AVATARS (see `superset/config.py` for more information)
- SQLLAB_BACKEND_PERSISTENCE
- SQL_VALIDATORS_BY_ENGINE [(docs)](https://superset.apache.org/docs/configuration/sql-templating)
- THUMBNAILS [(docs)](https://superset.apache.org/docs/configuration/cache)
## Deprecated Flags
These features flags currently default to True and **will be removed in a future major release**. For this current release you can turn them off by setting your config to False, but it is advised to remove or set these flags in your local configuration to **True** so that you do not experience any unexpected changes in a future release.
[//]: # "PLEASE KEEP THE LIST SORTED ALPHABETICALLY"
- AVOID_COLORS_COLLISION
- DRILL_TO_DETAIL
- ENABLE_JAVASCRIPT_CONTROLS
- KV_STORE

226
RESOURCES/INTHEWILD.md Normal file
View File

@@ -0,0 +1,226 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
## Superset Users in the Wild
Here's a list of organizations, broken down into broad industry categories, that have taken the time to send a PR to let
the world know they are using Apache Superset. If you are a user and want to be recognized,
all you have to do is file a simple PR [like this one](https://github.com/apache/superset/pull/10122) — [just click here](https://github.com/apache/superset/edit/master/RESOURCES/INTHEWILD.md) to do so. If you think
the categorization is inaccurate, please file a PR with your correction as well.
Join our growing community!
### Sharing Economy
- [Airbnb](https://github.com/airbnb)
- [Faasos](https://faasos.com/) [@shashanksingh]
- [Free2Move](https://www.free2move.com/) [@PaoloTerzi]
- [Hostnfly](https://www.hostnfly.com/) [@alexisrosuel]
- [Lime](https://www.li.me/) [@cxmcc]
- [Lyft](https://www.lyft.com/)
- [Ontruck](https://www.ontruck.com/)
### Financial Services
- [Aktia Bank plc](https://www.aktia.com)
- [American Express](https://www.americanexpress.com) [@TheLastSultan]
- [bumper](https://www.bumper.co/) [@vasu-ram, @JamiePercival]
- [Cape Crypto](https://capecrypto.com)
- [Capital Service S.A.](https://capitalservice.pl) [@pkonarzewski]
- [Clark.de](https://clark.de/)
- [Europace](https://europace.de)
- [KarrotPay](https://www.daangnpay.com/)
- [Remita](https://remita.net) [@mujibishola]
- [Taveo](https://www.taveo.com) [@codek]
- [Unit](https://www.unit.co/about-us) [@amitmiran137]
- [Wise](https://wise.com) [@koszti]
- [Xendit](https://xendit.co/) [@LieAlbertTriAdrian]
- [Cover Genius](https://covergenius.com/)
### Gaming
- [Popoko VM Games Studio](https://popoko.live)
### E-Commerce
- [AiHello](https://www.aihello.com) [@ganeshkrishnan1]
- [Bazaar Technologies](https://www.bazaartech.com) [@umair-abro]
- [Dragonpass](https://www.dragonpass.com.cn/) [@zhxjdwh]
- [Dropit Shopping](https://www.dropit.shop/) [@dropit-dev]
- [Fanatics](https://www.fanatics.com/) [@coderfender]
- [Fordeal](https://www.fordeal.com) [@Renkai]
- [Fynd](https://www.fynd.com/) [@darpanjain07]
- [GFG - Global Fashion Group](https://global-fashion-group.com) [@ksaagariconic]
- [GoTo/Gojek](https://www.gojek.io/) [@gwthm-in]
- [HuiShouBao](https://www.huishoubao.com/) [@Yukinoshita-Yukino]
- [Now](https://www.now.vn/) [@davidkohcw]
- [Qunar](https://www.qunar.com/) [@flametest]
- [Rakuten Viki](https://www.viki.com)
- [Shopee](https://shopee.sg) [@xiaohanyu]
- [Shopkick](https://www.shopkick.com) [@LAlbertalli]
- [ShopUp](https://www.shopup.org/) [@gwthm-in]
- [Tails.com](https://tails.com/gb/) [@alanmcruickshank]
- [THE ICONIC](https://theiconic.com.au/) [@ksaagariconic]
- [Utair](https://www.utair.ru) [@utair-digital]
- [VkusVill](https://vkusvill.ru/) [@ETselikov]
- [Zalando](https://www.zalando.com) [@dmigo]
- [Zalora](https://www.zalora.com) [@ksaagariconic]
- [Zepto](https://www.zeptonow.com/) [@gwthm-in]
### Enterprise Technology
- [A3Data](https://a3data.com.br) [@neylsoncrepalde]
- [Analytics Aura](https://analyticsaura.com/) [@Analytics-Aura]
- [Apollo GraphQL](https://www.apollographql.com/) [@evans]
- [Astronomer](https://www.astronomer.io) [@ryw]
- [Avesta Technologies](https://avestatechnologies.com/) [@TheRum]
- [Caizin](https://caizin.com/) [@tejaskatariya]
- [Canonical](https://canonical.com)
- [Careem](https://www.careem.com/) [@samraHanif0340]
- [Cloudsmith](https://cloudsmith.io) [@alancarson]
- [Cyberhaven](https://www.cyberhaven.com/) [@toliver-ch]
- [Deepomatic](https://deepomatic.com/) [@Zanoellia]
- [Dial Once](https://www.dial-once.com/)
- [Dremio](https://dremio.com) [@narendrans]
- [EFinance](https://www.efinance.com.eg) [@habeeb556]
- [Elestio](https://elest.io/) [@kaiwalyakoparkar]
- [ELMO Cloud HR & Payroll](https://elmosoftware.com.au/)
- [Endress+Hauser](https://www.endress.com/) [@rumbin]
- [FBK - ICT center](https://ict.fbk.eu)
- [Formbricks](https://formbricks.com)
- [Gavagai](https://gavagai.io) [@gavagai-corp]
- [GfK Data Lab](https://www.gfk.com/home) [@mherr]
- [HPE](https://www.hpe.com/in/en/home.html) [@anmol-hpe]
- [Hydrolix](https://www.hydrolix.io/)
- [Intercom](https://www.intercom.com/) [@kate-gallo]
- [jampp](https://jampp.com/)
- [Konfío](https://konfio.mx) [@uis-rodriguez]
- [Mainstrat](https://mainstrat.com/)
- [mishmash io](https://mishmash.io/) [@mishmash-io]
- [Myra Labs](https://www.myralabs.com/) [@viksit]
- [Nielsen](https://www.nielsen.com/) [@amitNielsen]
- [Ona](https://ona.io) [@pld]
- [Orange](https://www.orange.com) [@icsu]
- [Oslandia](https://oslandia.com)
- [Oxylabs](https://oxylabs.io/) [@rytis-ulys]
- [Peak AI](https://www.peak.ai/) [@azhar22k]
- [PeopleDoc](https://www.people-doc.com) [@rodo]
- [PlaidCloud](https://www.plaidcloud.com)
- [Preset, Inc.](https://preset.io)
- [PubNub](https://pubnub.com) [@jzucker2]
- [ReadyTech](https://www.readytech.io)
- [Reward Gateway](https://www.rewardgateway.com)
- [RIADVICE](https://riadvice.tn) [@riadvice]
- [ScopeAI](https://www.getscopeai.com) [@iloveluce]
- [shipmnts](https://shipmnts.com)
- [Showmax](https://showmax.com) [@bobek]
- [SingleStore](https://www.singlestore.com/)
- [TechAudit](https://www.techaudit.info) [@ETselikov]
- [Tenable](https://www.tenable.com) [@dflionis]
- [Tentacle](https://www.linkedin.com/company/tentacle-cmi/) [@jdclarke5]
- [timbr.ai](https://timbr.ai/) [@semantiDan]
- [Tobii](https://www.tobii.com/) [@dwa]
- [Tooploox](https://www.tooploox.com/) [@jakubczaplicki]
- [Unvired](https://unvired.com) [@srinisubramanian]
- [Virtuoso QA](https://www.virtuosoqa.com)
- [Whale](https://whale.im)
- [Windsor.ai](https://www.windsor.ai/) [@octaviancorlade]
- [WinWin Network马上赢](https://brandct.cn/) [@wenbinye]
- [Zeta](https://www.zeta.tech/) [@shaikidris]
### Media & Entertainment
- [6play](https://www.6play.fr) [@CoryChaplin]
- [bilibili](https://www.bilibili.com) [@Moinheart]
- [BurdaForward](https://www.burda-forward.de/en/)
- [Douban](https://www.douban.com/) [@luchuan]
- [Kuaishou](https://www.kuaishou.com/) [@zhaoyu89730105]
- [Netflix](https://www.netflix.com/)
- [Prensa Iberica](https://www.prensaiberica.es/) [@zamar-roura]
- [TME QQMUSIC/WESING](https://www.tencentmusic.com/) [@shenyuanli,@marklaw]
- [Xite](https://xite.com/) [@shashankkoppar]
- [Zaihang](https://www.zaih.com/)
### Education
- [Aveti Learning](https://avetilearning.com/) [@TheShubhendra]
- [Brilliant.org](https://brilliant.org/)
- [Open edX](https://openedx.org/)
- [Platzi.com](https://platzi.com/)
- [Sunbird](https://www.sunbird.org/) [@eksteporg]
- [The GRAPH Network](https://thegraphnetwork.org/) [@fccoelho]
- [Udemy](https://www.udemy.com/) [@sungjuly]
- [VIPKID](https://www.vipkid.com.cn/) [@illpanda]
- [WikiMedia Foundation](https://wikimediafoundation.org) [@vg]
### Energy
- [Airboxlab](https://foobot.io) [@antoine-galataud]
- [DouroECI](https://www.douroeci.com/) [@nunohelibeires]
- [Safaricom](https://www.safaricom.co.ke/) [@mmutiso]
- [Scoot](https://scoot.co/) [@haaspt]
- [Wattbewerb](https://wattbewerb.de/) [@wattbewerb]
### Healthcare
- [Amino](https://amino.com) [@shkr]
- [Bluesquare](https://www.bluesquarehub.com/) [@madewulf]
- [Care](https://www.getcare.io/) [@alandao2021]
- [Living Goods](https://www.livinggoods.org) [@chelule]
- [Maieutical Labs](https://maieuticallabs.it) [@xrmx]
- [Medic](https://medic.org) [@1yuv]
- [REDCap Cloud](https://www.redcapcloud.com/)
- [TrustMedis](https://trustmedis.com/) [@famasya]
- [WeSure](https://www.wesure.cn/)
- [2070Health](https://2070health.com/)
### HR / Staffing
- [Swile](https://www.swile.co/) [@PaoloTerzi]
- [Symmetrics](https://www.symmetrics.fyi)
- [bluquist](https://bluquist.com/)
### Government
- [City of Ann Arbor, MI](https://www.a2gov.org/) [@sfirke]
- [RIS3 Strategy of CZ, MIT CR](https://www.ris3.cz/) [@RIS3CZ]
- [NRLM - Sarathi, India](https://pib.gov.in/PressReleasePage.aspx?PRID=1999586)
### Travel
- [Agoda](https://www.agoda.com/) [@lostseaway, @maiake, @obombayo]
- [HomeToGo](https://hometogo.com/) [@pedromartinsteenstrup]
- [Skyscanner](https://www.skyscanner.net/) [@cleslie, @stanhoucke]
### Others
- [10Web](https://10web.io/)
- [AI inside](https://inside.ai/en/)
- [Automattic](https://automattic.com/) [@Khrol, @Usiel]
- [Dropbox](https://www.dropbox.com/) [@bkyryliuk]
- [Flowbird](https://flowbird.com) [@EmmanuelCbd]
- [GEOTAB](https://www.geotab.com) [@JZ6]
- [Grassroot](https://www.grassrootinstitute.org/)
- [Increff](https://www.increff.com/) [@ishansinghania]
- [komoot](https://www.komoot.com/) [@christophlingg]
- [Let's Roam](https://www.letsroam.com/)
- [Machrent SA](https://www.machrent.com/)
- [Onebeat](https://1beat.com/) [@GuyAttia]
- [X](https://x.com/)
- [VLMedia](https://www.vlmedia.com.tr/) [@ibotheperfect]
- [Yahoo!](https://yahoo.com/)

View File

@@ -1,760 +0,0 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# Apache Superset Users in the Wild
#
# To add your organization:
# 1. Find the appropriate category (or add a new one)
# 2. Add an entry with your organization details
# 3. Optionally add a logo file to docs/static/img/logos/
#
# Required fields:
# - name: Your organization name
# - url: Link to your organization's website
#
# Optional fields:
# - logo: Filename of logo in docs/static/img/logos/ (e.g., "mycompany.svg")
# - contributors: List of GitHub usernames who contributed (e.g., ["@username"])
categories:
Sharing Economy:
- name: Airbnb
url: https://github.com/airbnb
- name: Faasos
url: https://faasos.com/
contributors: ["@shashanksingh"]
- name: Free2Move
url: https://www.free2move.com/
contributors: ["@PaoloTerzi"]
- name: Hostnfly
url: https://www.hostnfly.com/
contributors: ["@alexisrosuel"]
- name: Lime
url: https://www.li.me/
contributors: ["@cxmcc"]
- name: Lyft
url: https://www.lyft.com/
- name: Ontruck
url: https://www.ontruck.com/
Financial Services:
- name: Aadhar Housing Finance Limited
url: https://www.aadharhousing.com
contributors: ["@thakerhardiks"]
- name: Aktia Bank plc
url: https://www.aktia.com
- name: American Express
url: https://www.americanexpress.com
contributors: ["@TheLastSultan"]
- name: bumper
url: https://www.bumper.co/
contributors: ["@vasu-ram", "@JamiePercival"]
- name: Cape Crypto
url: https://capecrypto.com
- name: Capital Service S.A.
url: https://capitalservice.pl
contributors: ["@pkonarzewski"]
- name: Clark.de
url: https://clark.de/
- name: Cover Genius
url: https://covergenius.com/
- name: EnquiryLabs
url: https://www.enquirylabs.co.uk
- name: Europace
url: https://europace.de
- name: KarrotPay
url: https://www.daangnpay.com/
- name: NICE Actimize
url: https://www.niceactimize.com/
contributors: ["@stevensuting"]
- name: Remita
url: https://remita.net
contributors: ["@mujibishola"]
- name: Taveo
url: https://www.taveo.com
contributors: ["@codek"]
- name: Unit
url: https://www.unit.co/about-us
contributors: ["@amitmiran137"]
- name: Wise
url: https://wise.com
contributors: ["@koszti"]
- name: Xendit
url: https://xendit.co/
contributors: ["@LieAlbertTriAdrian"]
Gaming:
- name: Popoko VM Games Studio
url: https://popoko.live
E-Commerce:
- name: AiHello
url: https://www.aihello.com
contributors: ["@ganeshkrishnan1"]
- name: Bazaar Technologies
url: https://www.bazaartech.com
contributors: ["@umair-abro"]
- name: Blinkit
url: https://www.blinkit.com/
contributors: ["@amsharm2"]
- name: Dragonpass
url: https://www.dragonpass.com.cn/
contributors: ["@zhxjdwh"]
- name: Dropit Shopping
url: https://www.dropit.shop/
contributors: ["@dropit-dev"]
- name: Fordeal
url: https://www.fordeal.com
contributors: ["@Renkai"]
- name: Fynd
url: https://www.fynd.com/
contributors: ["@darpanjain07"]
- name: GFG - Global Fashion Group
url: https://global-fashion-group.com
contributors: ["@ksaagariconic"]
- name: GoTo/Gojek
url: https://www.gojek.io/
contributors: ["@gwthm-in"]
- name: HuiShouBao
url: https://www.huishoubao.com/
contributors: ["@Yukinoshita-Yukino"]
- name: Now
url: https://www.now.vn/
contributors: ["@davidkohcw"]
- name: Qunar
url: https://www.qunar.com/
contributors: ["@flametest"]
- name: Rakuten Viki
url: https://www.viki.com
- name: Shopee
url: https://shopee.sg
contributors: ["@xiaohanyu"]
- name: Shopkick
url: https://www.shopkick.com
contributors: ["@LAlbertalli"]
- name: ShopUp
url: https://www.shopup.org/
contributors: ["@gwthm-in"]
- name: Tails.com
url: https://tails.com/gb/
contributors: ["@alanmcruickshank"]
- name: THE ICONIC
url: https://theiconic.com.au/
contributors: ["@ksaagariconic"]
- name: Utair
url: https://www.utair.ru
contributors: ["@utair-digital"]
- name: VkusVill
url: https://vkusvill.ru/
contributors: ["@ETselikov"]
- name: Zalando
url: https://www.zalando.com
contributors: ["@dmigo"]
- name: Zalora
url: https://www.zalora.com
contributors: ["@ksaagariconic"]
- name: Zepto
url: https://www.zeptonow.com/
contributors: ["@gwthm-in"]
Enterprise Technology:
- name: A3Data
url: https://a3data.com.br
contributors: ["@neylsoncrepalde"]
- name: Analytics Aura
url: https://analyticsaura.com/
contributors: ["@Analytics-Aura"]
- name: Apollo GraphQL
url: https://www.apollographql.com/
contributors: ["@evans"]
- name: Astronomer
url: https://www.astronomer.io
contributors: ["@ryw"]
- name: Avesta Technologies
url: https://avestatechnologies.com/
contributors: ["@TheRum"]
- name: Caizin
url: https://caizin.com/
contributors: ["@tejaskatariya"]
- name: Canonical
url: https://canonical.com
- name: Careem
url: https://www.careem.com/
contributors: ["@samraHanif0340"]
- name: Cloudsmith
url: https://cloudsmith.io
contributors: ["@alancarson"]
- name: Cyberhaven
url: https://www.cyberhaven.com/
contributors: ["@toliver-ch"]
- name: Deepomatic
url: https://deepomatic.com/
contributors: ["@Zanoellia"]
- name: Dial Once
url: https://www.dial-once.com/
- name: Dremio
url: https://dremio.com
contributors: ["@narendrans"]
- name: EFinance
url: https://www.efinance.com.eg
contributors: ["@habeeb556"]
- name: Elestio
url: https://elest.io/
contributors: ["@kaiwalyakoparkar"]
- name: ELMO Cloud HR & Payroll
url: https://elmosoftware.com.au/
- name: Endress+Hauser
url: https://www.endress.com/
contributors: ["@rumbin"]
- name: FBK - ICT center
url: https://ict.fbk.eu
- name: Formbricks
url: https://formbricks.com
- name: Gavagai
url: https://gavagai.io
contributors: ["@gavagai-corp"]
- name: GfK Data Lab
url: https://www.gfk.com/home
contributors: ["@mherr"]
- name: Hifadih Business & Technology
url: https://hifadih.net/en
logo: hifadih.png
contributors: ["@saintLaurent00"]
- name: HPE
url: https://www.hpe.com/in/en/home.html
logo: hpe.png
contributors: ["@anmol-hpe"]
- name: Hydrolix
url: https://www.hydrolix.io/
- name: Intercom
url: https://www.intercom.com/
contributors: ["@kate-gallo"]
- name: jampp
url: https://jampp.com/
- name: Konfío
url: https://konfio.mx
contributors: ["@uis-rodriguez"]
- name: Mainstrat
url: https://mainstrat.com/
- name: mishmash io
url: https://mishmash.io/
contributors: ["@mishmash-io"]
- name: Myra Labs
url: https://www.myralabs.com/
contributors: ["@viksit"]
- name: Nielsen
url: https://www.nielsen.com/
contributors: ["@amitNielsen"]
- name: Ona
url: https://ona.io
contributors: ["@pld"]
- name: Orange
url: https://www.orange.com
contributors: ["@icsu"]
- name: Oslandia
url: https://oslandia.com
- name: Oxylabs
url: https://oxylabs.io/
contributors: ["@rytis-ulys"]
- name: Peak AI
url: https://www.peak.ai/
contributors: ["@azhar22k"]
- name: PeopleDoc
url: https://www.people-doc.com
contributors: ["@rodo"]
- name: PlaidCloud
url: https://plaidcloud.com
logo: plaidcloud.svg
contributors: ["@rad-pat"]
- name: Preset, Inc.
url: https://preset.io
logo: preset.svg
contributors: ["@mistercrunch", "@betodealmeida", "@dpgaspar", "@rusackas", "@sadpandajoe", "@Vitor-Avila", "@kgabryje", "@geido", "@eschutho", "@Antonio-RiveroMartnez", "@yousoph"]
- name: PubNub
url: https://pubnub.com
contributors: ["@jzucker2"]
- name: ReadyTech
url: https://www.readytech.io
- name: Reward Gateway
url: https://www.rewardgateway.com
- name: RIADVICE
url: https://riadvice.tn
contributors: ["@riadvice"]
- name: ScopeAI
url: https://www.getscopeai.com
contributors: ["@iloveluce"]
- name: shipmnts
url: https://shipmnts.com
- name: Showmax
url: https://showmax.com
contributors: ["@bobek"]
- name: SingleStore
url: https://www.singlestore.com/
- name: TechAudit
url: https://www.techaudit.info
contributors: ["@ETselikov"]
- name: Tech Solution
url: https://www.tech-solution.com.ar/
contributors: ["@danteGiuliano", "@LeandroVallejos", "@McJaben", "@xJeree", "@zeo-return-null"]
- name: Tenable
url: https://www.tenable.com
contributors: ["@dflionis"]
- name: Tentacle
url: https://www.linkedin.com/company/tentacle-cmi/
contributors: ["@jdclarke5"]
- name: timbr.ai
url: https://timbr.ai/
contributors: ["@semantiDan"]
- name: Tobii
url: https://www.tobii.com/
contributors: ["@dwa"]
- name: Tooploox
url: https://www.tooploox.com/
contributors: ["@jakubczaplicki"]
- name: Unvired
url: https://unvired.com
contributors: ["@srinisubramanian"]
- name: UserGuiding
url: https://userguiding.com/
logo: userguiding.svg
contributors: ["@tzercin"]
- name: Value Ad
url: https://bestpair.info/
contributors: ["@stevensuting"]
- name: Virtuoso QA
url: https://www.virtuosoqa.com
- name: Whale
url: https://whale.im
- name: Windsor.ai
url: https://www.windsor.ai/
contributors: ["@octaviancorlade"]
- name: WinWin Network马上赢
url: https://brandct.cn/
contributors: ["@wenbinye"]
- name: XNET
url: https://xnetmobile.com/
logo: xnet.png
contributors: ["@deuspt"]
- name: Zeta
url: https://www.zeta.tech/
contributors: ["@shaikidris"]
Media & Entertainment:
- name: 6play
url: https://www.6play.fr
contributors: ["@CoryChaplin"]
- name: bilibili
url: https://www.bilibili.com
contributors: ["@Moinheart"]
- name: BurdaForward
url: https://www.burda-forward.de/en/
- name: Douban
url: https://www.douban.com/
contributors: ["@luchuan"]
- name: Kuaishou
url: https://www.kuaishou.com/
contributors: ["@zhaoyu89730105"]
- name: Netflix
url: https://www.netflix.com/
- name: Prensa Iberica
url: https://www.prensaiberica.es/
contributors: ["@zamar-roura"]
- name: TME QQMUSIC/WESING
url: https://www.tencentmusic.com/
contributors: ["@shenyuanli", "@marklaw"]
- name: Xite
url: https://xite.com/
contributors: ["@shashankkoppar"]
- name: Zaihang
url: https://www.zaih.com/
Education:
- name: Aveti Learning
url: https://avetilearning.com/
contributors: ["@TheShubhendra"]
- name: Brilliant.org
url: https://brilliant.org/
- name: Cirrus Assessment
url: https://cirrusassessment.com/
logo: cirrus.svg
contributors: ["@jeroenhabets", "@ddmm-white", "@paulrocost"]
- name: Open edX
url: https://openedx.org/
- name: Platzi.com
url: https://platzi.com/
- name: Sunbird
url: https://www.sunbird.org/
contributors: ["@eksteporg"]
- name: Udemy
url: https://www.udemy.com/
contributors: ["@sungjuly"]
- name: VIPKID
url: https://www.vipkid.com.cn/
contributors: ["@illpanda"]
Social Organization:
- name: Living Goods
url: https://www.livinggoods.org
contributors: ["@chelule"]
- name: One Acre Fund
url: https://oneacrefund.org/
contributors: ["@stevensuting"]
- name: Quest Alliance
url: https://www.questalliance.net/
contributors: ["@stevensuting"]
- name: The GRAPH Network
url: https://thegraphnetwork.org/
contributors: ["@fccoelho"]
- name: Wikimedia Foundation
url: https://wikimediafoundation.org
contributors: ["@vg"]
Energy:
- name: Airboxlab
url: https://foobot.io
contributors: ["@antoine-galataud"]
- name: DouroECI
url: https://www.douroeci.com/
contributors: ["@nunohelibeires"]
- name: Rogow
url: https://rogow.com.br/
contributors: ["@nilmonto"]
- name: Safaricom
url: https://www.safaricom.co.ke/
contributors: ["@mmutiso"]
- name: Scoot
url: https://scoot.co/
contributors: ["@haaspt"]
- name: Wattbewerb
url: https://wattbewerb.de/
contributors: ["@wattbewerb"]
Healthcare:
- name: 2070Health
url: https://2070health.com/
- name: Amino
url: https://amino.com
contributors: ["@shkr"]
- name: Bluesquare
url: https://www.bluesquarehub.com/
contributors: ["@madewulf"]
- name: Care
url: https://www.getcare.io/
contributors: ["@alandao2021"]
- name: Maieutical Labs
url: https://maieuticallabs.it
contributors: ["@xrmx"]
- name: Medic
url: https://medic.org
contributors: ["@1yuv"]
- name: REDCap Cloud
url: https://www.redcapcloud.com/
- name: TrustMedis
url: https://trustmedis.com/
contributors: ["@famasya"]
- name: WeSure
url: https://www.wesure.cn/
HR / Staffing:
- name: bluquist
url: https://bluquist.com/
- name: Swile
url: https://www.swile.co/
contributors: ["@PaoloTerzi"]
- name: Symmetrics
url: https://www.symmetrics.fyi
Government / Public authority:
- name: Centre Régional Auvergnat de l'Information Géographique (France)
url: https://www.craig.fr/
logo: craig.png
- name: City of Ann Arbor, MI
url: https://www.a2gov.org/
contributors: ["@sfirke"]
- name: Métropole Européenne de Lille (France)
url: https://data.lillemetropole.fr/accueil/
logo: mel.jpg
- name: NRLM - Sarathi, India
url: https://pib.gov.in/PressReleasePage.aspx?PRID=1999586
- name: Région Bretagne (France)
url: https://geobretagne.fr/
logo: geobretagne.svg
- name: Région Hauts-de-France (France)
url: https://www.geo2france.fr/
logo: geo2france.png
- name: Rennes Métropole (France)
url: https://metropole.rennes.fr/
logo: rennes-ville-metropole_noir.svg
- name: RIS3 Strategy of CZ, MIT CR
url: https://www.ris3.cz/
contributors: ["@RIS3CZ"]
Mobile Software:
- name: VLMedia
url: https://www.vlmedia.com.tr
logo: vlmedia.svg
contributors: ["@iercan"]
Travel:
- name: Agoda
url: https://www.agoda.com/
contributors: ["@lostseaway", "@maiake", "@obombayo"]
- name: HomeToGo
url: https://hometogo.com/
contributors: ["@pedromartinsteenstrup"]
- name: Skyscanner
url: https://www.skyscanner.net/
contributors: ["@cleslie", "@stanhoucke"]
Logistics:
- name: Stockarea
url: https://stockarea.io
- name: VTG
url: https://www.vtg.de
Sports:
- name: Club 25 de Agosto (Femenino / Women's Team)
url: https://www.instagram.com/25deagosto.basketfemenino/
contributors: [ "@lion90" ]
logo: club25deagosto.svg
- name: Fanatics
url: https://www.fanatics.com/
contributors: [ "@coderfender" ]
- name: komoot
url: https://www.komoot.com/
contributors: [ "@christophlingg" ]
Others:
- name: 10Web
url: https://10web.io/
- name: AI inside
url: https://inside.ai/en/
- name: Automattic
url: https://automattic.com/
contributors: ["@Khrol", "@Usiel"]
- name: CamptoCamp
url: https://camptocamp.com/
logo: camptocamp.svg
- name: Dropbox
url: https://www.dropbox.com/
contributors: ["@bkyryliuk"]
- name: Flowbird
url: https://flowbird.com
contributors: ["@EmmanuelCbd"]
- name: geOrchestra
url: https://www.georchestra.org
logo: georchestra.svg
- name: GEOTAB
url: https://www.geotab.com
contributors: ["@JZ6"]
- name: Grassroot
url: https://www.grassrootinstitute.org/
- name: HOLLYLAND猛玛
url: https://www.hollyland.com
logo: hollyland猛玛.svg
contributors: ["@hlyda0601"]
- name: Increff
url: https://www.increff.com/
contributors: ["@ishansinghania"]
- name: jDev
url: https://jdev.fr/
logo: jDev.svg
- name: Let's Roam
url: https://www.letsroam.com/
- name: Machrent SA
url: https://www.machrent.com/
- name: Onebeat
url: https://1beat.com/
contributors: ["@GuyAttia"]
- name: pi-Geosolutions
url: https://www.pi-geosolutions.fr/
logo: pi-Geosolutions.png
contributors: ["@jeanpommier"]
- name: X
url: https://x.com/
- name: Yahoo!
url: https://yahoo.com/

Some files were not shown because too many files have changed in this diff Show More