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

environment:
  TOX_ENV: windows

  matrix:
    - PYTHON: "C:\\Python27"
      PYTHON_VERSION: 2.7.8
      PYTHON_ARCH: 32
      CONCURRENCY: 1

build: false

install:
  - SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%
  # Note: bootstrap.pypa.io seems to have an SSL configuration problem causing downloads to fail, so we will instead get the script from GitHub
  # -ps: (new-object System.Net.WebClient).Downloadfile('https://bootstrap.pypa.io/get-pip.py', 'C:\Users\Emblem Parade\Desktop\get-pip.py')
  - ps: (new-object System.Net.WebClient).Downloadfile('https://github.com/pypa/get-pip/blob/master/get-pip.py', 'C:\Users\appveyor\get-pip.py')
  - ps: Start-Process -FilePath "C:\Python27\python.exe" -ArgumentList "C:\Users\appveyor\get-pip.py" -Wait -Passthru

before_test:
  - pip install virtualenv --upgrade
  - virtualenv env
  - env\Scripts\activate.bat
  - pip install tox

test_script:
  - tox -e %TOX_ENV%
