################################################################################
#  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 =
    pytest
    apache-beam==2.27.0
    cython==0.29.16
    grpcio>=1.29.0,<2
    grpcio-tools>=1.3.5,<=1.14.2
    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

[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
