# Copyright 2016 Google Inc.
#
# Licensed 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.

import platform
import setuptools
from setuptools.command import test
import sys

install_requires = [
    'portpicker',
    'pyyaml',
    'typing_extensions>=4.1.1; python_version<"3.8"',
]

if platform.system() == 'Windows':
  install_requires.append('pywin32')


class PyTest(test.test):
  """Class used to execute unit tests using PyTest. This allows us to execute
  unit tests without having to install the package.
  """

  def finalize_options(self):
    test.test.finalize_options(self)
    self.test_args = ['-x', "tests/mobly"]
    self.test_suite = True

  def run_tests(self):
    import pytest
    errno = pytest.main(self.test_args)
    sys.exit(errno)


def main():
  setuptools.setup(
      name='mobly',
      version='1.12',
      maintainer='Ang Li',
      maintainer_email='mobly-github@googlegroups.com',
      description='Automation framework for special end-to-end test cases',
      license='Apache2.0',
      url='https://github.com/google/mobly',
      download_url='https://github.com/google/mobly/tarball/1.12',
      packages=setuptools.find_packages(exclude=['tests']),
      include_package_data=False,
      scripts=['tools/sl4a_shell.py', 'tools/snippet_shell.py'],
      tests_require=[
          'mock',
          'pytest',
          'pytz',
      ],
      install_requires=install_requires,
      cmdclass={'test': PyTest},
  )


if __name__ == '__main__':
  main()
