#
# 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.
#
[flake8]
accept-encodings = utf-8
application-import-names =
    superset
    tests
exclude =
    .tox
    build
    docs
    superset/assets
    superset/data
    superset/migrations
    superset/templates
ignore =
    FI12
    FI15
    FI16
    FI17
    FI50
    FI51
    FI53
    FI54
    W504
    W605
import-order-style = google
max-line-length = 90
require-code = true

[testenv]
commands =
    {toxinidir}/superset/bin/superset db upgrade
    nosetests tests/load_examples_test.py
    nosetests -e load_examples_test {posargs}
deps =
    -rrequirements.txt
    -rrequirements-dev.txt
    coverage
    mock
    nose
setenv =
    PYTHONPATH = {toxinidir}
    SUPERSET_CONFIG = tests.superset_test_config
    SUPERSET_HOME = {envtmpdir}
    py36-mysql: SUPERSET__SQLALCHEMY_DATABASE_URI = mysql://mysqluser:mysqluserpassword@localhost/superset
    py36-postgres: SUPERSET__SQLALCHEMY_DATABASE_URI = postgresql+psycopg2://postgresuser:pguserpassword@localhost/superset
    py36-sqlite: SUPERSET__SQLALCHEMY_DATABASE_URI = sqlite:////{envtmpdir}/superset.db
whitelist_externals =
    npm

[testenv:cypress-dashboard]
commands =
    npm install -g npm@'>=6.5.0'
    pip install -e {toxinidir}/
    {toxinidir}/superset/assets/cypress_build.sh dashboard
setenv =
    PYTHONPATH = {toxinidir}
    SUPERSET_CONFIG = tests.superset_test_config
    SUPERSET_HOME = {envtmpdir}
deps =
    -rrequirements.txt
    -rrequirements-dev.txt

[testenv:cypress-explore]
commands =
    npm install -g npm@'>=6.5.0'
    pip install -e {toxinidir}/
    {toxinidir}/superset/assets/cypress_build.sh explore
setenv =
    PYTHONPATH = {toxinidir}
    SUPERSET_CONFIG = tests.superset_test_config
    SUPERSET_HOME = {envtmpdir}
deps =
    -rrequirements.txt
    -rrequirements-dev.txt

[testenv:cypress-sqllab]
commands =
    npm install -g npm@'>=6.5.0'
    pip install -e {toxinidir}/
    {toxinidir}/superset/assets/cypress_build.sh sqllab
setenv =
    PYTHONPATH = {toxinidir}
    SUPERSET_CONFIG = tests.superset_test_config
    SUPERSET_HOME = {envtmpdir}
deps =
    -rrequirements.txt
    -rrequirements-dev.txt

[testenv:eslint]
changedir = {toxinidir}/superset/assets
commands =
    npm run lint
deps =

[testenv:flake8]
commands =
    flake8 {toxinidir}/
deps =
    -rrequirements-dev.txt

[testenv:javascript]
commands =
    npm install -g npm@'>=6.5.0'
    {toxinidir}/superset/assets/js_build.sh
deps =

[testenv:pylint]
commands =
    pylint superset
deps =
    -rrequirements.txt
    -rrequirements-dev.txt

[testenv:license-check]
commands =
    {toxinidir}/scripts/check_license.sh
whitelist_externals =
    {toxinidir}/scripts/check_license.sh
passenv = *

[tox]
envlist =
    cypress-dashboard
    cypress-explore
    cypress-sqllab
    eslint
    flake8
    javascript
    pylint
    license-check
skipsdist = true
