name: ci
on: push
jobs:

  lint:
    name: lint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - uses: actions/setup-python@v1
        with:
          python-version: '3.7'
      - name: extract pip cache
        uses: actions/cache@v2
        with:
          path: ~/.cache/pip
          key: ${{ runner.os }}-pip-${{ hashFiles('setup.py') }}
          restore-keys: ${{ runner.os }}-pip-
      - run: |
          pip install --user --upgrade pip wheel
          pip install -e .[lint]
      - run: make lint

  tests-unit:
    name: "tests / unit"
    strategy:
      matrix:
        os:
          - ubuntu-latest
          - macos-latest
          - windows-latest
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v1
      - uses: actions/setup-python@v1
        with:
          python-version: '3.7'
      - name: set pip cache dir
        id: pip-cache
        run: echo "::set-output name=dir::$(pip cache dir)"
      - name: extract pip cache
        uses: actions/cache@v2
        with:
          path: ${{ steps.pip-cache.outputs.dir }}
          key: ${{ runner.os }}-pip-${{ hashFiles('setup.py') }}
          restore-keys: ${{ runner.os }}-pip-
      - run: |
          pip install --user --upgrade pip wheel
          pip install -e .[test]
      - env:
          HOME: /tmp
        run: coverage run -m unittest -vv tests.unit.test_conf tests.unit.blockchain tests.unit.test_event_controller tests.unit.crypto tests.unit.schema tests.unit.db
#        run: coverage run -m unittest discover -vv tests.unit
      - env:
          COVERALLS_REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          COVERALLS_PARALLEL: true
        name: Submit to coveralls
        run: |
          pip install https://github.com/bboe/coveralls-python/archive/github_actions.zip
          coveralls

  tests-integration:
    name: "tests / integration"
    runs-on: ubuntu-latest
    strategy:
      matrix:
        test:
#          - datanetwork
          - blockchain
#          - other
        db:
          - sqlite
          - postgres
    services:
      postgres:
        image: postgres:12
        env:
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: postgres
          POSTGRES_DB: postgres
        ports:
        - 5432:5432
        options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
    steps:
      - uses: actions/checkout@v1
      - uses: actions/setup-python@v1
        with:
          python-version: '3.7'
      - if: matrix.test == 'other'
        run: |
          sudo apt-get update
          sudo apt-get install -y --no-install-recommends ffmpeg
      - name: extract pip cache
        uses: actions/cache@v2
        with:
          path: ./.tox
          key: tox-integration-${{ matrix.test }}-${{ matrix.db }}-${{ hashFiles('setup.py') }}
          restore-keys: txo-integration-${{ matrix.test }}-${{ matrix.db }}-
      - run: pip install tox
      - env:
          TEST_DB: ${{ matrix.db }}
        run: tox -e ${{ matrix.test }}
      - env:
          COVERALLS_REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          COVERALLS_PARALLEL: true
        name: Submit to coveralls
        run: |
          pip install https://github.com/bboe/coveralls-python/archive/github_actions.zip
          coverage combine tests
          coveralls

  coveralls-finished:
    needs: ["tests-unit", "tests-integration"]
    runs-on: ubuntu-latest
    steps:
      - name: Coveralls Finished
        uses: coverallsapp/github-action@57daa114
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          parallel-finished: true

  build:
    needs: ["lint", "tests-unit", "tests-integration"]
    name: "build"
    strategy:
      matrix:
        os:
          - ubuntu-16.04
          - macos-latest
          - windows-latest
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v1
      - uses: actions/setup-python@v1
        with:
          python-version: '3.7'
      - name: set pip cache dir
        id: pip-cache
        run: echo "::set-output name=dir::$(pip cache dir)"
      - name: extract pip cache
        uses: actions/cache@v2
        with:
          path: ${{ steps.pip-cache.outputs.dir }}
          key: ${{ runner.os }}-pip-${{ hashFiles('setup.py') }}
          restore-keys: ${{ runner.os }}-pip-
      - name: Setup
        run: |
          pip install --user --upgrade pip wheel
          pip install sqlalchemy@git+https://github.com/eukreign/pyinstaller.git@sqlalchemy
      - if: startsWith(runner.os, 'linux')
        run: |
          sudo apt-get install libzmq3-dev
          pip install -e .[postgres]
      - if: startsWith(runner.os, 'mac')
        run: |
          brew install zeromq
          pip install -e .
      - if: startsWith(runner.os, 'linux') || startsWith(runner.os, 'mac')
        name: Build & Run (Unix)
        run: |
          pyinstaller --onefile --name lbrynet lbry/cli.py
          chmod +x dist/lbrynet
          dist/lbrynet --version
      - if: startsWith(runner.os, 'windows')
        name: Build & Run (Windows)
        run: |
          pip install pywin32
          pip install -e .
          pyinstaller --additional-hooks-dir=scripts/. --icon=icons/lbry256.ico --onefile --name lbrynet lbry/cli.py
          dist/lbrynet.exe --version
      - uses: actions/upload-artifact@v2
        with:
          name: lbrynet-${{ matrix.os }}
          path: dist/