################################################################################
#  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.
################################################################################

[tox]
# tox (https://tox.readthedocs.io/) is a tool for running tests
# in multiple virtualenvs. This configuration file will run the
# test suite on all supported python versions.
# new environments will be excluded by default unless explicitly added to envlist.
envlist = {py36, py37, py38}-cython

[testenv]
whitelist_externals=
    /bin/bash
deps =
    -r dev/dev-requirements.txt
    pytest
    apache-flink-libraries
passenv = *
commands =
    python --version
    # python test
    bash ./dev/integration_test.sh
    python setup.py build_ext --inplace --force
    # cython test
    bash ./dev/integration_test.sh
    bash ./dev/run_pip_test.sh
# Replace the default installation command with a custom retry installation script, because on high-speed
# networks, downloading a package may raise a ConnectionResetError: [Errno 104] Peer reset connection.
install_command = {toxinidir}/dev/install_command.sh {opts} {packages}

[flake8]
# We follow PEP 8 (https://www.python.org/dev/peps/pep-0008/) with one exception: lines can be
# up to 100 characters in length, not 79.
ignore=E226,E241,E305,E402,E722,E731,E741,W503,W504
max-line-length=100
exclude=.tox/*,dev/*,lib/*,target/*,build/*,dist/*,pyflink/shell.py,.eggs/*,pyflink/fn_execution/tests/process_mode_test_data.py,pyflink/fn_execution/*_pb2.py,pyflink/examples/table/basic_operations.py

[mypy]
files=pyflink/common/*.py,pyflink/table/*.py,pyflink/datastream/*.py,pyflink/metrics/*.py
ignore_missing_imports = True
strict_optional=False

[mypy-pyflink.fn_execution.*]
ignore_errors = True
