Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
de615eb79e | ||
|
|
9fb638da6f | ||
|
|
60ceb9213f | ||
|
|
7458292ca9 | ||
|
|
adb3ebbba3 | ||
|
|
c5f07bc6c1 | ||
|
|
81d2d32dbf | ||
|
|
cce369ee00 | ||
|
|
d95721cb14 | ||
|
|
0a91bc8c3f | ||
|
|
13f01ac2ab | ||
|
|
705bad9792 | ||
|
|
86d079b31c | ||
|
|
b4d4d1cc88 | ||
|
|
7c5546586c | ||
|
|
5895af50f5 | ||
|
|
baeac9dc97 | ||
|
|
9e21009db3 | ||
|
|
79e4253230 | ||
|
|
520284a4a4 | ||
|
|
bb78d492e9 | ||
|
|
1e9f1de563 | ||
|
|
d00a2c2899 | ||
|
|
0b07566346 | ||
|
|
c0572c5302 | ||
|
|
4b4f6b9c1d | ||
|
|
ffa4226f10 | ||
|
|
64d54d6fdd | ||
|
|
fa7a5249ea | ||
|
|
f8f3b7abbb | ||
|
|
83661aee99 | ||
|
|
9976250954 | ||
|
|
08e64048fa | ||
|
|
18f551580e | ||
|
|
d85875d962 | ||
|
|
31f994b090 | ||
|
|
a16605cf01 | ||
|
|
e70bcc7283 | ||
|
|
980c38d1b7 | ||
|
|
87fad13f89 | ||
|
|
a1a71ee6e1 | ||
|
|
feab690b8d | ||
|
|
b7d9be449d | ||
|
|
69c5cd7922 | ||
|
|
430ebe18aa | ||
|
|
04622529df | ||
|
|
ec22acb786 | ||
|
|
7c059cda39 | ||
|
|
7b15b7690d | ||
|
|
4cb79e5017 | ||
|
|
41e8190575 | ||
|
|
5917407b9c | ||
|
|
c0615c55df | ||
|
|
76a13dfc9a | ||
|
|
39913d286a | ||
|
|
c8a8347b43 | ||
|
|
3f57ea76db | ||
|
|
a889cb3505 | ||
|
|
e0576786c3 | ||
|
|
39db6a73ee | ||
|
|
a7f247b472 | ||
|
|
5031a67597 | ||
|
|
31d79ff67c | ||
|
|
6095978040 | ||
|
|
22dc3d1eaa | ||
|
|
3061b6ad09 | ||
|
|
c77bf264d1 | ||
|
|
475f9cdc35 | ||
|
|
a786373fff | ||
|
|
46188c1011 | ||
|
|
ce6bc3b598 | ||
|
|
c01d42fd98 | ||
|
|
b73d7baedf | ||
|
|
324ecb31fc | ||
|
|
5fd798afb7 | ||
|
|
c37c56c2e4 | ||
|
|
908db3ab31 | ||
|
|
7e691f9849 | ||
|
|
a3a762e5a7 | ||
|
|
f1b57c0d88 | ||
|
|
2d61f15153 | ||
|
|
cc704dd53a | ||
|
|
eb78f4332f | ||
|
|
e8f18f4dbf | ||
|
|
c2e4290392 | ||
|
|
3b9b2c97aa | ||
|
|
02f9749d18 | ||
|
|
f4739f427e | ||
|
|
6afa840659 | ||
|
|
56dd2a3269 | ||
|
|
ac9c1372b4 | ||
|
|
7b0acc45de | ||
|
|
7b503fa710 | ||
|
|
bfe7eb9a7b | ||
|
|
3f6c81b621 | ||
|
|
671b8f2544 | ||
|
|
3adf8e85cd | ||
|
|
32d2aa0c40 | ||
|
|
bdfc2dc9d5 | ||
|
|
11b0249803 | ||
|
|
eda38a758e | ||
|
|
ea49aa3d2d | ||
|
|
a3f54a6c7b | ||
|
|
2ce676d20d | ||
|
|
8c7e09e500 | ||
|
|
e5540b79ec | ||
|
|
663dd3f853 | ||
|
|
3f5237a3c1 | ||
|
|
019e74652d | ||
|
|
94e759dbfa | ||
|
|
315c52a328 | ||
|
|
eeba326f8b | ||
|
|
2d0056507b | ||
|
|
e6a37022ac | ||
|
|
1297fd9169 | ||
|
|
62550db385 | ||
|
|
5be0a89625 | ||
|
|
7aeb15031d | ||
|
|
f6115a73d4 | ||
|
|
16a26bac35 | ||
|
|
fb5dce07b7 | ||
|
|
2f95f81be7 | ||
|
|
873daf3867 | ||
|
|
b81f120916 | ||
|
|
6d3e19d857 | ||
|
|
9c81599d21 | ||
|
|
7330aefeac | ||
|
|
65728ea049 | ||
|
|
4ba17092fa | ||
|
|
73b436ab9f | ||
|
|
f9b72505fb | ||
|
|
d408ff8466 | ||
|
|
9c854ff1f1 | ||
|
|
c1eb9cec49 | ||
|
|
ebec353351 | ||
|
|
d4bec135e8 | ||
|
|
e660de6936 | ||
|
|
04c0680f6e | ||
|
|
5e1c469f42 | ||
|
|
040b94119b | ||
|
|
b9d3338153 | ||
|
|
fdb40350bb | ||
|
|
f6fe29db87 | ||
|
|
211319673f | ||
|
|
f104fba61d | ||
|
|
3441182630 | ||
|
|
e66db63333 | ||
|
|
fefcea7979 | ||
|
|
9a79a5775b | ||
|
|
ab4e3b9bf9 | ||
|
|
d26254099e | ||
|
|
32a5680510 | ||
|
|
5bce2538a2 | ||
|
|
e969edc451 | ||
|
|
6cb91ee142 | ||
|
|
5cc95bb378 | ||
|
|
c9dad05f2b | ||
|
|
cbd37801a0 | ||
|
|
ad773ffe79 | ||
|
|
2aa889944d | ||
|
|
dd800162c5 | ||
|
|
3b7441663c | ||
|
|
9ff2531cd0 | ||
|
|
1e1706d741 | ||
|
|
80dd525026 | ||
|
|
9a14aed152 | ||
|
|
3a249a0090 | ||
|
|
a7cbcde9bf | ||
|
|
239336c3e8 | ||
|
|
618a354ca1 | ||
|
|
7d0f6ab7f5 | ||
|
|
281cb92bfa | ||
|
|
45c3ae0bf9 | ||
|
|
5cc4f3c4b9 | ||
|
|
4e79ffd471 | ||
|
|
ca873acd55 | ||
|
|
069d5cb6a4 | ||
|
|
4234031cba | ||
|
|
e9383e6d00 | ||
|
|
71924eb40b | ||
|
|
fe68e45f52 | ||
|
|
66c28d653f | ||
|
|
0721f54580 | ||
|
|
42d84deca1 | ||
|
|
0ed97eb696 | ||
|
|
674f234de6 | ||
|
|
6b790990a8 | ||
|
|
0c74a8060f | ||
|
|
234e3081a5 | ||
|
|
625468c56a | ||
|
|
7dd3af6dda | ||
|
|
e305f2a5f3 | ||
|
|
d908dd6689 | ||
|
|
b489cffb57 | ||
|
|
22494b642e | ||
|
|
985af72ac3 | ||
|
|
5d86b8dde6 | ||
|
|
070f0b6cb2 | ||
|
|
ac01d91c28 | ||
|
|
154f460446 | ||
|
|
de17acd618 | ||
|
|
a1793f304e | ||
|
|
b3e699b767 | ||
|
|
42a1061bfa | ||
|
|
9f969d00bd | ||
|
|
351d3c594b | ||
|
|
1483e04381 | ||
|
|
ad87ba3724 | ||
|
|
e6bbca3f61 | ||
|
|
02032ee8a4 | ||
|
|
a914e3c1cb | ||
|
|
8efd94a14f | ||
|
|
f0c0d7492c | ||
|
|
52ad779a27 | ||
|
|
2dc8bd6c30 | ||
|
|
517f8c0a7a | ||
|
|
f39582c900 | ||
|
|
2252f3396c | ||
|
|
34542db3b6 | ||
|
|
257385e888 | ||
|
|
d8a15e60b9 | ||
|
|
79d3d06c8a | ||
|
|
5d86ffe768 | ||
|
|
d70ac21054 | ||
|
|
62a8f2e193 | ||
|
|
9ed8ce53ed | ||
|
|
78dd17cb29 | ||
|
|
0778f4ab28 | ||
|
|
7ec6bdff7c | ||
|
|
2ebba519c9 | ||
|
|
4d1672f496 | ||
|
|
faf6fcd83e | ||
|
|
600473ff72 | ||
|
|
f67e40236d | ||
|
|
b5fc03f964 | ||
|
|
cc765b51c7 | ||
|
|
abc18b13d0 | ||
|
|
ee8b1ed15a | ||
|
|
367d47bec5 | ||
|
|
7e9674a8fa | ||
|
|
1d572ca92b | ||
|
|
2be52c0659 | ||
|
|
026eefdb36 | ||
|
|
4ab565ca36 | ||
|
|
4685d86d63 | ||
|
|
ad85e7be52 | ||
|
|
e539d08074 | ||
|
|
77800f972e | ||
|
|
301b94f49a | ||
|
|
4f5f9287fc | ||
|
|
86a59a2927 | ||
|
|
abd999bd6b | ||
|
|
ae160f7f21 | ||
|
|
58cda8f8d6 | ||
|
|
c732d2dada | ||
|
|
cd4f97926c | ||
|
|
29dd0844bf | ||
|
|
83be06d2cc | ||
|
|
314d49c13b | ||
|
|
0af5a3d600 | ||
|
|
08bda27a43 | ||
|
|
bee386e643 | ||
|
|
15796ea4ac | ||
|
|
624b41347b | ||
|
|
07852c3528 | ||
|
|
83d50dd9fd | ||
|
|
fb322b5bab | ||
|
|
b20293d1b1 | ||
|
|
2cb13e695e | ||
|
|
dd16468d44 | ||
|
|
f62cea3586 | ||
|
|
8f92618e46 | ||
|
|
80b8df0673 | ||
|
+4 |
68704a595b | ||
|
|
e5ab9a4091 | ||
|
|
ea2a98fcc2 | ||
|
|
ee2ee48661 | ||
|
|
99fe9c5657 | ||
|
|
81633e99ae | ||
|
|
cbc4aa8dc1 | ||
|
|
d4480f5c9a | ||
|
|
7f2f51b2bd | ||
|
|
246368e9dc | ||
|
|
7889564250 | ||
|
|
b5119b8dff | ||
|
|
55d0371b92 | ||
|
|
665459fbca | ||
|
|
0ff3253afd | ||
|
|
baf42bc2c5 | ||
|
|
a3a34773ae | ||
|
|
285c1b5d22 | ||
|
|
f286647140 | ||
|
|
e5d4765986 | ||
|
|
e606477ec1 | ||
|
|
ffa51753e3 | ||
|
|
cad5ba828c | ||
|
|
6c16f9bb2f | ||
|
|
7ad8fd5c98 | ||
|
|
5f96e63bbb | ||
|
|
61e6b7017b | ||
|
|
292bce5862 | ||
|
|
ebb3efce5a | ||
|
|
a2d69ea252 | ||
|
|
5181a74116 | ||
|
|
8b3d08aeed | ||
|
|
149c5fd594 | ||
|
|
743d9cc928 | ||
|
|
4a394cd6fb | ||
|
|
4630abb5a8 | ||
|
|
ab7f31fd85 | ||
|
|
dd407331a6 | ||
|
|
727847d2e5 | ||
|
|
f109da479d | ||
|
|
f33a0e1d68 | ||
|
|
2af928796a | ||
|
|
fa6b25d257 | ||
|
|
b8f4e7d093 | ||
|
|
fe7755897c | ||
|
|
1797805740 | ||
|
|
faae27bd2f | ||
|
|
076f774daf | ||
|
|
a0179ac513 | ||
|
|
ed6d10e283 | ||
|
|
21d1fb55c6 | ||
|
|
e713912fdf | ||
|
|
f52b6715cf | ||
|
|
0b7e524f02 | ||
|
|
18f3089fb5 | ||
|
|
ac18c90da2 | ||
|
|
1c4cb28e91 | ||
|
|
93447d1903 | ||
|
|
486b8d911f | ||
|
|
d8a1acffde | ||
|
|
ddcf461749 | ||
|
|
8205ea53ab | ||
|
|
f53b2c6587 | ||
|
|
2ebc0a078a | ||
|
|
e62cb2f991 | ||
|
|
a4ce9521e2 | ||
|
|
b9b903f8e6 |
@@ -33,6 +33,7 @@ If applicable, add screenshots to help explain your problem.
|
||||
- superset version: `superset version`
|
||||
- python version: `python --version`
|
||||
- node.js version: `node -v`
|
||||
- any feature flags active:
|
||||
|
||||
### Checklist
|
||||
|
||||
|
||||
@@ -6,9 +6,9 @@ labels: "#SIP"
|
||||
---
|
||||
|
||||
*Please make sure you are familiar with the SIP process documented*
|
||||
(here)[https://github.com/apache/superset/issues/5602]
|
||||
(here)[https://github.com/apache/superset/issues/5602]. The SIP number should be the next number after the latest SIP listed [here](https://github.com/apache/superset/issues?q=is%3Aissue+label%3Asip).
|
||||
|
||||
## [SIP] Proposal for XXX
|
||||
## [SIP-\<number>] Proposal for <title>
|
||||
|
||||
### Motivation
|
||||
|
||||
|
||||
@@ -192,7 +192,7 @@ cypress-run-all() {
|
||||
say "::endgroup::"
|
||||
|
||||
# Rerun SQL Lab tests with backend persist enabled
|
||||
export SUPERSET_CONFIG=tests.superset_test_config_sqllab_backend_persist
|
||||
export SUPERSET_CONFIG=tests.integration_tests.superset_test_config_sqllab_backend_persist
|
||||
|
||||
# Restart Flask with new configs
|
||||
kill $flaskProcessId
|
||||
|
||||
@@ -25,7 +25,7 @@ jobs:
|
||||
env:
|
||||
FLASK_ENV: development
|
||||
ENABLE_REACT_CRUD_VIEWS: true
|
||||
SUPERSET_CONFIG: tests.superset_test_config
|
||||
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
|
||||
|
||||
@@ -0,0 +1,193 @@
|
||||
# Python integration tests
|
||||
name: Python-Integration
|
||||
|
||||
on:
|
||||
push:
|
||||
branches-ignore:
|
||||
- "dependabot/npm_and_yarn/**"
|
||||
pull_request:
|
||||
types: [synchronize, opened, reopened, ready_for_review]
|
||||
|
||||
jobs:
|
||||
test-mysql:
|
||||
if: github.event.pull_request.draft == false
|
||||
runs-on: ubuntu-20.04
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: [3.7]
|
||||
env:
|
||||
PYTHONPATH: ${{ github.workspace }}
|
||||
SUPERSET_CONFIG: tests.integration_tests.superset_test_config
|
||||
REDIS_PORT: 16379
|
||||
SUPERSET__SQLALCHEMY_DATABASE_URI: |
|
||||
mysql+mysqldb://superset:superset@127.0.0.1:13306/superset?charset=utf8mb4&binary_prefix=true
|
||||
services:
|
||||
mysql:
|
||||
image: mysql:5.7
|
||||
env:
|
||||
MYSQL_ROOT_PASSWORD: root
|
||||
ports:
|
||||
- 13306:3306
|
||||
redis:
|
||||
image: redis:5-alpine
|
||||
options: --entrypoint redis-server
|
||||
ports:
|
||||
- 16379:6379
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
- name: Check if python changes are present
|
||||
id: check
|
||||
env:
|
||||
GITHUB_REPO: ${{ github.repository }}
|
||||
PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||
continue-on-error: true
|
||||
run: ./scripts/ci_check_no_file_changes.sh python
|
||||
- name: Setup Python
|
||||
if: steps.check.outcome == 'failure'
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
- name: Install dependencies
|
||||
if: steps.check.outcome == 'failure'
|
||||
uses: ./.github/actions/cached-dependencies
|
||||
with:
|
||||
run: |
|
||||
apt-get-install
|
||||
pip-upgrade
|
||||
pip install -r requirements/testing.txt
|
||||
setup-mysql
|
||||
- name: Run celery
|
||||
if: steps.check.outcome == 'failure'
|
||||
run: celery --app=superset.tasks.celery_app:app worker -Ofair -c 2 &
|
||||
- name: Python integration tests (MySQL)
|
||||
if: steps.check.outcome == 'failure'
|
||||
run: |
|
||||
./scripts/python_tests.sh
|
||||
- name: Upload code coverage
|
||||
if: steps.check.outcome == 'failure'
|
||||
run: |
|
||||
bash .github/workflows/codecov.sh -c -F python -F mysql
|
||||
|
||||
test-postgres:
|
||||
if: github.event.pull_request.draft == false
|
||||
runs-on: ubuntu-20.04
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: [3.7, 3.8]
|
||||
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:10-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:5-alpine
|
||||
ports:
|
||||
- 16379:6379
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
- name: Check if python changes are present
|
||||
id: check
|
||||
env:
|
||||
GITHUB_REPO: ${{ github.repository }}
|
||||
PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||
continue-on-error: true
|
||||
run: ./scripts/ci_check_no_file_changes.sh python
|
||||
- name: Setup Python
|
||||
if: steps.check.outcome == 'failure'
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
- name: Install dependencies
|
||||
if: steps.check.outcome == 'failure'
|
||||
uses: ./.github/actions/cached-dependencies
|
||||
with:
|
||||
run: |
|
||||
apt-get-install
|
||||
pip-upgrade
|
||||
pip install -r requirements/testing.txt
|
||||
setup-postgres
|
||||
- name: Run celery
|
||||
if: steps.check.outcome == 'failure'
|
||||
run: celery --app=superset.tasks.celery_app:app worker -Ofair -c 2 &
|
||||
- name: Python integration tests (PostgreSQL)
|
||||
if: steps.check.outcome == 'failure'
|
||||
run: |
|
||||
./scripts/python_tests.sh
|
||||
- name: Upload code coverage
|
||||
if: steps.check.outcome == 'failure'
|
||||
run: |
|
||||
bash .github/workflows/codecov.sh -c -F python -F postgres
|
||||
|
||||
test-sqlite:
|
||||
if: github.event.pull_request.draft == false
|
||||
runs-on: ubuntu-20.04
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: [3.7]
|
||||
env:
|
||||
PYTHONPATH: ${{ github.workspace }}
|
||||
SUPERSET_CONFIG: tests.integration_tests.superset_test_config
|
||||
REDIS_PORT: 16379
|
||||
SUPERSET__SQLALCHEMY_DATABASE_URI: |
|
||||
sqlite:///${{ github.workspace }}/.temp/unittest.db
|
||||
services:
|
||||
redis:
|
||||
image: redis:5-alpine
|
||||
ports:
|
||||
- 16379:6379
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
- name: Check if python changes are present
|
||||
id: check
|
||||
env:
|
||||
GITHUB_REPO: ${{ github.repository }}
|
||||
PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||
continue-on-error: true
|
||||
run: ./scripts/ci_check_no_file_changes.sh python
|
||||
- name: Setup Python
|
||||
if: steps.check.outcome == 'failure'
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
- name: Install dependencies
|
||||
if: steps.check.outcome == 'failure'
|
||||
uses: ./.github/actions/cached-dependencies
|
||||
with:
|
||||
run: |
|
||||
apt-get-install
|
||||
pip-upgrade
|
||||
pip install -r requirements/testing.txt
|
||||
mkdir ${{ github.workspace }}/.temp
|
||||
- name: Run celery
|
||||
if: steps.check.outcome == 'failure'
|
||||
run: celery --app=superset.tasks.celery_app:app worker -Ofair -c 2 &
|
||||
- name: Python integration tests (SQLite)
|
||||
if: steps.check.outcome == 'failure'
|
||||
run: |
|
||||
./scripts/python_tests.sh
|
||||
- name: Upload code coverage
|
||||
if: steps.check.outcome == 'failure'
|
||||
run: |
|
||||
bash .github/workflows/codecov.sh -c -F python -F sqlite
|
||||
@@ -17,7 +17,7 @@ jobs:
|
||||
python-version: [3.8]
|
||||
env:
|
||||
PYTHONPATH: ${{ github.workspace }}
|
||||
SUPERSET_CONFIG: tests.superset_test_config
|
||||
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
|
||||
SUPERSET__SQLALCHEMY_EXAMPLES_URI: presto://localhost:15433/memory/default
|
||||
@@ -91,7 +91,7 @@ jobs:
|
||||
python-version: [3.8]
|
||||
env:
|
||||
PYTHONPATH: ${{ github.workspace }}
|
||||
SUPERSET_CONFIG: tests.superset_test_config
|
||||
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
|
||||
SUPERSET__SQLALCHEMY_EXAMPLES_URI: hive://localhost:10000/default
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Python unit tests
|
||||
name: Python
|
||||
name: Python-Unit
|
||||
|
||||
on:
|
||||
push:
|
||||
@@ -9,150 +9,14 @@ on:
|
||||
types: [synchronize, opened, reopened, ready_for_review]
|
||||
|
||||
jobs:
|
||||
test-mysql:
|
||||
unit-tests:
|
||||
if: github.event.pull_request.draft == false
|
||||
runs-on: ubuntu-20.04
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: [3.7]
|
||||
python-version: [3.7,3.8]
|
||||
env:
|
||||
PYTHONPATH: ${{ github.workspace }}
|
||||
SUPERSET_CONFIG: tests.superset_test_config
|
||||
REDIS_PORT: 16379
|
||||
SUPERSET__SQLALCHEMY_DATABASE_URI: |
|
||||
mysql+mysqldb://superset:superset@127.0.0.1:13306/superset?charset=utf8mb4&binary_prefix=true
|
||||
services:
|
||||
mysql:
|
||||
image: mysql:5.7
|
||||
env:
|
||||
MYSQL_ROOT_PASSWORD: root
|
||||
ports:
|
||||
- 13306:3306
|
||||
redis:
|
||||
image: redis:5-alpine
|
||||
options: --entrypoint redis-server
|
||||
ports:
|
||||
- 16379:6379
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
- name: Check if python changes are present
|
||||
id: check
|
||||
env:
|
||||
GITHUB_REPO: ${{ github.repository }}
|
||||
PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||
continue-on-error: true
|
||||
run: ./scripts/ci_check_no_file_changes.sh python
|
||||
- name: Setup Python
|
||||
if: steps.check.outcome == 'failure'
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
- name: Install dependencies
|
||||
if: steps.check.outcome == 'failure'
|
||||
uses: ./.github/actions/cached-dependencies
|
||||
with:
|
||||
run: |
|
||||
apt-get-install
|
||||
pip-upgrade
|
||||
pip install -r requirements/testing.txt
|
||||
setup-mysql
|
||||
- name: Run celery
|
||||
if: steps.check.outcome == 'failure'
|
||||
run: celery --app=superset.tasks.celery_app:app worker -Ofair -c 2 &
|
||||
- name: Python unit tests (MySQL)
|
||||
if: steps.check.outcome == 'failure'
|
||||
run: |
|
||||
./scripts/python_tests.sh
|
||||
- name: Upload code coverage
|
||||
if: steps.check.outcome == 'failure'
|
||||
run: |
|
||||
bash .github/workflows/codecov.sh -c -F python -F mysql
|
||||
|
||||
test-postgres:
|
||||
if: github.event.pull_request.draft == false
|
||||
runs-on: ubuntu-20.04
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: [3.7, 3.8]
|
||||
env:
|
||||
PYTHONPATH: ${{ github.workspace }}
|
||||
SUPERSET_CONFIG: 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:10-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:5-alpine
|
||||
ports:
|
||||
- 16379:6379
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
persist-credentials: false
|
||||
submodules: recursive
|
||||
- name: Check if python changes are present
|
||||
id: check
|
||||
env:
|
||||
GITHUB_REPO: ${{ github.repository }}
|
||||
PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||
continue-on-error: true
|
||||
run: ./scripts/ci_check_no_file_changes.sh python
|
||||
- name: Setup Python
|
||||
if: steps.check.outcome == 'failure'
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
- name: Install dependencies
|
||||
if: steps.check.outcome == 'failure'
|
||||
uses: ./.github/actions/cached-dependencies
|
||||
with:
|
||||
run: |
|
||||
apt-get-install
|
||||
pip-upgrade
|
||||
pip install -r requirements/testing.txt
|
||||
setup-postgres
|
||||
- name: Run celery
|
||||
if: steps.check.outcome == 'failure'
|
||||
run: celery --app=superset.tasks.celery_app:app worker -Ofair -c 2 &
|
||||
- name: Python unit tests (PostgreSQL)
|
||||
if: steps.check.outcome == 'failure'
|
||||
run: |
|
||||
./scripts/python_tests.sh
|
||||
- name: Upload code coverage
|
||||
if: steps.check.outcome == 'failure'
|
||||
run: |
|
||||
bash .github/workflows/codecov.sh -c -F python -F postgres
|
||||
|
||||
test-sqlite:
|
||||
if: github.event.pull_request.draft == false
|
||||
runs-on: ubuntu-20.04
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: [3.7]
|
||||
env:
|
||||
PYTHONPATH: ${{ github.workspace }}
|
||||
SUPERSET_CONFIG: tests.superset_test_config
|
||||
REDIS_PORT: 16379
|
||||
SUPERSET__SQLALCHEMY_DATABASE_URI: |
|
||||
sqlite:///${{ github.workspace }}/.temp/unittest.db
|
||||
services:
|
||||
redis:
|
||||
image: redis:5-alpine
|
||||
ports:
|
||||
- 16379:6379
|
||||
steps:
|
||||
- name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
|
||||
uses: actions/checkout@v2
|
||||
@@ -171,6 +35,7 @@ jobs:
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
# TODO: separated requiermentes.txt file just for unit tests
|
||||
- name: Install dependencies
|
||||
if: steps.check.outcome == 'failure'
|
||||
uses: ./.github/actions/cached-dependencies
|
||||
@@ -180,14 +45,11 @@ jobs:
|
||||
pip-upgrade
|
||||
pip install -r requirements/testing.txt
|
||||
mkdir ${{ github.workspace }}/.temp
|
||||
- name: Run celery
|
||||
if: steps.check.outcome == 'failure'
|
||||
run: celery --app=superset.tasks.celery_app:app worker -Ofair -c 2 &
|
||||
- name: Python unit tests (SQLite)
|
||||
- name: Python unit tests
|
||||
if: steps.check.outcome == 'failure'
|
||||
run: |
|
||||
./scripts/python_tests.sh
|
||||
pytest ./tests/unit_tests --cache-clear
|
||||
- name: Upload code coverage
|
||||
if: steps.check.outcome == 'failure'
|
||||
run: |
|
||||
bash .github/workflows/codecov.sh -c -F python -F sqlite
|
||||
bash .github/workflows/codecov.sh -c -F python -F unit
|
||||
|
||||
@@ -81,7 +81,15 @@ confidence=
|
||||
# --enable=similarities". If you want to run only the classes checker, but have
|
||||
# no Warning level messages displayed, use"--disable=all --enable=classes
|
||||
# --disable=W"
|
||||
disable=long-builtin,dict-view-method,intern-builtin,suppressed-message,no-absolute-import,unpacking-in-except,apply-builtin,delslice-method,indexing-exception,old-raise-syntax,print-statement,cmp-builtin,reduce-builtin,useless-suppression,coerce-method,input-builtin,cmp-method,raw_input-builtin,nonzero-method,backtick,basestring-builtin,setslice-method,reload-builtin,oct-method,map-builtin-not-iterating,execfile-builtin,old-octal-literal,zip-builtin-not-iterating,buffer-builtin,getslice-method,metaclass-assignment,xrange-builtin,long-suffix,round-builtin,range-builtin-not-iterating,next-method-called,parameter-unpacking,unicode-builtin,unichr-builtin,import-star-module-level,raising-string,filter-builtin-not-iterating,using-cmp-argument,coerce-builtin,file-builtin,old-division,hex-method,missing-docstring,too-many-lines,ungrouped-imports,import-outside-toplevel,raise-missing-from,super-with-arguments,bad-option-value,too-few-public-methods,too-many-locals
|
||||
disable=
|
||||
missing-docstring,
|
||||
too-many-lines,
|
||||
ungrouped-imports,
|
||||
import-outside-toplevel,
|
||||
raise-missing-from,
|
||||
super-with-arguments,
|
||||
too-few-public-methods,
|
||||
too-many-locals,
|
||||
|
||||
|
||||
[REPORTS]
|
||||
@@ -209,7 +217,7 @@ max-nested-blocks=5
|
||||
[FORMAT]
|
||||
|
||||
# Maximum number of characters on a single line.
|
||||
max-line-length=88
|
||||
max-line-length=90
|
||||
|
||||
# Regexp for a line that is allowed to be longer than the limit.
|
||||
ignore-long-lines=^\s*(# )?<?https?://\S+>?$
|
||||
@@ -308,7 +316,7 @@ generated-members=
|
||||
# List of decorators that produce context managers, such as
|
||||
# contextlib.contextmanager. Add to this list to register other decorators that
|
||||
# produce valid context managers.
|
||||
contextmanager-decorators=contextlib.contextmanager,contextlib2.contextmanager
|
||||
contextmanager-decorators=contextlib.contextmanager
|
||||
|
||||
|
||||
[VARIABLES]
|
||||
@@ -365,7 +373,7 @@ max-locals=15
|
||||
max-returns=10
|
||||
|
||||
# Maximum number of branch for function / method body
|
||||
max-branches=12
|
||||
max-branches=15
|
||||
|
||||
# Maximum number of statements in function / method body
|
||||
max-statements=50
|
||||
@@ -374,7 +382,7 @@ max-statements=50
|
||||
max-parents=7
|
||||
|
||||
# Maximum number of attributes for a class (see R0902).
|
||||
max-attributes=7
|
||||
max-attributes=8
|
||||
|
||||
# Minimum number of public methods for a class (see R0903).
|
||||
min-public-methods=2
|
||||
|
||||
@@ -17,6 +17,511 @@ specific language governing permissions and limitations
|
||||
under the License.
|
||||
-->
|
||||
## Change Log
|
||||
### 1.2 (Date TBD)
|
||||
**Features**
|
||||
- [11498](https://github.com/apache/superset/pull/11498) feat(SIP-39): Websocket sidecar app (#11498) (@Rob DiCiuccio)
|
||||
- [13894](https://github.com/apache/superset/pull/13894) feat(alert/report): add ALERTS_ATTACH_REPORTS feature flags + feature (#13894) (@Lily Kuang)
|
||||
- [13828](https://github.com/apache/superset/pull/13828) feat(alert/report): chart as csv format attachment for email and slack (#13828) (@Lily Kuang)
|
||||
- [14235](https://github.com/apache/superset/pull/14235) feat(alert/report): update content format radio buttons (#14235) (@Lily Kuang)
|
||||
- [13752](https://github.com/apache/superset/pull/13752) feat(alerts & reports): Easier to read execution logs (#13752) (@Jack Fragassi)
|
||||
- [14076](https://github.com/apache/superset/pull/14076) feat(can_share): can share chart and dashboard (#14076) (@Amit Miran)
|
||||
- [13687](https://github.com/apache/superset/pull/13687) feat(cross-filter): Cross filter badge (#13687) (@simcha90)
|
||||
- [13625](https://github.com/apache/superset/pull/13625) feat(cross-filters): Add scoping for cross filters (#13625) (@simcha90)
|
||||
- [13523](https://github.com/apache/superset/pull/13523) feat(dashboard): dashboard/id/datasets endpoint (#13523) (@David Aaron Suddjian)
|
||||
- [13145](https://github.com/apache/superset/pull/13145) feat(dashboard_rbac): manage roles for dashboard (#13145) (@simcha90)
|
||||
- [13992](https://github.com/apache/superset/pull/13992) feat(dashboard_rbac): provide data access based on dashboard access (#13992) (@Amit Miran)
|
||||
- [14519](https://github.com/apache/superset/pull/14519) feat(dremio): implement convert_dttm method (#14519) (@Ville Brofeldt)
|
||||
- [13210](https://github.com/apache/superset/pull/13210) feat(explore): ColumnSelectControl with drag-and-drop (#13210) (@Yongjie Zhao)
|
||||
- [13598](https://github.com/apache/superset/pull/13598) feat(explore): Drag and drop UX improvements (#13598) (@Kamil Gabryjelski)
|
||||
- [13294](https://github.com/apache/superset/pull/13294) feat(explore): Postgres datatype conversion (#13294) (@Nikola Gigić)
|
||||
- [13758](https://github.com/apache/superset/pull/13758) feat(explore): adhoc column formatting for Table chart (#13758) (@Jesse Yang)
|
||||
- [14340](https://github.com/apache/superset/pull/14340) feat(filter-box): sort by metric on backend (#14340) (@Ville Brofeldt)
|
||||
- [13576](https://github.com/apache/superset/pull/13576) feat(filter-set): Filter set edge cases (#13576) (@simcha90)
|
||||
- [13529](https://github.com/apache/superset/pull/13529) feat(filter-set): Filter set history (#13529) (@simcha90)
|
||||
- [13545](https://github.com/apache/superset/pull/13545) feat(filter-set): Update existing filter set (#13545) (@simcha90)
|
||||
- [13515](https://github.com/apache/superset/pull/13515) feat(filter-set): adding new filters (#13515) (@simcha90)
|
||||
- [13678](https://github.com/apache/superset/pull/13678) feat(helm): Add optional apt-get install to superset_bootstrap.sh (#13678) (@Daniel Wood)
|
||||
- [14030](https://github.com/apache/superset/pull/14030) feat(helm): add pod and deployment annotations to template (#14030) (@Bruno FERNANDO)
|
||||
- [13683](https://github.com/apache/superset/pull/13683) feat(homescreen and cards): Toggle thumbnails off or on and feature flag (#13683) (@Phillip Kelley-Dotson)
|
||||
- [13726](https://github.com/apache/superset/pull/13726) feat(native-filters): Add default first value to select filter (#13726) (@simcha90)
|
||||
- [14461](https://github.com/apache/superset/pull/14461) feat(native-filters): Auto apply changes in FiltersConfigModal (#14461) (@simcha90)
|
||||
- [13507](https://github.com/apache/superset/pull/13507) feat(native-filters): Filter set tabs (#13507) (@simcha90)
|
||||
- [14313](https://github.com/apache/superset/pull/14313) feat(native-filters): Implement adhoc filters and time picker in Range and Select native filters (#14313) (@Kamil Gabryjelski)
|
||||
- [14261](https://github.com/apache/superset/pull/14261) feat(native-filters): Show/Hide filter bar by metdata ff (#14261) (@simcha90)
|
||||
- [13506](https://github.com/apache/superset/pull/13506) feat(native-filters): Update filter bar buttons (#13506) (@simcha90)
|
||||
- [14374](https://github.com/apache/superset/pull/14374) feat(native-filters): Use datasets in dashboard as default options for native filters (#14374) (@Kamil Gabryjelski)
|
||||
- [14314](https://github.com/apache/superset/pull/14314) feat(native-filters): add option to create value in select filter (#14314) (@Ville Brofeldt)
|
||||
- [14346](https://github.com/apache/superset/pull/14346) feat(native-filters): add optional sort metric to select filter (#14346) (@Ville Brofeldt)
|
||||
- [14375](https://github.com/apache/superset/pull/14375) feat(native-filters): add refresh button to default value picker (#14375) (@Ville Brofeldt)
|
||||
- [13569](https://github.com/apache/superset/pull/13569) feat(native-filters): add sort option to select filter (#13569) (@Ville Brofeldt)
|
||||
- [13622](https://github.com/apache/superset/pull/13622) feat(native-filters): add temporal support to select filter (#13622) (@Ville Brofeldt)
|
||||
- [13484](https://github.com/apache/superset/pull/13484) feat(native-filters): add timegrain and column filter (#13484) (@Ville Brofeldt)
|
||||
- [14312](https://github.com/apache/superset/pull/14312) feat(native-filters): add tooltip to control values (#14312) (@Ville Brofeldt)
|
||||
- [14217](https://github.com/apache/superset/pull/14217) feat(native-filters): select group by support (#14217) (@Amit Miran)
|
||||
- [13634](https://github.com/apache/superset/pull/13634) feat(reports): SLACK_API_TOKEN as callable or str (#13634) (@ʈᵃᵢ)
|
||||
- [13135](https://github.com/apache/superset/pull/13135) feat(reports): send notification on error with grace (#13135) (@Daniel Vaz Gaspar)
|
||||
- [13772](https://github.com/apache/superset/pull/13772) feat(rls): enable row level security by default (#13772) (@Ville Brofeldt)
|
||||
- [14197](https://github.com/apache/superset/pull/14197) feat(viz): add mixed and radar chart (#14197) (@Ville Brofeldt)
|
||||
- [13377](https://github.com/apache/superset/pull/13377) feat(viz): implement time picker on filter box (#13377) (@Yongjie Zhao)
|
||||
- [13144](https://github.com/apache/superset/pull/13144) feat: Add error pages (#13144) (@Sam Faber-Manning)
|
||||
- [14357](https://github.com/apache/superset/pull/14357) feat: Add etag caching to dashboard APIs (#14357) (@Erik Ritter)
|
||||
- [14110](https://github.com/apache/superset/pull/14110) feat: Add health endpoint to WebSocket server (#14110) (@Ben Reinhart)
|
||||
- [13190](https://github.com/apache/superset/pull/13190) feat: Added Rows Returned (#13190) (@AAfghahi)
|
||||
- [14109](https://github.com/apache/superset/pull/14109) feat: Adding encrypted field factory (#14109) (@Craig Rueda)
|
||||
- [14234](https://github.com/apache/superset/pull/14234) feat: Adding limiting_factor column to Query model (#14234) (@AAfghahi)
|
||||
- [14318](https://github.com/apache/superset/pull/14318) feat: Dynamic imports for the Icons component (#14318) (@Geido)
|
||||
- [13981](https://github.com/apache/superset/pull/13981) feat: FE: Export for Queries II (#13981) (@Lyndsi Kay Williams)
|
||||
- [14091](https://github.com/apache/superset/pull/14091) feat: FE: Import for Queries II (#14091) (@Lyndsi Kay Williams)
|
||||
- [13740](https://github.com/apache/superset/pull/13740) feat: Implement Celery SoftTimeLimit handling (#13740) (@Lily Kuang)
|
||||
- [13340](https://github.com/apache/superset/pull/13340) feat: Implement drag and drop columns for filters (#13340) (@Kamil Gabryjelski)
|
||||
- [13575](https://github.com/apache/superset/pull/13575) feat: Implement drag and drop for metrics (#13575) (@Kamil Gabryjelski)
|
||||
- [13521](https://github.com/apache/superset/pull/13521) feat: Logic added to limiting factor column in Query model (#13521) (@AAfghahi)
|
||||
- [14007](https://github.com/apache/superset/pull/14007) feat: Make async query JWT cookie domain configurable (#14007) (@Ben Reinhart)
|
||||
- [12862](https://github.com/apache/superset/pull/12862) feat: Make initial user configurable in helm chart (#12862) (@Andreas Eberle)
|
||||
- [13696](https://github.com/apache/superset/pull/13696) feat: Refactor asyncEvent middleware and add websocket support (#13696) (@Rob DiCiuccio)
|
||||
- [14256](https://github.com/apache/superset/pull/14256) feat: Setup `supersetText` configuration to overwrite errors (#14256) (@Hugh A. Miles II)
|
||||
- [14398](https://github.com/apache/superset/pull/14398) feat: Support env vars configuration for WebSocket server (#14398) (@Ben Reinhart)
|
||||
- [14008](https://github.com/apache/superset/pull/14008) feat: Support feature flag overrides in ephemeral test envs (#14008) (@Rob DiCiuccio)
|
||||
- [14122](https://github.com/apache/superset/pull/14122) feat: TrinoEngineSpec.adjust_database_uri (#14122) (@Đặng Minh Dũng)
|
||||
- [13662](https://github.com/apache/superset/pull/13662) feat: add 'extra' column to saved_queries GET (#13662) (@Maxime Beauchemin)
|
||||
- [13682](https://github.com/apache/superset/pull/13682) feat: add Databricks DB engine spec (#13682) (@Beto Dealmeida)
|
||||
- [14072](https://github.com/apache/superset/pull/14072) feat: add Echarts gauge chart (#14072) (@krsnik93)
|
||||
- [13584](https://github.com/apache/superset/pull/13584) feat: add ErrorBoundary to chart controls (#13584) (@Jesse Yang)
|
||||
- [14267](https://github.com/apache/superset/pull/14267) feat: add alerts & reports to docker compose (#14267) (@Daniel Vaz Gaspar)
|
||||
- [13152](https://github.com/apache/superset/pull/13152) feat: add connector for CrateDB (#13152) (@Srini Kadamati)
|
||||
- [13827](https://github.com/apache/superset/pull/13827) feat: add descriptions to report emails (#13827) (@Sam Faber-Manning)
|
||||
- [14208](https://github.com/apache/superset/pull/14208) feat: add endpoint to fetch available DBs (#14208) (@Beto Dealmeida)
|
||||
- [13468](https://github.com/apache/superset/pull/13468) feat: add event_logger to test_connection and create_database commands (#13468) (@Hugh A. Miles II)
|
||||
- [13997](https://github.com/apache/superset/pull/13997) feat: add extract_errors to Postgres (#13997) (@Beto Dealmeida)
|
||||
- [13586](https://github.com/apache/superset/pull/13586) feat: add more big data for testing (#13586) (@Beto Dealmeida)
|
||||
- [13448](https://github.com/apache/superset/pull/13448) feat: add option to load big/wide tables (#13448) (@Beto Dealmeida)
|
||||
- [13364](https://github.com/apache/superset/pull/13364) feat: add unit test for LimitMethod.FETCH_MANY (#13364) (@Beto Dealmeida)
|
||||
- [13606](https://github.com/apache/superset/pull/13606) feat: add warning metadata to tables and metrics (#13606) (@Erik Ritter)
|
||||
- [13610](https://github.com/apache/superset/pull/13610) feat: added support to configure the default explorer viz (#13610) (@cccs-jc)
|
||||
- [13601](https://github.com/apache/superset/pull/13601) feat: better error message when adding DBs (#13601) (@Beto Dealmeida)
|
||||
- [14250](https://github.com/apache/superset/pull/14250) feat: catch errors on do_ping (#14250) (@Beto Dealmeida)
|
||||
- [13893](https://github.com/apache/superset/pull/13893) feat: create backend routes and API for importing saved queries (#13893) (@AAfghahi)
|
||||
- [13487](https://github.com/apache/superset/pull/13487) feat: create hooks to redux component (#13487) (@AAfghahi)
|
||||
- [13871](https://github.com/apache/superset/pull/13871) feat: create table with long name (#13871) (@Beto Dealmeida)
|
||||
- [14172](https://github.com/apache/superset/pull/14172) feat: error messages for Presto connections (#14172) (@Beto Dealmeida)
|
||||
- [14093](https://github.com/apache/superset/pull/14093) feat: error messages when connecting to MSSQL (#14093) (@Beto Dealmeida)
|
||||
- [14171](https://github.com/apache/superset/pull/14171) feat: error messages when connecting to mssql (#14171) (@AAfghahi)
|
||||
- [14040](https://github.com/apache/superset/pull/14040) feat: handle chart/data API errors (#14040) (@Erik Ritter)
|
||||
- [14204](https://github.com/apache/superset/pull/14204) feat: improve engine spec discoverability (#14204) (@Beto Dealmeida)
|
||||
- [13960](https://github.com/apache/superset/pull/13960) feat: initial work to make v1 API compatible with SIP-40 and SIP-41 (#13960) (@Beto Dealmeida)
|
||||
- [14146](https://github.com/apache/superset/pull/14146) feat: invalid DB name error messages (MySQL/Postgres/Redshift) (#14146) (@AAfghahi)
|
||||
- [14089](https://github.com/apache/superset/pull/14089) feat: invalid hostname and password error messages (MySQL) (#14089) (@AAfghahi)
|
||||
- [14111](https://github.com/apache/superset/pull/14111) feat: invalid hostname and password error messages (Redshift) (#14111) (@AAfghahi)
|
||||
- [14038](https://github.com/apache/superset/pull/14038) feat: invalid password error message (Postgres) (#14038) (@Beto Dealmeida)
|
||||
- [13862](https://github.com/apache/superset/pull/13862) feat: only send alert error emails to owners of the alert (#13862) (@Sam Faber-Manning)
|
||||
- [14163](https://github.com/apache/superset/pull/14163) feat: publish superset helm chart (#14163) (@jawabuu)
|
||||
- [13441](https://github.com/apache/superset/pull/13441) feat: refactor on DBEventLogger to allow for context management (#13441) (@Hugh A. Miles II)
|
||||
- [14092](https://github.com/apache/superset/pull/14092) feat: restyle database modal (#14092) (@Elizabeth Thompson)
|
||||
- [13561](https://github.com/apache/superset/pull/13561) feat: script to benchmark DB migrations (#13561) (@Beto Dealmeida)
|
||||
- [13720](https://github.com/apache/superset/pull/13720) feat: sort time grain configs (#13720) (@Elizabeth Thompson)
|
||||
- [13743](https://github.com/apache/superset/pull/13743) feat: use cross-env when running dev-server (#13743) (@Cemre Mengu)
|
||||
|
||||
**Fixes**
|
||||
- [13585](https://github.com/apache/superset/pull/13585) fix antd select dropdown issue (#13585) (@Lily Kuang)
|
||||
- [14369](https://github.com/apache/superset/pull/14369) fix error getting partitionQuery from table.partition (#14369) (@eriendeng)
|
||||
- [13878](https://github.com/apache/superset/pull/13878) fix(#13378): Ensure g.user is set for impersonation (#13878) (@Ben Reinhart)
|
||||
- [13756](https://github.com/apache/superset/pull/13756) fix(CI): use presto docker image from starburst (#13756) (@Jesse Yang)
|
||||
- [13718](https://github.com/apache/superset/pull/13718) fix(alerts and reports): Unify timestamp format on execution log view (#13718) (@Jack Fragassi)
|
||||
- [13436](https://github.com/apache/superset/pull/13436) fix(alerts&reports): add celery soft timeout support (#13436) (@Daniel Vaz Gaspar)
|
||||
- [13911](https://github.com/apache/superset/pull/13911) fix(alerts/reports): working timeout with celery kill and logic fix (#13911) (@Daniel Vaz Gaspar)
|
||||
- [14483](https://github.com/apache/superset/pull/14483) fix(annotations): pass force param to annotation request (#14483) (@Ville Brofeldt)
|
||||
- [14526](https://github.com/apache/superset/pull/14526) fix(chart-data): handle url_params in csv export and native filters (#14526) (@Ville Brofeldt)
|
||||
- [13945](https://github.com/apache/superset/pull/13945) fix(colors): fix color schemes (#13945) (@simcha90)
|
||||
- [14063](https://github.com/apache/superset/pull/14063) fix(country-map): update geojson and control layout (#14063) (@Jesse Yang)
|
||||
- [13665](https://github.com/apache/superset/pull/13665) fix(cross-filter): fix scheme py (#13665) (@simcha90)
|
||||
- [14220](https://github.com/apache/superset/pull/14220) fix(cross-filters): Fix missed metadata (#14220) (@simcha90)
|
||||
- [13692](https://github.com/apache/superset/pull/13692) fix(cross-filters): add a control panel to range filter (#13692) (@Ville Brofeldt)
|
||||
- [13703](https://github.com/apache/superset/pull/13703) fix(cross-filters): expand relevant indicator sections (#13703) (@Ville Brofeldt)
|
||||
- [13704](https://github.com/apache/superset/pull/13704) fix(cross-filters): only apply filters if ff is set (#13704) (@Ville Brofeldt)
|
||||
- [13825](https://github.com/apache/superset/pull/13825) fix(cypress): avoid referencing detached dom nodes (#13825) (@David Aaron Suddjian)
|
||||
- [14306](https://github.com/apache/superset/pull/14306) fix(dashboard): Add caching for dashboard datasets (#14306) (@David Aaron Suddjian)
|
||||
- [13352](https://github.com/apache/superset/pull/13352) fix(dashboard): Get dashboard by slug (#13352) (@David Aaron Suddjian)
|
||||
- [14207](https://github.com/apache/superset/pull/14207) fix(dashboard): draft dashboards should be viewable (#14207) (@Jesse Yang)
|
||||
- [14129](https://github.com/apache/superset/pull/14129) fix(dashboard): filter set hydration not working (#14129) (@Ville Brofeldt)
|
||||
- [14148](https://github.com/apache/superset/pull/14148) fix(dashboard): incorrect perm for users with multiple roles (#14148) (@Jesse Yang)
|
||||
- [13691](https://github.com/apache/superset/pull/13691) fix(dashboard): missing parents in directPathToFilter (#13691) (@Ville Brofeldt)
|
||||
- [13769](https://github.com/apache/superset/pull/13769) fix(dashboard): rename native filter configuration property (#13769) (@Ville Brofeldt)
|
||||
- [13652](https://github.com/apache/superset/pull/13652) fix(datasets): log create exceptions as warning (#13652) (@ʈᵃᵢ)
|
||||
- [14295](https://github.com/apache/superset/pull/14295) fix(db2): change name and add legacy alias (#14295) (@Ville Brofeldt)
|
||||
- [14362](https://github.com/apache/superset/pull/14362) fix(emotion): add separate namespace for menu app (#14362) (@ʈᵃᵢ)
|
||||
- [13826](https://github.com/apache/superset/pull/13826) fix(errors): Downgrade error on stop query to a warning (#13826) (@Will Barrett)
|
||||
- [13621](https://github.com/apache/superset/pull/13621) fix(explore): Add int and bool regex pattern (#13621) (@Nikola Gigić)
|
||||
- [14194](https://github.com/apache/superset/pull/14194) fix(explore): CUSTOM SQL tab should automatically update (#14194) (@Yaozong Liu)
|
||||
- [13566](https://github.com/apache/superset/pull/13566) fix(explore): make horizontal scroll appears in data panel (#13566) (@Yaozong Liu)
|
||||
- [13473](https://github.com/apache/superset/pull/13473) fix(explore): make sure sort by metric is not duplicated (#13473) (@Jesse Yang)
|
||||
- [13801](https://github.com/apache/superset/pull/13801) fix(explore): strip semicolons in virtual table SQL (#13801) (@Phillip Kelley-Dotson)
|
||||
- [13613](https://github.com/apache/superset/pull/13613) fix(helm): Add missing extraConfigs template volume mapping and fix type error on template. (#13613) (@Daniel Wood)
|
||||
- [14255](https://github.com/apache/superset/pull/14255) fix(hive): Update CSV to Hive upload prefix (#14255) (@John Bodley)
|
||||
- [14240](https://github.com/apache/superset/pull/14240) fix(hive): Use parquet rather than textfile when uploading CSV files to Hive (#14240) (@John Bodley)
|
||||
- [13906](https://github.com/apache/superset/pull/13906) fix(listview): update listview feature flag (#13906) (@Phillip Kelley-Dotson)
|
||||
- [14332](https://github.com/apache/superset/pull/14332) fix(native-filters): Fix first loading of charts (#14332) (@simcha90)
|
||||
- [14334](https://github.com/apache/superset/pull/14334) fix(native-filters): Fix indicators (#14334) (@simcha90)
|
||||
- [14370](https://github.com/apache/superset/pull/14370) fix(native-filters): Update filter saving (#14370) (@simcha90)
|
||||
- [13837](https://github.com/apache/superset/pull/13837) fix(native-filters): add global async query support to native filters (#13837) (@Ville Brofeldt)
|
||||
- [14353](https://github.com/apache/superset/pull/14353) fix(native-filters): allowClear only when required not checked (#14353) (@Ville Brofeldt)
|
||||
- [14409](https://github.com/apache/superset/pull/14409) fix(native-filters): always show filters without dataset (#14409) (@Ville Brofeldt)
|
||||
- [14401](https://github.com/apache/superset/pull/14401) fix(native-filters): default value not populated on second opening (#14401) (@Ville Brofeldt)
|
||||
- [14426](https://github.com/apache/superset/pull/14426) fix(native-filters): fix filter scope error (#14426) (@Ville Brofeldt)
|
||||
- [14387](https://github.com/apache/superset/pull/14387) fix(native-filters): fix lint (#14387) (@simcha90)
|
||||
- [14218](https://github.com/apache/superset/pull/14218) fix(native-filters): fix remove native filters (#14218) (@simcha90)
|
||||
- [13688](https://github.com/apache/superset/pull/13688) fix(native-filters): fix removing native filter (#13688) (@simcha90)
|
||||
- [14385](https://github.com/apache/superset/pull/14385) fix(native-filters): force update control value on change (#14385) (@Ville Brofeldt)
|
||||
- [13794](https://github.com/apache/superset/pull/13794) fix(native-filters): improve loading styles for filter component (#13794) (@Ville Brofeldt)
|
||||
- [14244](https://github.com/apache/superset/pull/14244) fix(native-filters): merge_extra_form_data extras processing (#14244) (@Ville Brofeldt)
|
||||
- [13434](https://github.com/apache/superset/pull/13434) fix(query): order by adhoc metrics should trigger group by (#13434) (@Jesse Yang)
|
||||
- [13331](https://github.com/apache/superset/pull/13331) fix(query-object): extra time-range-endpoints (#13331) (@John Bodley)
|
||||
- [14014](https://github.com/apache/superset/pull/14014) fix(sqla): apply sqla type on calculated columns (#14014) (@Ville Brofeldt)
|
||||
- [14095](https://github.com/apache/superset/pull/14095) fix(sqla): labels_expected contains mutated label (#14095) (@Ville Brofeldt)
|
||||
- [14297](https://github.com/apache/superset/pull/14297) fix(sqla): timeseries limit not applied when using columns (#14297) (@Ville Brofeldt)
|
||||
- [13739](https://github.com/apache/superset/pull/13739) fix(sqla-query): order by aggregations in Presto and Hive (#13739) (@Jesse Yang)
|
||||
- [13636](https://github.com/apache/superset/pull/13636) fix(sqllab): Table name and schema are encoded twice during fetching table metadata on SQL Lab page. (#13636) (@Dmytro Mudrov)
|
||||
- [14390](https://github.com/apache/superset/pull/14390) fix(sqllab): fix error due to anonymous user (#14390) (@Ville Brofeldt)
|
||||
- [13288](https://github.com/apache/superset/pull/13288) fix(sqllab): per-tab hide left bar (#13288) (@Beto Dealmeida)
|
||||
- [13841](https://github.com/apache/superset/pull/13841) fix(sqllab): warning message when rows limited (#13841) (@zuzana-vej)
|
||||
- [14045](https://github.com/apache/superset/pull/14045) fix(viz): bump superset-ui 0.17.30 (#14045) (@Ville Brofeldt)
|
||||
- [14438](https://github.com/apache/superset/pull/14438) fix(viz): bump superset-ui to fix bugs in table and graph chart (#14438) (@Jesse Yang)
|
||||
- [14191](https://github.com/apache/superset/pull/14191) fix(viz): time shift read-only error (#14191) (@Ville Brofeldt)
|
||||
- [13657](https://github.com/apache/superset/pull/13657) fix: 'Run in SQL Lab' redirect bug (#13657) (@Maxime Beauchemin)
|
||||
- [13444](https://github.com/apache/superset/pull/13444) fix: API to allow importing old exports (JSON/YAML) (#13444) (@Beto Dealmeida)
|
||||
- [14180](https://github.com/apache/superset/pull/14180) fix: Add extra requires for shillelagh (#14180) (@Erik Ritter)
|
||||
- [14192](https://github.com/apache/superset/pull/14192) fix: Center each import icon and add a tooltip II (#14192) (@Lyndsi Kay Williams)
|
||||
- [13859](https://github.com/apache/superset/pull/13859) fix: Check for permissions in FilterBox (#13859) (@Erik Ritter)
|
||||
- [14317](https://github.com/apache/superset/pull/14317) fix: Cleanup serialization and hashing code (#14317) (@Ben Reinhart)
|
||||
- [13972](https://github.com/apache/superset/pull/13972) fix: Data table z index in sql Editor (#13972) (@AAfghahi)
|
||||
- [13749](https://github.com/apache/superset/pull/13749) fix: Disallows negative options remaining (#13749) (@Michael S. Molina)
|
||||
- [14291](https://github.com/apache/superset/pull/14291) fix: Fix unintended cache misses with async queries (#14291) (@Ben Reinhart)
|
||||
- [14086](https://github.com/apache/superset/pull/14086) fix: Fixed saved query export (#14086) (@Lyndsi Kay Williams)
|
||||
- [13858](https://github.com/apache/superset/pull/13858) fix: Floating Menu in SQL Left Bar (#13858) (@AAfghahi)
|
||||
- [14147](https://github.com/apache/superset/pull/14147) fix: Handle bad permission errors for bigquery test connections (#14147) (@Hugh A. Miles II)
|
||||
- [13980](https://github.com/apache/superset/pull/13980) fix: Issue 13956 (#13980) (@John Bodley)
|
||||
- [13602](https://github.com/apache/superset/pull/13602) fix: ParsedQuery subselect edge case (#13602) (@Erik Ritter)
|
||||
- [13987](https://github.com/apache/superset/pull/13987) fix: Pie chart not displayed in viz (#13987) (@Yongjie Zhao)
|
||||
- [13852](https://github.com/apache/superset/pull/13852) fix: Pin Prophet dependency after breaking changes (#13852) (@Étienne Boisseau-Sierra)
|
||||
- [13469](https://github.com/apache/superset/pull/13469) fix: Remove view in sql lab from druid datasources (#13469) (@Erik Ritter)
|
||||
- [13464](https://github.com/apache/superset/pull/13464) fix: SHOW is not DML (#13464) (@Beto Dealmeida)
|
||||
- [13946](https://github.com/apache/superset/pull/13946) fix: SQL -> Explore Overwrite flow (#13946) (@Hugh A. Miles II)
|
||||
- [14358](https://github.com/apache/superset/pull/14358) fix: SQL Statement on QUERY_LOGGER prints none to log (#14358) (@cccs-rc)
|
||||
- [14372](https://github.com/apache/superset/pull/14372) fix: SQLLab role permissions (#14372) (@Daniel Vaz Gaspar)
|
||||
- [13655](https://github.com/apache/superset/pull/13655) fix: Slack dashboard has stale charts (#13655) (@Beto Dealmeida)
|
||||
- [14170](https://github.com/apache/superset/pull/14170) fix: Switching to local codecov script (#14170) (@Craig Rueda)
|
||||
- [13974](https://github.com/apache/superset/pull/13974) fix: Use superset generic db to catch external_metadata queries (#13974) (@Hugh A. Miles II)
|
||||
- [13830](https://github.com/apache/superset/pull/13830) fix: Use utils.json_iso_dttm_ser to dump jsons when async query execution (#13830) (@Carlos Fidel Selva Ochoa)
|
||||
- [13496](https://github.com/apache/superset/pull/13496) fix: `IS NULL` filter operator for numeric columns (#13496) (@Jesse Yang)
|
||||
- [14036](https://github.com/apache/superset/pull/14036) fix: add exception to catch session not having JWT (#14036) (@Hugh A. Miles II)
|
||||
- [13822](https://github.com/apache/superset/pull/13822) fix: adjusted tab height (#13822) (@AAfghahi)
|
||||
- [13488](https://github.com/apache/superset/pull/13488) fix: allow option to generate new query (#13488) (@Elizabeth Thompson)
|
||||
- [13800](https://github.com/apache/superset/pull/13800) fix: allow spaces in DB names (#13800) (@Beto Dealmeida)
|
||||
- [13563](https://github.com/apache/superset/pull/13563) fix: always pass a string as a value to ace editor (#13563) (@Elizabeth Thompson)
|
||||
- [12341](https://github.com/apache/superset/pull/12341) fix: annotation layer modal err handling (#12341) (@Moriah Kreeger)
|
||||
- [13969](https://github.com/apache/superset/pull/13969) fix: annotation modal dateRangePicker saved invalid value (#13969) (@Yongjie Zhao)
|
||||
- [13790](https://github.com/apache/superset/pull/13790) fix: bad copy-and-paste in API spec (#13790) (@Beto Dealmeida)
|
||||
- [13578](https://github.com/apache/superset/pull/13578) fix: better handle datasource exceptions (#13578) (@Daniel Vaz Gaspar)
|
||||
- [13642](https://github.com/apache/superset/pull/13642) fix: bump FAB to 3.2.1, SQLAlchemy fix (#13642) (@Daniel Vaz Gaspar)
|
||||
- [13868](https://github.com/apache/superset/pull/13868) fix: change status code for generic errors to 400 (#13868) (@Hugh A. Miles II)
|
||||
- [13681](https://github.com/apache/superset/pull/13681) fix: clean up incorrect usage of TypeScript type in PropTypes (#13681) (@Jesse Yang)
|
||||
- [14084](https://github.com/apache/superset/pull/14084) fix: custom TimeRange can not input value (#14084) (@Yongjie Zhao)
|
||||
- [13695](https://github.com/apache/superset/pull/13695) fix: dashboard filter scope bug (#13695) (@Grace Guo)
|
||||
- [13624](https://github.com/apache/superset/pull/13624) fix: data column in SQL lab left panel open by default (#13624) (@AAfghahi)
|
||||
- [13330](https://github.com/apache/superset/pull/13330) fix: date picker support date unit with singular and plural (#13330) (@Yongjie Zhao)
|
||||
- [13603](https://github.com/apache/superset/pull/13603) fix: default when adding tab_state.hide_left_bar (#13603) (@Beto Dealmeida)
|
||||
- [13389](https://github.com/apache/superset/pull/13389) fix: delete dataset columns and metrics on the REST API (#13389) (@Daniel Vaz Gaspar)
|
||||
- [13917](https://github.com/apache/superset/pull/13917) fix: do not run containers as root by default in Helm chart (#13917) (@Stanislav Simovski)
|
||||
- [13926](https://github.com/apache/superset/pull/13926) fix: enable installing docker/requirements-local.txt in docker-compose-non-dev.yml (#13926) (@ʈᵃᵢ)
|
||||
- [13998](https://github.com/apache/superset/pull/13998) fix: execution log crashes for logs with no uuid (#13998) (@Jack Fragassi)
|
||||
- [14081](https://github.com/apache/superset/pull/14081) fix: fix bug when remove chart not removing it's related cross filter data (#14081) (@simcha90)
|
||||
- [13546](https://github.com/apache/superset/pull/13546) fix: fix initial filter loading (#13546) (@simcha90)
|
||||
- [14082](https://github.com/apache/superset/pull/14082) fix: flacky test in test_update_dataset_item_w_override_columns (#14082) (@Hugh A. Miles II)
|
||||
- [14347](https://github.com/apache/superset/pull/14347) fix: flaky test for alerts and reports (#14347) (@Daniel Vaz Gaspar)
|
||||
- [13979](https://github.com/apache/superset/pull/13979) fix: import dataset/dashboard empty keys (#13979) (@Beto Dealmeida)
|
||||
- [14258](https://github.com/apache/superset/pull/14258) fix: incorrect module reference (#14258) (@Yongjie Zhao)
|
||||
- [13737](https://github.com/apache/superset/pull/13737) fix: log exceptions for thumbnail generation as warnings (#13737) (@Sam Faber-Manning)
|
||||
- [14057](https://github.com/apache/superset/pull/14057) fix: logs table - user_id is NULL (#14057) (@Hugh A. Miles II)
|
||||
- [13493](https://github.com/apache/superset/pull/13493) fix: merge 67da9ef1ef9c and 1412ec1e5a7b migrations (#13493) (@Hugh A. Miles II)
|
||||
- [13921](https://github.com/apache/superset/pull/13921) fix: new import/export CLI (#13921) (@Beto Dealmeida)
|
||||
- [13955](https://github.com/apache/superset/pull/13955) fix: null exception from adhoc metric popover (#13955) (@Grace Guo)
|
||||
- [14509](https://github.com/apache/superset/pull/14509) fix: parameterize titles correctly (#14509) (@David Aaron Suddjian)
|
||||
- [14338](https://github.com/apache/superset/pull/14338) fix: pybabel extract fails (#14338) (@ume)
|
||||
- [13780](https://github.com/apache/superset/pull/13780) fix: restart superset container in test script (#13780) (@Ben Reinhart)
|
||||
- [13694](https://github.com/apache/superset/pull/13694) fix: select table overlay (#13694) (@AAfghahi)
|
||||
- [14074](https://github.com/apache/superset/pull/14074) fix: unable to apply logging format (#14074) (@Yongjie Zhao)
|
||||
- [14319](https://github.com/apache/superset/pull/14319) fix: unbreak CI (#14319) (@Erik Ritter)
|
||||
- [13679](https://github.com/apache/superset/pull/13679) fix: use FeatureFlags in @superset-ui/core (#13679) (@Jesse Yang)
|
||||
- [14099](https://github.com/apache/superset/pull/14099) fix:fix get permission function (#14099) (@simcha90)
|
||||
|
||||
**Documentation**
|
||||
- [13770](https://github.com/apache/superset/pull/13770) docs(contributing): fix backend port (#13770) (@Cemre Mengu)
|
||||
- [13813](https://github.com/apache/superset/pull/13813) docs: Documenting how to debug Flask app (#13813) (@cccs-jc)
|
||||
- [13455](https://github.com/apache/superset/pull/13455) docs: Fix typo in footer (#13455) (@Holger Stitz)
|
||||
- [14304](https://github.com/apache/superset/pull/14304) docs: add publish step (#14304) (@ʈᵃᵢ)
|
||||
- [13611](https://github.com/apache/superset/pull/13611) docs: correct sentence (#13611) (@Erfan Mirzapour)
|
||||
- [13440](https://github.com/apache/superset/pull/13440) docs: deprecate old alerts and dash/charts reports (#13440) (@Daniel Vaz Gaspar)
|
||||
- [14394](https://github.com/apache/superset/pull/14394) docs: improved clickhouse connection details (#14394) (@Srini Kadamati)
|
||||
- [14321](https://github.com/apache/superset/pull/14321) docs: multiple small fixes around databases (#14321) (@Srini Kadamati)
|
||||
- [12932](https://github.com/apache/superset/pull/12932) docs: update helm documentation (#12932) (@Anthony Corletti)
|
||||
- [14027](https://github.com/apache/superset/pull/14027) docs: update outdated country map tools instructions (#14027) (@Jesse Yang)
|
||||
- [13781](https://github.com/apache/superset/pull/13781) docs: update setup instructions (#13781) (@Ben Reinhart)
|
||||
|
||||
**Other**
|
||||
- [13759](https://github.com/apache/superset/pull/13759) Add CODEOWNERS (#13759) (@Rob DiCiuccio)
|
||||
- [14238](https://github.com/apache/superset/pull/14238) Add Preset code owners for ephemeral test env workflows (#14238) (@Rob DiCiuccio)
|
||||
- [13553](https://github.com/apache/superset/pull/13553) Add dedicated dir and storybook (#13553) (@Geido)
|
||||
- [13961](https://github.com/apache/superset/pull/13961) Add docs for configuring Docker Compose setup (#13961) (@Alex Kreidler)
|
||||
- [13728](https://github.com/apache/superset/pull/13728) Add extraSecrets config to allow specifying extra secret files (#13728) (@Andreas Eberle)
|
||||
- [14223](https://github.com/apache/superset/pull/14223) Add superset helm repository (#14223) (@jawabuu)
|
||||
- [13778](https://github.com/apache/superset/pull/13778) Add tests (#13778) (@Geido)
|
||||
- [13950](https://github.com/apache/superset/pull/13950) Add tests for FilterBar CascadeFilterControl (#13950) (@Geido)
|
||||
- [13425](https://github.com/apache/superset/pull/13425) Adding v0 import/export fields to dashboard metadata schema (#13425) (@michellethomas)
|
||||
- [13359](https://github.com/apache/superset/pull/13359) Adds tests and storybook to CopyToClipboard component (#13359) (@Michael S. Molina)
|
||||
- [13658](https://github.com/apache/superset/pull/13658) Bump pyyaml to latest (#13658) (@Rob DiCiuccio)
|
||||
- [13854](https://github.com/apache/superset/pull/13854) Displays row limit warning with Alert component (#13854) (@Michael S. Molina)
|
||||
- [14187](https://github.com/apache/superset/pull/14187) Enable the new pivot table (#14187) (@Kamil Gabryjelski)
|
||||
- [13861](https://github.com/apache/superset/pull/13861) Fix broken link (#13861) (@Eric Anderson)
|
||||
- [14039](https://github.com/apache/superset/pull/14039) Fix broken port-forward instructions (#14039) (@Caleb Collins-Parks)
|
||||
- [14243](https://github.com/apache/superset/pull/14243) Fix filter edit popover not opening in DnD mode (#14243) (@Kamil Gabryjelski)
|
||||
- [13608](https://github.com/apache/superset/pull/13608) Fix: Add SASL dependency module (#13608) (@Daniel Wood)
|
||||
- [13505](https://github.com/apache/superset/pull/13505) Fixed KeyError by making kwarg explicit (#13505) (@Richard Nordin)
|
||||
- [13905](https://github.com/apache/superset/pull/13905) Fixing condition around left margin for dashboard layout. Fixes #13863 (#13905) (@Evan Rusackas)
|
||||
- [14323](https://github.com/apache/superset/pull/14323) Fixing spelling: `clint` -> `client` (#14323) (@Chris Carini)
|
||||
- [13570](https://github.com/apache/superset/pull/13570) Given port in dockerfile set to same port in config (#13570) (@İbrahim Ercan)
|
||||
- [13273](https://github.com/apache/superset/pull/13273) Improves ButtonGroup tests (#13273) (@Michael S. Molina)
|
||||
- [14046](https://github.com/apache/superset/pull/14046) Make chart exclude itself from cross filtering (#14046) (@Kamil Gabryjelski)
|
||||
- [14287](https://github.com/apache/superset/pull/14287) Make g.user attribute access safe for public users (#14287) (@Rob DiCiuccio)
|
||||
- [13643](https://github.com/apache/superset/pull/13643) Make preliminary suggested changes to CONTRIBUTING.md (#13643) (@Kris Stern)
|
||||
- [13314](https://github.com/apache/superset/pull/13314) Moves AsyncSelect component and tests to own folder (#13314) (@Michael S. Molina)
|
||||
- [13901](https://github.com/apache/superset/pull/13901) Revert "fix: select table overlay (#13694)" (#13901) (@Erik Ritter)
|
||||
- [13876](https://github.com/apache/superset/pull/13876) Tests for "CrossFilterScopingModal/utils" (#13876) (@Bruno Motta)
|
||||
- [13991](https://github.com/apache/superset/pull/13991) Tests for ColumnSelect (#13991) (@Bruno Motta)
|
||||
- [13975](https://github.com/apache/superset/pull/13975) Tests for ControlItems (#13975) (@Bruno Motta)
|
||||
- [13872](https://github.com/apache/superset/pull/13872) Tests for DetailsPanel (#13872) (@Bruno Motta)
|
||||
- [14025](https://github.com/apache/superset/pull/14025) Update CONTRIBUTING.md (#14025) (@Hugh A. Miles II)
|
||||
- [13607](https://github.com/apache/superset/pull/13607) Update UPDATING.md (#13607) (@Beto Dealmeida)
|
||||
- [13934](https://github.com/apache/superset/pull/13934) Update docs to use the newer WEBDRIVER_TYPE name (#13934) (@Octavian)
|
||||
- [14219](https://github.com/apache/superset/pull/14219) Update trino connection docs (#14219) (@Aakash Nand)
|
||||
- [14031](https://github.com/apache/superset/pull/14031) Use consistent chart value (#14031) (@Tom Vendetta)
|
||||
- [13323](https://github.com/apache/superset/pull/13323) Use redis:latest in docker-compose workflow (#13323) (@Rob DiCiuccio)
|
||||
- [13730](https://github.com/apache/superset/pull/13730) Use stringData instead of data in Secrets and remove manual base64 encoding (#13730) (@Andreas Eberle)
|
||||
- [13936](https://github.com/apache/superset/pull/13936) Use the right variable for Celery results in Redis (#13936) (@Octavian)
|
||||
- [14252](https://github.com/apache/superset/pull/14252) WIP (#14252) (@Beto Dealmeida)
|
||||
- [14446](https://github.com/apache/superset/pull/14446) add migration (#14446) (@Ville Brofeldt)
|
||||
- [13365](https://github.com/apache/superset/pull/13365) add more documentation around python testing and linting (#13365) (@Elizabeth Thompson)
|
||||
- [13527](https://github.com/apache/superset/pull/13527) build(deps): bump elliptic from 6.5.3 to 6.5.4 in /docs (#13527) (@dependabot[bot])
|
||||
- [12636](https://github.com/apache/superset/pull/12636) build(deps): bump socket.io from 2.3.0 to 2.4.1 in /docs (#12636) (@dependabot[bot])
|
||||
- [13391](https://github.com/apache/superset/pull/13391) build(deps): bump three from 0.68.87 to 0.125.0 in /docs (#13391) (@dependabot[bot])
|
||||
- [13393](https://github.com/apache/superset/pull/13393) build(deps): bump urijs from 1.19.4 to 1.19.6 in /superset-frontend (#13393) (@dependabot[bot])
|
||||
- [13874](https://github.com/apache/superset/pull/13874) build(deps): bump y18n from 4.0.0 to 4.0.1 in /docs (#13874) (@dependabot[bot])
|
||||
- [13886](https://github.com/apache/superset/pull/13886) build(deps): bump y18n from 4.0.0 to 4.0.1 in /superset-frontend (#13886) (@dependabot[bot])
|
||||
- [13452](https://github.com/apache/superset/pull/13452) build(test env): Shutdown test environments on PR close (#13452) (@Rob DiCiuccio)
|
||||
- [13189](https://github.com/apache/superset/pull/13189) build: Ephemeral environments for PRs via slash command (#13189) (@Rob DiCiuccio)
|
||||
- [13498](https://github.com/apache/superset/pull/13498) build: check potential db migration conflict for open PRs (#13498) (@Jesse Yang)
|
||||
- [13375](https://github.com/apache/superset/pull/13375) build: fix codecov informational config (#13375) (@Jesse Yang)
|
||||
- [13421](https://github.com/apache/superset/pull/13421) build: ignore Storybook stories in CodeCov (#13421) (@Jesse Yang)
|
||||
- [13677](https://github.com/apache/superset/pull/13677) build: implement codecov carryforward flags (#13677) (@Jack Fragassi)
|
||||
- [13927](https://github.com/apache/superset/pull/13927) catch collapse onchange (#13927) (@Elizabeth Thompson)
|
||||
- [13757](https://github.com/apache/superset/pull/13757) chore(CI): dont run Hive tests on Py 3.7 (#13757) (@Jesse Yang)
|
||||
- [13784](https://github.com/apache/superset/pull/13784) chore(cypress): Make the e2e tests more behavior-driven (#13784) (@David Aaron Suddjian)
|
||||
- [13939](https://github.com/apache/superset/pull/13939) chore(dashboard): Datasource -> Dataset (#13939) (@David Aaron Suddjian)
|
||||
- [14342](https://github.com/apache/superset/pull/14342) chore(docker-compose): use dev image for docker-compose-non-dev.yml (#14342) (@ʈᵃᵢ)
|
||||
- [14331](https://github.com/apache/superset/pull/14331) chore(docs): remove .py from db migrate -m (#14331) (@Amit Miran)
|
||||
- [13660](https://github.com/apache/superset/pull/13660) chore(explore): added debounce in DateFilter (#13660) (@Yongjie Zhao)
|
||||
- [13593](https://github.com/apache/superset/pull/13593) chore(explore): bump superset-ui 0.17.19 (#13593) (@Yongjie Zhao)
|
||||
- [13767](https://github.com/apache/superset/pull/13767) chore(git): ignore superset/app/ folder (#13767) (@Cemre Mengu)
|
||||
- [13500](https://github.com/apache/superset/pull/13500) chore(homepage): separate out api calls to make homepage load more dynamically (#13500) (@Phillip Kelley-Dotson)
|
||||
- [14228](https://github.com/apache/superset/pull/14228) chore(prophet): bump prophet to 1.0.1 (#14228) (@Ville Brofeldt)
|
||||
- [13306](https://github.com/apache/superset/pull/13306) chore(spa refactor): refactoring dashboard to use api's instead of bootstrapdata (#13306) (@Phillip Kelley-Dotson)
|
||||
- [14013](https://github.com/apache/superset/pull/14013) chore(toggle thumbnails): use localstorage for toggle (#14013) (@Phillip Kelley-Dotson)
|
||||
- [14274](https://github.com/apache/superset/pull/14274) chore: Add Redis password option to helm chart (#14274) (@Rob DiCiuccio)
|
||||
- [13418](https://github.com/apache/superset/pull/13418) chore: Added rockset and firebird (#13418) (@Srini Kadamati)
|
||||
- [13951](https://github.com/apache/superset/pull/13951) chore: Adds dataMask reducer to reducerIndex (#13951) (@Michael S. Molina)
|
||||
- [14203](https://github.com/apache/superset/pull/14203) chore: Bumping lodash version in Superset (#14203) (@Evan Rusackas)
|
||||
- [14196](https://github.com/apache/superset/pull/14196) chore: Code cleanup in DatabaseModal (#14196) (@Lyndsi Kay Williams)
|
||||
- [14164](https://github.com/apache/superset/pull/14164) chore: Configures Jest to ignore storybook files when collecting coverage statistics (#14164) (@Michael S. Molina)
|
||||
- [14339](https://github.com/apache/superset/pull/14339) chore: Improve Japanese translation (#14339) (@ume)
|
||||
- [13722](https://github.com/apache/superset/pull/13722) chore: Improve Korean translation (#13722) (@김세환)
|
||||
- [13376](https://github.com/apache/superset/pull/13376) chore: Improve japannese translation (#13376) (@Tetsushi Watanabe)
|
||||
- [14193](https://github.com/apache/superset/pull/14193) chore: Improves Icons storybook (#14193) (@Michael S. Molina)
|
||||
- [13274](https://github.com/apache/superset/pull/13274) chore: Migrates RefreshChartOverlay into Chart (#13274) (@Michael S. Molina)
|
||||
- [13361](https://github.com/apache/superset/pull/13361) chore: Migrating dashboard/components/menu from jsx to tsx (#13361) (@Ayan Ginet)
|
||||
- [13460](https://github.com/apache/superset/pull/13460) chore: Moves BootstrapSliderWrapper to own folder (#13460) (@Michael S. Molina)
|
||||
- [14139](https://github.com/apache/superset/pull/14139) chore: Moves Card to the components folder (#14139) (@Michael S. Molina)
|
||||
- [13454](https://github.com/apache/superset/pull/13454) chore: Moves ChartIcon to own folder (#13454) (@Michael S. Molina)
|
||||
- [13459](https://github.com/apache/superset/pull/13459) chore: Moves CheckboxIcons to Checkbox folder (#13459) (@Michael S. Molina)
|
||||
- [14124](https://github.com/apache/superset/pull/14124) chore: Moves Collapse to the components folder (#14124) (@Michael S. Molina)
|
||||
- [14125](https://github.com/apache/superset/pull/14125) chore: Moves CronPicker to the components folder (#14125) (@Michael S. Molina)
|
||||
- [14126](https://github.com/apache/superset/pull/14126) chore: Moves Dropdown to the components folder (#14126) (@Michael S. Molina)
|
||||
- [14127](https://github.com/apache/superset/pull/14127) chore: Moves DropdownButton to the components folder (#14127) (@Michael S. Molina)
|
||||
- [13458](https://github.com/apache/superset/pull/13458) chore: Moves Fade component into TableElement (#13458) (@Michael S. Molina)
|
||||
- [13322](https://github.com/apache/superset/pull/13322) chore: Moves FilterableTable test to component folder (#13322) (@Michael S. Molina)
|
||||
- [13485](https://github.com/apache/superset/pull/13485) chore: Moves InfoTooltip component to own folder (#13485) (@Michael S. Molina)
|
||||
- [14128](https://github.com/apache/superset/pull/14128) chore: Moves InfoTooltip to the components folder (#14128) (@Michael S. Molina)
|
||||
- [13324](https://github.com/apache/superset/pull/13324) chore: Moves ListView test to component folder (#13324) (@Michael S. Molina)
|
||||
- [14130](https://github.com/apache/superset/pull/14130) chore: Moves Modal to the components folder (#14130) (@Michael S. Molina)
|
||||
- [13338](https://github.com/apache/superset/pull/13338) chore: Moves OnPasteSelect tests to component's folder (#13338) (@Michael S. Molina)
|
||||
- [14133](https://github.com/apache/superset/pull/14133) chore: Moves Radio to the components folder (#14133) (@Michael S. Molina)
|
||||
- [14135](https://github.com/apache/superset/pull/14135) chore: Moves Switch to the components folder (#14135) (@Michael S. Molina)
|
||||
- [13411](https://github.com/apache/superset/pull/13411) chore: Moves TableSelector tests to component's folder (#13411) (@Michael S. Molina)
|
||||
- [14136](https://github.com/apache/superset/pull/14136) chore: Moves Tabs to the components folder (#14136) (@Michael S. Molina)
|
||||
- [14137](https://github.com/apache/superset/pull/14137) chore: Moves Tooltip to the components folder (#14137) (@Michael S. Molina)
|
||||
- [14123](https://github.com/apache/superset/pull/14123) chore: Moves WarningIconWithTooltip to own folder (#14123) (@Michael S. Molina)
|
||||
- [14200](https://github.com/apache/superset/pull/14200) chore: Moves spec files to the src folder - iteration 1 (#14200) (@Michael S. Molina)
|
||||
- [14201](https://github.com/apache/superset/pull/14201) chore: Moves spec files to the src folder - iteration 2 (#14201) (@Michael S. Molina)
|
||||
- [14202](https://github.com/apache/superset/pull/14202) chore: Moves spec files to the src folder - iteration 3 (#14202) (@Michael S. Molina)
|
||||
- [14166](https://github.com/apache/superset/pull/14166) chore: Moves the branding folder to the assets folder (#14166) (@Michael S. Molina)
|
||||
- [14167](https://github.com/apache/superset/pull/14167) chore: Moves the staticPages folder to the assets folder (#14167) (@Michael S. Molina)
|
||||
- [13462](https://github.com/apache/superset/pull/13462) chore: Removes Popover duplication (#13462) (@Michael S. Molina)
|
||||
- [13477](https://github.com/apache/superset/pull/13477) chore: Removes Select duplication (#13477) (@Michael S. Molina)
|
||||
- [13408](https://github.com/apache/superset/pull/13408) chore: Removes unused Hotkeys component (#13408) (@Michael S. Molina)
|
||||
- [14298](https://github.com/apache/superset/pull/14298) chore: SQLLab row limit warning using Alert component (#14298) (@zuzana-vej)
|
||||
- [13332](https://github.com/apache/superset/pull/13332) chore: Update OAuth2 configuration guide to match with FlaskAppBuilder (#13332) (@Liam)
|
||||
- [13855](https://github.com/apache/superset/pull/13855) chore: Update PR template for SIP-59 DB migrations process (#13855) (@Rob DiCiuccio)
|
||||
- [13738](https://github.com/apache/superset/pull/13738) chore: Update presto.mdx (#13738) (@Hugh A. Miles II)
|
||||
- [14257](https://github.com/apache/superset/pull/14257) chore: WebSocket server improvements (#14257) (@Ben Reinhart)
|
||||
- [14354](https://github.com/apache/superset/pull/14354) chore: add some basic instrumentation to Node WebSocket server (#14354) (@Ben Reinhart)
|
||||
- [13811](https://github.com/apache/superset/pull/13811) chore: add success log whenever a connection is working (#13811) (@Hugh A. Miles II)
|
||||
- [14355](https://github.com/apache/superset/pull/14355) chore: bump 0.17.38 (#14355) (@Amit Miran)
|
||||
- [13953](https://github.com/apache/superset/pull/13953) chore: bump @superset-ui/plugin-chart-table to 0.17.28 (#13953) (@Jesse Yang)
|
||||
- [14222](https://github.com/apache/superset/pull/14222) chore: bump package.json (#14222) (@Amit Miran)
|
||||
- [14253](https://github.com/apache/superset/pull/14253) chore: bump superset-ui (#14253) (@Erik Ritter)
|
||||
- [14460](https://github.com/apache/superset/pull/14460) chore: bump table plugin to 0.17.42 (#14460) (@Amit Miran)
|
||||
- [13932](https://github.com/apache/superset/pull/13932) chore: bump to new superset-ui version (#13932) (@Amit Miran)
|
||||
- [13374](https://github.com/apache/superset/pull/13374) chore: convert chartReducer to TypeScript (#13374) (@Jesse Yang)
|
||||
- [13450](https://github.com/apache/superset/pull/13450) chore: disable drag metrics and columns in datasourcePanel (#13450) (@Yongjie Zhao)
|
||||
- [13342](https://github.com/apache/superset/pull/13342) chore: improve modal error handling (#13342) (@Lily Kuang)
|
||||
- [13596](https://github.com/apache/superset/pull/13596) chore: metric refactor iteration 1 (#13596) (@Yongjie Zhao)
|
||||
- [13296](https://github.com/apache/superset/pull/13296) chore: migrating some LESS (#13296) (@Evan Rusackas)
|
||||
- [14169](https://github.com/apache/superset/pull/14169) chore: rename connection errors (#14169) (@Beto Dealmeida)
|
||||
- [13970](https://github.com/apache/superset/pull/13970) chore: starter make file (#13970) (@Hugh A. Miles II)
|
||||
- [14088](https://github.com/apache/superset/pull/14088) chore: stop logging `SupersetExceptions` if status < 500 (#14088) (@Hugh A. Miles II)
|
||||
- [14178](https://github.com/apache/superset/pull/14178) chore: type some SQL Lab components (#14178) (@Erik Ritter)
|
||||
- [14152](https://github.com/apache/superset/pull/14152) chore: update RELEASING readme (#14152) (@Lily Kuang)
|
||||
- [13104](https://github.com/apache/superset/pull/13104) chore: update docs for new alerts and reporting feature (#13104) (@leocape)
|
||||
- [14033](https://github.com/apache/superset/pull/14033) chore: well component to card component(Updating PR #12200) (#14033) (@Bruno Motta)
|
||||
- [13518](https://github.com/apache/superset/pull/13518) ci: increase page size of GH PR API call (#13518) (@Ville Brofeldt)
|
||||
- [14350](https://github.com/apache/superset/pull/14350) ci: set remote URL to https and bump sha (#14350) (@Daniel Vaz Gaspar)
|
||||
- [14211](https://github.com/apache/superset/pull/14211) ci: use git submodules for Chart Actions (#14211) (@jawabuu)
|
||||
- [13587](https://github.com/apache/superset/pull/13587) create better link for badge (#13587) (@Elizabeth Thompson)
|
||||
- [13626](https://github.com/apache/superset/pull/13626) dynamic dttm fix for test_convert_dttm (#13626) (@Nikola Gigić)
|
||||
- [14140](https://github.com/apache/superset/pull/14140) horizontal scroll (#14140) (@AAfghahi)
|
||||
- [13367](https://github.com/apache/superset/pull/13367) npm audit security updates (#13367) (@Elizabeth Thompson)
|
||||
- [14443](https://github.com/apache/superset/pull/14443) perf(native-filters): Load native filters after charts (#14443) (@simcha90)
|
||||
- [14408](https://github.com/apache/superset/pull/14408) perf(native-filters): avoid unnecessary reloading of charts (#14408) (@simcha90)
|
||||
- [14035](https://github.com/apache/superset/pull/14035) refactor(addslicecontainer): move slice container panel from bootstrap panel to ant-d (#14035) (@Phillip Kelley-Dotson)
|
||||
- [14366](https://github.com/apache/superset/pull/14366) refactor(db_engine_specs): Removing top-level import of app (#14366) (@John Bodley)
|
||||
- [13221](https://github.com/apache/superset/pull/13221) refactor(explore): convert ControlPanelsContainer to typescript (#13221) (@Jesse Yang)
|
||||
- [13437](https://github.com/apache/superset/pull/13437) refactor(native-filters): Move `filtersState` to `dataMask` redux root (#13437) (@simcha90)
|
||||
- [14441](https://github.com/apache/superset/pull/14441) refactor(native-filters): allow cascading only for filter_select (#14441) (@simcha90)
|
||||
- [13723](https://github.com/apache/superset/pull/13723) refactor(native-filters): refactor filter bar (#13723) (@simcha90)
|
||||
- [13983](https://github.com/apache/superset/pull/13983) refactor(native-filters): update dataMask and ExtraFormData schema (#13983) (@simcha90)
|
||||
- [13137](https://github.com/apache/superset/pull/13137) refactor(self-trigger): Split native filters state (#13137) (@simcha90)
|
||||
- [14090](https://github.com/apache/superset/pull/14090) refactor(userInfo): userinfo panel to styled component (#14090) (@Phillip Kelley-Dotson)
|
||||
- [14100](https://github.com/apache/superset/pull/14100) refactor: Boostrap to AntD - Row/Col (#14100) (@Michael S. Molina)
|
||||
- [14048](https://github.com/apache/superset/pull/14048) refactor: Boostrap to AntD - Tabs (#14048) (@Michael S. Molina)
|
||||
- [14106](https://github.com/apache/superset/pull/14106) refactor: Bootstrap to AntD - Form - iteration 1 (#14106) (@Michael S. Molina)
|
||||
- [13996](https://github.com/apache/superset/pull/13996) refactor: Bootstrap to AntD - ListGroup (#13996) (@Michael S. Molina)
|
||||
- [13989](https://github.com/apache/superset/pull/13989) refactor: Bootstrap to AntD - Slider (#13989) (@Michael S. Molina)
|
||||
- [13218](https://github.com/apache/superset/pull/13218) refactor: Introduce api resource hooks, fetch owners for chart errors (#13218) (@David Aaron Suddjian)
|
||||
- [12229](https://github.com/apache/superset/pull/12229) refactor: New Icon system with Enhanced Antd Custom Icon (#12229) (@Geido)
|
||||
- [13797](https://github.com/apache/superset/pull/13797) refactor: New schedule query button (#13797) (@AAfghahi)
|
||||
- [13102](https://github.com/apache/superset/pull/13102) refactor: Query search into functional component (#13102) (@AAfghahi)
|
||||
- [13785](https://github.com/apache/superset/pull/13785) refactor: Revert "refactor: ScheduleQueryButton into functional component (#134… (#13785) (@Hugh A. Miles II)
|
||||
- [13443](https://github.com/apache/superset/pull/13443) refactor: ScheduleQueryButton into functional component (#13443) (@AAfghahi)
|
||||
- [13630](https://github.com/apache/superset/pull/13630) refactor: Share sql lab query (#13630) (@AAfghahi)
|
||||
- [13676](https://github.com/apache/superset/pull/13676) refactor: SouthPane into functional component (#13676) (@AAfghahi)
|
||||
- [13417](https://github.com/apache/superset/pull/13417) refactor: add set data mask to build query (#13417) (@simcha90)
|
||||
- [13401](https://github.com/apache/superset/pull/13401) refactor: convert controlUtils to TypeScript (1 of 2) (#13401) (@Jesse Yang)
|
||||
- [13520](https://github.com/apache/superset/pull/13520) refactor: convert controlUtils to TypeScript (2 of 2) (#13520) (@Jesse Yang)
|
||||
- [13877](https://github.com/apache/superset/pull/13877) refactor: move CTAS/CVAS field II (#13877) (@Hugh A. Miles II)
|
||||
- [14309](https://github.com/apache/superset/pull/14309) refactor: reorganize dateFilterUtils.tx (#14309) (@Yongjie Zhao)
|
||||
- [13174](https://github.com/apache/superset/pull/13174) sql Lab buttons (#13174) (@AAfghahi)
|
||||
- [13537](https://github.com/apache/superset/pull/13537) switch message content between chart and dashboard AlertReportModal (#13537) (@Lily Kuang)
|
||||
- [14371](https://github.com/apache/superset/pull/14371) test(maximize-chart): Add tests to maximize chart action (#14371) (@simcha90)
|
||||
- [14245](https://github.com/apache/superset/pull/14245) test(native-filters): Filter config modal test (#14245) (@simcha90)
|
||||
- [14098](https://github.com/apache/superset/pull/14098) test(native-filters): add integration tests for filter bar (#14098) (@simcha90)
|
||||
- [13973](https://github.com/apache/superset/pull/13973) test: Add tests for Dashboard Header and HeaderActionsDropdown components (#13973) (@Geido)
|
||||
- [13517](https://github.com/apache/superset/pull/13517) test: Adds storybook and tests to AsyncEsmComponent (#13517) (@Michael S. Molina)
|
||||
- [13547](https://github.com/apache/superset/pull/13547) test: Adds storybook and tests to PopoverDropdown component (#13547) (@Michael S. Molina)
|
||||
- [13516](https://github.com/apache/superset/pull/13516) test: Adds storybook to AlteredSliceTag component (#13516) (@Michael S. Molina)
|
||||
- [13406](https://github.com/apache/superset/pull/13406) test: Adds storybook to AnchorLink component (#13406) (@Michael S. Molina)
|
||||
- [13412](https://github.com/apache/superset/pull/13412) test: Adds storybook to ConfirmStatusChange component (#13412) (@Michael S. Molina)
|
||||
- [13482](https://github.com/apache/superset/pull/13482) test: Adds storybook to Dropdown and DropdownButton components (#13482) (@Michael S. Molina)
|
||||
- [13362](https://github.com/apache/superset/pull/13362) test: Adds storybook to EditableTitle component (#13362) (@Michael S. Molina)
|
||||
- [13407](https://github.com/apache/superset/pull/13407) test: Adds storybook to FormRow component (#13407) (@Michael S. Molina)
|
||||
- [13415](https://github.com/apache/superset/pull/13415) test: Adds storybook to IconTooltip component (#13415) (@Michael S. Molina)
|
||||
- [13410](https://github.com/apache/superset/pull/13410) test: Adds storybook to SearchInput component (#13410) (@Michael S. Molina)
|
||||
- [13479](https://github.com/apache/superset/pull/13479) test: Adds storybook to Switch component (#13479) (@Michael S. Molina)
|
||||
- [13343](https://github.com/apache/superset/pull/13343) test: Adds storybook to Timer component (#13343) (@Michael S. Molina)
|
||||
- [13457](https://github.com/apache/superset/pull/13457) test: Adds tests and storybook to CertifiedIcon component (#13457) (@Michael S. Molina)
|
||||
- [13438](https://github.com/apache/superset/pull/13438) test: Adds tests and storybook to PopoverSection component (#13438) (@Michael S. Molina)
|
||||
- [13409](https://github.com/apache/superset/pull/13409) test: Adds tests and storybook to RefreshLabel (#13409) (@Michael S. Molina)
|
||||
- [13705](https://github.com/apache/superset/pull/13705) test: Adds tests for the FixedOrMetricControl component (#13705) (@Michael S. Molina)
|
||||
- [13299](https://github.com/apache/superset/pull/13299) test: Adds tests to TableLoader component (#13299) (@Michael S. Molina)
|
||||
- [13319](https://github.com/apache/superset/pull/13319) test: Adds tests to URLShortLinkButton component (#13319) (@Michael S. Molina)
|
||||
- [13650](https://github.com/apache/superset/pull/13650) test: Adds tests to dnd controls (#13650) (@Michael S. Molina)
|
||||
- [13664](https://github.com/apache/superset/pull/13664) test: Adds tests to the AdvancedFrame component (#13664) (@Michael S. Molina)
|
||||
- [13748](https://github.com/apache/superset/pull/13748) test: Adds tests to the AnnotationLayer component (#13748) (@Michael S. Molina)
|
||||
- [13933](https://github.com/apache/superset/pull/13933) test: Adds tests to the CssEditor component (#13933) (@Michael S. Molina)
|
||||
- [13675](https://github.com/apache/superset/pull/13675) test: Adds tests to the CustomFrame component (#13675) (@Michael S. Molina)
|
||||
- [13729](https://github.com/apache/superset/pull/13729) test: Adds tests to the OptionControls component (#13729) (@Michael S. Molina)
|
||||
- [13892](https://github.com/apache/superset/pull/13892) test: Adds tests to the PublishedStatus component (#13892) (@Michael S. Molina)
|
||||
- [13712](https://github.com/apache/superset/pull/13712) test: Adds tests to the TimeSeriesColumnControl component (#13712) (@Michael S. Molina)
|
||||
- [13919](https://github.com/apache/superset/pull/13919) test: Adds tests to the UndoRedoKeyListeners component (#13919) (@Michael S. Molina)
|
||||
- [13887](https://github.com/apache/superset/pull/13887) test: Adds tests to the filter scope components (#13887) (@Michael S. Molina)
|
||||
- [13787](https://github.com/apache/superset/pull/13787) test: AdhocMetricEditPopover (#13787) (@Bruno Motta)
|
||||
- [13318](https://github.com/apache/superset/pull/13318) test: CacheLabel (#13318) (@Bruno Motta)
|
||||
- [13656](https://github.com/apache/superset/pull/13656) test: CollectionControl (#13656) (@Bruno Motta)
|
||||
- [13549](https://github.com/apache/superset/pull/13549) test: CronPicker (#13549) (@Bruno Motta)
|
||||
- [13875](https://github.com/apache/superset/pull/13875) test: CrossFilterScopingForm (#13875) (@Bruno Motta)
|
||||
- [13668](https://github.com/apache/superset/pull/13668) test: DataTableControl (#13668) (@Bruno Motta)
|
||||
- [13736](https://github.com/apache/superset/pull/13736) test: DataTablesPane (#13736) (@Bruno Motta)
|
||||
- [13581](https://github.com/apache/superset/pull/13581) test: DatabaseSelector (#13581) (@Bruno Motta)
|
||||
- [13605](https://github.com/apache/superset/pull/13605) test: DatasourceControl (#13605) (@Bruno Motta)
|
||||
- [13627](https://github.com/apache/superset/pull/13627) test: DatasourcePanelDragWrapper (#13627) (@Bruno Motta)
|
||||
- [13750](https://github.com/apache/superset/pull/13750) test: DisplayQueryButton (#13750) (@Bruno Motta)
|
||||
- [13745](https://github.com/apache/superset/pull/13745) test: Enhance tests and directory structure for FilterControl components (#13745) (@Geido)
|
||||
- [13276](https://github.com/apache/superset/pull/13276) test: ErrorBoundary dedicated directory and tests (#13276) (@Geido)
|
||||
- [13358](https://github.com/apache/superset/pull/13358) test: ErrorMessage components tests (#13358) (@Geido)
|
||||
- [13753](https://github.com/apache/superset/pull/13753) test: FilterBoxItemControl (#13753) (@Bruno Motta)
|
||||
- [14028](https://github.com/apache/superset/pull/14028) test: FilterSets-utils (#14028) (@Bruno Motta)
|
||||
- [13548](https://github.com/apache/superset/pull/13548) test: Fixes PropertiesModal_spec (#13548) (@Michael S. Molina)
|
||||
- [13270](https://github.com/apache/superset/pull/13270) test: FormLabel dedicated directory and tests (#13270) (@Geido)
|
||||
- [13302](https://github.com/apache/superset/pull/13302) test: Menu component tests (#13302) (@Geido)
|
||||
- [13277](https://github.com/apache/superset/pull/13277) test: Pagination component (#13277) (@Bruno Motta)
|
||||
- [13818](https://github.com/apache/superset/pull/13818) test: PropertiesModal (#13818) (@Bruno Motta)
|
||||
- [13931](https://github.com/apache/superset/pull/13931) test: PropertiesModal (Dashboard) (#13931) (@Bruno Motta)
|
||||
- [13799](https://github.com/apache/superset/pull/13799) test: Refactor and enhance tests for the Explore DatasourcePanel Component (#13799) (@Geido)
|
||||
- [13638](https://github.com/apache/superset/pull/13638) test: SelectAsyncControl (#13638) (@Bruno Motta)
|
||||
- [13860](https://github.com/apache/superset/pull/13860) test: ShareMenuItems (#13860) (@Bruno Motta)
|
||||
- [13888](https://github.com/apache/superset/pull/13888) test: SliceHeader (#13888) (@Bruno Motta)
|
||||
- [13895](https://github.com/apache/superset/pull/13895) test: SliceHeaderControls (#13895) (@Bruno Motta)
|
||||
- [13937](https://github.com/apache/superset/pull/13937) test: Tab (#13937) (@Bruno Motta)
|
||||
- [13583](https://github.com/apache/superset/pull/13583) test: TableCollection (#13583) (@Bruno Motta)
|
||||
- [13941](https://github.com/apache/superset/pull/13941) test: Tabs (#13941) (@Bruno Motta)
|
||||
- [13502](https://github.com/apache/superset/pull/13502) test: Tests and Storybook entry for the IndeterminateCheckbox Component (#13502) (@Geido)
|
||||
- [13501](https://github.com/apache/superset/pull/13501) test: Tests and Storybook entry for the TableView Component (#13501) (@Geido)
|
||||
- [13508](https://github.com/apache/superset/pull/13508) test: Tests and dedicated directory for the SupersetResourceSelect Component (#13508) (@Geido)
|
||||
- [13916](https://github.com/apache/superset/pull/13916) test: Tests audit for the Dashboard FilterBar (#13916) (@Geido)
|
||||
- [13286](https://github.com/apache/superset/pull/13286) test: Tests for DeleteModal component (#13286) (@Bruno Motta)
|
||||
- [13305](https://github.com/apache/superset/pull/13305) test: Tests for OmniContainer (#13305) (@Bruno Motta)
|
||||
- [13513](https://github.com/apache/superset/pull/13513) test: Tests, dedicated directory and Storybook for the Badge component (#13513) (@Geido)
|
||||
- [13534](https://github.com/apache/superset/pull/13534) test: Tests, dedicated directory and Storybook for the ProgressBar component (#13534) (@Geido)
|
||||
- [13751](https://github.com/apache/superset/pull/13751) test: changing logger.exception to logger.errors in databases api (#13751) (@AAfghahi)
|
||||
- [13719](https://github.com/apache/superset/pull/13719) test: exploreUtils (#13719) (@Bruno Motta)
|
||||
- [13329](https://github.com/apache/superset/pull/13329) test: optimize codecov config (#13329) (@Jesse Yang)
|
||||
- [13984](https://github.com/apache/superset/pull/13984) test: prevent flaky frontend unit test case (#13984) (@Yongjie Zhao)
|
||||
- [13320](https://github.com/apache/superset/pull/13320) test: tests for component FaveStar (#13320) (@Bruno Motta)
|
||||
- [13555](https://github.com/apache/superset/pull/13555) test: useChangeEffect (#13555) (@Bruno Motta)
|
||||
- [13554](https://github.com/apache/superset/pull/13554) test: usePrevious hook (#13554) (@Bruno Motta)
|
||||
- [13873](https://github.com/apache/superset/pull/13873) tests for FilterIndicator (#13873) (@Bruno Motta)
|
||||
- [13896](https://github.com/apache/superset/pull/13896) tests for function handleScroll (#13896) (@Bruno Motta)
|
||||
- [14363](https://github.com/apache/superset/pull/14363) update default cron settings for new alerts and reports (#14363) (@Sam Faber-Manning)
|
||||
- [13463](https://github.com/apache/superset/pull/13463) update test (#13463) (@Lily Kuang)
|
||||
- [13897](https://github.com/apache/superset/pull/13897) updates load_examples to load-examples (#13897) (@Alex Simoes)
|
||||
- [14009](https://github.com/apache/superset/pull/14009) use dynamic time_grains for schema (#14009) (@Elizabeth Thompson)
|
||||
- [13424](https://github.com/apache/superset/pull/13424) use semver for badge sort (#13424) (@Elizabeth Thompson)
|
||||
|
||||
### 1.1 (Wed Feb 24 12:08:28 2021 +0200)
|
||||
|
||||
|
||||
@@ -77,6 +77,8 @@ little bit helps, and credit will always be given.
|
||||
- [Python Testing](#python-testing)
|
||||
- [Frontend Testing](#frontend-testing)
|
||||
- [Integration Testing](#integration-testing)
|
||||
- [Debugging Server App](#debugging-server-app)
|
||||
- [Debugging Server App in Kubernetes Environment](#debugging-server-app-in-kubernetes-environment)
|
||||
- [Storybook](#storybook)
|
||||
- [Translating](#translating)
|
||||
- [Enabling language selection](#enabling-language-selection)
|
||||
@@ -418,9 +420,10 @@ For example, the image referenced above actually lives in `superset-frontend/ima
|
||||
|
||||
#### OS Dependencies
|
||||
|
||||
Make sure your machine meets the [OS dependencies](https://superset.apache.org/docs/installation/installing-superset-from-scratch#os-dependencies) before following these steps.
|
||||
Make sure your machine meets the [OS dependencies](https://superset.apache.org/docs/installation/installing-superset-from-scratch#os-dependencies) before following these steps.
|
||||
You also need to install MySQL or [MariaDB](https://mariadb.com/downloads).
|
||||
|
||||
Ensure Python versions >3.7, Then proceed with:
|
||||
Ensure that you are using Python version 3.7 or 3.8, then proceed with:
|
||||
|
||||
````bash
|
||||
# Create a virtual environment and activate it (recommended)
|
||||
@@ -428,12 +431,12 @@ python3 -m venv venv # setup a python3 virtualenv
|
||||
source venv/bin/activate
|
||||
|
||||
# Install external dependencies
|
||||
pip install -r requirements/local.txt
|
||||
pip install -r requirements/testing.txt
|
||||
|
||||
# Install Superset in editable (development) mode
|
||||
pip install -e .
|
||||
|
||||
# Create an admin user in your metadata database
|
||||
# Create an admin user in your metadata database (use `admin` as username to be able to load the examples)
|
||||
superset fab create-admin
|
||||
|
||||
# Initialize the database
|
||||
@@ -442,13 +445,15 @@ superset db upgrade
|
||||
# Create default roles and permissions
|
||||
superset init
|
||||
|
||||
# Load some data to play with (you must create an Admin user with the username `admin` for this command to work)
|
||||
# Load some data to play with.
|
||||
# Note: you MUST have previously created an admin user with the username `admin` for this command to work.
|
||||
superset load-examples
|
||||
|
||||
# Start the Flask dev web server from inside your virtualenv.
|
||||
# Note that your page may not have css at this point.
|
||||
# Note that your page may not have CSS at this point.
|
||||
# See instructions below how to build the front-end assets.
|
||||
FLASK_ENV=development superset run -p 8088 --with-threads --reload --debugger
|
||||
```
|
||||
|
||||
Or you can install via our Makefile
|
||||
|
||||
@@ -473,6 +478,17 @@ via `.flaskenv`, however if needed, it should be set to `superset.app:create_app
|
||||
If you have made changes to the FAB-managed templates, which are not built the same way as the newer, React-powered front-end assets, you need to start the app without the `--with-threads` argument like so:
|
||||
`FLASK_ENV=development superset run -p 8088 --reload --debugger`
|
||||
|
||||
#### Dependencies
|
||||
|
||||
If you add a new requirement or update an existing requirement (per the `install_requires` section in `setup.py`) you must recompile (freeze) the Python dependencies to ensure that for CI, testing, etc. the build is deterministic. This can be achieved via,
|
||||
|
||||
```bash
|
||||
$ python3 -m venv venv
|
||||
$ source venv/bin/activate
|
||||
$ python3 -m pip install -r requirements/integration.txt
|
||||
$ pip-compile-multi --no-upgrade
|
||||
```
|
||||
|
||||
#### Logging to the browser console
|
||||
|
||||
This feature is only available on Python 3. When debugging your application, you can have the server logs sent directly to the browser console using the [ConsoleLog](https://github.com/betodealmeida/consolelog) package. You need to mutate the app, by adding the following to your `config.py` or `superset_config.py`:
|
||||
@@ -767,7 +783,7 @@ npm run test -- path/to/file.js
|
||||
We use [Cypress](https://www.cypress.io/) for integration tests. Tests can be run by `tox -e cypress`. To open Cypress and explore tests first setup and run test server:
|
||||
|
||||
```bash
|
||||
export SUPERSET_CONFIG=tests.superset_test_config
|
||||
export SUPERSET_CONFIG=tests.integration_tests.superset_test_config
|
||||
export SUPERSET_TESTENV=true
|
||||
export ENABLE_REACT_CRUD_VIEWS=true
|
||||
export CYPRESS_BASE_URL="http://localhost:8081"
|
||||
@@ -1371,6 +1387,7 @@ Note not all fields are correctly catagorized. The fields vary based on visualiz
|
||||
| Field | Type | Notes |
|
||||
| ------------------------------------------------------------------------------------------------------ | ------------------------------------------------- | ------------------------------------------------- |
|
||||
| `adhoc_filters` | _array(object)_ | The **Filters** widget |
|
||||
| `extra_filters` | _array(object)_ | Another pathway to the **Filters** widget.<br/>It is generally used to pass dashboard filter parameters to a chart.<br/>It can be used for appending additional filters to a chart that has been saved with its own filters on an ad-hoc basis if the chart is being used as a standalone widget.<br/><br/>For implementation examples see : [utils test.py](https://github.com/apache/superset/blob/66a4c94a1ed542e69fe6399bab4c01d4540486cf/tests/utils_tests.py#L181)<br/>For insight into how superset processes the contents of this parameter see: [exploreUtils/index.js](https://github.com/apache/superset/blob/93c7f5bb446ec6895d7702835f3157426955d5a9/superset-frontend/src/explore/exploreUtils/index.js#L159) |
|
||||
| `columns` | _array(string)_ | The **Breakdowns** widget |
|
||||
| `groupby` | _array(string)_ | The **Group by** or **Series** widget |
|
||||
| `limit` | _number_ | The **Series Limit** widget |
|
||||
@@ -1417,7 +1434,6 @@ Note the `y_axis_format` is defined under various section for some charts.
|
||||
| `default_filters` | _N/A_ | |
|
||||
| `entity` | _N/A_ | |
|
||||
| `expanded_slices` | _N/A_ | |
|
||||
| `extra_filters` | _N/A_ | |
|
||||
| `filter_immune_slice_fields` | _N/A_ | |
|
||||
| `filter_immune_slices` | _N/A_ | |
|
||||
| `flt_col_0` | _N/A_ | |
|
||||
|
||||
@@ -18,6 +18,6 @@ under the License.
|
||||
-->
|
||||
# INSTALL / BUILD instructions for Apache Superset
|
||||
|
||||
At this time, the docker file at RELEASING/Dockerfile.from_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.
|
||||
|
||||
@@ -15,6 +15,9 @@
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
# Python version installed; we need 3.8 or 3.7
|
||||
PYTHON=`command -v python3.8 || command -v python3.7`
|
||||
|
||||
.PHONY: install superset venv pre-commit
|
||||
|
||||
install: superset pre-commit
|
||||
@@ -59,8 +62,9 @@ update-js:
|
||||
|
||||
venv:
|
||||
# Create a virtual environment and activate it (recommended)
|
||||
python3 -m venv venv # setup a python3 virtualenv
|
||||
source venv/bin/activate
|
||||
if ! [ -x "${PYTHON}" ]; then echo "You need Python 3.7 or 3.8 installed"; exit 1; fi
|
||||
test -d venv || ${PYTHON} -m venv venv # setup a python3 virtualenv
|
||||
. venv/bin/activate
|
||||
|
||||
pre-commit:
|
||||
# setup pre commit dependencies
|
||||
@@ -72,5 +76,8 @@ format: py-format js-format
|
||||
py-format: pre-commit
|
||||
pre-commit run black --all-files
|
||||
|
||||
py-lint: pre-commit
|
||||
pylint -j 0 superset
|
||||
|
||||
js-format:
|
||||
cd superset-frontend; npm run prettier
|
||||
|
||||
@@ -121,6 +121,7 @@ Here are some of the major database solutions that are supported:
|
||||
<img src="superset-frontend/images/monet-db.png" alt="monet-db" border="0" width="106" height="46" />
|
||||
<img src="superset-frontend/images/apache-kylin.png" alt="apache-kylin" border="0" width="56" height="64"/>
|
||||
<img src="superset-frontend/images/hologres.png" alt="hologres" border="0" width="71" height="64"/>
|
||||
<img src="superset-frontend/images/netezza.png" alt="netezza" border="0" width="64" height="64"/>
|
||||
</p>
|
||||
|
||||
**A more comprehensive list of supported databases** along with the configuration instructions can be found
|
||||
|
||||
@@ -29,7 +29,9 @@ on the Superset Slack. People crafting releases and those interested in
|
||||
partaking in the process should join the channel.
|
||||
|
||||
## Release notes for recent releases
|
||||
- [1.0.0](release-notes-1-0/README.md)
|
||||
- [1.2](release-notes-1-2/README.md)
|
||||
- [1.1](release-notes-1-1/README.md)
|
||||
- [1.0](release-notes-1-0/README.md)
|
||||
- [0.38](release-notes-0-38/README.md)
|
||||
|
||||
## Release setup (First Time Only)
|
||||
@@ -197,6 +199,7 @@ Now let's ship this RC into svn's dev folder
|
||||
cd ~/svn/superset_dev/
|
||||
svn add ${SUPERSET_VERSION_RC}
|
||||
svn commit -m "Release ${SUPERSET_VERSION_RC}"
|
||||
svn update
|
||||
```
|
||||
|
||||
### Build and test from SVN source tarball
|
||||
@@ -270,6 +273,7 @@ cd ~/svn/superset/
|
||||
for f in ${SUPERSET_VERSION}/*; do mv "$f" "${f/${SUPERSET_VERSION_RC}/${SUPERSET_VERSION}}"; done
|
||||
svn add ${SUPERSET_VERSION}
|
||||
svn commit -m "Release ${SUPERSET_VERSION}"
|
||||
svn update
|
||||
```
|
||||
|
||||
Then tag the final release:
|
||||
|
||||
@@ -24,6 +24,7 @@ from dataclasses import dataclass
|
||||
from typing import Any, Dict, Iterator, List, Optional, Union
|
||||
|
||||
import click
|
||||
from click.core import Context
|
||||
|
||||
try:
|
||||
from github import BadCredentialsException, Github, PullRequest, Repository
|
||||
@@ -50,7 +51,7 @@ class GitLog:
|
||||
author_email: str = ""
|
||||
|
||||
def __eq__(self, other: object) -> bool:
|
||||
""" A log entry is considered equal if it has the same PR number """
|
||||
"""A log entry is considered equal if it has the same PR number"""
|
||||
if isinstance(other, self.__class__):
|
||||
return other.pr_number == self.pr_number
|
||||
return False
|
||||
@@ -170,7 +171,7 @@ class GitChangeLog:
|
||||
|
||||
def _parse_change_log(
|
||||
self, changelog: Dict[str, str], pr_info: Dict[str, str], github_login: str,
|
||||
):
|
||||
) -> None:
|
||||
formatted_pr = (
|
||||
f"- [#{pr_info.get('id')}]"
|
||||
f"(https://github.com/{SUPERSET_REPO}/pull/{pr_info.get('id')}) "
|
||||
@@ -324,8 +325,8 @@ def print_title(message: str) -> None:
|
||||
@click.pass_context
|
||||
@click.option("--previous_version", help="The previous release version", required=True)
|
||||
@click.option("--current_version", help="The current release version", required=True)
|
||||
def cli(ctx, previous_version: str, current_version: str) -> None:
|
||||
""" Welcome to change log generator """
|
||||
def cli(ctx: Context, previous_version: str, current_version: str) -> None:
|
||||
"""Welcome to change log generator"""
|
||||
previous_logs = GitLogs(previous_version)
|
||||
current_logs = GitLogs(current_version)
|
||||
previous_logs.fetch()
|
||||
@@ -337,7 +338,7 @@ def cli(ctx, previous_version: str, current_version: str) -> None:
|
||||
@cli.command("compare")
|
||||
@click.pass_obj
|
||||
def compare(base_parameters: BaseParameters) -> None:
|
||||
""" Compares both versions (by PR) """
|
||||
"""Compares both versions (by PR)"""
|
||||
previous_logs = base_parameters.previous_logs
|
||||
current_logs = base_parameters.current_logs
|
||||
print_title(
|
||||
@@ -369,7 +370,7 @@ def compare(base_parameters: BaseParameters) -> None:
|
||||
def change_log(
|
||||
base_parameters: BaseParameters, csv: str, access_token: str, risk: bool
|
||||
) -> None:
|
||||
""" Outputs a changelog (by PR) """
|
||||
"""Outputs a changelog (by PR)"""
|
||||
previous_logs = base_parameters.previous_logs
|
||||
current_logs = base_parameters.current_logs
|
||||
previous_diff_logs = previous_logs.diff(current_logs)
|
||||
|
||||
@@ -0,0 +1,122 @@
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
|
||||
# Release Notes for Superset 1.2
|
||||
|
||||
Superset 1.2 continues the Apache ECharts migration by introducing several chart types. It also brings with it tons of user experience improvements, API improvements, bug fixes, and continued development of experimental features included in previous releases. Keep reading for more details on these categories:
|
||||
|
||||
- [**User Experience**](#user-experience)
|
||||
- [**Dashboard Level Security**](#dashboard-level-security)
|
||||
- [**Database Connectivity**](#database-connectivity)
|
||||
- [**Developer Experience**](#developer-experience)
|
||||
- [**PR Highlights**](#pr-highlights)
|
||||
- [**Breaking Changes and Full Changelog**](#breaking-changes-and-full-changelog)
|
||||
|
||||
# User Experience
|
||||
|
||||
The migration to Apache ECharts continues by introducing several new high-quality visualizations in this release.
|
||||
|
||||
The mixed time-series multi chart allows different kinds of time-series visualization to be overlayed.
|
||||
|
||||

|
||||
|
||||
The radar chart provides a good way to compare two or more groups over various features of interest.
|
||||
|
||||

|
||||
|
||||
By popular demand, we have introduced a new and improved version of the pivot table visualization as well.
|
||||
|
||||

|
||||
|
||||
Several UI tweaks in Explore and SQL Lab made it into this release as well, including new buttons and menu options to make common workflows easier, as well as more communicative error messages, particularly in the database connection menus.
|
||||
|
||||
The dashboard native filter feature, [while still behind a feature flag in this release](https://github.com/apache/superset/blob/master/RELEASING/release-notes-1-0/README.md#feature-flags), has received plenty of new functionality and is closer than ever to being ready for prime-time. This feature provides a way to apply and manipulate filters over many charts at the dashboard level. 1.2 adds more controls, more options for aggregations, and better support for temporal filters, among other things.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
Last but not least, the alerts and reports feature and its dependencies have been added to the [docker-compose](https://superset.apache.org/docs/installation/installing-superset-using-docker-compose) setup, making it easier to use outside of well-supported enterprise deployments.
|
||||
|
||||
|
||||
# Dashboard Level Security
|
||||
|
||||
Superset has so far relied on a role-based access system implemented at the dataset level. While this provides granular security options that satisfy many use cases, some organizations need more options. [SIP-51](https://github.com/apache/superset/issues/10408) lays out a vision for dashboard-level role-based access control as a fully backwards compatible extension to Superset's security options.
|
||||
|
||||
The 1.1 release saw steps taken in the direction of this vision, and 1.2 builds on that with new permissions for sharing charts and dashboards that can be assigned to roles. **Note that this functionality is still experimental and hidden behind a feature flag as of 1.2.**
|
||||
|
||||

|
||||
|
||||
# Database Connectivity
|
||||
The 1.2 release adds support for [Crate DB](https://github.com/apache/superset/pull/13152) and the [Databricks DB](https://github.com/apache/superset/pull/13682) engine spec.
|
||||
|
||||
|
||||
# Developer Experience
|
||||
Expanding the API has been an ongoing effort, and 1.2 introduces several new API routes to allow developers to get available databases, get a given dashboard's charts, and import saved queries, among other things.
|
||||
|
||||
# PR Highlights
|
||||
|
||||
**New Charts and User Experience**
|
||||
|
||||
- [14197](https://github.com/apache/superset/pull/14197) feat(viz): add mixed and radar chart (#14197) (@Ville Brofeldt)
|
||||
- [14187](https://github.com/apache/superset/pull/14187) Enable the new pivot table (#14187) (@Kamil Gabryjelski)
|
||||
- [13210](https://github.com/apache/superset/pull/13210) feat(explore): ColumnSelectControl with drag-and-drop (#13210) (@Yongjie Zhao)
|
||||
- [13598](https://github.com/apache/superset/pull/13598) feat(explore): Drag and drop UX improvements (#13598) (@Kamil Gabryjelski)
|
||||
- [13294](https://github.com/apache/superset/pull/13294) feat(explore): Postgres datatype conversion (#13294) (@Nikola Gigić)
|
||||
- [13758](https://github.com/apache/superset/pull/13758) feat(explore): adhoc column formatting for Table chart (#13758) (@Jesse Yang)
|
||||
|
||||
**Progress On Dashboard Native Filters**
|
||||
|
||||
- [13726](https://github.com/apache/superset/pull/13726) feat(native-filters): Add default first value to select filter (#13726) (@simcha90)
|
||||
- [14461](https://github.com/apache/superset/pull/14461) feat(native-filters): Auto apply changes in FiltersConfigModal (#14461) (@simcha90)
|
||||
- [13507](https://github.com/apache/superset/pull/13507) feat(native-filters): Filter set tabs (#13507) (@simcha90)
|
||||
- [14313](https://github.com/apache/superset/pull/14313) feat(native-filters): Implement adhoc filters and time picker in Range and Select native filters (#14313) (@Kamil Gabryjelski)
|
||||
- [14261](https://github.com/apache/superset/pull/14261) feat(native-filters): Show/Hide filter bar by metdata ff (#14261) (@simcha90)
|
||||
- [13506](https://github.com/apache/superset/pull/13506) feat(native-filters): Update filter bar buttons (#13506) (@simcha90)
|
||||
- [14374](https://github.com/apache/superset/pull/14374) feat(native-filters): Use datasets in dashboard as default options for native filters (#14374) (@Kamil Gabryjelski)
|
||||
- [14314](https://github.com/apache/superset/pull/14314) feat(native-filters): add option to create value in select filter (#14314) (@Ville Brofeldt)
|
||||
- [14346](https://github.com/apache/superset/pull/14346) feat(native-filters): add optional sort metric to select filter (#14346) (@Ville Brofeldt)
|
||||
- [14375](https://github.com/apache/superset/pull/14375) feat(native-filters): add refresh button to default value picker (#14375) (@Ville Brofeldt)
|
||||
- [13569](https://github.com/apache/superset/pull/13569) feat(native-filters): add sort option to select filter (#13569) (@Ville Brofeldt)
|
||||
- [13622](https://github.com/apache/superset/pull/13622) feat(native-filters): add temporal support to select filter (#13622) (@Ville Brofeldt)
|
||||
- [13484](https://github.com/apache/superset/pull/13484) feat(native-filters): add timegrain and column filter (#13484) (@Ville Brofeldt)
|
||||
- [14312](https://github.com/apache/superset/pull/14312) feat(native-filters): add tooltip to control values (#14312) (@Ville Brofeldt)
|
||||
- [14217](https://github.com/apache/superset/pull/14217) feat(native-filters): select group by support (#14217) (@Amit Miran)
|
||||
|
||||
**Progress On Dashboard Level Access**
|
||||
|
||||
- [13145](https://github.com/apache/superset/pull/13145) feat(dashboard_rbac): manage roles for dashboard (#13145) (@simcha90)
|
||||
- [13992](https://github.com/apache/superset/pull/13992) feat(dashboard_rbac): provide data access based on dashboard access (#13992) (@Amit Miran)
|
||||
- [#12865](https://github.com/apache/superset/pull/12865) feat(dashboard_rbac): dashboards API support for roles create/update + roles validation (@amitmiran137)
|
||||
|
||||
|
||||
**Improvements to Developer Experience**
|
||||
|
||||
- [14208](https://github.com/apache/superset/pull/14208) feat: add endpoint to fetch available DBs (#14208) (@Beto Dealmeida)
|
||||
- [13331](https://github.com/apache/superset/pull/13331) fix(query-object): extra time-range-endpoints (#13331) (@John Bodley)
|
||||
- [13893](https://github.com/apache/superset/pull/13893) feat: create backend routes and API for importing saved queries (#13893) (@AAfghahi)
|
||||
- [13960](https://github.com/apache/superset/pull/13960) feat: initial work to make v1 API compatible with SIP-40 and SIP-41 (#13960) (@Beto Dealmeida)
|
||||
- [13444](https://github.com/apache/superset/pull/13444) fix: API to allow importing old exports (JSON/YAML) (#13444) (@Beto Dealmeida)
|
||||
- [13893](https://github.com/apache/superset/pull/13893) feat: create backend routes and API for importing saved queries (#13893) (@AAfghahi)
|
||||
|
||||
|
||||
## Breaking Changes and Full Changelog
|
||||
|
||||
- To see the complete changelog in this release, head to [CHANGELOG.MD](https://github.com/apache/superset/blob/master/CHANGELOG.md).
|
||||
- In line with the semantic versioning scheme adopted by the community, 1.2.0 does not contain any backwards incompatible changes.
|
||||
|
After Width: | Height: | Size: 542 KiB |
|
After Width: | Height: | Size: 383 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 576 KiB |
|
After Width: | Height: | Size: 217 KiB |
|
After Width: | Height: | Size: 37 KiB |
@@ -17,7 +17,9 @@
|
||||
#
|
||||
import smtplib
|
||||
import ssl
|
||||
from typing import List
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from click.core import Context
|
||||
|
||||
try:
|
||||
import jinja2
|
||||
@@ -50,7 +52,7 @@ def send_email(
|
||||
sender_email: str,
|
||||
receiver_email: str,
|
||||
message: str,
|
||||
):
|
||||
) -> None:
|
||||
"""
|
||||
Send a simple text email (SMTP)
|
||||
"""
|
||||
@@ -61,7 +63,7 @@ def send_email(
|
||||
server.sendmail(sender_email, receiver_email, message)
|
||||
|
||||
|
||||
def render_template(template_file: str, **kwargs) -> str:
|
||||
def render_template(template_file: str, **kwargs: Any) -> str:
|
||||
"""
|
||||
Simple render template based on named parameters
|
||||
|
||||
@@ -73,7 +75,9 @@ def render_template(template_file: str, **kwargs) -> str:
|
||||
return template.render(kwargs)
|
||||
|
||||
|
||||
def inter_send_email(username, password, sender_email, receiver_email, message):
|
||||
def inter_send_email(
|
||||
username: str, password: str, sender_email: str, receiver_email: str, message: str
|
||||
) -> None:
|
||||
print("--------------------------")
|
||||
print("SMTP Message")
|
||||
print("--------------------------")
|
||||
@@ -102,16 +106,16 @@ def inter_send_email(username, password, sender_email, receiver_email, message):
|
||||
|
||||
class BaseParameters(object):
|
||||
def __init__(
|
||||
self, email=None, username=None, password=None, version=None, version_rc=None
|
||||
):
|
||||
self, email: str, username: str, password: str, version: str, version_rc: str,
|
||||
) -> None:
|
||||
self.email = email
|
||||
self.username = username
|
||||
self.password = password
|
||||
self.version = version
|
||||
self.version_rc = version_rc
|
||||
self.template_arguments = dict()
|
||||
self.template_arguments: Dict[str, Any] = {}
|
||||
|
||||
def __repr__(self):
|
||||
def __repr__(self) -> str:
|
||||
return f"Apache Credentials: {self.email}/{self.username}/{self.version}/{self.version_rc}"
|
||||
|
||||
|
||||
@@ -133,8 +137,15 @@ class BaseParameters(object):
|
||||
)
|
||||
@click.option("--version", envvar="SUPERSET_VERSION")
|
||||
@click.option("--version_rc", envvar="SUPERSET_VERSION_RC")
|
||||
def cli(ctx, apache_email, apache_username, apache_password, version, version_rc):
|
||||
""" Welcome to releasing send email CLI interface! """
|
||||
def cli(
|
||||
ctx: Context,
|
||||
apache_email: str,
|
||||
apache_username: str,
|
||||
apache_password: str,
|
||||
version: str,
|
||||
version_rc: str,
|
||||
) -> None:
|
||||
"""Welcome to releasing send email CLI interface!"""
|
||||
base_parameters = BaseParameters(
|
||||
apache_email, apache_username, apache_password, version, version_rc
|
||||
)
|
||||
@@ -155,7 +166,7 @@ def cli(ctx, apache_email, apache_username, apache_password, version, version_rc
|
||||
prompt="The receiver email (To:)",
|
||||
)
|
||||
@click.pass_obj
|
||||
def vote_pmc(base_parameters, receiver_email):
|
||||
def vote_pmc(base_parameters: BaseParameters, receiver_email: str) -> None:
|
||||
template_file = "email_templates/vote_pmc.j2"
|
||||
base_parameters.template_arguments["receiver_email"] = receiver_email
|
||||
message = render_template(template_file, **base_parameters.template_arguments)
|
||||
@@ -202,13 +213,13 @@ def vote_pmc(base_parameters, receiver_email):
|
||||
)
|
||||
@click.pass_obj
|
||||
def result_pmc(
|
||||
base_parameters,
|
||||
receiver_email,
|
||||
vote_bindings,
|
||||
vote_nonbindings,
|
||||
vote_negatives,
|
||||
vote_thread,
|
||||
):
|
||||
base_parameters: BaseParameters,
|
||||
receiver_email: str,
|
||||
vote_bindings: str,
|
||||
vote_nonbindings: str,
|
||||
vote_negatives: str,
|
||||
vote_thread: str,
|
||||
) -> None:
|
||||
template_file = "email_templates/result_pmc.j2"
|
||||
base_parameters.template_arguments["receiver_email"] = receiver_email
|
||||
base_parameters.template_arguments["vote_bindings"] = string_comma_to_list(
|
||||
@@ -239,7 +250,7 @@ def result_pmc(
|
||||
prompt="The receiver email (To:)",
|
||||
)
|
||||
@click.pass_obj
|
||||
def announce(base_parameters, receiver_email):
|
||||
def announce(base_parameters: BaseParameters, receiver_email: str) -> None:
|
||||
template_file = "email_templates/announce.j2"
|
||||
base_parameters.template_arguments["receiver_email"] = receiver_email
|
||||
message = render_template(template_file, **base_parameters.template_arguments)
|
||||
|
||||
@@ -25,7 +25,6 @@ These features are considered **unfinished** and should only be used on developm
|
||||
- CLIENT_CACHE
|
||||
- DASHBOARD_CACHE
|
||||
- DASHBOARD_NATIVE_FILTERS_SET
|
||||
- DASHBOARD_RBAC
|
||||
- DISABLE_DATASET_SOURCE_EDIT
|
||||
- ENABLE_EXPLORE_JSON_CSRF_PROTECTION
|
||||
- KV_STORE
|
||||
@@ -49,6 +48,7 @@ These features are **finished** but currently being tested. They are usable, but
|
||||
These features flags are **safe for production** and have been tested.
|
||||
|
||||
- DASHBOARD_CROSS_FILTERS
|
||||
- DASHBOARD_RBAC [(docs)](https://superset.apache.org/docs/creating-charts-dashboards/first-dashboard#manage-access-to-dashboards)
|
||||
- ESCAPE_MARKDOWN_HTML
|
||||
- ENABLE_TEMPLATE_PROCESSING
|
||||
- LISTVIEWS_DEFAULT_CARD_VIEW
|
||||
|
||||
@@ -79,6 +79,7 @@ Join our growing community!
|
||||
- [FBK - ICT center](http://ict.fbk.eu)
|
||||
- [GfK Data Lab](http://datalab.gfk.com) [@mherr]
|
||||
- [GrowthSimple](https://growthsimple.ai/)
|
||||
- [Hydrolix](https://www.hydrolix.io/)
|
||||
- [Intercom](https://www.intercom.com/) [@kate-gallo]
|
||||
- [jampp](https://jampp.com/)
|
||||
- [Konfío](http://konfio.mx) [@uis-rodriguez]
|
||||
@@ -110,7 +111,7 @@ Join our growing community!
|
||||
- [Douban](https://www.douban.com/) [@luchuan]
|
||||
- [Kuaishou](https://www.kuaishou.com/) [@zhaoyu89730105]
|
||||
- [Netflix](https://www.netflix.com/)
|
||||
- [TME QQMUSIC/WESING](https://www.tencentmusic.com/)
|
||||
- [TME QQMUSIC/WESING](https://www.tencentmusic.com/)[@shenyuanli,@marklaw]
|
||||
- [Xite](https://xite.com/) [@shashankkoppar]
|
||||
- [Zaihang](http://www.zaih.com/)
|
||||
|
||||
@@ -118,6 +119,7 @@ Join our growing community!
|
||||
- [Brilliant.org](https://brilliant.org/)
|
||||
- [Udemy](https://www.udemy.com/) [@sungjuly]
|
||||
- [VIPKID](https://www.vipkid.com.cn/) [@illpanda]
|
||||
- [Sunbird](https://www.sunbird.org/) [@eksteporg]
|
||||
|
||||
### Energy
|
||||
- [Airboxlab](https://foobot.io) [@antoine-galataud]
|
||||
|
||||
@@ -23,6 +23,9 @@ This file documents any backwards-incompatible changes in Superset and
|
||||
assists people when migrating to a new version.
|
||||
|
||||
## Next
|
||||
- [15909](https://github.com/apache/incubator-superset/pull/15909): a change which
|
||||
drops a uniqueness criterion (which may or may not have existed) to the tables table. This constraint was obsolete as it is handled by the ORM due to differences in how MySQL, PostgreSQL, etc. handle uniqueness for NULL values.
|
||||
|
||||
- [13772](https://github.com/apache/superset/pull/13772): Row level security (RLS) is now enabled by default. To activate the feature, please run `superset init` to expose the RLS menus to Admin users.
|
||||
|
||||
- [13980](https://github.com/apache/superset/pull/13980): Data health checks no longer use the metadata database as an interim cache. Though non-breaking, deployments which implement complex logic should likely memoize the callback function. Refer to documentation in the confg.py file for more detail.
|
||||
|
||||
@@ -118,6 +118,9 @@ services:
|
||||
depends_on: *superset-depends-on
|
||||
user: *superset-user
|
||||
volumes: *superset-volumes
|
||||
# Bump memory limit if processing selenium / thumbails on superset-worker
|
||||
# mem_limit: 2038m
|
||||
# mem_reservation: 128M
|
||||
|
||||
superset-worker-beat:
|
||||
image: *superset-image
|
||||
|
||||
@@ -24,58 +24,52 @@ Docker is an easy way to get started with Superset.
|
||||
## Prerequisites
|
||||
|
||||
1. Docker! [link](https://www.docker.com/get-started)
|
||||
1. Docker-compose [link](https://docs.docker.com/compose/install/)
|
||||
2. Docker-compose [link](https://docs.docker.com/compose/install/)
|
||||
|
||||
## Configuration
|
||||
|
||||
The `/app/pythonpath` folder is mounted from [./docker/pythonpath_dev](./docker/pythonpath_dev)
|
||||
which contains a base configuration [./docker/pythonpath_dev/superset_config.py](./docker/pythonpath_dev/superset_config.py)
|
||||
The `/app/pythonpath` folder is mounted from [`./docker/pythonpath_dev`](./pythonpath_dev)
|
||||
which contains a base configuration [`./docker/pythonpath_dev/superset_config.py`](./pythonpath_dev/superset_config.py)
|
||||
intended for use with local development.
|
||||
|
||||
### Local overrides
|
||||
|
||||
In order to override configuration settings locally, simply make a copy of [./docker/pythonpath_dev/superset_config_local.example](./docker/pythonpath_dev/superset_config_local.example)
|
||||
into [./docker/pythonpath_dev/superset_config_docker.py](./docker/pythonpath_dev/superset_config_docker.py) (git ignored) and fill in your overrides.
|
||||
In order to override configuration settings locally, simply make a copy of [`./docker/pythonpath_dev/superset_config_local.example`](./pythonpath_dev/superset_config_local.example)
|
||||
into `./docker/pythonpath_dev/superset_config_docker.py` (git ignored) and fill in your overrides.
|
||||
|
||||
### Local packages
|
||||
|
||||
If you want to add python packages in order to test things like DBs locally, you can simply add a local requirements.txt (./docker/requirements-local.txt)
|
||||
and rebuild your docker stack.
|
||||
If you want to add Python packages in order to test things like databases locally, you can simply add a local requirements.txt (`./docker/requirements-local.txt`)
|
||||
and rebuild your Docker stack.
|
||||
|
||||
Steps:
|
||||
1. Create ./docker/requirements-local.txt
|
||||
2. Add your new packages
|
||||
3. Rebuild docker-compose
|
||||
a. `docker-compose down -v`
|
||||
b. `docker-compose up`
|
||||
|
||||
1. Create `./docker/requirements-local.txt`
|
||||
2. Add your new packages
|
||||
3. Rebuild docker-compose
|
||||
1. `docker-compose down -v`
|
||||
2. `docker-compose up`
|
||||
|
||||
## Initializing Database
|
||||
|
||||
The DB will initialize itself upon startup via the init container (superset-init)
|
||||
(This may take a minute.)
|
||||
The database will initialize itself upon startup via the init container ([`superset-init`](./docker-init.sh)). This may take a minute.
|
||||
|
||||
## Normal Operation
|
||||
|
||||
To run the container, simply run:
|
||||
To run the container, simply run: `docker-compose up`
|
||||
|
||||
```bash
|
||||
docker-compose up
|
||||
```
|
||||
|
||||
After several minutes for superset initialization to finish, you can open a browser and view [`http://localhost:8088`](http://localhost:8088)
|
||||
After waiting several minutes for Superset initialization to finish, you can open a browser and view [`http://localhost:8088`](http://localhost:8088)
|
||||
to start your journey.
|
||||
|
||||
## Developing
|
||||
|
||||
While running, the container server will reload on modification of the superset python and javascript source code.
|
||||
While running, the container server will reload on modification of the Superset Python and JavaScript source code.
|
||||
Don't forget to reload the page to take the new frontend into account though.
|
||||
|
||||
## Production
|
||||
|
||||
It is also possible to run Superset in non-development mode: in the `docker-compose.yml` file remove
|
||||
the volumes needed for development and change the variable `SUPERSET_ENV` to `production`.
|
||||
It is possible to run Superset in non-development mode by using [`docker-compose-non-dev.yml`](../docker-compose-non-dev.yml). This file excludes the volumes needed for development and uses [`./docker/.env-non-dev`](./.env-non-dev) which sets the variable `SUPERSET_ENV` to `production`.
|
||||
|
||||
## Resource Constraints
|
||||
|
||||
If you are attempting to build on a Mac and it exits with 137 you need to increase your docker resources.
|
||||
OSX instructions: https://docs.docker.com/docker-for-mac/#advanced (Search for memory)
|
||||
If you are attempting to build on macOS and it exits with 137 you need to increase your Docker resources. See instructions [here](https://docs.docker.com/docker-for-mac/#advanced) (search for memory)
|
||||
|
||||
@@ -21,7 +21,7 @@ set -eo pipefail
|
||||
REQUIREMENTS_LOCAL="/app/docker/requirements-local.txt"
|
||||
# If Cypress run – overwrite the password for admin and export env variables
|
||||
if [ "$CYPRESS_CONFIG" == "true" ]; then
|
||||
export SUPERSET_CONFIG=tests.superset_test_config
|
||||
export SUPERSET_CONFIG=tests.integration_tests.superset_test_config
|
||||
export SUPERSET_TESTENV=true
|
||||
export ENABLE_REACT_CRUD_VIEWS=true
|
||||
export SUPERSET__SQLALCHEMY_DATABASE_URI=postgresql+psycopg2://superset:superset@db:5432/superset
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
import logging
|
||||
import os
|
||||
from datetime import timedelta
|
||||
from typing import Optional
|
||||
|
||||
from cachelib.file import FileSystemCache
|
||||
from celery.schedules import crontab
|
||||
@@ -30,7 +31,7 @@ from celery.schedules import crontab
|
||||
logger = logging.getLogger()
|
||||
|
||||
|
||||
def get_env_variable(var_name, default=None):
|
||||
def get_env_variable(var_name: str, default: Optional[str] = None) -> str:
|
||||
"""Get the environment variable or raise exception."""
|
||||
try:
|
||||
return os.environ[var_name]
|
||||
@@ -63,8 +64,8 @@ SQLALCHEMY_DATABASE_URI = "%s://%s:%s@%s:%s/%s" % (
|
||||
|
||||
REDIS_HOST = get_env_variable("REDIS_HOST")
|
||||
REDIS_PORT = get_env_variable("REDIS_PORT")
|
||||
REDIS_CELERY_DB = get_env_variable("REDIS_CELERY_DB", 0)
|
||||
REDIS_RESULTS_DB = get_env_variable("REDIS_RESULTS_DB", 1)
|
||||
REDIS_CELERY_DB = get_env_variable("REDIS_CELERY_DB", "0")
|
||||
REDIS_RESULTS_DB = get_env_variable("REDIS_RESULTS_DB", "1")
|
||||
|
||||
RESULTS_BACKEND = FileSystemCache("/app/superset_home/sqllab")
|
||||
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
# 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.
|
||||
|
||||
publish:
|
||||
whoami: asf-site
|
||||
|
||||
staging:
|
||||
whoami: asf-site
|
||||
@@ -443,7 +443,7 @@ This is an optional feature that can be turned on by activating its feature flag
|
||||
}
|
||||
|
||||
|
||||
For this feature you will need a cache system and celery workers. All thumbnails are store on cache and are processed
|
||||
For this feature you will need a cache system and celery workers. All thumbnails are stored on cache and are processed
|
||||
asynchronously by the workers.
|
||||
|
||||
An example config where images are stored on S3 could be:
|
||||
@@ -1571,6 +1571,7 @@ Second step: Create a `CustomSsoSecurityManager` that extends `SupersetSecurityM
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
import logging
|
||||
from superset.security import SupersetSecurityManager
|
||||
|
||||
class CustomSsoSecurityManager(SupersetSecurityManager):
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
],
|
||||
"license": "0BSD",
|
||||
"scripts": {
|
||||
"build": "gatsby build && cp .htaccess public/",
|
||||
"build": "gatsby build && cp .htaccess .asf.yaml public/",
|
||||
"develop": "gatsby develop",
|
||||
"develop-ga": "GATSBY_GTAG_DEBUG=true gatsby develop",
|
||||
"format": "prettier --write \"**/*.{js,jsx,ts,tsx,json,md,mdx}\"",
|
||||
|
||||
|
After Width: | Height: | Size: 53 KiB |
@@ -53,12 +53,18 @@ Rebuild your local image with the new driver baked in:
|
||||
docker-compose build --force-rm
|
||||
```
|
||||
|
||||
After the rebuild is complete, which make take a few minutes, relaunch:
|
||||
After the rebuild of the Docker images is complete (which make take a few minutes) you can relaunch using the following command:
|
||||
|
||||
```
|
||||
docker-compose up
|
||||
```
|
||||
|
||||
The other option is to start Superset via Docker Compose is using the recipe in `docker-compose-non-dev.yml`, which will use pre-built frontend assets and skip the building of front-end assets:
|
||||
|
||||
```
|
||||
docker-compose -f docker-compose-non-dev.yml up
|
||||
```
|
||||
|
||||
### 3. Connect to MySQL
|
||||
|
||||
Now that you've got a MySQL driver installed locally, you should be able to test it out.
|
||||
|
||||
@@ -14,7 +14,7 @@ The recommended connector library for Dremio is
|
||||
The expected connection string for ODBC (Default port is 31010) is formatted as follows:
|
||||
|
||||
```
|
||||
dremio://{username}:{password}@{host}:{port}/dremio
|
||||
dremio://{username}:{password}@{host}:{port}/{database_name}/dremio?SSL=1
|
||||
```
|
||||
The expected connection string for Arrow Flight (Dremio 4.9.1+. Default port is 32010) is formatted as follows:
|
||||
|
||||
|
||||
@@ -44,6 +44,7 @@ A list of some of the recommended packages.
|
||||
|[Google Sheets](/docs/databases/google-sheets)|```pip install shillelagh[gsheetsapi]```|```gsheets://```|
|
||||
|[Hologres](/docs/databases/hologres)|```pip install psycopg2```|```postgresql+psycopg2://<UserName>:<DBPassword>@<Database Host>/<Database Name>```|
|
||||
|[IBM Db2](/docs/databases/ibm-db2)|```pip install ibm_db_sa```|```db2+ibm_db://```|
|
||||
|[IBM Netezza Performance Server](/docs/databases/netezza)|```pip install nzalchemy```|```netezza+nzpy://<UserName>:<DBPassword>@<Database Host>/<Database Name>```|
|
||||
|[MySQL](/docs/databases/mysql)|```pip install mysqlclient```|```mysql://<UserName>:<DBPassword>@<Database Host>/<Database Name>```|
|
||||
|[Oracle](/docs/databases/oracle)|```pip install cx_Oracle```|```oracle://```|
|
||||
|[PostgreSQL](/docs/databases/postgresql)|```pip install psycopg2```|```postgresql://<UserName>:<DBPassword>@<Database Host>/<Database Name>```|
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
---
|
||||
name: IBM Netezza Performance Server
|
||||
menu: Connecting to Databases
|
||||
route: /docs/databases/netezza
|
||||
index: 19
|
||||
version: 1
|
||||
---
|
||||
|
||||
## IBM Netezza Performance Server
|
||||
|
||||
The [nzalchemy](https://pypi.org/project/nzalchemy/) library provides a
|
||||
Python / SQLAlchemy interface to IBM Netezza Performance Server (aka Netezza).
|
||||
|
||||
Here's the recommended connection string:
|
||||
|
||||
```
|
||||
netezza+nzpy://{username}:{password}@{hostname}:{port}/{database}
|
||||
```
|
||||
@@ -0,0 +1,77 @@
|
||||
---
|
||||
name: Using Database Connection UI
|
||||
menu: Connecting to Databases
|
||||
route: /docs/databases/db-connection-ui
|
||||
index: 1
|
||||
version: 1
|
||||
---
|
||||
|
||||
Here is the documentation on how to leverage the new DB Connection UI. This will provide admins the ability to enhance the UX for users who want to connect to new databases.
|
||||
|
||||

|
||||
|
||||
There are now 3 steps when connecting to a database in the new UI:
|
||||
|
||||
Step 1: First the admin must inform superset what engine they want to connect to. This page is powered by the `/available` endpoint which pulls on the engines currently installed in your environment, so that only supported databases are shown.
|
||||
|
||||
Step 2: Next, the admin is prompted to enter database specific parameters. Depending on whether there is a dynamic form available for that specific engine, the admin will either see the new custom form or the legacy SQLAlchemy form. We currently have built dynamic forms for (Redshift, MySQL, Postgres, and BigQuery). The new form prompts the user for the parameters needed to connect (for example, username, password, host, port, etc.) and provides immediate feedback on errors.
|
||||
|
||||
Step 3: Finally, once the admin has connected to their DB using the dynamic form they have the opportunity to update any optional advanced settings.
|
||||
|
||||
We hope this feature will help eliminate a huge bottleneck for users to get into the application and start crafting datasets.
|
||||
|
||||
### How to setup up preferred database options and images
|
||||
|
||||
We added a new configuration option where the admin can define their preferred databases, in order:
|
||||
|
||||
```python
|
||||
# A list of preferred databases, in order. These databases will be
|
||||
# displayed prominently in the "Add Database" dialog. You should
|
||||
# use the "engine_name" attribute of the corresponding DB engine spec
|
||||
# in `superset/db_engine_specs/`.
|
||||
PREFERRED_DATABASES: List[str] = [
|
||||
"PostgreSQL",
|
||||
"Presto",
|
||||
"MySQL",
|
||||
"SQLite",
|
||||
]
|
||||
```
|
||||
|
||||
For copyright reasons the logos for each database are not distributed with Superset.
|
||||
|
||||
### Setting images
|
||||
|
||||
- To set the images of your preferred database, admins must create a mapping in the `superset_text.yml` file with engine and location of the image. The image can be host locally inside your static/file directory or online (e.g. S3)
|
||||
|
||||
```python
|
||||
DB_IMAGES:
|
||||
postgresql: "path/to/image/postgres.jpg"
|
||||
bigquery: "path/to/s3bucket/bigquery.jpg"
|
||||
snowflake: "path/to/image/snowflake.jpg"
|
||||
```
|
||||
|
||||
### How to add new database engines to available endpoint
|
||||
|
||||
Currently the new modal supports the following databases:
|
||||
|
||||
- Postgres
|
||||
- Redshift
|
||||
- MySQL
|
||||
- BigQuery
|
||||
|
||||
When the user selects a database not in this list they will see the old dialog asking for the SQLAlchemy URI. New databases can be added gradually to the new flow. In order to support the rich configuration a DB engine spec needs to have the following attributes:
|
||||
|
||||
1. `parameters_schema`: a Marshmallow schema defining the parameters needed to configure the database. For Postgres this includes username, password, host, port, etc. ([see](https://github.com/apache/superset/blob/accee507c0819cd0d7bcfb5a3e1199bc81eeebf2/superset/db_engine_specs/base.py#L1309-L1320)).
|
||||
2. `default_driver`: the name of the recommended driver for the DB engine spec. Many SQLAlchemy dialects support multiple drivers, but usually one is the official recommendation. For Postgres we use "psycopg2".
|
||||
3. `sqlalchemy_uri_placeholder`: a string that helps the user in case they want to type the URI directly.
|
||||
4. `encryption_parameters`: parameters used to build the URI when the user opts for an encrypted connection. For Postgres this is `{"sslmode": "require"}`.
|
||||
|
||||
In addition, the DB engine spec must implement these class methods:
|
||||
|
||||
- `build_sqlalchemy_uri(cls, parameters, encrypted_extra)`: this method receives the distinct parameters and builds the URI from them.
|
||||
- `get_parameters_from_uri(cls, uri, encrypted_extra)`: this method does the opposite, extracting the parameters from a given URI.
|
||||
- `validate_parameters(cls, parameters)`: this method is used for `onBlur` validation of the form. It should return a list of `SupersetError` indicating which parameters are missing, and which parameters are definitely incorrect ([example](https://github.com/apache/superset/blob/accee507c0819cd0d7bcfb5a3e1199bc81eeebf2/superset/db_engine_specs/base.py#L1404)).
|
||||
|
||||
For databases like MySQL and Postgres that use the standard format of `engine+driver://user:password@host:port/dbname` all you need to do is add the `BasicParametersMixin` to the DB engine spec, and then define the parameters 2-4 (`parameters_schema` is already present in the mixin).
|
||||
|
||||
For other databases you need to implement these methods yourself. The BigQuery DB engine spec is a good example of how to do that.
|
||||
@@ -66,7 +66,7 @@ Navigate to **Data ‣ Datasets** and select the **+ Dataset** button in the top
|
||||
|
||||
A modal window should pop up in front of you. Select your **Database**,
|
||||
**Schema**, and **Table** using the drop downs that appear. In the following example,
|
||||
we register the **cleaned_sales_data** table from the **examples** database.
|
||||
we register the **Vehicle Sales** table from the **examples** database.
|
||||
|
||||
<img src="/images/tutorial_09_add_new_table.png" />
|
||||
|
||||
@@ -172,3 +172,19 @@ into a position you like onto the underlying grid.
|
||||
Congrats! You’ve successfully linked, analyzed, and visualized data in Superset. There are a wealth
|
||||
of other table configuration and visualization options, so please start exploring and creating
|
||||
slices and dashboards of your own
|
||||
|
||||
ֿ
|
||||
### Manage access to Dashboards
|
||||
|
||||
|
||||
Access to dashboards is managed via owners (users that have edit permissions to the dashboard)
|
||||
|
||||
Non-owner users access can be managed two different ways:
|
||||
|
||||
1. Dataset permissions - if you add to the relevant role permissions to datasets it automatically grants implict access to all dashboards that uses those permitted datasets
|
||||
2. Dashboard roles - if you enable **DASHBOARD_RBAC** feature flag then you be able to manage which roles can access the dashboard
|
||||
- Having dashboard access implicitly grants read access to the associated datasets, therefore
|
||||
all charts will load their data even if feature flag is turned on and no roles assigned
|
||||
to roles the access will fallback to **Dataset permissions**
|
||||
|
||||
<img src="/images/tutorial_dashboard_access.png" />
|
||||
|
||||
@@ -263,3 +263,75 @@ The database is currently running too many queries.
|
||||
```
|
||||
|
||||
The database might be under heavy load, running too many queries. Please try again later, or contact an administrator for further assistance.
|
||||
|
||||
## Issue 1028
|
||||
|
||||
```
|
||||
One or more parameters specified in the query are malformatted.
|
||||
```
|
||||
|
||||
The query contains one or more malformed template parameters. Please check your query and confirm that all template parameters are surround by double braces, for example, "{{ ds }}". Then, try running your query again.
|
||||
|
||||
## Issue 1029
|
||||
|
||||
```
|
||||
The object does not exist in this database.
|
||||
```
|
||||
|
||||
Either the schema, column, or table do not exist in the database.
|
||||
|
||||
## Issue 1030
|
||||
|
||||
```
|
||||
The query potentially has a syntax error.
|
||||
```
|
||||
|
||||
The query might have a syntax error. Please check and run again.
|
||||
|
||||
## Issue 1031
|
||||
|
||||
```
|
||||
The results backend no longer has the data from the query.
|
||||
```
|
||||
|
||||
The results from the query might have been deleted from the results backend after some period. Please re-run your query.
|
||||
|
||||
## Issue 1032
|
||||
|
||||
```
|
||||
The query associated with the results was deleted.
|
||||
```
|
||||
|
||||
The query associated with the stored results no longer exists. Please re-run your query.
|
||||
|
||||
## Issue 1033
|
||||
|
||||
```
|
||||
The results stored in the backend were stored in a different format, and no longer can be deserialized.
|
||||
```
|
||||
|
||||
The query results were stored in a format that is no longer supported. Please re-run your query.
|
||||
|
||||
## Issue 1034
|
||||
|
||||
```
|
||||
The database port provided is invalid.
|
||||
```
|
||||
|
||||
Please check that the provided database port is an integer between 0 and 65535 (inclusive).
|
||||
|
||||
## Issue 1035
|
||||
|
||||
```
|
||||
Failed to start remote query on a worker.
|
||||
```
|
||||
|
||||
The query was not started by an asynchronous worker. Please reach out to your administrator for further assistance.
|
||||
|
||||
## Issue 1036
|
||||
|
||||
```
|
||||
The database was deleted.
|
||||
```
|
||||
|
||||
The operation failed because the database referenced no longer exists. Please reach out to your administrator for further assistance.
|
||||
|
||||
@@ -38,6 +38,7 @@ To send alerts and reports to Slack channels, you need to create a new Slack App
|
||||
3. Go to "OAuth & Permissions" section, and give the following scopes to your app:
|
||||
- `incoming-webhook`
|
||||
- `files:write`
|
||||
- `chat:write`
|
||||
4. At the top of the "OAuth and Permissions" section, click "install to workspace".
|
||||
5. Select a default channel for your app and continue.
|
||||
(You can post to any channel by inviting your Superset app into that channel).
|
||||
|
||||
@@ -71,7 +71,7 @@ FEATURE_FLAGS = {
|
||||
}
|
||||
```
|
||||
|
||||
For this feature you will need a cache system and celery workers. All thumbnails are store on cache
|
||||
For this feature you will need a cache system and celery workers. All thumbnails are stored on cache
|
||||
and are processed asynchronously by the workers.
|
||||
|
||||
An example config where images are stored on S3 could be:
|
||||
|
||||
@@ -154,6 +154,7 @@ Then, create a `CustomSsoSecurityManager` that extends `SupersetSecurityManager`
|
||||
`oauth_user_info`:
|
||||
|
||||
```python
|
||||
import logging
|
||||
from superset.security import SupersetSecurityManager
|
||||
|
||||
class CustomSsoSecurityManager(SupersetSecurityManager):
|
||||
|
||||
@@ -100,3 +100,13 @@ username: admin
|
||||
```bash
|
||||
password: admin
|
||||
```
|
||||
|
||||
|
||||
### 5. Connecting your local database instance to superset
|
||||
|
||||
When running Superset using `docker` or `docker-compose` it runs in its own docker container, as if the Superset was running in a separate machine entirely. Therefore attempts to connect to your local database with hostname `localhost` won't work as `localhost` refers to the docker container Superset is running in, and not your actual host machine. Fortunately, docker provides an easy way to access network resources in the host machine from inside a container, and we will leverage this capability to connect to our local database instance.
|
||||
|
||||
Here the instructions are for connecting to postgresql (which is running on your host machine) from Superset (which is running in its docker container). Other databases may have slightly different configurations but gist would be same and boils down to 2 steps -
|
||||
|
||||
1. **(Mac users may skip this step)** Configuring the local postgresql/database instance to accept public incoming connections. By default postgresql only allows incoming connections from `localhost` only, but re-iterating once again, `localhosts` are different for host machine and docker container. For postgresql this involves make one-line changes to the files `postgresql.conf` and `pg_hba.conf`, you can find helpful links tailored to your OS / PG version on the web easily for this task. For docker it suffices to only whitelist IPs `172.0.0.0/8` instead of `*`, but in any case you are *warned* that doing this in a production database *may* have disastrous consequences as you are opening your database to the public internet.
|
||||
2. Instead of `localhost`, try using `host.docker.internal` (Mac users) or `172.18.0.1` (Linux users) as the host name when attempting to connect to the database. This is docker internal detail, what is happening is that in Mac systems docker creates a dns entry for the host name `host.docker.internal` which resolves to the correct address for the host machine, whereas in linux this is not the case (at least by default). If neither of these 2 hostnames work then you may want to find the exact host name you want to use, for that you can do `ifconfig` or `ip addr show` and look at the IP address of `docker0` interface that must have been created by docker for you. Alternately if you don't even see the `docker0` interface try (if needed with sudo) `docker network inspect bridge` and see if there is an entry for `"Gateway"` and note the IP address.
|
||||
|
||||
@@ -32,7 +32,7 @@ cross-domain request).
|
||||
|
||||
Add the following setting in your `superset_config.py` file:
|
||||
|
||||
- `SUPERSET_WEBSERVER_DOMAINS`: list of allowed hostnames for domain shareding feature.
|
||||
- `SUPERSET_WEBSERVER_DOMAINS`: list of allowed hostnames for domain sharding feature.
|
||||
|
||||
### Middleware
|
||||
|
||||
|
||||
@@ -235,4 +235,9 @@ export const Databases = [
|
||||
href: 'https://www.alibabacloud.com/product/hologres',
|
||||
imgName: 'hologres.png',
|
||||
},
|
||||
{
|
||||
title: 'IBM Netezza Performance Server',
|
||||
href: 'https://www.ibm.com/products/netezza',
|
||||
imgName: 'netezza.png',
|
||||
},
|
||||
];
|
||||
|
||||
|
After Width: | Height: | Size: 46 KiB |
@@ -22,13 +22,13 @@ maintainers:
|
||||
- name: craig-rueda
|
||||
email: craig@craigrueda.com
|
||||
url: https://github.com/craig-rueda
|
||||
version: 0.2.1
|
||||
version: 0.3.5
|
||||
dependencies:
|
||||
- name: postgresql
|
||||
version: 10.2.0
|
||||
repository: https://charts.bitnami.com/bitnami
|
||||
condition: postgresql.enabled
|
||||
- name: redis
|
||||
version: 12.3.0
|
||||
version: 12.3.3
|
||||
repository: https://charts.bitnami.com/bitnami
|
||||
condition: redis.enabled
|
||||
|
||||
@@ -69,7 +69,7 @@ spec:
|
||||
env:
|
||||
- name: "SUPERSET_PORT"
|
||||
value: {{ .Values.service.port | quote}}
|
||||
{{ if .Values.extraEnv }}
|
||||
{{- if .Values.extraEnv }}
|
||||
{{- range $key, $value := .Values.extraEnv }}
|
||||
- name: {{ $key | quote}}
|
||||
value: {{ $value | quote }}
|
||||
@@ -78,6 +78,10 @@ spec:
|
||||
envFrom:
|
||||
- secretRef:
|
||||
name: {{ tpl .Values.envFromSecret . | quote }}
|
||||
{{- range .Values.envFromSecrets }}
|
||||
- secretRef:
|
||||
name: {{ tpl . $ | quote }}
|
||||
{{- end }}
|
||||
volumeMounts:
|
||||
- name: superset-config
|
||||
mountPath: {{ .Values.configMountPath | quote }}
|
||||
|
||||
@@ -70,7 +70,7 @@ spec:
|
||||
env:
|
||||
- name: "SUPERSET_PORT"
|
||||
value: {{ .Values.service.port | quote}}
|
||||
{{ if .Values.extraEnv }}
|
||||
{{- if .Values.extraEnv }}
|
||||
{{- range $key, $value := .Values.extraEnv }}
|
||||
- name: {{ $key | quote}}
|
||||
value: {{ $value | quote }}
|
||||
@@ -79,6 +79,10 @@ spec:
|
||||
envFrom:
|
||||
- secretRef:
|
||||
name: {{ tpl .Values.envFromSecret . | quote }}
|
||||
{{- range .Values.envFromSecrets }}
|
||||
- secretRef:
|
||||
name: {{ tpl . $ | quote }}
|
||||
{{- end }}
|
||||
volumeMounts:
|
||||
- name: superset-config
|
||||
mountPath: {{ .Values.configMountPath | quote }}
|
||||
|
||||
@@ -73,7 +73,7 @@ spec:
|
||||
env:
|
||||
- name: "SUPERSET_PORT"
|
||||
value: {{ .Values.service.port | quote}}
|
||||
{{ if .Values.extraEnv }}
|
||||
{{- if .Values.extraEnv }}
|
||||
{{- range $key, $value := .Values.extraEnv }}
|
||||
- name: {{ $key | quote}}
|
||||
value: {{ $value | quote }}
|
||||
@@ -82,6 +82,10 @@ spec:
|
||||
envFrom:
|
||||
- secretRef:
|
||||
name: {{ tpl .Values.envFromSecret . | quote }}
|
||||
{{- range .Values.envFromSecrets }}
|
||||
- secretRef:
|
||||
name: {{ tpl . $ | quote }}
|
||||
{{- end }}
|
||||
volumeMounts:
|
||||
- name: superset-config
|
||||
mountPath: {{ .Values.configMountPath | quote }}
|
||||
|
||||
@@ -16,8 +16,7 @@
|
||||
#
|
||||
{{ if .Values.ingress.enabled -}}
|
||||
{{- $fullName := include "superset.fullname" . -}}
|
||||
{{- $ingressPath := .Values.ingress.path -}}
|
||||
apiVersion: extensions/v1beta1
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: {{ $fullName }}
|
||||
@@ -46,9 +45,12 @@ spec:
|
||||
- host: {{ . }}
|
||||
http:
|
||||
paths:
|
||||
- path: {{ $ingressPath }}
|
||||
- path: {{ $.Values.ingress.path }}
|
||||
pathType: {{ $.Values.ingress.pathType }}
|
||||
backend:
|
||||
serviceName: {{ $fullName }}
|
||||
servicePort: http
|
||||
service:
|
||||
name: {{ $fullName }}
|
||||
port:
|
||||
name: http
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
@@ -46,12 +46,16 @@ spec:
|
||||
envFrom:
|
||||
- secretRef:
|
||||
name: {{ tpl .Values.envFromSecret . }}
|
||||
{{- range .Values.envFromSecrets }}
|
||||
- secretRef:
|
||||
name: {{ tpl . $ }}
|
||||
{{- end }}
|
||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||
volumeMounts:
|
||||
- name: superset-config
|
||||
mountPath: {{ .Values.configMountPath | quote }}
|
||||
readOnly: true
|
||||
{{ if .Values.extraConfigs }}
|
||||
{{- if .Values.extraConfigs }}
|
||||
- name: superset-extra-config
|
||||
mountPath: {{ .Values.extraConfigMountPath | quote }}
|
||||
readOnly: true
|
||||
|
||||
@@ -44,6 +44,8 @@ configFromSecret: '{{ template "superset.fullname" . }}-config'
|
||||
## This can be useful for secret keys, etc.
|
||||
##
|
||||
envFromSecret: '{{ template "superset.fullname" . }}-env'
|
||||
## This can be a list of template strings
|
||||
envFromSecrets: []
|
||||
|
||||
## Extra environment variables that will be passed into pods
|
||||
##
|
||||
@@ -145,6 +147,7 @@ ingress:
|
||||
# nginx.ingress.kubernetes.io/proxy-read-timeout: "300"
|
||||
# nginx.ingress.kubernetes.io/proxy-send-timeout: "300"
|
||||
path: /
|
||||
pathType: ImplementationSpecific
|
||||
hosts:
|
||||
- chart-example.local
|
||||
tls: []
|
||||
@@ -241,7 +244,7 @@ supersetCeleryBeat:
|
||||
## Init job configuration
|
||||
init:
|
||||
# Configure resources
|
||||
# Warning: fab commant consumes a lot of ram and can
|
||||
# Warning: fab command consumes a lot of ram and can
|
||||
# cause the process to be killed due to OOM if it exceeds limit
|
||||
resources: {}
|
||||
# limits:
|
||||
|
||||
@@ -48,8 +48,6 @@ colorama==0.4.4
|
||||
# via
|
||||
# apache-superset
|
||||
# flask-appbuilder
|
||||
contextlib2==0.6.0.post1
|
||||
# via apache-superset
|
||||
convertdate==2.3.0
|
||||
# via holidays
|
||||
cron-descriptor==1.2.24
|
||||
@@ -58,19 +56,32 @@ croniter==0.3.36
|
||||
# via apache-superset
|
||||
cryptography==3.3.2
|
||||
# via apache-superset
|
||||
decorator==4.4.2
|
||||
# via retry
|
||||
defusedxml==0.6.0
|
||||
# via python3-openid
|
||||
deprecation==2.1.0
|
||||
# via apache-superset
|
||||
dnspython==2.0.0
|
||||
# via email-validator
|
||||
email-validator==1.1.1
|
||||
# via flask-appbuilder
|
||||
flask==1.1.2
|
||||
# via
|
||||
# apache-superset
|
||||
# flask-appbuilder
|
||||
# flask-babel
|
||||
# flask-caching
|
||||
# flask-compress
|
||||
# flask-jwt-extended
|
||||
# flask-login
|
||||
# flask-migrate
|
||||
# flask-openid
|
||||
# flask-sqlalchemy
|
||||
# flask-wtf
|
||||
flask-appbuilder==3.3.0
|
||||
# via apache-superset
|
||||
flask-babel==1.0.0
|
||||
# via flask-appbuilder
|
||||
flask-caching==1.9.0
|
||||
flask-caching==1.10.1
|
||||
# via apache-superset
|
||||
flask-compress==1.8.0
|
||||
# via apache-superset
|
||||
@@ -92,19 +103,6 @@ flask-wtf==0.14.3
|
||||
# via
|
||||
# apache-superset
|
||||
# flask-appbuilder
|
||||
flask==1.1.2
|
||||
# via
|
||||
# apache-superset
|
||||
# flask-appbuilder
|
||||
# flask-babel
|
||||
# flask-caching
|
||||
# flask-compress
|
||||
# flask-jwt-extended
|
||||
# flask-login
|
||||
# flask-migrate
|
||||
# flask-openid
|
||||
# flask-sqlalchemy
|
||||
# flask-wtf
|
||||
geographiclib==1.50
|
||||
# via geopy
|
||||
geopy==2.0.0
|
||||
@@ -121,11 +119,6 @@ idna==2.10
|
||||
# via
|
||||
# email-validator
|
||||
# yarl
|
||||
importlib-metadata==2.1.1
|
||||
# via
|
||||
# jsonschema
|
||||
# kombu
|
||||
# markdown
|
||||
isodate==0.6.0
|
||||
# via apache-superset
|
||||
itsdangerous==1.1.0
|
||||
@@ -152,15 +145,15 @@ markupsafe==1.1.1
|
||||
# jinja2
|
||||
# mako
|
||||
# wtforms
|
||||
marshmallow-enum==1.5.1
|
||||
# via flask-appbuilder
|
||||
marshmallow-sqlalchemy==0.23.1
|
||||
# via flask-appbuilder
|
||||
marshmallow==3.9.0
|
||||
# via
|
||||
# flask-appbuilder
|
||||
# marshmallow-enum
|
||||
# marshmallow-sqlalchemy
|
||||
marshmallow-enum==1.5.1
|
||||
# via flask-appbuilder
|
||||
marshmallow-sqlalchemy==0.23.1
|
||||
# via flask-appbuilder
|
||||
msgpack==1.0.0
|
||||
# via apache-superset
|
||||
multidict==5.0.0
|
||||
@@ -174,21 +167,19 @@ numpy==1.19.4
|
||||
# pandas
|
||||
# pyarrow
|
||||
packaging==20.4
|
||||
# via bleach
|
||||
# via
|
||||
# bleach
|
||||
# deprecation
|
||||
pandas==1.2.2
|
||||
# via apache-superset
|
||||
parsedatetime==2.6
|
||||
# via apache-superset
|
||||
pathlib2==2.3.5
|
||||
# via apache-superset
|
||||
pgsanity==0.2.9
|
||||
# via apache-superset
|
||||
polyline==1.4.0
|
||||
# via apache-superset
|
||||
prison==0.1.3
|
||||
# via flask-appbuilder
|
||||
py==1.9.0
|
||||
# via retry
|
||||
pyarrow==4.0.1
|
||||
# via apache-superset
|
||||
pycparser==2.20
|
||||
@@ -237,8 +228,6 @@ pyyaml==5.4.1
|
||||
# apispec
|
||||
redis==3.5.3
|
||||
# via apache-superset
|
||||
retry==0.9.2
|
||||
# via apache-superset
|
||||
selenium==3.141.0
|
||||
# via apache-superset
|
||||
simplejson==3.17.2
|
||||
@@ -253,7 +242,6 @@ six==1.15.0
|
||||
# isodate
|
||||
# jsonschema
|
||||
# packaging
|
||||
# pathlib2
|
||||
# polyline
|
||||
# prison
|
||||
# pyrsistent
|
||||
@@ -262,10 +250,6 @@ six==1.15.0
|
||||
# wtforms-json
|
||||
slackclient==2.5.0
|
||||
# via apache-superset
|
||||
sqlalchemy-utils==0.36.8
|
||||
# via
|
||||
# apache-superset
|
||||
# flask-appbuilder
|
||||
sqlalchemy==1.3.20
|
||||
# via
|
||||
# alembic
|
||||
@@ -274,13 +258,18 @@ sqlalchemy==1.3.20
|
||||
# flask-sqlalchemy
|
||||
# marshmallow-sqlalchemy
|
||||
# sqlalchemy-utils
|
||||
sqlalchemy-utils==0.36.8
|
||||
# via
|
||||
# apache-superset
|
||||
# flask-appbuilder
|
||||
sqlparse==0.3.0
|
||||
# via apache-superset
|
||||
tabulate==0.8.9
|
||||
# via apache-superset
|
||||
typing-extensions==3.7.4.3
|
||||
# via
|
||||
# aiohttp
|
||||
# apache-superset
|
||||
# yarl
|
||||
urllib3==1.25.11
|
||||
# via selenium
|
||||
vine==1.3.0
|
||||
@@ -293,18 +282,16 @@ werkzeug==1.0.1
|
||||
# via
|
||||
# flask
|
||||
# flask-jwt-extended
|
||||
wtforms-json==0.3.3
|
||||
# via apache-superset
|
||||
wtforms==2.3.3
|
||||
# via
|
||||
# flask-wtf
|
||||
# wtforms-json
|
||||
wtforms-json==0.3.3
|
||||
# via apache-superset
|
||||
yarl==1.6.2
|
||||
# via aiohttp
|
||||
zipp==3.4.1
|
||||
# via
|
||||
# -r requirements/base.in
|
||||
# importlib-metadata
|
||||
# via -r requirements/base.in
|
||||
|
||||
# The following packages are considered to be unsafe in a requirements file:
|
||||
# setuptools
|
||||
|
||||
@@ -25,3 +25,4 @@ psycopg2-binary==2.8.5
|
||||
tableschema
|
||||
thrift>=0.11.0,<1.0.0
|
||||
pygithub>=1.54.1,<2.0.0
|
||||
progress>=1.5,<2
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SHA1:1b4d15a41f3498d2eb930ac3d3d4ce5d1f218a2f
|
||||
# SHA1:c470411e2e9cb04b412a94f80a6a9d870bece74d
|
||||
#
|
||||
# This file is autogenerated by pip-compile-multi
|
||||
# To update, run:
|
||||
@@ -44,6 +44,8 @@ openpyxl==3.0.5
|
||||
# via tabulator
|
||||
pillow==7.2.0
|
||||
# via -r requirements/development.in
|
||||
progress==1.5
|
||||
# via -r requirements/development.in
|
||||
psycopg2-binary==2.8.5
|
||||
# via -r requirements/development.in
|
||||
pydruid==0.6.1
|
||||
@@ -70,13 +72,13 @@ tableschema==1.20.0
|
||||
# via -r requirements/development.in
|
||||
tabulator==1.52.5
|
||||
# via tableschema
|
||||
thrift-sasl==0.4.2
|
||||
# via pyhive
|
||||
thrift==0.13.0
|
||||
# via
|
||||
# -r requirements/development.in
|
||||
# pyhive
|
||||
# thrift-sasl
|
||||
thrift-sasl==0.4.2
|
||||
# via pyhive
|
||||
unicodecsv==0.14.1
|
||||
# via
|
||||
# tableschema
|
||||
|
||||
@@ -21,12 +21,6 @@ filelock==3.0.12
|
||||
# virtualenv
|
||||
identify==1.5.9
|
||||
# via pre-commit
|
||||
importlib-metadata==2.1.1
|
||||
# via
|
||||
# pluggy
|
||||
# pre-commit
|
||||
# tox
|
||||
# virtualenv
|
||||
nodeenv==1.5.0
|
||||
# via pre-commit
|
||||
packaging==20.4
|
||||
@@ -63,8 +57,6 @@ virtualenv==20.1.0
|
||||
# via
|
||||
# pre-commit
|
||||
# tox
|
||||
zipp==3.4.1
|
||||
# via importlib-metadata
|
||||
|
||||
# The following packages are considered to be unsafe in a requirements file:
|
||||
# pip
|
||||
|
||||
@@ -32,3 +32,4 @@ pylint
|
||||
pytest
|
||||
pytest-cov
|
||||
statsd
|
||||
pytest-mock
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SHA1:dba8c39bbdcb85b86e83af855d023b55a2674e87
|
||||
# SHA1:d39180c0eb498d1a7dd73b8428e6ab304b728484
|
||||
#
|
||||
# This file is autogenerated by pip-compile-multi
|
||||
# To update, run:
|
||||
@@ -9,7 +9,7 @@
|
||||
-r integration.txt
|
||||
-e file:.
|
||||
# via -r requirements/base.in
|
||||
appnope==0.1.0
|
||||
appnope==0.1.2
|
||||
# via ipython
|
||||
astroid==2.4.2
|
||||
# via pylint
|
||||
@@ -17,6 +17,8 @@ backcall==0.2.0
|
||||
# via ipython
|
||||
coverage==5.3
|
||||
# via pytest-cov
|
||||
decorator==5.0.9
|
||||
# via ipython
|
||||
docker==4.3.1
|
||||
# via -r requirements/testing.in
|
||||
flask-testing==0.8.0
|
||||
@@ -27,12 +29,12 @@ iniconfig==1.1.1
|
||||
# via pytest
|
||||
ipdb==0.13.4
|
||||
# via -r requirements/testing.in
|
||||
ipython-genutils==0.2.0
|
||||
# via traitlets
|
||||
ipython==7.16.1
|
||||
# via
|
||||
# -r requirements/testing.in
|
||||
# ipdb
|
||||
ipython-genutils==0.2.0
|
||||
# via traitlets
|
||||
isort==5.6.4
|
||||
# via pylint
|
||||
jedi==0.17.2
|
||||
@@ -65,18 +67,19 @@ pyhive[hive,presto]==0.6.3
|
||||
# -r requirements/testing.in
|
||||
pylint==2.6.0
|
||||
# via -r requirements/testing.in
|
||||
pytest-cov==2.10.1
|
||||
# via -r requirements/testing.in
|
||||
pytest==6.1.2
|
||||
# via
|
||||
# -r requirements/testing.in
|
||||
# pytest-cov
|
||||
# pytest-mock
|
||||
pytest-cov==2.10.1
|
||||
# via -r requirements/testing.in
|
||||
pytest-mock==3.6.1
|
||||
# via -r requirements/testing.in
|
||||
statsd==3.3.0
|
||||
# via -r requirements/testing.in
|
||||
traitlets==5.0.5
|
||||
# via ipython
|
||||
typed-ast==1.4.3
|
||||
# via astroid
|
||||
wcwidth==0.2.5
|
||||
# via prompt-toolkit
|
||||
websocket-client==0.57.0
|
||||
|
||||
@@ -29,7 +29,8 @@ from flask import current_app
|
||||
from flask_appbuilder import Model
|
||||
from flask_migrate import downgrade, upgrade
|
||||
from graphlib import TopologicalSorter # pylint: disable=wrong-import-order
|
||||
from sqlalchemy import create_engine, inspect, Table
|
||||
from progress.bar import ChargingBar
|
||||
from sqlalchemy import create_engine, inspect
|
||||
from sqlalchemy.ext.automap import automap_base
|
||||
|
||||
from superset import db
|
||||
@@ -93,11 +94,22 @@ def find_models(module: ModuleType) -> List[Type[Model]]:
|
||||
engine = create_engine(sqlalchemy_uri)
|
||||
Base = automap_base()
|
||||
Base.prepare(engine, reflect=True)
|
||||
for table in tables:
|
||||
seen = set()
|
||||
while tables:
|
||||
table = tables.pop()
|
||||
seen.add(table)
|
||||
model = getattr(Base.classes, table)
|
||||
model.__tablename__ = table
|
||||
models.append(model)
|
||||
|
||||
# add other models referenced in foreign keys
|
||||
inspector = inspect(model)
|
||||
for column in inspector.columns.values():
|
||||
for foreign_key in column.foreign_keys:
|
||||
table = foreign_key.column.table.name
|
||||
if table not in seen:
|
||||
tables.add(table)
|
||||
|
||||
# sort topologically so we can create entities in order and
|
||||
# maintain relationships (eg, create a database before creating
|
||||
# a slice)
|
||||
@@ -107,7 +119,8 @@ def find_models(module: ModuleType) -> List[Type[Model]]:
|
||||
dependent_tables: List[str] = []
|
||||
for column in inspector.columns.values():
|
||||
for foreign_key in column.foreign_keys:
|
||||
dependent_tables.append(foreign_key.target_fullname.split(".")[0])
|
||||
if foreign_key.column.table.name != model.__tablename__:
|
||||
dependent_tables.append(foreign_key.column.table.name)
|
||||
sorter.add(model.__tablename__, *dependent_tables)
|
||||
order = list(sorter.static_order())
|
||||
models.sort(key=lambda model: order.index(model.__tablename__))
|
||||
@@ -177,18 +190,23 @@ def main(
|
||||
for model in models:
|
||||
missing = min_entities - model_rows[model]
|
||||
if missing > 0:
|
||||
entities: List[Model] = []
|
||||
print(f"- Adding {missing} entities to the {model.__name__} model")
|
||||
bar = ChargingBar("Processing", max=missing)
|
||||
try:
|
||||
added_models = add_sample_rows(session, model, missing)
|
||||
for entity in add_sample_rows(session, model, missing):
|
||||
entities.append(entity)
|
||||
bar.next()
|
||||
except Exception:
|
||||
session.rollback()
|
||||
raise
|
||||
bar.finish()
|
||||
model_rows[model] = min_entities
|
||||
session.add_all(entities)
|
||||
session.commit()
|
||||
|
||||
if auto_cleanup:
|
||||
new_models[model].extend(added_models)
|
||||
|
||||
new_models[model].extend(entities)
|
||||
start = time.time()
|
||||
upgrade(revision=revision)
|
||||
duration = time.time() - start
|
||||
@@ -196,6 +214,10 @@ def main(
|
||||
results[f"{min_entities}+"] = duration
|
||||
min_entities *= 10
|
||||
|
||||
print("\nResults:\n")
|
||||
for label, duration in results.items():
|
||||
print(f"{label}: {duration:.2f} s")
|
||||
|
||||
if auto_cleanup:
|
||||
print("Cleaning up DB")
|
||||
# delete in reverse order of creation to handle relationships
|
||||
@@ -210,10 +232,6 @@ def main(
|
||||
upgrade(revision=revision)
|
||||
print("Reverted")
|
||||
|
||||
print("\nResults:\n")
|
||||
for label, duration in results.items():
|
||||
print(f"{label}: {duration:.2f} s")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
from superset.app import create_app
|
||||
|
||||
@@ -33,7 +33,7 @@ Example:
|
||||
./cancel_github_workflows.py 1024 --include-last
|
||||
"""
|
||||
import os
|
||||
from typing import Iterable, List, Optional, Union
|
||||
from typing import Any, Dict, Iterable, Iterator, List, Optional, Union
|
||||
|
||||
import click
|
||||
import requests
|
||||
@@ -45,7 +45,9 @@ github_token = os.environ.get("GITHUB_TOKEN")
|
||||
github_repo = os.environ.get("GITHUB_REPOSITORY", "apache/superset")
|
||||
|
||||
|
||||
def request(method: Literal["GET", "POST", "DELETE", "PUT"], endpoint: str, **kwargs):
|
||||
def request(
|
||||
method: Literal["GET", "POST", "DELETE", "PUT"], endpoint: str, **kwargs: Any
|
||||
) -> Dict[str, Any]:
|
||||
resp = requests.request(
|
||||
method,
|
||||
f"https://api.github.com/{endpoint.lstrip('/')}",
|
||||
@@ -57,10 +59,14 @@ def request(method: Literal["GET", "POST", "DELETE", "PUT"], endpoint: str, **kw
|
||||
return resp
|
||||
|
||||
|
||||
def list_runs(repo: str, params=None):
|
||||
def list_runs(
|
||||
repo: str, params: Optional[Dict[str, str]] = None,
|
||||
) -> Iterator[Dict[str, Any]]:
|
||||
"""List all github workflow runs.
|
||||
Returns:
|
||||
An iterator that will iterate through all pages of matching runs."""
|
||||
if params is None:
|
||||
params = {}
|
||||
page = 1
|
||||
total_count = 10000
|
||||
while page * 100 < total_count:
|
||||
@@ -75,11 +81,11 @@ def list_runs(repo: str, params=None):
|
||||
page += 1
|
||||
|
||||
|
||||
def cancel_run(repo: str, run_id: Union[str, int]):
|
||||
def cancel_run(repo: str, run_id: Union[str, int]) -> Dict[str, Any]:
|
||||
return request("POST", f"/repos/{repo}/actions/runs/{run_id}/cancel")
|
||||
|
||||
|
||||
def get_pull_request(repo: str, pull_number: Union[str, int]):
|
||||
def get_pull_request(repo: str, pull_number: Union[str, int]) -> Dict[str, Any]:
|
||||
return request("GET", f"/repos/{repo}/pulls/{pull_number}")
|
||||
|
||||
|
||||
@@ -89,7 +95,7 @@ def get_runs(
|
||||
user: Optional[str] = None,
|
||||
statuses: Iterable[str] = ("queued", "in_progress"),
|
||||
events: Iterable[str] = ("pull_request", "push"),
|
||||
):
|
||||
) -> List[Dict[str, Any]]:
|
||||
"""Get workflow runs associated with the given branch"""
|
||||
return [
|
||||
item
|
||||
@@ -101,7 +107,7 @@ def get_runs(
|
||||
]
|
||||
|
||||
|
||||
def print_commit(commit, branch):
|
||||
def print_commit(commit: Dict[str, Any], branch: str) -> None:
|
||||
"""Print out commit message for verification"""
|
||||
indented_message = " \n".join(commit["message"].split("\n"))
|
||||
date_str = (
|
||||
@@ -151,7 +157,7 @@ def cancel_github_workflows(
|
||||
event: List[str],
|
||||
include_last: bool,
|
||||
include_running: bool,
|
||||
):
|
||||
) -> None:
|
||||
"""Cancel running or queued GitHub workflows by branch or pull request ID"""
|
||||
if not github_token:
|
||||
raise ClickException("Please provide GITHUB_TOKEN as an env variable")
|
||||
@@ -231,7 +237,7 @@ def cancel_github_workflows(
|
||||
try:
|
||||
print(f"[{entry['status']}] {entry['name']}", end="\r")
|
||||
cancel_run(repo, entry["id"])
|
||||
print(f"[Cancled] {entry['name']} ")
|
||||
print(f"[Canceled] {entry['name']} ")
|
||||
except ClickException as error:
|
||||
print(f"[Error: {error.message}] {entry['name']} ")
|
||||
print("")
|
||||
|
||||
@@ -19,7 +19,7 @@ from collections import defaultdict
|
||||
from superset import security_manager
|
||||
|
||||
|
||||
def cleanup_permissions():
|
||||
def cleanup_permissions() -> None:
|
||||
# 1. Clean up duplicates.
|
||||
pvms = security_manager.get_session.query(
|
||||
security_manager.permissionview_model
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
#
|
||||
set -e
|
||||
|
||||
export SUPERSET_CONFIG=${SUPERSET_CONFIG:-tests.superset_test_config}
|
||||
export SUPERSET_CONFIG=${SUPERSET_CONFIG:-tests.integration_tests.superset_test_config}
|
||||
export SUPERSET_TESTENV=true
|
||||
echo "Superset config module: $SUPERSET_CONFIG"
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@ DB_NAME="test"
|
||||
DB_USER="superset"
|
||||
DB_PASSWORD="superset"
|
||||
export SUPERSET__SQLALCHEMY_DATABASE_URI=${SUPERSET__SQLALCHEMY_DATABASE_URI:-postgresql+psycopg2://"${DB_USER}":"${DB_PASSWORD}"@localhost/"${DB_NAME}"}
|
||||
export SUPERSET_CONFIG=${SUPERSET_CONFIG:-tests.superset_test_config}
|
||||
export SUPERSET_CONFIG=${SUPERSET_CONFIG:-tests.integration_tests.superset_test_config}
|
||||
RUN_INIT=1
|
||||
RUN_RESET_DB=1
|
||||
RUN_TESTS=1
|
||||
|
||||
@@ -30,21 +30,23 @@ combine_as_imports = true
|
||||
include_trailing_comma = true
|
||||
line_length = 88
|
||||
known_first_party = superset
|
||||
known_third_party =alembic,apispec,backoff,bleach,cachelib,celery,click,colorama,contextlib2,cron_descriptor,croniter,cryptography,dateutil,deprecation,flask,flask_appbuilder,flask_babel,flask_caching,flask_compress,flask_jwt_extended,flask_login,flask_migrate,flask_sqlalchemy,flask_talisman,flask_testing,flask_wtf,freezegun,geohash,geopy,graphlib,holidays,humanize,isodate,jinja2,jwt,markdown,markupsafe,marshmallow,marshmallow_enum,msgpack,numpy,pandas,parameterized,parsedatetime,pathlib2,pgsanity,pkg_resources,polyline,prison,pyarrow,pyhive,pyparsing,pytest,pytz,redis,requests,retry,selenium,setuptools,simplejson,slack,sqlalchemy,sqlalchemy_utils,sqlparse,typing_extensions,werkzeug,wtforms,wtforms_json,yaml
|
||||
known_third_party =alembic,apispec,backoff,bleach,cachelib,celery,click,colorama,cron_descriptor,croniter,cryptography,dateutil,deprecation,flask,flask_appbuilder,flask_babel,flask_caching,flask_compress,flask_jwt_extended,flask_login,flask_migrate,flask_sqlalchemy,flask_talisman,flask_testing,flask_wtf,freezegun,geohash,geopy,graphlib,holidays,humanize,isodate,jinja2,jwt,markdown,markupsafe,marshmallow,marshmallow_enum,msgpack,numpy,pandas,parameterized,parsedatetime,pgsanity,pkg_resources,polyline,prison,progress,pyarrow,pyhive,pyparsing,pytest,pytest_mock,pytz,redis,requests,selenium,setuptools,simplejson,slack,sqlalchemy,sqlalchemy_utils,sqlparse,tabulate,typing_extensions,werkzeug,wtforms,wtforms_json,yaml
|
||||
multi_line_output = 3
|
||||
order_by_type = false
|
||||
|
||||
[mypy]
|
||||
check_untyped_defs = true
|
||||
disallow_any_generics = true
|
||||
disallow_untyped_calls = true
|
||||
disallow_untyped_defs = true
|
||||
ignore_missing_imports = true
|
||||
no_implicit_optional = true
|
||||
warn_unused_ignores = true
|
||||
|
||||
[mypy-superset.*]
|
||||
check_untyped_defs = true
|
||||
disallow_untyped_calls = true
|
||||
disallow_untyped_defs = true
|
||||
warn_unused_ignores = false
|
||||
|
||||
[mypy-superset.migrations.versions.*]
|
||||
ignore_errors = true
|
||||
|
||||
[mypy-tests.*]
|
||||
check_untyped_defs = false
|
||||
disallow_untyped_calls = false
|
||||
disallow_untyped_defs = false
|
||||
|
||||
@@ -32,7 +32,7 @@ with io.open("README.md", "r", encoding="utf-8") as f:
|
||||
long_description = f.read()
|
||||
|
||||
|
||||
def get_git_sha():
|
||||
def get_git_sha() -> str:
|
||||
try:
|
||||
s = subprocess.check_output(["git", "rev-parse", "HEAD"])
|
||||
return s.decode().strip()
|
||||
@@ -70,13 +70,13 @@ setup(
|
||||
"celery>=4.3.0, <5.0.0, !=4.4.1",
|
||||
"click<8",
|
||||
"colorama",
|
||||
"contextlib2",
|
||||
"croniter>=0.3.28",
|
||||
"cron-descriptor",
|
||||
"cryptography>=3.3.2",
|
||||
"deprecation>=2.1.0, <2.2.0",
|
||||
"flask>=1.1.0, <2.0.0",
|
||||
"flask-appbuilder>=3.3.0, <4.0.0",
|
||||
"flask-caching",
|
||||
"flask-caching>=1.10.0",
|
||||
"flask-compress",
|
||||
"flask-talisman",
|
||||
"flask-migrate",
|
||||
@@ -84,16 +84,17 @@ setup(
|
||||
"geopy",
|
||||
"graphlib-backport",
|
||||
"gunicorn>=20.0.2, <20.1",
|
||||
"holidays==0.10.3", # PINNED! https://github.com/dr-prodigy/python-holidays/issues/406
|
||||
"humanize",
|
||||
"itsdangerous>=1.0.0, <2.0.0",
|
||||
"itsdangerous>=1.0.0, <2.0.0", # https://github.com/apache/superset/pull/14627
|
||||
"isodate",
|
||||
"markdown>=3.0",
|
||||
"msgpack>=1.0.0, <1.1",
|
||||
"pandas>=1.2.2, <1.3",
|
||||
"parsedatetime",
|
||||
"pathlib2",
|
||||
"pgsanity",
|
||||
"polyline",
|
||||
"pyparsing>=2.4.7, <3.0.0",
|
||||
"python-dateutil",
|
||||
"python-dotenv",
|
||||
"python-geohash",
|
||||
@@ -101,18 +102,15 @@ setup(
|
||||
"pyyaml>=5.4",
|
||||
"PyJWT>=1.7.1, <2",
|
||||
"redis",
|
||||
"retry>=0.9.2",
|
||||
"selenium>=3.141.0",
|
||||
"simplejson>=3.15.0",
|
||||
"slackclient==2.5.0", # PINNED! slack changes file upload api in the future versions
|
||||
"sqlalchemy>=1.3.16, <1.4, !=1.3.21",
|
||||
"sqlalchemy-utils>=0.36.6,<0.37",
|
||||
"sqlparse==0.3.0", # PINNED! see https://github.com/andialbrecht/sqlparse/issues/562
|
||||
"tabulate==0.8.9",
|
||||
"typing-extensions>=3.7.4.3,<4", # needed to support typing.Literal on py37
|
||||
"wtforms-json",
|
||||
"pyparsing>=2.4.7, <3.0.0",
|
||||
"holidays==0.10.3", # PINNED! https://github.com/dr-prodigy/python-holidays/issues/406
|
||||
"deprecation>=2.1.0, <2.2.0",
|
||||
],
|
||||
extras_require={
|
||||
"athena": ["pyathena>=1.10.8,<1.11"],
|
||||
@@ -135,7 +133,7 @@ setup(
|
||||
"exasol": ["sqlalchemy-exasol>=2.1.0, <2.2"],
|
||||
"excel": ["xlrd>=1.2.0, <1.3"],
|
||||
"firebird": ["sqlalchemy-firebird>=0.7.0, <0.8"],
|
||||
"gsheets": ["shillelagh[gsheetsapi]>=0.5, <0.6"],
|
||||
"gsheets": ["shillelagh[gsheetsapi]>=0.7.1, <0.8"],
|
||||
"hana": ["hdbcli==2.4.162", "sqlalchemy_hana==0.4.0"],
|
||||
"hive": ["pyhive[hive]>=0.6.1", "tableschema", "thrift>=0.11.0, <1.0.0"],
|
||||
"impala": ["impyla>0.16.2, <0.17"],
|
||||
@@ -153,6 +151,7 @@ setup(
|
||||
"teradata": ["sqlalchemy-teradata==0.9.0.dev0"],
|
||||
"thumbnails": ["Pillow>=7.0.0, <8.0.0"],
|
||||
"vertica": ["sqlalchemy-vertica-python>=0.5.9, < 0.6"],
|
||||
"netezza": ["nzalchemy>=11.0.2"],
|
||||
},
|
||||
python_requires="~=3.7",
|
||||
author="Apache Software Foundation",
|
||||
|
||||
@@ -18,11 +18,11 @@
|
||||
*/
|
||||
const path = require('path');
|
||||
|
||||
// Suerset's webpack.config.js
|
||||
// Superset's webpack.config.js
|
||||
const customConfig = require('../webpack.config.js');
|
||||
|
||||
module.exports = {
|
||||
stories: ['../src/@(components|common|filters)/**/*.stories.@(t|j)sx'],
|
||||
stories: ['../src/@(components|common|filters)/**/*.stories.@(t|j)sx'],
|
||||
addons: [
|
||||
'@storybook/addon-essentials',
|
||||
'@storybook/addon-links',
|
||||
@@ -43,4 +43,7 @@ stories: ['../src/@(components|common|filters)/**/*.stories.@(t|j)sx'],
|
||||
},
|
||||
plugins: [...config.plugins, ...customConfig.plugins],
|
||||
}),
|
||||
typescript: {
|
||||
reactDocgen: 'none',
|
||||
},
|
||||
};
|
||||
|
||||
@@ -45,6 +45,7 @@ module.exports = {
|
||||
['@babel/plugin-proposal-class-properties', { loose: true }],
|
||||
['@babel/plugin-proposal-optional-chaining', { loose: true }],
|
||||
['@babel/plugin-proposal-private-methods', { loose: true }],
|
||||
['@babel/plugin-proposal-nullish-coalescing-operator', { loose: true }],
|
||||
['@babel/plugin-transform-runtime', { corejs: 3 }],
|
||||
'react-hot-loader/babel',
|
||||
],
|
||||
|
||||
@@ -22,7 +22,7 @@ describe('chart card view', () => {
|
||||
beforeEach(() => {
|
||||
cy.login();
|
||||
cy.visit(CHART_LIST);
|
||||
cy.get('[data-test="card-view"]').click();
|
||||
cy.get('[aria-label="card-view"]').click();
|
||||
});
|
||||
|
||||
it('should load cards', () => {
|
||||
|
||||
@@ -22,7 +22,7 @@ describe('chart card view filters', () => {
|
||||
beforeEach(() => {
|
||||
cy.login();
|
||||
cy.visit(CHART_LIST);
|
||||
cy.get('[data-test="card-view"]').click();
|
||||
cy.get('[aria-label="card-view"]').click();
|
||||
});
|
||||
|
||||
it('should filter by owners correctly', () => {
|
||||
@@ -89,7 +89,7 @@ describe('chart list view filters', () => {
|
||||
beforeEach(() => {
|
||||
cy.login();
|
||||
cy.visit(CHART_LIST);
|
||||
cy.get('[data-test="list-view"]').click();
|
||||
cy.get('[aria-label="list-view"]').click();
|
||||
});
|
||||
|
||||
it('should filter by owners correctly', () => {
|
||||
|
||||
@@ -22,7 +22,7 @@ describe('chart list view', () => {
|
||||
beforeEach(() => {
|
||||
cy.login();
|
||||
cy.visit(CHART_LIST);
|
||||
cy.get('[data-test="list-view"]').click();
|
||||
cy.get('[aria-label="list-view"]').click();
|
||||
});
|
||||
|
||||
it('should load rows', () => {
|
||||
@@ -51,11 +51,11 @@ describe('chart list view', () => {
|
||||
it('should bulk delete correctly', () => {
|
||||
cy.get('[data-test="listview-table"]').should('be.visible');
|
||||
cy.get('[data-test="bulk-select"]').eq(0).click();
|
||||
cy.get('[data-test="checkbox-off"]').eq(1).siblings('input').click();
|
||||
cy.get('[data-test="checkbox-off"]').eq(2).siblings('input').click();
|
||||
cy.get('[aria-label="checkbox-off"]').eq(1).siblings('input').click();
|
||||
cy.get('[aria-label="checkbox-off"]').eq(2).siblings('input').click();
|
||||
cy.get('[data-test="bulk-select-action"]').eq(0).click();
|
||||
cy.get('[data-test="delete-modal-input"]').eq(0).type('DELETE');
|
||||
cy.get('[data-test="modal-confirm-button"]').eq(0).click();
|
||||
cy.get('[data-test="checkbox-on"]').should('not.exist');
|
||||
cy.get('[aria-label="checkbox-on"]').should('not.exist');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -63,7 +63,7 @@ describe('Dashboard top-level controls', () => {
|
||||
// should allow force refresh
|
||||
WORLD_HEALTH_CHARTS.forEach(waitForChartLoad);
|
||||
getChartAliasesBySpec(WORLD_HEALTH_CHARTS).then(aliases => {
|
||||
cy.get('[data-test="more-horiz"]').click();
|
||||
cy.get('[aria-label="more-horiz"]').click();
|
||||
cy.get('[data-test="refresh-dashboard-menu-item"]').should(
|
||||
'not.have.class',
|
||||
'ant-dropdown-menu-item-disabled',
|
||||
@@ -92,7 +92,7 @@ describe('Dashboard top-level controls', () => {
|
||||
});
|
||||
});
|
||||
});
|
||||
cy.get('[data-test="more-horiz"]').click();
|
||||
cy.get('[aria-label="more-horiz"]').click();
|
||||
cy.get('[data-test="refresh-dashboard-menu-item"]').and(
|
||||
'not.have.class',
|
||||
'ant-dropdown-menu-item-disabled',
|
||||
|
||||
@@ -23,7 +23,7 @@ describe('Dashboard edit mode', () => {
|
||||
cy.login();
|
||||
cy.visit(WORLD_HEALTH_DASHBOARD);
|
||||
cy.get('[data-test="dashboard-header"]')
|
||||
.find('[data-test=edit-alt]')
|
||||
.find('[aria-label=edit-alt]')
|
||||
.click();
|
||||
});
|
||||
|
||||
@@ -96,7 +96,7 @@ describe('Dashboard edit mode', () => {
|
||||
.click();
|
||||
cy.get('[data-test="dashboard-header"]').within(() => {
|
||||
cy.get('[data-test="dashboard-edit-actions"]').should('not.be.visible');
|
||||
cy.get('[data-test="edit-alt"]').should('be.visible');
|
||||
cy.get('[aria-label="edit-alt"]').should('be.visible');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -77,7 +77,7 @@ describe('Dashboard edit action', () => {
|
||||
cy.get('.dashboard-grid', { timeout: 50000 })
|
||||
.should('be.visible') // wait for 50 secs to load dashboard
|
||||
.then(() => {
|
||||
cy.get('.dashboard-header [data-test=edit-alt]')
|
||||
cy.get('.dashboard-header [aria-label=edit-alt]')
|
||||
.should('be.visible')
|
||||
.click();
|
||||
openDashboardEditProperties();
|
||||
|
||||
@@ -38,7 +38,7 @@ describe('Dashboard filter', () => {
|
||||
cy.get('.Select__placeholder:first').click();
|
||||
|
||||
// should show the filter indicator
|
||||
cy.get('svg[data-test="filter"]:visible').should(nodes => {
|
||||
cy.get('span[aria-label="filter"]:visible').should(nodes => {
|
||||
expect(nodes.length).to.least(9);
|
||||
});
|
||||
|
||||
@@ -50,7 +50,7 @@ describe('Dashboard filter', () => {
|
||||
cy.get('.Select__menu').first().contains('South Asia').click();
|
||||
|
||||
// should still have all filter indicators
|
||||
cy.get('svg[data-test="filter"]:visible').should(nodes => {
|
||||
cy.get('span[aria-label="filter"]:visible').should(nodes => {
|
||||
expect(nodes.length).to.least(9);
|
||||
});
|
||||
|
||||
|
||||
@@ -30,12 +30,12 @@ describe('Dashboard edit markdown', () => {
|
||||
numScripts = nodes.length;
|
||||
});
|
||||
cy.get('[data-test="dashboard-header"]')
|
||||
.find('[data-test="edit-alt"]')
|
||||
.find('[aria-label="edit-alt"]')
|
||||
.click();
|
||||
|
||||
// lazy load - need to open dropdown for the scripts to load
|
||||
cy.get('[data-test="dashboard-header"]')
|
||||
.find('[data-test="more-horiz"]')
|
||||
.find('[aria-label="more-horiz"]')
|
||||
.click();
|
||||
cy.get('script').then(nodes => {
|
||||
// load 5 new script chunks for css editor
|
||||
@@ -70,7 +70,7 @@ describe('Dashboard edit markdown', () => {
|
||||
.type('Test resize');
|
||||
|
||||
resize(
|
||||
'[data-test="dashboard-markdown-editor"] .resizable-container span div',
|
||||
'[data-test="dashboard-markdown-editor"] .resizable-container span div:last-child',
|
||||
).to(500, 600);
|
||||
|
||||
cy.get('[data-test="dashboard-markdown-editor"]').contains('Test resize');
|
||||
@@ -78,7 +78,7 @@ describe('Dashboard edit markdown', () => {
|
||||
// entering edit mode does not add new scripts
|
||||
// (though scripts may still be removed by others)
|
||||
cy.get('script').then(nodes => {
|
||||
expect(nodes.length).to.most(numScripts);
|
||||
expect(nodes.length).to.greaterThan(numScripts);
|
||||
});
|
||||
|
||||
cy.get('@component-background-first').click('right');
|
||||
|
||||
@@ -25,7 +25,7 @@ import {
|
||||
} from './dashboard.helper';
|
||||
|
||||
function openDashboardEditProperties() {
|
||||
cy.get('.dashboard-header [data-test=edit-alt]').click();
|
||||
cy.get('.dashboard-header [aria-label=edit-alt]').click();
|
||||
cy.get('#save-dash-split-button').trigger('click', { force: true });
|
||||
cy.get('.dropdown-menu').contains('Edit dashboard properties').click();
|
||||
}
|
||||
@@ -42,7 +42,7 @@ describe('Dashboard save action', () => {
|
||||
'copyRequest',
|
||||
);
|
||||
|
||||
cy.get('[data-test="more-horiz"]').trigger('click', { force: true });
|
||||
cy.get('[aria-label="more-horiz"]').trigger('click', { force: true });
|
||||
cy.get('[data-test="save-as-menu-item"]').trigger('click', {
|
||||
force: true,
|
||||
});
|
||||
@@ -68,7 +68,7 @@ describe('Dashboard save action', () => {
|
||||
WORLD_HEALTH_CHARTS.forEach(waitForChartLoad);
|
||||
|
||||
// remove box_plot chart from dashboard
|
||||
cy.get('[data-test="edit-alt"]').click({ timeout: 5000 });
|
||||
cy.get('[aria-label="edit-alt"]').click({ timeout: 5000 });
|
||||
cy.get('[data-test="dashboard-delete-component-button"]')
|
||||
.last()
|
||||
.trigger('moustenter')
|
||||
@@ -87,7 +87,7 @@ describe('Dashboard save action', () => {
|
||||
// go back to view mode
|
||||
cy.wait('@saveRequest');
|
||||
cy.get('[data-test="dashboard-header"]')
|
||||
.find('[data-test="edit-alt"]')
|
||||
.find('[aria-label="edit-alt"]')
|
||||
.click();
|
||||
|
||||
// deleted boxplot should still not exist
|
||||
|
||||
@@ -22,7 +22,7 @@ describe('Dashboard card view', () => {
|
||||
beforeEach(() => {
|
||||
cy.login();
|
||||
cy.visit(DASHBOARD_LIST);
|
||||
cy.get('[data-test="card-view"]').click();
|
||||
cy.get('[aria-label="card-view"]').click();
|
||||
});
|
||||
|
||||
xit('should load cards', () => {
|
||||
|
||||
@@ -22,7 +22,7 @@ describe('dashboard filters card view', () => {
|
||||
beforeEach(() => {
|
||||
cy.login();
|
||||
cy.visit(DASHBOARD_LIST);
|
||||
cy.get('[data-test="card-view"]').click();
|
||||
cy.get('[aria-label="card-view"]').click();
|
||||
});
|
||||
|
||||
it('should filter by owners correctly', () => {
|
||||
@@ -59,13 +59,13 @@ describe('dashboard filters card view', () => {
|
||||
// filter by published
|
||||
cy.get('.Select__control').eq(2).click();
|
||||
cy.get('.Select__menu').contains('Published').click({ timeout: 5000 });
|
||||
cy.get('[data-test="styled-card"]').should('have.length', 2);
|
||||
cy.get('[data-test="styled-card"]').should('have.length', 3);
|
||||
cy.get('[data-test="styled-card"]')
|
||||
.contains('USA Births Names')
|
||||
.should('be.visible');
|
||||
cy.get('.Select__control').eq(1).click();
|
||||
cy.get('.Select__control').eq(1).type('unpub{enter}');
|
||||
cy.get('[data-test="styled-card"]').should('have.length', 2);
|
||||
cy.get('[data-test="styled-card"]').should('have.length', 3);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -73,7 +73,7 @@ describe('dashboard filters list view', () => {
|
||||
beforeEach(() => {
|
||||
cy.login();
|
||||
cy.visit(DASHBOARD_LIST);
|
||||
cy.get('[data-test="list-view"]').click();
|
||||
cy.get('[aria-label="list-view"]').click();
|
||||
});
|
||||
|
||||
it('should filter by owners correctly', () => {
|
||||
@@ -110,12 +110,12 @@ describe('dashboard filters list view', () => {
|
||||
// filter by published
|
||||
cy.get('.Select__control').eq(2).click();
|
||||
cy.get('.Select__menu').contains('Published').click();
|
||||
cy.get('[data-test="table-row"]').should('have.length', 2);
|
||||
cy.get('[data-test="table-row"]').should('have.length', 3);
|
||||
cy.get('[data-test="table-row"]')
|
||||
.contains('USA Births Names')
|
||||
.should('be.visible');
|
||||
cy.get('.Select__control').eq(2).click();
|
||||
cy.get('.Select__control').eq(2).type('unpub{enter}');
|
||||
cy.get('[data-test="table-row"]').should('have.length', 2);
|
||||
cy.get('[data-test="table-row"]').should('have.length', 3);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -22,7 +22,7 @@ describe('dashboard list view', () => {
|
||||
beforeEach(() => {
|
||||
cy.login();
|
||||
cy.visit(DASHBOARD_LIST);
|
||||
cy.get('[data-test="list-view"]').click();
|
||||
cy.get('[aria-label="list-view"]').click();
|
||||
});
|
||||
|
||||
xit('should load rows', () => {
|
||||
@@ -51,11 +51,11 @@ describe('dashboard list view', () => {
|
||||
it('should bulk delete correctly', () => {
|
||||
cy.get('[data-test="listview-table"]').should('be.visible');
|
||||
cy.get('[data-test="bulk-select"]').eq(0).click();
|
||||
cy.get('[data-test="checkbox-off"]').eq(1).siblings('input').click();
|
||||
cy.get('[data-test="checkbox-off"]').eq(2).siblings('input').click();
|
||||
cy.get('[aria-label="checkbox-off"]').eq(1).siblings('input').click();
|
||||
cy.get('[aria-label="checkbox-off"]').eq(2).siblings('input').click();
|
||||
cy.get('[data-test="bulk-select-action"]').eq(0).click();
|
||||
cy.get('[data-test="delete-modal-input"]').eq(0).type('DELETE');
|
||||
cy.get('[data-test="modal-confirm-button"]').eq(0).click();
|
||||
cy.get('[data-test="checkbox-on"]').should('not.exist');
|
||||
cy.get('[aria-label="checkbox-on"]').should('not.exist');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -21,71 +21,50 @@ import { DATABASE_LIST } from './helper';
|
||||
describe('Add database', () => {
|
||||
beforeEach(() => {
|
||||
cy.login();
|
||||
});
|
||||
|
||||
it('should keep create modal open when error', () => {
|
||||
cy.visit(DATABASE_LIST);
|
||||
|
||||
// open modal
|
||||
cy.wait(3000);
|
||||
cy.get('[data-test="btn-create-database"]').click();
|
||||
|
||||
// values should be blank
|
||||
cy.get('[data-test="database-modal"] input[name="database_name"]').should(
|
||||
'have.value',
|
||||
'',
|
||||
);
|
||||
cy.get('[data-test="database-modal"] input[name="sqlalchemy_uri"]').should(
|
||||
'have.value',
|
||||
'',
|
||||
);
|
||||
|
||||
// type values
|
||||
cy.get('[data-test="database-modal"] input[name="database_name"]')
|
||||
.focus()
|
||||
.type('cypress');
|
||||
cy.get('[data-test="database-modal"] input[name="sqlalchemy_uri"]')
|
||||
.focus()
|
||||
.type('bad_db_uri');
|
||||
|
||||
// click save
|
||||
cy.get('[data-test="modal-confirm-button"]:not(:disabled)').click();
|
||||
|
||||
// should show error alerts and keep modal open
|
||||
cy.get('.toast').contains('error');
|
||||
cy.wait(1000); // wait for potential (incorrect) closing annimation
|
||||
cy.get('[data-test="database-modal"]').should('be.visible');
|
||||
|
||||
// should be able to close modal
|
||||
cy.get('[data-test="modal-cancel-button"]').click();
|
||||
cy.get('[data-test="database-modal"]').should('not.be.visible');
|
||||
});
|
||||
|
||||
it('should keep update modal open when error', () => {
|
||||
// open modal
|
||||
cy.get('[data-test="database-edit"]:last').click();
|
||||
it('should open dynamic form', () => {
|
||||
// click postgres dynamic form
|
||||
cy.get('.preferred > :nth-child(1)').click();
|
||||
|
||||
// it should show saved values
|
||||
cy.get('[data-test="database-modal"]:last input[name="sqlalchemy_uri"]')
|
||||
.invoke('val')
|
||||
.should('not.be.empty');
|
||||
cy.get('[data-test="database-modal"] input[name="database_name"]')
|
||||
.invoke('val')
|
||||
.should('not.be.empty');
|
||||
// make sure all the fields are rendering
|
||||
cy.get('input[name="host"]').should('have.value', '');
|
||||
cy.get('input[name="port"]').should('have.value', '');
|
||||
cy.get('input[name="database"]').should('have.value', '');
|
||||
cy.get('input[name="password"]').should('have.value', '');
|
||||
cy.get('input[name="database_name"]').should('have.value', '');
|
||||
});
|
||||
|
||||
cy.get('[data-test="database-modal"]:last input[name="sqlalchemy_uri"]')
|
||||
.focus()
|
||||
.dblclick()
|
||||
.type('{selectall}{backspace}bad_uri');
|
||||
it('should open sqlalchemy form', () => {
|
||||
// click postgres dynamic form
|
||||
cy.get('.preferred > :nth-child(1)').click();
|
||||
|
||||
// click save
|
||||
cy.get('[data-test="modal-confirm-button"]:not(:disabled)').click();
|
||||
cy.get('[data-test="sqla-connect-btn"]').click();
|
||||
|
||||
// should show error alerts
|
||||
// TODO(hugh): Update this test
|
||||
// cy.get('.toast').contains('error').should('be.visible');
|
||||
// check if the sqlalchemy form is showing up
|
||||
cy.get('[data-test=database-name-input]').should('be.visible');
|
||||
cy.get('[data-test="sqlalchemy-uri-input"]').should('be.visible');
|
||||
});
|
||||
|
||||
// modal should still be open
|
||||
// cy.wait(1000); // wait for potential (incorrect) closing annimation
|
||||
// cy.get('[data-test="database-modal"]').should('be.visible');
|
||||
it('show error alerts on dynamic form for bad host', () => {
|
||||
// click postgres dynamic form
|
||||
cy.get('.preferred > :nth-child(1)').click();
|
||||
cy.get('input[name="host"]').focus().type('badhost');
|
||||
cy.get('input[name="port"]').focus().type('5432');
|
||||
cy.get('.ant-form-item-explain-error').contains(
|
||||
"The hostname provided can't be resolved",
|
||||
);
|
||||
});
|
||||
|
||||
it('show error alerts on dynamic form for bad port', () => {
|
||||
// click postgres dynamic form
|
||||
cy.get('.preferred > :nth-child(1)').click();
|
||||
cy.get('input[name="host"]').focus().type('localhost');
|
||||
cy.get('input[name="port"]').focus().type('123');
|
||||
cy.get('input[name="database"]').focus();
|
||||
cy.get('.ant-form-item-explain-error').contains('The port is closed');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -99,20 +99,14 @@ describe('VizType control', () => {
|
||||
cy.visitChartByName('Daily Totals');
|
||||
cy.verifySliceSuccess({ waitAlias: '@tableChartData' });
|
||||
|
||||
let numScripts = 0;
|
||||
cy.get('script').then(nodes => {
|
||||
numScripts = nodes.length;
|
||||
});
|
||||
|
||||
cy.get('[data-test="visualization-type"]').contains('Table').click();
|
||||
|
||||
cy.get('button').contains('Evolution').click(); // change categories
|
||||
cy.get('[role="button"]').contains('Line Chart').click();
|
||||
cy.get('button').contains('Select').click();
|
||||
|
||||
// should load mathjs for line chart
|
||||
cy.get('script[src*="mathjs"]').should('have.length', 1);
|
||||
cy.get('script').then(nodes => {
|
||||
expect(nodes.length).to.greaterThan(numScripts);
|
||||
});
|
||||
|
||||
cy.get('button[data-test="run-query-button"]').click();
|
||||
cy.verifySliceSuccess({
|
||||
|
||||
@@ -73,13 +73,12 @@ describe('Visualization > Line', () => {
|
||||
it('should allow type to search color schemes', () => {
|
||||
cy.get('#controlSections-tab-display').click();
|
||||
cy.get('.Control[data-test="color_scheme"]').scrollIntoView();
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="text"]')
|
||||
cy.get('.Control[data-test="color_scheme"] input[type="search"]')
|
||||
.focus()
|
||||
.type('air{enter}');
|
||||
cy.get('input[name="select-color_scheme"]').should(
|
||||
'have.value',
|
||||
'bnbColors',
|
||||
);
|
||||
.type('bnbColors{enter}');
|
||||
cy.get(
|
||||
'.Control[data-test="color_scheme"] .ant-select-selection-item > ul[data-test="bnbColors"]',
|
||||
).should('exist');
|
||||
});
|
||||
|
||||
it('should work with adhoc metric', () => {
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M8.66667 5H12V6.33333H8.66667V5ZM8.66667 9.66667H12V11H8.66667V9.66667ZM12.6667 2H3.33333C2.6 2 2 2.6 2 3.33333V12.6667C2 13.4 2.6 14 3.33333 14H12.6667C13.4 14 14 13.4 14 12.6667V3.33333C14 2.6 13.4 2 12.6667 2ZM12.6667 12.6667H3.33333V3.33333H12.6667V12.6667ZM7.33333 4H4V7.33333H7.33333V4ZM6.66667 6.66667H4.66667V4.66667H6.66667V6.66667ZM7.33333 8.66667H4V12H7.33333V8.66667ZM6.66667 11.3333H4.66667V9.33333H6.66667V11.3333Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1,22 @@
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
|
||||
<svg width="17" height="17" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M7.73967 1.7002L4.04888 7.79629H11.4305L7.73967 1.7002ZM7.73967 4.3012L9.0348 6.4416H6.43783L7.73967 4.3012ZM11.4305 9.15098C9.75954 9.15098 8.41072 10.5124 8.41072 12.199C8.41072 13.8856 9.75954 15.2471 11.4305 15.2471C13.1014 15.2471 14.4502 13.8856 14.4502 12.199C14.4502 10.5124 13.1014 9.15098 11.4305 9.15098ZM11.4305 13.8924C10.5044 13.8924 9.75283 13.1338 9.75283 12.199C9.75283 11.2643 10.5044 10.5057 11.4305 10.5057C12.3565 10.5057 13.1081 11.2643 13.1081 12.199C13.1081 13.1338 12.3565 13.8924 11.4305 13.8924ZM1.7002 14.9084H7.06862V9.48965H1.7002V14.9084ZM3.0423 10.8443H5.72651V13.5537H3.0423V10.8443Z" fill="currentColor" fill-opacity="0.85"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
@@ -0,0 +1,21 @@
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path opacity="0.4" fill-rule="evenodd" clip-rule="evenodd" d="M15.9942 14.9661C16.0473 14.9256 16.0843 14.893 16.1094 14.8686V12.3207C15.7158 12.5563 15.2568 12.7608 14.7565 12.9359C13.2501 13.4632 11.2149 13.7763 8.99998 13.7763C6.78508 13.7763 4.74988 13.4632 3.24347 12.9359C2.74318 12.7608 2.28418 12.5563 1.89058 12.3207V14.8686C1.91568 14.893 1.95268 14.9256 2.00578 14.9661C2.26078 15.1603 2.71837 15.3956 3.40987 15.6184C4.77707 16.059 6.75368 16.3544 8.99998 16.3544C11.2463 16.3544 13.2229 16.059 14.5901 15.6184C15.2816 15.3956 15.7392 15.1603 15.9942 14.9661ZM15.7503 10.8614C16.0622 10.6033 16.1094 10.4232 16.1094 10.3388V8.41454C15.7158 8.65004 15.2568 8.85464 14.7565 9.02974C13.2501 9.55694 11.2149 9.87004 8.99998 9.87004C6.78508 9.87004 4.74988 9.55694 3.24347 9.02974C2.74318 8.85464 2.28418 8.65004 1.89058 8.41454V10.3388C1.89058 10.4232 1.93777 10.6033 2.24967 10.8614C2.55707 11.1158 3.04418 11.3763 3.70798 11.6086C5.02918 12.071 6.90007 12.37 8.99998 12.37C11.0999 12.37 12.9708 12.071 14.292 11.6086C14.9558 11.3763 15.4429 11.1158 15.7503 10.8614ZM0.484375 6.43254V10.3388V15.0165C0.484375 16.5321 4.29698 17.7607 8.99998 17.7607C13.703 17.7607 17.5156 16.5321 17.5156 15.0165V10.3388V6.43254V3.31734C17.5156 1.80174 13.703 0.573242 8.99998 0.573242H8.99508H8.99018C4.29258 0.573242 0.484375 1.80174 0.484375 3.31734V6.43254ZM16.1094 6.43254V4.81964C14.59 5.56754 11.9689 6.06144 8.99018 6.06144C6.02428 6.06144 3.41288 5.57174 1.89058 4.82924V6.43254C1.89058 6.51694 1.93777 6.69714 2.24967 6.95524C2.55707 7.20954 3.04418 7.47004 3.70798 7.70244C5.02918 8.16484 6.90007 8.46384 8.99998 8.46384C11.0999 8.46384 12.9708 8.16484 14.292 7.70244C14.9558 7.47004 15.4429 7.20954 15.7503 6.95524C16.0622 6.69714 16.1094 6.51694 16.1094 6.43254ZM2.07487 3.31764C2.33937 3.50124 2.77558 3.71554 3.40748 3.91944C4.77268 4.35984 6.74668 4.65524 8.99018 4.65524C11.2337 4.65524 13.2078 4.35984 14.573 3.91944C15.2053 3.71544 15.6416 3.50104 15.9061 3.31734C15.6416 3.13364 15.2053 2.91924 14.573 2.71524C13.2087 2.27514 11.2366 1.97984 8.99508 1.97944C6.75078 1.97984 4.77607 2.27514 3.40987 2.71544C2.77677 2.91944 2.33977 3.13384 2.07487 3.31764ZM16.1561 14.8151C16.1565 14.8152 16.1546 14.8186 16.1493 14.8253C16.1532 14.8185 16.1558 14.8151 16.1561 14.8151ZM1.84998 3.50934C1.84668 3.51524 1.84438 3.51814 1.84408 3.51804H1.84398C1.84458 3.51684 1.84648 3.51394 1.84998 3.50934ZM1.84387 14.8151C1.84417 14.8151 1.84678 14.8185 1.85068 14.8253C1.84538 14.8186 1.84347 14.8152 1.84387 14.8151Z" fill="#444E7C"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.3 KiB |
@@ -0,0 +1,21 @@
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M10 12C10 13.1046 10.8954 14 12 14C13.1046 14 14 13.1046 14 12C14 10.8954 13.1046 10 12 10C10.8954 10 10 10.8954 10 12ZM10 19C10 20.1046 10.8954 21 12 21C13.1046 21 14 20.1046 14 19C14 17.8954 13.1046 17 12 17C10.8954 17 10 17.8954 10 19ZM10 5C10 6.10457 10.8954 7 12 7C13.1046 7 14 6.10457 14 5C14 3.89543 13.1046 3 12 3C10.8954 3 10 3.89543 10 5Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1,22 @@
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
|
||||
<svg width="17" height="17" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M14.1668 7.0835V5.66683H11.3335V2.8335H9.91683V5.66683H7.0835V2.8335H5.66683V5.66683H2.8335V7.0835H5.66683V9.91683H2.8335V11.3335H5.66683V14.1668H7.0835V11.3335H9.91683V14.1668H11.3335V11.3335H14.1668V9.91683H11.3335V7.0835H14.1668ZM9.91683 9.91683H7.0835V7.0835H9.91683V9.91683Z" fill="currentColor" fill-opacity="0.85"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 53 KiB |
@@ -20,7 +20,7 @@ module.exports = {
|
||||
testRegex: '(\\/spec|\\/src)\\/.*(_spec|\\.test)\\.(j|t)sx?$',
|
||||
moduleNameMapper: {
|
||||
'\\.(css|less)$': '<rootDir>/spec/__mocks__/styleMock.js',
|
||||
'\\.(gif|ttf|eot|png)$': '<rootDir>/spec/__mocks__/fileMock.js',
|
||||
'\\.(gif|ttf|eot|png|jpg)$': '<rootDir>/spec/__mocks__/fileMock.js',
|
||||
'\\.svg$': '<rootDir>/spec/__mocks__/svgrMock.tsx',
|
||||
'^src/(.*)$': '<rootDir>/src/$1',
|
||||
'^spec/(.*)$': '<rootDir>/spec/$1',
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "superset",
|
||||
"version": "0.999.0dev",
|
||||
"version": "0.0.0dev",
|
||||
"description": "Superset is a data exploration platform designed to be visual, intuitive, and interactive.",
|
||||
"license": "Apache-2.0",
|
||||
"directories": {
|
||||
@@ -67,35 +67,35 @@
|
||||
"@emotion/babel-preset-css-prop": "^11.2.0",
|
||||
"@emotion/cache": "^11.1.3",
|
||||
"@emotion/react": "^11.1.5",
|
||||
"@superset-ui/chart-controls": "^0.17.58",
|
||||
"@superset-ui/core": "^0.17.58",
|
||||
"@superset-ui/legacy-plugin-chart-calendar": "^0.17.58",
|
||||
"@superset-ui/legacy-plugin-chart-chord": "^0.17.58",
|
||||
"@superset-ui/legacy-plugin-chart-country-map": "^0.17.58",
|
||||
"@superset-ui/legacy-plugin-chart-event-flow": "^0.17.58",
|
||||
"@superset-ui/legacy-plugin-chart-force-directed": "^0.17.58",
|
||||
"@superset-ui/legacy-plugin-chart-heatmap": "^0.17.58",
|
||||
"@superset-ui/legacy-plugin-chart-histogram": "^0.17.58",
|
||||
"@superset-ui/legacy-plugin-chart-horizon": "^0.17.58",
|
||||
"@superset-ui/legacy-plugin-chart-map-box": "^0.17.58",
|
||||
"@superset-ui/legacy-plugin-chart-paired-t-test": "^0.17.58",
|
||||
"@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.17.58",
|
||||
"@superset-ui/legacy-plugin-chart-partition": "^0.17.58",
|
||||
"@superset-ui/legacy-plugin-chart-pivot-table": "^0.17.58",
|
||||
"@superset-ui/legacy-plugin-chart-rose": "^0.17.58",
|
||||
"@superset-ui/legacy-plugin-chart-sankey": "^0.17.58",
|
||||
"@superset-ui/legacy-plugin-chart-sankey-loop": "^0.17.58",
|
||||
"@superset-ui/legacy-plugin-chart-sunburst": "^0.17.58",
|
||||
"@superset-ui/legacy-plugin-chart-treemap": "^0.17.58",
|
||||
"@superset-ui/legacy-plugin-chart-world-map": "^0.17.58",
|
||||
"@superset-ui/legacy-preset-chart-big-number": "^0.17.58",
|
||||
"@superset-ui/legacy-preset-chart-deckgl": "^0.4.7",
|
||||
"@superset-ui/legacy-preset-chart-nvd3": "^0.17.58",
|
||||
"@superset-ui/plugin-chart-echarts": "^0.17.58",
|
||||
"@superset-ui/plugin-chart-pivot-table": "^0.17.58",
|
||||
"@superset-ui/plugin-chart-table": "^0.17.58",
|
||||
"@superset-ui/plugin-chart-word-cloud": "^0.17.58",
|
||||
"@superset-ui/preset-chart-xy": "^0.17.58",
|
||||
"@superset-ui/chart-controls": "^0.17.80",
|
||||
"@superset-ui/core": "^0.17.80",
|
||||
"@superset-ui/legacy-plugin-chart-calendar": "^0.17.80",
|
||||
"@superset-ui/legacy-plugin-chart-chord": "^0.17.80",
|
||||
"@superset-ui/legacy-plugin-chart-country-map": "^0.17.80",
|
||||
"@superset-ui/legacy-plugin-chart-event-flow": "^0.17.80",
|
||||
"@superset-ui/legacy-plugin-chart-force-directed": "^0.17.80",
|
||||
"@superset-ui/legacy-plugin-chart-heatmap": "^0.17.80",
|
||||
"@superset-ui/legacy-plugin-chart-histogram": "^0.17.80",
|
||||
"@superset-ui/legacy-plugin-chart-horizon": "^0.17.80",
|
||||
"@superset-ui/legacy-plugin-chart-map-box": "^0.17.80",
|
||||
"@superset-ui/legacy-plugin-chart-paired-t-test": "^0.17.80",
|
||||
"@superset-ui/legacy-plugin-chart-parallel-coordinates": "^0.17.80",
|
||||
"@superset-ui/legacy-plugin-chart-partition": "^0.17.80",
|
||||
"@superset-ui/legacy-plugin-chart-pivot-table": "^0.17.80",
|
||||
"@superset-ui/legacy-plugin-chart-rose": "^0.17.80",
|
||||
"@superset-ui/legacy-plugin-chart-sankey": "^0.17.80",
|
||||
"@superset-ui/legacy-plugin-chart-sankey-loop": "^0.17.80",
|
||||
"@superset-ui/legacy-plugin-chart-sunburst": "^0.17.80",
|
||||
"@superset-ui/legacy-plugin-chart-treemap": "^0.17.80",
|
||||
"@superset-ui/legacy-plugin-chart-world-map": "^0.17.80",
|
||||
"@superset-ui/legacy-preset-chart-big-number": "^0.17.80",
|
||||
"@superset-ui/legacy-preset-chart-deckgl": "^0.4.9",
|
||||
"@superset-ui/legacy-preset-chart-nvd3": "^0.17.80",
|
||||
"@superset-ui/plugin-chart-echarts": "^0.17.80",
|
||||
"@superset-ui/plugin-chart-pivot-table": "^0.17.80",
|
||||
"@superset-ui/plugin-chart-table": "^0.17.80",
|
||||
"@superset-ui/plugin-chart-word-cloud": "^0.17.80",
|
||||
"@superset-ui/preset-chart-xy": "^0.17.80",
|
||||
"@vx/responsive": "^0.0.195",
|
||||
"abortcontroller-polyfill": "^1.1.9",
|
||||
"antd": "^4.9.4",
|
||||
@@ -113,6 +113,7 @@
|
||||
"emotion-rgba": "0.0.9",
|
||||
"fontsource-fira-code": "^3.0.5",
|
||||
"fontsource-inter": "^3.0.5",
|
||||
"fuse.js": "^6.4.6",
|
||||
"geolib": "^2.0.24",
|
||||
"global-box": "^1.2.0",
|
||||
"html-webpack-plugin": "^4.5.1",
|
||||
@@ -130,6 +131,7 @@
|
||||
"mathjs": "^8.0.1",
|
||||
"memoize-one": "^5.1.1",
|
||||
"moment": "^2.26.0",
|
||||
"moment-timezone": "^0.5.33",
|
||||
"mousetrap": "^1.6.1",
|
||||
"mustache": "^2.2.1",
|
||||
"omnibar": "^2.1.1",
|
||||
@@ -147,10 +149,10 @@
|
||||
"react-dom": "^16.13.0",
|
||||
"react-gravatar": "^2.6.1",
|
||||
"react-hot-loader": "^4.12.20",
|
||||
"react-icons": "^4.2.0",
|
||||
"react-js-cron": "^1.2.0",
|
||||
"react-json-tree": "^0.11.2",
|
||||
"react-jsonschema-form": "^1.2.0",
|
||||
"react-lines-ellipsis": "^0.15.0",
|
||||
"react-loadable": "^5.5.0",
|
||||
"react-markdown": "^4.3.1",
|
||||
"react-redux": "^7.2.0",
|
||||
@@ -177,6 +179,7 @@
|
||||
"redux-undo": "^1.0.0-beta9-9-7",
|
||||
"regenerator-runtime": "^0.13.5",
|
||||
"rison": "^0.1.1",
|
||||
"scroll-into-view-if-needed": "^2.2.28",
|
||||
"shortid": "^2.2.6",
|
||||
"urijs": "^1.19.6",
|
||||
"use-immer": "^0.4.2",
|
||||
@@ -189,7 +192,6 @@
|
||||
"@babel/node": "^7.12.10",
|
||||
"@babel/plugin-proposal-class-properties": "^7.12.1",
|
||||
"@babel/plugin-proposal-optional-chaining": "^7.12.7",
|
||||
"@babel/plugin-proposal-private-methods": "^7.14.5",
|
||||
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
|
||||
"@babel/plugin-transform-runtime": "^7.12.10",
|
||||
"@babel/preset-env": "^7.12.11",
|
||||
@@ -206,7 +208,7 @@
|
||||
"@storybook/client-api": "^6.1.17",
|
||||
"@storybook/preset-typescript": "^3.0.0",
|
||||
"@storybook/react": "^6.1.20",
|
||||
"@svgr/webpack": "^5.5.0",
|
||||
"@svgr/webpack": "^5.4.0",
|
||||
"@testing-library/dom": "^7.29.4",
|
||||
"@testing-library/jest-dom": "^5.11.6",
|
||||
"@testing-library/react": "^11.2.0",
|
||||
@@ -302,7 +304,7 @@
|
||||
"transform-loader": "^0.2.3",
|
||||
"ts-jest": "^26.4.2",
|
||||
"ts-loader": "^8.0.7",
|
||||
"typescript": "^4.0.3",
|
||||
"typescript": "^4.1.6",
|
||||
"url-loader": "^1.0.1",
|
||||
"webpack": "^4.42.0",
|
||||
"webpack-bundle-analyzer": "^3.6.1",
|
||||
|
||||
@@ -45,7 +45,6 @@ export const nativeFilters: NativeFiltersState = {
|
||||
rootPath: ['ROOT_ID'],
|
||||
excluded: [],
|
||||
},
|
||||
isInstant: true,
|
||||
controlValues: {
|
||||
multiSelect: false,
|
||||
enableEmptyFilter: false,
|
||||
@@ -79,7 +78,6 @@ export const nativeFilters: NativeFiltersState = {
|
||||
enableEmptyFilter: false,
|
||||
inverseSelection: false,
|
||||
},
|
||||
isInstant: true,
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -136,7 +134,6 @@ export const singleNativeFiltersState = {
|
||||
cascadeParentIds: [],
|
||||
scope: { rootPath: ['ROOT_ID'], excluded: [227, 229] },
|
||||
inverseSelection: false,
|
||||
isInstant: true,
|
||||
allowsMultipleValues: false,
|
||||
isRequired: false,
|
||||
},
|
||||
|
||||
@@ -28,6 +28,7 @@ import dashboardInfo from './mockDashboardInfo';
|
||||
import { emptyFilters } from './mockDashboardFilters';
|
||||
import dashboardState from './mockDashboardState';
|
||||
import { sliceEntitiesForChart } from './mockSliceEntities';
|
||||
import { user } from '../javascripts/sqllab/fixtures';
|
||||
|
||||
export default {
|
||||
datasources,
|
||||
@@ -40,5 +41,6 @@ export default {
|
||||
dashboardState,
|
||||
dashboardLayout,
|
||||
messageToasts,
|
||||
user,
|
||||
impressionId: 'mock_impression_id',
|
||||
};
|
||||
|
||||
@@ -20,6 +20,7 @@ import '@testing-library/jest-dom/extend-expect';
|
||||
import React, { ReactNode, ReactElement } from 'react';
|
||||
import { render, RenderOptions } from '@testing-library/react';
|
||||
import { ThemeProvider, supersetTheme } from '@superset-ui/core';
|
||||
import { BrowserRouter } from 'react-router-dom';
|
||||
import { Provider } from 'react-redux';
|
||||
import { combineReducers, createStore, applyMiddleware, compose } from 'redux';
|
||||
import thunk from 'redux-thunk';
|
||||
@@ -32,13 +33,20 @@ type Options = Omit<RenderOptions, 'queries'> & {
|
||||
useRedux?: boolean;
|
||||
useDnd?: boolean;
|
||||
useQueryParams?: boolean;
|
||||
useRouter?: boolean;
|
||||
initialState?: {};
|
||||
reducers?: {};
|
||||
};
|
||||
|
||||
function createWrapper(options?: Options) {
|
||||
const { useDnd, useRedux, useQueryParams, initialState, reducers } =
|
||||
options || {};
|
||||
const {
|
||||
useDnd,
|
||||
useRedux,
|
||||
useQueryParams,
|
||||
useRouter,
|
||||
initialState,
|
||||
reducers,
|
||||
} = options || {};
|
||||
|
||||
return ({ children }: { children?: ReactNode }) => {
|
||||
let result = (
|
||||
@@ -63,6 +71,10 @@ function createWrapper(options?: Options) {
|
||||
result = <QueryParamProvider>{result}</QueryParamProvider>;
|
||||
}
|
||||
|
||||
if (useRouter) {
|
||||
result = <BrowserRouter>{result}</BrowserRouter>;
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -20,10 +20,15 @@ import React from 'react';
|
||||
import { shallow } from 'enzyme';
|
||||
import { supersetTheme } from '@superset-ui/core';
|
||||
import { Provider } from 'react-redux';
|
||||
import { Store } from 'redux';
|
||||
import * as SupersetUI from '@superset-ui/core';
|
||||
import { CHART_UPDATE_SUCCEEDED } from 'src/chart/chartAction';
|
||||
import { styledMount as mount } from 'spec/helpers/theming';
|
||||
import {
|
||||
CHART_RENDERING_SUCCEEDED,
|
||||
CHART_UPDATE_SUCCEEDED,
|
||||
} from 'src/chart/chartAction';
|
||||
import { buildActiveFilters } from 'src/dashboard/util/activeDashboardFilters';
|
||||
import FiltersBadge from 'src/dashboard/containers/FiltersBadge';
|
||||
import { FiltersBadge } from 'src/dashboard/components/FiltersBadge';
|
||||
import {
|
||||
getMockStoreWithFilters,
|
||||
getMockStoreWithNativeFilters,
|
||||
@@ -34,6 +39,15 @@ import { dashboardWithFilter } from 'spec/fixtures/mockDashboardLayout';
|
||||
import Icons from 'src/components/Icons';
|
||||
import { FeatureFlag } from 'src/featureFlags';
|
||||
|
||||
const defaultStore = getMockStoreWithFilters();
|
||||
function setup(store: Store = defaultStore) {
|
||||
return mount(
|
||||
<Provider store={store}>
|
||||
<FiltersBadge chartId={sliceId} />
|
||||
</Provider>,
|
||||
);
|
||||
}
|
||||
|
||||
describe('FiltersBadge', () => {
|
||||
// there's this bizarre "active filters" thing
|
||||
// that doesn't actually use any kind of state management.
|
||||
@@ -71,9 +85,7 @@ describe('FiltersBadge', () => {
|
||||
<FiltersBadge chartId={sliceId} />,
|
||||
</Provider>,
|
||||
);
|
||||
expect(
|
||||
wrapper.dive().find('[data-test="applied-filter-count"]'),
|
||||
).not.toExist();
|
||||
expect(wrapper.find('[data-test="applied-filter-count"]')).not.toExist();
|
||||
});
|
||||
|
||||
it('shows the indicator when filters have been applied', () => {
|
||||
@@ -91,14 +103,13 @@ describe('FiltersBadge', () => {
|
||||
],
|
||||
dashboardFilters,
|
||||
});
|
||||
const wrapper = shallow(
|
||||
<FiltersBadge {...{ store }} chartId={sliceId} />,
|
||||
).dive();
|
||||
expect(wrapper.dive().find('DetailsPanelPopover')).toExist();
|
||||
expect(
|
||||
wrapper.dive().find('[data-test="applied-filter-count"]'),
|
||||
).toHaveText('1');
|
||||
expect(wrapper.dive().find('WarningFilled')).not.toExist();
|
||||
store.dispatch({ type: CHART_RENDERING_SUCCEEDED, key: sliceId });
|
||||
const wrapper = setup(store);
|
||||
expect(wrapper.find('DetailsPanelPopover')).toExist();
|
||||
expect(wrapper.find('[data-test="applied-filter-count"]')).toHaveText(
|
||||
'1',
|
||||
);
|
||||
expect(wrapper.find('WarningFilled')).not.toExist();
|
||||
});
|
||||
|
||||
it("shows a warning when there's a rejected filter", () => {
|
||||
@@ -118,19 +129,18 @@ describe('FiltersBadge', () => {
|
||||
],
|
||||
dashboardFilters,
|
||||
});
|
||||
const wrapper = shallow(
|
||||
<FiltersBadge {...{ store }} chartId={sliceId} />,
|
||||
).dive();
|
||||
expect(wrapper.dive().find('DetailsPanelPopover')).toExist();
|
||||
store.dispatch({ type: CHART_RENDERING_SUCCEEDED, key: sliceId });
|
||||
const wrapper = setup(store);
|
||||
expect(wrapper.find('DetailsPanelPopover')).toExist();
|
||||
expect(wrapper.find('[data-test="applied-filter-count"]')).toHaveText(
|
||||
'0',
|
||||
);
|
||||
expect(
|
||||
wrapper.dive().find('[data-test="applied-filter-count"]'),
|
||||
).toHaveText('0');
|
||||
expect(
|
||||
wrapper.dive().find('[data-test="incompatible-filter-count"]'),
|
||||
wrapper.find('[data-test="incompatible-filter-count"]'),
|
||||
).toHaveText('1');
|
||||
// to look at the shape of the wrapper use:
|
||||
// console.log(wrapper.dive().debug())
|
||||
expect(wrapper.dive().find(Icons.AlertSolid)).toExist();
|
||||
// console.log(wrapper.debug())
|
||||
expect(wrapper.find(Icons.AlertSolid)).toExist();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -149,14 +159,9 @@ describe('FiltersBadge', () => {
|
||||
},
|
||||
],
|
||||
});
|
||||
const wrapper = shallow(
|
||||
<Provider store={store}>
|
||||
<FiltersBadge chartId={sliceId} />,
|
||||
</Provider>,
|
||||
);
|
||||
expect(
|
||||
wrapper.dive().find('[data-test="applied-filter-count"]'),
|
||||
).not.toExist();
|
||||
store.dispatch({ type: CHART_RENDERING_SUCCEEDED, key: sliceId });
|
||||
const wrapper = setup(store);
|
||||
expect(wrapper.find('[data-test="applied-filter-count"]')).not.toExist();
|
||||
});
|
||||
|
||||
it('shows the indicator when filters have been applied', () => {
|
||||
@@ -177,14 +182,13 @@ describe('FiltersBadge', () => {
|
||||
},
|
||||
],
|
||||
});
|
||||
const wrapper = shallow(
|
||||
<FiltersBadge {...{ store }} chartId={sliceId} />,
|
||||
).dive();
|
||||
expect(wrapper.dive().find('DetailsPanelPopover')).toExist();
|
||||
expect(
|
||||
wrapper.dive().find('[data-test="applied-filter-count"]'),
|
||||
).toHaveText('1');
|
||||
expect(wrapper.dive().find('WarningFilled')).not.toExist();
|
||||
store.dispatch({ type: CHART_RENDERING_SUCCEEDED, key: sliceId });
|
||||
const wrapper = setup(store);
|
||||
expect(wrapper.find('DetailsPanelPopover')).toExist();
|
||||
expect(wrapper.find('[data-test="applied-filter-count"]')).toHaveText(
|
||||
'1',
|
||||
);
|
||||
expect(wrapper.find('WarningFilled')).not.toExist();
|
||||
});
|
||||
|
||||
it("shows a warning when there's a rejected filter", () => {
|
||||
@@ -207,17 +211,16 @@ describe('FiltersBadge', () => {
|
||||
},
|
||||
],
|
||||
});
|
||||
const wrapper = shallow(
|
||||
<FiltersBadge {...{ store }} chartId={sliceId} />,
|
||||
).dive();
|
||||
expect(wrapper.dive().find('DetailsPanelPopover')).toExist();
|
||||
store.dispatch({ type: CHART_RENDERING_SUCCEEDED, key: sliceId });
|
||||
const wrapper = setup(store);
|
||||
expect(wrapper.find('DetailsPanelPopover')).toExist();
|
||||
expect(wrapper.find('[data-test="applied-filter-count"]')).toHaveText(
|
||||
'0',
|
||||
);
|
||||
expect(
|
||||
wrapper.dive().find('[data-test="applied-filter-count"]'),
|
||||
).toHaveText('0');
|
||||
expect(
|
||||
wrapper.dive().find('[data-test="incompatible-filter-count"]'),
|
||||
wrapper.find('[data-test="incompatible-filter-count"]'),
|
||||
).toHaveText('1');
|
||||
expect(wrapper.dive().find(Icons.AlertSolid)).toExist();
|
||||
expect(wrapper.find(Icons.AlertSolid)).toExist();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -155,10 +155,10 @@ describe('SliceAdder', () => {
|
||||
});
|
||||
|
||||
it('handleSelect', () => {
|
||||
const newSortBy = { value: 'viz_type' };
|
||||
const newSortBy = 'viz_type';
|
||||
wrapper.instance().handleSelect(newSortBy);
|
||||
expect(spy.calledOnce).toBe(true);
|
||||
expect(spy.lastCall.args[1]).toBe(newSortBy.value);
|
||||
expect(spy.lastCall.args[1]).toBe(newSortBy);
|
||||
});
|
||||
|
||||
it('handleKeyPress', () => {
|
||||
|
||||