Hello community,

here is the log from the commit of package python-coveralls for 
openSUSE:Leap:15.2 checked in at 2020-04-02 16:49:13
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Leap:15.2/python-coveralls (Old)
 and      /work/SRC/openSUSE:Leap:15.2/.python-coveralls.new.3248 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-coveralls"

Thu Apr  2 16:49:13 2020 rev:5 rq:790661 version:1.11.1

Changes:
--------
--- /work/SRC/openSUSE:Leap:15.2/python-coveralls/python-coveralls.changes      
2020-03-09 18:04:09.376781496 +0100
+++ 
/work/SRC/openSUSE:Leap:15.2/.python-coveralls.new.3248/python-coveralls.changes
    2020-04-02 16:49:21.226027980 +0200
@@ -1,0 +2,12 @@
+Wed Apr  1 13:54:08 UTC 2020 - Marketa Calabkova <mcalabk...@suse.com>
+
+- 1.11.1
+  * add service_number for github actions
+  * Python 2.7 and 3.4 are now officially End-Of-Life'd. Consider 
+    them deprecated from the perspective of this package -- we'll 
+    remove them in an upcoming release (likely the first one which 
+    requires non-trivial work to continue supporting them!).
+  * support coverage>=5.0
+  * mark Python 3.8 as officially supported.
+
+-------------------------------------------------------------------

Old:
----
  1.8.2.tar.gz

New:
----
  1.11.1.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-coveralls.spec ++++++
--- /var/tmp/diff_new_pack.t9Dm4X/_old  2020-04-02 16:49:21.638028469 +0200
+++ /var/tmp/diff_new_pack.t9Dm4X/_new  2020-04-02 16:49:21.642028474 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package python-coveralls
 #
-# Copyright (c) 2019 SUSE LLC
+# Copyright (c) 2020 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -18,7 +18,7 @@
 
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-coveralls
-Version:        1.8.2
+Version:        1.11.1
 Release:        0
 Summary:        Module for showing coverage stats online via coverallsio
 License:        MIT

++++++ 1.8.2.tar.gz -> 1.11.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coveralls-python-1.8.2/.circleci/config.yml 
new/coveralls-python-1.11.1/.circleci/config.yml
--- old/coveralls-python-1.8.2/.circleci/config.yml     2019-07-29 
21:36:54.000000000 +0200
+++ new/coveralls-python-1.11.1/.circleci/config.yml    2020-02-15 
01:13:01.000000000 +0100
@@ -1,102 +1,153 @@
-version: 2
+version: 2.1
 
-jobs:
-  check:
-    docker:
-      - image: python:3.6
-    steps:
-      - checkout
-      - run: pip install pre-commit
-      - run: pre-commit run --all-files
+orbs:
+  linter: thekevjames/linter@1
 
-  test-py27:
+jobs:
+  toxpy:
     docker:
-      - image: python:2.7-alpine
+      - image: python:<<parameters.docker_image>>-alpine
+    parameters:
+      docker_image:
+        type: string
+      # TODO: figure out `<<parameters.docker_image>>.replace('.','')`
+      tox_environment:
+        type: string
+      cov_version:
+        default: ""
+        type: string
     steps:
       - run: apk add --no-cache gcc git libffi-dev musl-dev openssh-client 
openssl-dev
       - checkout
-      - run: pip install tox
-      - run: tox -e "py27-cov{3,4,41}-{default,pyyaml}"
-
-  test-py34:
-    docker:
-      - image: python:3.4-alpine
-    steps:
-      - run: apk add --no-cache git openssh-client
-      - checkout
-      - run: pip install tox
-      - run: tox -e "py34-cov{3,4,41}-{default,pyyaml}"
-
-  test-py35:
-    docker:
-      - image: python:3.5-alpine
-    steps:
-      - run: apk add --no-cache git openssh-client
-      - checkout
-      - run: pip install tox
-      - run: tox -e "py35-cov{3,4,41}-{default,pyyaml}"
-
-  test-py36:
-    docker:
-      - image: python:3.6-alpine
-    steps:
-      - run: apk add --no-cache git openssh-client
-      - checkout
-      - run: pip install tox
-      - run: tox -e "py36-cov41-{default,pyyaml}"
-
-  test-py37:
-    docker:
-      - image: python:3.7-alpine
-    steps:
-      - run: apk add --no-cache git openssh-client
-      - checkout
-      - run: pip install tox
-      - run: tox -e "py37-cov41-{default,pyyaml}"
-
-  test-pypy2-5:
-    docker:
-      - image: pypy:2-5.8.0
-    steps:
-      - checkout
-      - run: pip install tox
-      - run: tox -e "pypy-cov{3,4,41}-{default,pyyaml}"
-
-  test-pypy2-6:
-    docker:
-      - image: pypy:2-6.0.0
-    steps:
-      - checkout
-      - run: pip install tox
-      - run: tox -e "pypy-cov{3,4,41}-{default,pyyaml}"
-
-  test-pypy3-5:
-    docker:
-      - image: pypy:3-5.8.0
-    steps:
-      - checkout
-      - run: pip install tox
-      - run: tox -e "pypy3-cov{3,4,41}-{default,pyyaml}"
-
-  test-pypy3-6:
-    docker:
-      - image: pypy:3-6.0.0
-    steps:
-      - checkout
-      - run: pip install tox
-      - run: tox -e "pypy3-cov{3,4,41}-{default,pyyaml}"
+      - run: pip install tox tox-factor
+      - unless:
+          condition: <<parameters.cov_version>>
+          steps:
+            - run: tox -f <<parameters.tox_environment>>
+            - run: tox -e coveralls41
+      - when:
+          condition: <<parameters.cov_version>>
+          steps:
+            - run: tox -f 
<<parameters.tox_environment>>-cov<<parameters.cov_version>>
+            - run: tox -e coveralls<<parameters.cov_version>>
+
+  # TODO: by introspecting `docker_image` (or `tox_environment`), we could
+  # these job definitions
+  toxpypy:
+    docker:
+      - image: pypy:<<parameters.docker_image>>
+    parameters:
+      docker_image:
+        type: string
+      # TODO: figure out `<<parameters.docker_image>>.replace('.','')`
+      tox_environment:
+        type: string
+      cov_version:
+        default: ""
+        type: string
+    steps:
+      - checkout
+      - run: pip install tox tox-factor
+      - unless:
+          condition: <<parameters.cov_version>>
+          steps:
+            - run: tox -f <<parameters.tox_environment>>
+            - run: tox -e coveralls41
+      - when:
+          condition: <<parameters.cov_version>>
+          steps:
+            - run: tox -f 
<<parameters.tox_environment>>-cov<<parameters.cov_version>>
+            - run: tox -e coveralls<<parameters.cov_version>>
 
 workflows:
-  version: 2
-  test-all-envs:
+  run-jobs:
     jobs:
-      - check
-      - test-py27
-      - test-py34
-      - test-py35
-      - test-py36
-      - test-py37
-      - test-pypy2-5
-      - test-pypy2-6
-      - test-pypy3-5
-      - test-pypy3-6
+      - linter/pre-commit:
+          python_version: 3.7.5
+
+      - toxpy:
+          name: test-py2.7
+          docker_image: '2.7'
+          tox_environment: py27
+      - toxpy:
+          name: test-py3.4
+          docker_image: '3.4'
+          tox_environment: py34
+      - toxpy:
+          name: test-py3.5
+          docker_image: '3.5'
+          tox_environment: py35
+      - toxpy:
+          name: test-py3.6-cov4
+          docker_image: '3.6'
+          tox_environment: py36
+          cov_version: '41'
+      - toxpy:
+          name: test-py3.6-cov5
+          docker_image: '3.6'
+          tox_environment: py36
+          cov_version: '5'
+      - toxpy:
+          name: test-py3.7-cov4
+          docker_image: '3.7'
+          tox_environment: py37
+          cov_version: '41'
+      - toxpy:
+          name: test-py3.7-cov5
+          docker_image: '3.7'
+          tox_environment: py37
+          cov_version: '5'
+      - toxpy:
+          name: test-py3.8-cov4
+          docker_image: '3.8'
+          tox_environment: py38
+          cov_version: '41'
+      - toxpy:
+          name: test-py3.8-cov5
+          docker_image: '3.8'
+          tox_environment: py38
+          cov_version: '5'
+
+      - toxpypy:
+          name: test-pypy2-5
+          docker_image: 2-5
+          tox_environment: pypy
+      - toxpypy:
+          name: test-pypy2-6
+          docker_image: 2-6
+          tox_environment: pypy
+      - toxpypy:
+          name: test-pypy2-7
+          docker_image: 2-7
+          tox_environment: pypy
+
+      - toxpypy:
+          name: test-pypy3-5-cov4
+          docker_image: 3-5
+          tox_environment: pypy3
+          cov_version: '41'
+      - toxpypy:
+          name: test-pypy3-5-cov5
+          docker_image: 3-5
+          tox_environment: pypy3
+          cov_version: '5'
+      - toxpypy:
+          name: test-pypy3-6-cov4
+          docker_image: 3-6
+          tox_environment: pypy3
+          cov_version: '41'
+      - toxpypy:
+          name: test-pypy3-6-cov5
+          docker_image: 3-6
+          tox_environment: pypy3
+          cov_version: '5'
+      - toxpypy:
+          name: test-pypy3-7-cov4
+          docker_image: 3-7
+          tox_environment: pypy3
+          cov_version: '41'
+      - toxpypy:
+          name: test-pypy3-7-cov5
+          docker_image: 3-7
+          tox_environment: pypy3
+          cov_version: '5'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/coveralls-python-1.8.2/.github/workflows/pythonpackage.yml 
new/coveralls-python-1.11.1/.github/workflows/pythonpackage.yml
--- old/coveralls-python-1.8.2/.github/workflows/pythonpackage.yml      
1970-01-01 01:00:00.000000000 +0100
+++ new/coveralls-python-1.11.1/.github/workflows/pythonpackage.yml     
2020-02-15 01:13:01.000000000 +0100
@@ -0,0 +1,26 @@
+name: coveralls
+
+on: [push, pull_request]
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+    strategy:
+      max-parallel: 4
+      matrix:
+        python-version: [2.7, 3.5, 3.6, 3.7, 3.8]
+
+    steps:
+    - uses: actions/checkout@v1
+      with:
+        fetch-depth: 1  # no history, just HEAD
+    - name: Set up Python ${{ matrix.python-version }}
+      uses: actions/setup-python@v1
+      with:
+        python-version: ${{ matrix.python-version }}
+    - name: Install dependencies
+      run: |
+        python -m pip install --upgrade pip tox tox-gh-actions
+    - name: Test with tox
+      run: |
+        tox
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coveralls-python-1.8.2/.pre-commit-config.yaml 
new/coveralls-python-1.11.1/.pre-commit-config.yaml
--- old/coveralls-python-1.8.2/.pre-commit-config.yaml  2019-07-29 
21:36:54.000000000 +0200
+++ new/coveralls-python-1.11.1/.pre-commit-config.yaml 2020-02-15 
01:13:01.000000000 +0100
@@ -31,6 +31,7 @@
         args:
         - --max-line-length=79
         - --ignore-imports=yes
+        - -d broad-except
         - -d fixme
         - -d import-error
         - -d invalid-name
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coveralls-python-1.8.2/.travis.yml 
new/coveralls-python-1.11.1/.travis.yml
--- old/coveralls-python-1.8.2/.travis.yml      2019-07-29 21:36:54.000000000 
+0200
+++ new/coveralls-python-1.11.1/.travis.yml     2020-02-15 01:13:01.000000000 
+0100
@@ -1,24 +1,18 @@
 sudo: false
+
 language: python
 python:
   - 2.7
   - 3.4
   - 3.5
+  - 3.6
+  - 3.7
+  - 3.8
   - pypy
   - pypy3
-env:
-  - $COVPYYAML=cov3-default,coveralls3
-  - $COVPYYAML=cov4-pyyaml,coveralls4
-  - $COVPYYAML=cov41-pyyaml,coveralls41
-matrix:
-  include:
-    - python: 3.6
-      env: $COVPYYAML=cov41-pyyaml,coveralls41
-    - python: 3.7
-      dist: xenial  # https://github.com/travis-ci/travis-ci/issues/9815
-      sudo: true
-      env: $COVPYYAML=cov41-pyyaml,coveralls41
+
 install:
   - pip install tox
+
 script:
-  - tox -e $(echo py$TRAVIS_PYTHON_VERSION | tr -d . | sed -e 
's/pypypy/pypy/')-$COVPYYAML
+  - tox -e $(echo py$TRAVIS_PYTHON_VERSION | tr -d . | sed -e 
's/pypypy/pypy/')-cov41-pyyaml
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coveralls-python-1.8.2/CHANGELOG.md 
new/coveralls-python-1.11.1/CHANGELOG.md
--- old/coveralls-python-1.8.2/CHANGELOG.md     2019-07-29 21:36:54.000000000 
+0200
+++ new/coveralls-python-1.11.1/CHANGELOG.md    2020-02-15 01:13:01.000000000 
+0100
@@ -1,3 +1,60 @@
+<a name="1.11.1"></a>
+## 1.11.1 (2020-02-15)
+
+#### Bug Fixes
+
+* **github:**  rename to github-actions ([9e65a059](9e65a059))
+    This fixes a regression introduced with v1.11.0, which may have prevented
+    usage of this library on Github Actions.
+
+<a name="1.11.0"></a>
+## 1.11.0 (2020-02-12)
+
+#### Fixes
+
+* **github:**  add service_number for github actions ([9f93bd8e](9f93bd8e))
+    This should fix support for parallel builds.
+
+#### Compatibility
+
+*  Python 2.7 and 3.4 are now officially End-Of-Life'd. Consider them 
deprecated
+   from the perspective of this package -- we'll remove them in an upcoming
+   release (likely the first one which requires non-trivial work to continue
+   supporting them!).
+
+<a name="1.10.0"></a>
+## 1.10.0 (2019-12-31)
+
+#### Features
+
+*  support coverage>=5.0 (#214) ([4a917402](4a917402))
+
+<a name="1.9.2"></a>
+## 1.9.2 (2019-12-03)
+
+#### Bug Fixes
+
+* **github:**  fixup incorrect API usage (#209) ([c338cab4](c338cab4))
+
+<a name="1.9.1"></a>
+## 1.9.1 (2019-12-03)
+
+#### Compatibility
+
+*  this release marks Python 3.8 as officially supported. Earlier versions 
probably
+   supported Python 3.8 too, but now we're *sure*.
+
+<a name="1.9.0"></a>
+## 1.9.0 (2019-12-03)
+
+#### Features
+
+* **support:**  support Github Actions CI (#207) ([817119c3](817119c3))
+
+#### Bug Fixes
+
+* **compatibility:**  fixup coverage.__version__ comparisons (#208) 
([03a57a9a](03a57a9a))
+
 <a name="1.8.2"></a>
 ## 1.8.2 (2019-07-29)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coveralls-python-1.8.2/README.rst 
new/coveralls-python-1.11.1/README.rst
--- old/coveralls-python-1.8.2/README.rst       2019-07-29 21:36:54.000000000 
+0200
+++ new/coveralls-python-1.11.1/README.rst      2020-02-15 01:13:01.000000000 
+0100
@@ -1,29 +1,38 @@
-Coveralls for python
+Coveralls for Python
 ====================
 
-.. image:: 
https://img.shields.io/circleci/project/github/coveralls-clients/coveralls-python/master.svg?style=flat-square
-    :target: https://circleci.com/gh/coveralls-clients/coveralls-python
+:Test Status:
+    .. image:: 
https://img.shields.io/circleci/project/github/coveralls-clients/coveralls-python/master.svg?style=flat-square&label=CircleCI
+        :target: https://circleci.com/gh/coveralls-clients/coveralls-python
 
-.. image:: 
https://img.shields.io/travis/coveralls-clients/coveralls-python/master.svg?style=flat-square
-    :target: https://travis-ci.org/coveralls-clients/coveralls-python
+    .. image:: 
https://img.shields.io/travis/coveralls-clients/coveralls-python/master.svg?style=flat-square&label=TravisCI
+        :target: https://travis-ci.org/coveralls-clients/coveralls-python
 
-.. image:: 
https://img.shields.io/coveralls/coveralls-clients/coveralls-python/master.svg?style=flat-square
-    :target: https://coveralls.io/r/coveralls-clients/coveralls-python
+    .. image:: 
https://img.shields.io/github/workflow/status/coveralls-clients/coveralls-python/coveralls/master?style=flat-square&label=Github%20Actions
+        :target: https://github.com/coveralls-clients/coveralls-python/actions
 
-.. image:: https://img.shields.io/pypi/dm/coveralls.svg?style=flat-square
-    :target: https://pypi.org/project/coveralls/
+    .. image:: 
https://img.shields.io/coveralls/coveralls-clients/coveralls-python/master.svg?style=flat-square&label=Coverage
+        :target: https://coveralls.io/r/coveralls-clients/coveralls-python
 
-.. image:: https://anaconda.org/conda-forge/coveralls/badges/version.svg
-    :target: https://anaconda.org/conda-forge/coveralls
+:Version Info:
+    .. image:: 
https://img.shields.io/conda/v/conda-forge/coveralls?style=flat-square&label=Conda
+        :target: https://anaconda.org/conda-forge/coveralls
 
-.. image:: https://img.shields.io/pypi/v/coveralls.svg?style=flat-square
-    :target: https://pypi.org/project/coveralls/
+    .. image:: 
https://img.shields.io/pypi/v/coveralls.svg?style=flat-square&label=PyPI
+        :target: https://pypi.org/project/coveralls/
 
-.. image:: 
https://img.shields.io/pypi/pyversions/coveralls.svg?style=flat-square
-    :target: https://pypi.org/project/coveralls/
+    .. image:: 
https://img.shields.io/conda/dn/conda-forge/coveralls?label=Conda%20Downloads&style=flat-square
+        :target: https://anaconda.org/conda-forge/coveralls
 
-.. image:: 
https://img.shields.io/pypi/implementation/coveralls.svg?style=flat-square
-    :target: https://pypi.org/project/coveralls/
+    .. image:: 
https://img.shields.io/pypi/dm/coveralls.svg?style=flat-square&label=PyPI%20Downloads
+        :target: https://pypi.org/project/coveralls/
+
+:Compatibility:
+    .. image:: 
https://img.shields.io/pypi/pyversions/coveralls.svg?style=flat-square&label=Python%20Versions
+        :target: https://pypi.org/project/coveralls/
+
+    .. image:: 
https://img.shields.io/pypi/implementation/coveralls.svg?style=flat-square&label=Python%20Implementations
+        :target: https://pypi.org/project/coveralls/
 
 `coveralls.io`_ is a service for publishing your coverage stats online. This 
package provides seamless integration with `coverage.py`_ (and thus ``pytest``, 
``nosetests``, etc...) in your Python projects::
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coveralls-python-1.8.2/coveralls/api.py 
new/coveralls-python-1.11.1/coveralls/api.py
--- old/coveralls-python-1.8.2/coveralls/api.py 2019-07-29 21:36:54.000000000 
+0200
+++ new/coveralls-python-1.11.1/coveralls/api.py        2020-02-15 
01:13:01.000000000 +0100
@@ -51,7 +51,13 @@
         name, job, pr = self.load_config_from_ci_environment()
         self.config['service_name'] = self.config.get('service_name', name)
         if job:
-            self.config['service_job_id'] = job
+            # N.B. Github Actions uses a different chunk of the Coveralls
+            # config when running parallel builds, ie. `service_number` instead
+            # of `service_job_id`.
+            if name.startswith('github'):
+                self.config['service_number'] = job
+            else:
+                self.config['service_job_id'] = job
         if pr:
             self.config['service_pull_request'] = pr
 
@@ -62,8 +68,8 @@
             return
 
         raise CoverallsException(
-            'Not on Travis or CircleCI. You have to provide either repo_token '
-            'in {} or set the COVERALLS_REPO_TOKEN env var.'.format(
+            'Not on TravisCI. You have to provide either repo_token in {} or '
+            'set the COVERALLS_REPO_TOKEN env var.'.format(
                 self.config_filename))
 
     @staticmethod
@@ -84,6 +90,15 @@
         return 'circle-ci', os.environ.get('CIRCLE_BUILD_NUM'), pr
 
     @staticmethod
+    def load_config_from_github():
+        service_number = os.environ.get('GITHUB_SHA')
+        pr = None
+        if os.environ.get('GITHUB_REF', '').startswith('refs/pull/'):
+            pr = os.environ.get('GITHUB_REF', '//').split('/')[2]
+            service_number += '-PR-{0}'.format(pr)
+        return 'github-actions', service_number, pr
+
+    @staticmethod
     def load_config_from_jenkins():
         pr = os.environ.get('CI_PULL_REQUEST', '').split('/')[-1] or None
         return 'jenkins', os.environ.get('BUILD_NUMBER'), pr
@@ -108,8 +123,9 @@
         elif os.environ.get('BUILDKITE'):
             name, job, pr = self.load_config_from_buildkite()
         elif os.environ.get('CIRCLECI'):
-            self._token_required = False
             name, job, pr = self.load_config_from_circle()
+        elif os.environ.get('GITHUB_ACTIONS'):
+            name, job, pr = self.load_config_from_github()
         elif os.environ.get('JENKINS_HOME'):
             name, job, pr = self.load_config_from_jenkins()
         elif os.environ.get('TRAVIS'):
@@ -257,7 +273,7 @@
         else:
             workman.get_data()
 
-        return CoverallReporter(workman, workman.config).report()
+        return CoverallReporter(workman, workman.config).coverage
 
     @staticmethod
     def debug_bad_encoding(data):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coveralls-python-1.8.2/coveralls/git.py 
new/coveralls-python-1.11.1/coveralls/git.py
--- old/coveralls-python-1.8.2/coveralls/git.py 2019-07-29 21:36:54.000000000 
+0200
+++ new/coveralls-python-1.11.1/coveralls/git.py        2020-02-15 
01:13:01.000000000 +0100
@@ -34,6 +34,29 @@
         return unicode(glog)  # pylint: disable=undefined-variable
 
 
+def git_branch():
+    branch = None
+    if os.environ.get('GITHUB_ACTIONS'):
+        github_ref = os.environ.get('GITHUB_REF')
+        if github_ref.startswith('refs/heads/'):
+            # E.g. in push events.
+            branch = github_ref.split('/', 2)[-1]
+        else:
+            # E.g. in pull_request events.
+            branch = os.environ.get('GITHUB_HEAD_REF')
+    else:
+        branch = (os.environ.get('APPVEYOR_REPO_BRANCH')
+                  or os.environ.get('BUILDKITE_BRANCH')
+                  or os.environ.get('CI_BRANCH')
+                  or os.environ.get('CIRCLE_BRANCH')
+                  or os.environ.get('GIT_BRANCH')
+                  or os.environ.get('TRAVIS_BRANCH')
+                  or os.environ.get('BRANCH_NAME')
+                  or run_command('git', 'rev-parse', '--abbrev-ref', 'HEAD'))
+
+    return branch
+
+
 def git_info():
     """
     A hash of Git data that can be used to display more information to users.
@@ -56,14 +79,7 @@
         }
     """
     try:
-        branch = (os.environ.get('APPVEYOR_REPO_BRANCH')
-                  or os.environ.get('BUILDKITE_BRANCH')
-                  or os.environ.get('CI_BRANCH')
-                  or os.environ.get('CIRCLE_BRANCH')
-                  or os.environ.get('GIT_BRANCH')
-                  or os.environ.get('TRAVIS_BRANCH')
-                  or os.environ.get('BRANCH_NAME')
-                  or run_command('git', 'rev-parse', '--abbrev-ref', 'HEAD'))
+        branch = git_branch()
         head = {
             'id': gitlog('%H'),
             'author_name': gitlog('%aN'),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coveralls-python-1.8.2/coveralls/reporter.py 
new/coveralls-python-1.11.1/coveralls/reporter.py
--- old/coveralls-python-1.8.2/coveralls/reporter.py    2019-07-29 
21:36:54.000000000 +0200
+++ new/coveralls-python-1.11.1/coveralls/reporter.py   2020-02-15 
01:13:01.000000000 +0100
@@ -7,7 +7,6 @@
 from coverage.misc import NoSource
 from coverage.misc import NotPython
 from coverage.phystokens import source_encoding
-from coverage.report import Reporter
 
 from .exception import CoverallsException
 
@@ -15,47 +14,137 @@
 log = logging.getLogger('coveralls.reporter')
 
 
-class CoverallReporter(Reporter):
+class CoverallReporter(object):
     """Custom coverage.py reporter for coveralls.io"""
 
-    def __init__(self, *args, **kwargs):
-        self.source_files = []
-        super(CoverallReporter, self).__init__(*args, **kwargs)
+    def __init__(self, cov, conf):
+        self.coverage = []
+        self.report(cov, conf)
+
+    def report5(self, cov):
+        # N.B. this method is 99% copied from the coverage source code;
+        # unfortunately, the coverage v5 style of `get_analysis_to_report`
+        # errors out entirely if any source file has issues -- which would be a
+        # breaking change for us. In the interest of backwards compatibility,
+        # I've copied their code here so we can maintain the same `coveralls`
+        # API regardless of which `coverage` version is being used.
+        #
+        # TODO: deprecate the relevant APIs so we can just use the coverage
+        # public API directly.
+        #
+        # from coverage.report import get_analysis_to_report
+        # try:
+        #     for cu, analyzed in get_analysis_to_report(cov, None):
+        #         self.parse_file(cu, analyzed)
+        # except NoSource:
+        #     # Note that this behavior must necessarily change between
+        #     # coverage<5 and coverage>=5, as we are no longer interweaving
+        #     # with get_analysis_to_report (a single exception breaks the
+        #     # whole loop)
+        #     log.warning('No source for at least one file')
+        # except NotPython:
+        #     # Note that this behavior must necessarily change between
+        #     # coverage<5 and coverage>=5, as we are no longer interweaving
+        #     # with get_analysis_to_report (a single exception breaks the
+        #     # whole loop)
+        #     log.warning('A source file is not python')
+        # except CoverageException as e:
+        #     if str(e) != 'No data to report.':
+        #         raise
+
+        from coverage.files import FnmatchMatcher, prep_patterns
+
+        # get_analysis_to_report starts here; changes marked with TODOs
+        file_reporters = cov._get_file_reporters(None)  # pylint: disable=W0212
+        config = cov.config
+
+        if config.report_include:
+            matcher = FnmatchMatcher(prep_patterns(config.report_include))
+            file_reporters = [fr for fr in file_reporters
+                              if matcher.match(fr.filename)]
+
+        if config.report_omit:
+            matcher = FnmatchMatcher(prep_patterns(config.report_omit))
+            file_reporters = [fr for fr in file_reporters
+                              if not matcher.match(fr.filename)]
+
+        # TODO: deprecate changes
+        # if not file_reporters:
+        #     raise CoverageException("No data to report.")
 
-    def report(self, morfs=None):
+        for fr in sorted(file_reporters):
+            try:
+                analysis = cov._analyze(fr)  # pylint: disable=W0212
+            except NoSource:
+                if not config.ignore_errors:
+                    # TODO: deprecate changes
+                    # raise
+                    log.warning('No source for %s', fr.filename)
+            except NotPython:
+                # Only report errors for .py files, and only if we didn't
+                # explicitly suppress those errors.
+                # NotPython is only raised by PythonFileReporter, which has a
+                # should_be_python() method.
+                if fr.should_be_python():
+                    if config.ignore_errors:
+                        msg = "Couldn't parse Python file '{}'".format(
+                            fr.filename)
+                        cov._warn(msg,  # pylint: disable=W0212
+                                  slug="couldnt-parse")
+                    else:
+                        # TODO: deprecate changes
+                        # raise
+                        log.warning('Source file is not python %s',
+                                    fr.filename)
+            else:
+                # TODO: deprecate changes (well, this one is fine /shrug)
+                # yield (fr, analysis)
+                self.parse_file(fr, analysis)
+
+    def report(self, cov, conf, morfs=None):
         """
         Generate a part of json report for coveralls
 
         `morfs` is a list of modules or filenames.
         `outfile` is a file object to write the json to.
         """
+        # pylint: disable=too-many-branches
+        try:
+            from coverage.report import Reporter
+            self.reporter = Reporter(cov, conf)
+        except ImportError:  # coverage >= 5.0
+            return self.report5(cov)
+
         units = None
-        if hasattr(self, 'find_code_units'):
-            self.find_code_units(morfs)
+        if hasattr(self.reporter, 'find_code_units'):
+            self.reporter.find_code_units(morfs)
         else:
-            units = self.find_file_reporters(morfs)
+            units = self.reporter.find_file_reporters(morfs)
 
         if units is None:
-            if hasattr(self, 'code_units'):
-                units = self.code_units
+            if hasattr(self.reporter, 'code_units'):
+                units = self.reporter.code_units
             else:
-                units = self.file_reporters
+                units = self.reporter.file_reporters
 
         for cu in units:
             try:
-                analyzed = self.coverage._analyze(cu)  # pylint: disable=W0212
+                _fn = self.reporter.coverage._analyze  # pylint: disable=W0212
+                analyzed = _fn(cu)
                 self.parse_file(cu, analyzed)
             except NoSource:
-                if not self.config.ignore_errors:
+                if not self.reporter.config.ignore_errors:
                     log.warning('No source for %s', cu.filename)
             except NotPython:
                 # Only report errors for .py files, and only if we didn't
                 # explicitly suppress those errors.
-                if cu.should_be_python() and not self.config.ignore_errors:
+                if (cu.should_be_python()
+                        and not self.reporter.config.ignore_errors):
                     log.warning('Source file is not python %s', cu.filename)
             except KeyError:
-                cov3x = __version__[0] < 4
-                cov40 = __version__[0] == 4 and __version__[1] < 1
+                version = [int(x) for x in __version__.split('.')]
+                cov3x = version[0] < 4
+                cov40 = version[0] == 4 and version[1] < 1
                 if cov3x or cov40:
                     raise CoverallsException(
                         'Old (<4.1) versions of coverage.py do not work '
@@ -65,7 +154,7 @@
 
                 raise
 
-        return self.source_files
+        return self.coverage
 
     @staticmethod
     def get_hits(line_num, analysis):
@@ -100,7 +189,14 @@
         if not analysis.has_arcs():
             return None
 
-        branch_lines = analysis.branch_lines()
+        if not hasattr(analysis, 'branch_lines'):
+            # N.B. switching to the public method analysis.missing_branch_arcs
+            # would work for half of what we need, but there doesn't seem to be
+            # an equivalent analysis.executed_branch_arcs
+            branch_lines = analysis._branch_lines()  # pylint: disable=W0212
+        else:
+            branch_lines = analysis.branch_lines()
+
         branches = []
 
         for l1, l2 in analysis.arcs_executed():
@@ -159,4 +255,4 @@
         if branches:
             results['branches'] = branches
 
-        self.source_files.append(results)
+        self.coverage.append(results)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coveralls-python-1.8.2/coveralls/version.py 
new/coveralls-python-1.11.1/coveralls/version.py
--- old/coveralls-python-1.8.2/coveralls/version.py     2019-07-29 
21:36:54.000000000 +0200
+++ new/coveralls-python-1.11.1/coveralls/version.py    2020-02-15 
01:13:01.000000000 +0100
@@ -1 +1 @@
-__version__ = '1.8.2'
+__version__ = '1.11.1'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coveralls-python-1.8.2/docs/index.rst 
new/coveralls-python-1.11.1/docs/index.rst
--- old/coveralls-python-1.8.2/docs/index.rst   2019-07-29 21:36:54.000000000 
+0200
+++ new/coveralls-python-1.11.1/docs/index.rst  2020-02-15 01:13:01.000000000 
+0100
@@ -34,4 +34,4 @@
    release
 
 .. _coveralls.io: https://coveralls.io/
-.. _coverage.py: https://coverage.readthedocs.io/en/coverage-4.4.1/
+.. _coverage.py: https://coverage.readthedocs.io/en/latest/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coveralls-python-1.8.2/docs/release.rst 
new/coveralls-python-1.11.1/docs/release.rst
--- old/coveralls-python-1.8.2/docs/release.rst 2019-07-29 21:36:54.000000000 
+0200
+++ new/coveralls-python-1.11.1/docs/release.rst        2020-02-15 
01:13:01.000000000 +0100
@@ -7,11 +7,10 @@
 
 1. Update the ``CHANGELOG.md`` with the new version (``clog -C CHANGELOG.md -F 
--setversion x.y.z``).
 2. Bump the version number in ``version.py``.
-3. Tag that commit with the version number (``git tag x.y.z``).
-4. Push the new tag to GitHub.
-5. Create a new `GitHub release`_.
-
-Make sure to push the release commit to GitHub.
+3. Commit and push (``git commit -am 'chore(release): bump version' && git 
push``)
+4. Tag that commit with the version number (``git tag x.y.z``).
+5. Push the new tag to GitHub.
+6. Create a new `GitHub release`_.
 
 To create a new PyPI release, do the following:
 
@@ -22,7 +21,9 @@
 
 1. Fork `coveralls-feedstock`_.
 2. Update ``recipe/meta.yaml`` with the new version number and `sha`_.
-3. Create a PR. A conda-forge maintainer will get to it eventually.
+3. Create a PR.
+4. Comment on your own PR with: "@conda-forge-admin, please rerender".
+5. Merge along with the automated commit from Conda.
 
 .. _coveralls: https://pypi.org/project/coveralls/
 .. _coveralls-feedstock: https://github.com/conda-forge/coveralls-feedstock
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coveralls-python-1.8.2/docs/usage/configuration.rst 
new/coveralls-python-1.11.1/docs/usage/configuration.rst
--- old/coveralls-python-1.8.2/docs/usage/configuration.rst     2019-07-29 
21:36:54.000000000 +0200
+++ new/coveralls-python-1.11.1/docs/usage/configuration.rst    2020-02-15 
01:13:01.000000000 +0100
@@ -3,7 +3,7 @@
 Configuration
 =============
 
-coveralls-python often works without any outside configuration by examining 
the environment it is being run in. Special handling has been added for 
AppVeyor, BuildKite, CircleCI, Jenkins, and TravisCI to make coveralls-python 
as close to "plug and play" as possible.
+coveralls-python often works without any outside configuration by examining 
the environment it is being run in. Special handling has been added for 
AppVeyor, BuildKite, CircleCI, Github Actions, Jenkins, and TravisCI to make 
coveralls-python as close to "plug and play" as possible.
 
 Most often, you will simply need to run coveralls-python with no additional 
options after you have run your coverage suite::
 
@@ -21,7 +21,7 @@
 
 If you are interested in merging the coverage results between multiple 
languages/projects, see our :ref:`multi-language <multilang>` documentation.
 
-If coveralls-python is being run on CircleCI or TravisCI, it will 
automatically set the token for communication with coveralls.io. Otherwise, you 
should set the environment variable ``COVERALLS_REPO_TOKEN``, which can be 
found on the dashboard for your project in coveralls.io::
+If coveralls-python is being run on TravisCI, it will automatically set the 
token for communication with coveralls.io. Otherwise, you should set the 
environment variable ``COVERALLS_REPO_TOKEN``, which can be found on the 
dashboard for your project in coveralls.io::
 
     COVERALLS_REPO_TOKEN=mV2Jajb8y3c6AFlcVNagHO20fiZNkXPVy coveralls
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coveralls-python-1.8.2/docs/usage/index.rst 
new/coveralls-python-1.11.1/docs/usage/index.rst
--- old/coveralls-python-1.8.2/docs/usage/index.rst     2019-07-29 
21:36:54.000000000 +0200
+++ new/coveralls-python-1.11.1/docs/usage/index.rst    2020-02-15 
01:13:01.000000000 +0100
@@ -3,7 +3,7 @@
 
 This package works with any CI environment. Special handling has been included 
for some CI service providers, but coveralls-python can run anywhere.
 
-To get started with coveralls-python, make sure to `add your repo`_ on the 
coveralls.io website. If you will be using coveralls-python on CircleCI or 
TravisCI, you're done here -- otherwise, take note of the "repo token" in the 
coveralls.io dashboard.
+To get started with coveralls-python, make sure to `add your repo`_ on the 
coveralls.io website. If you will be using coveralls-python on TravisCI, you're 
done here -- otherwise, take note of the "repo token" in the coveralls.io 
dashboard.
 
 After that, its as simple as installing coveralls-python, collecting coverage 
results, and sending them to coveralls.io.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coveralls-python-1.8.2/docs/usage/tox.rst 
new/coveralls-python-1.11.1/docs/usage/tox.rst
--- old/coveralls-python-1.8.2/docs/usage/tox.rst       2019-07-29 
21:36:54.000000000 +0200
+++ new/coveralls-python-1.11.1/docs/usage/tox.rst      2020-02-15 
01:13:01.000000000 +0100
@@ -56,6 +56,19 @@
 - ``CIRCLE_BRANCH``
 - ``CI_PULL_REQUEST``
 
+Github Actions
+--------------
+::
+
+    passenv = GITHUB_*
+
+All variables:
+
+- ``GITHUB_ACTIONS``
+- ``GITHUB_REF``
+- ``GITHUB_SHA``
+- ``GITHUB_HEAD_REF``
+
 Jenkins
 -------
 ::
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coveralls-python-1.8.2/setup.py 
new/coveralls-python-1.11.1/setup.py
--- old/coveralls-python-1.8.2/setup.py 2019-07-29 21:36:54.000000000 +0200
+++ new/coveralls-python-1.11.1/setup.py        2020-02-15 01:13:01.000000000 
+0100
@@ -33,13 +33,15 @@
         ],
     },
     install_requires=[
-        'coverage>=3.6,<5.0',
+        'coverage>=3.6,<6.0',
         'docopt>=0.6.1',
         'requests>=1.0.0',
     ],
-    tests_require=['mock', 'pytest', 'sh>=1.08'],
+    tests_require=['mock', 'pytest'],
     extras_require={
-        'yaml': ['PyYAML>=3.10'],
+        # N.B. PyYAML 5.3 dropped support for Python 3.4... which we should
+        # also do...
+        'yaml': ['PyYAML>=3.10,<5.3'],
         ':python_version < "3"': ['urllib3[secure]'],
     },
     classifiers=[
@@ -54,6 +56,7 @@
         'Programming Language :: Python :: 3.5',
         'Programming Language :: Python :: 3.6',
         'Programming Language :: Python :: 3.7',
+        'Programming Language :: Python :: 3.8',
         'Programming Language :: Python :: Implementation :: CPython',
         'Programming Language :: Python :: Implementation :: PyPy',
     ],
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/coveralls-python-1.8.2/tests/api/configuration_test.py 
new/coveralls-python-1.11.1/tests/api/configuration_test.py
--- old/coveralls-python-1.8.2/tests/api/configuration_test.py  2019-07-29 
21:36:54.000000000 +0200
+++ new/coveralls-python-1.11.1/tests/api/configuration_test.py 2020-02-15 
01:13:01.000000000 +0100
@@ -7,7 +7,6 @@
 
 import mock
 import pytest
-import sh
 try:
     import yaml
 except ImportError:
@@ -22,7 +21,7 @@
     def setUp(self):
         self.dir = tempfile.mkdtemp()
 
-        sh.cd(self.dir)
+        os.chdir(self.dir)
         with open('.coveralls.mock', 'w+') as fp:
             fp.write('repo_token: xxx\n')
             fp.write('service_name: jenkins\n')
@@ -65,8 +64,8 @@
             Coveralls()
 
         assert str(excinfo.value) == (
-            'Not on Travis or CircleCI. You have to provide either repo_token '
-            'in .coveralls.mock or set the COVERALLS_REPO_TOKEN env var.')
+            'Not on TravisCI. You have to provide either repo_token in '
+            '.coveralls.mock or set the COVERALLS_REPO_TOKEN env var.')
 
     @mock.patch.dict(os.environ, {'APPVEYOR': 'True',
                                   'APPVEYOR_BUILD_ID': '1234567',
@@ -105,13 +104,39 @@
          'CI_PULL_REQUEST': 'https://github.com/org/repo/pull/9999'},
         clear=True)
     def test_circleci_no_config(self):
-        cover = Coveralls()
+        cover = Coveralls(repo_token='xxx')
         assert cover.config['service_name'] == 'circle-ci'
         assert cover.config['service_job_id'] == '888'
         assert cover.config['service_pull_request'] == '9999'
 
     @mock.patch.dict(
         os.environ,
+        {'GITHUB_ACTIONS': 'true',
+         'GITHUB_REF': 'refs/pull/1234/merge',
+         'GITHUB_SHA': 'bb0e00166b28f49db04d6a8b8cb4bddb5afa529f',
+         'GITHUB_HEAD_REF': 'fixup-branch'},
+        clear=True)
+    def test_github_no_config(self):
+        cover = Coveralls(repo_token='xxx')
+        assert cover.config['service_name'] == 'github-actions'
+        assert cover.config['service_pull_request'] == '1234'
+        assert 'service_job_id' not in cover.config
+
+    @mock.patch.dict(
+        os.environ,
+        {'GITHUB_ACTIONS': 'true',
+         'GITHUB_REF': 'refs/heads/master',
+         'GITHUB_SHA': 'bb0e00166b28f49db04d6a8b8cb4bddb5afa529f',
+         'GITHUB_HEAD_REF': ''},
+        clear=True)
+    def test_github_no_config_no_pr(self):
+        cover = Coveralls(repo_token='xxx')
+        assert cover.config['service_name'] == 'github-actions'
+        assert 'service_pull_request' not in cover.config
+        assert 'service_job_id' not in cover.config
+
+    @mock.patch.dict(
+        os.environ,
         {'JENKINS_HOME': '/var/lib/jenkins',
          'BUILD_NUMBER': '888',
          'CI_PULL_REQUEST': 'https://github.com/org/repo/pull/9999'},
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coveralls-python-1.8.2/tests/api/encoding_test.py 
new/coveralls-python-1.11.1/tests/api/encoding_test.py
--- old/coveralls-python-1.8.2/tests/api/encoding_test.py       2019-07-29 
21:36:54.000000000 +0200
+++ new/coveralls-python-1.11.1/tests/api/encoding_test.py      2020-02-15 
01:13:01.000000000 +0100
@@ -2,11 +2,11 @@
 import json
 import logging
 import os
+import subprocess
 import sys
 
 import coverage
 import pytest
-import sh
 
 from coveralls import Coveralls
 
@@ -17,7 +17,7 @@
 
 def test_non_unicode():
     os.chdir(NONUNICODE_DIR)
-    sh.coverage('run', 'nonunicode.py')
+    subprocess.call(['coverage', 'run', 'nonunicode.py'], cwd=NONUNICODE_DIR)
 
     actual_json = json.dumps(Coveralls(repo_token='xxx').get_coverage())
     expected_json_part = (
@@ -32,7 +32,7 @@
                     reason='coverage 4 not affected')
 def test_malformed_encoding_declaration(capfd):
     os.chdir(NONUNICODE_DIR)
-    sh.coverage('run', 'malformed.py')
+    subprocess.call(['coverage', 'run', 'malformed.py'], cwd=NONUNICODE_DIR)
 
     logging.getLogger('coveralls').addHandler(logging.StreamHandler())
     assert Coveralls(repo_token='xxx').get_coverage() == []
@@ -46,7 +46,7 @@
                     reason='coverage 3 fails')
 def test_malformed_encoding_declaration_py3_or_coverage4():
     os.chdir(NONUNICODE_DIR)
-    sh.coverage('run', 'malformed.py')
+    subprocess.call(['coverage', 'run', 'malformed.py'], cwd=NONUNICODE_DIR)
 
     result = Coveralls(repo_token='xxx').get_coverage()
     assert len(result) == 1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coveralls-python-1.8.2/tests/api/reporter_test.py 
new/coveralls-python-1.11.1/tests/api/reporter_test.py
--- old/coveralls-python-1.8.2/tests/api/reporter_test.py       2019-07-29 
21:36:54.000000000 +0200
+++ new/coveralls-python-1.11.1/tests/api/reporter_test.py      2020-02-15 
01:13:01.000000000 +0100
@@ -1,10 +1,9 @@
 # coding: utf-8
 # pylint: disable=no-self-use
 import os
+import subprocess
 import unittest
 
-import sh
-
 from coveralls import Coveralls
 
 
@@ -23,11 +22,17 @@
     def setUp(self):
         os.chdir(EXAMPLE_DIR)
 
-        sh.rm('-f', '.coverage')
-        sh.rm('-f', 'extra.py')
+        try:
+            os.remove('.coverage')
+        except Exception:
+            pass
+        try:
+            os.remove('extra.py')
+        except Exception:
+            pass
 
     def test_reporter(self):
-        sh.coverage('run', 'runtests.py')
+        subprocess.call(['coverage', 'run', 'runtests.py'], cwd=EXAMPLE_DIR)
         results = Coveralls(repo_token='xxx').get_coverage()
         assert len(results) == 2
 
@@ -59,7 +64,8 @@
             'coverage': [None, 1, None, 1, 1, 1, 1]})
 
     def test_reporter_with_branches(self):
-        sh.coverage('run', '--branch', 'runtests.py')
+        subprocess.call(['coverage', 'run', '--branch', 'runtests.py'],
+                        cwd=EXAMPLE_DIR)
         results = Coveralls(repo_token='xxx').get_coverage()
         assert len(results) == 2
 
@@ -98,13 +104,19 @@
             'coverage': [None, 1, None, 1, 1, 1, 1]})
 
     def test_missing_file(self):
-        sh.echo('print("Python rocks!")', _out='extra.py')
-        sh.coverage('run', 'extra.py')
-        sh.rm('-f', 'extra.py')
+        with open('extra.py', 'w') as f:
+            f.write('print("Python rocks!")\n')
+        subprocess.call(['coverage', 'run', 'extra.py'], cwd=EXAMPLE_DIR)
+        try:
+            os.remove('extra.py')
+        except Exception:
+            pass
         assert Coveralls(repo_token='xxx').get_coverage() == []
 
     def test_not_python(self):
-        sh.echo('print("Python rocks!")', _out='extra.py')
-        sh.coverage('run', 'extra.py')
-        sh.echo("<h1>This isn't python!</h1>", _out='extra.py')
+        with open('extra.py', 'w') as f:
+            f.write('print("Python rocks!")\n')
+        subprocess.call(['coverage', 'run', 'extra.py'], cwd=EXAMPLE_DIR)
+        with open('extra.py', 'w') as f:
+            f.write("<h1>This isn't python!</h1>\n")
         assert Coveralls(repo_token='xxx').get_coverage() == []
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coveralls-python-1.8.2/tests/api/wear_test.py 
new/coveralls-python-1.11.1/tests/api/wear_test.py
--- old/coveralls-python-1.8.2/tests/api/wear_test.py   2019-07-29 
21:36:54.000000000 +0200
+++ new/coveralls-python-1.11.1/tests/api/wear_test.py  2020-02-15 
01:13:01.000000000 +0100
@@ -8,7 +8,6 @@
 import coverage
 import mock
 import pytest
-import sh
 
 import coveralls
 from coveralls.api import log
@@ -23,7 +22,10 @@
 @mock.patch('coveralls.api.requests')
 class WearTest(unittest.TestCase):
     def setUp(self):
-        sh.rm('-f', '.coverage')
+        try:
+            os.remove('.coverage')
+        except Exception:
+            pass
 
     def test_wet_run(self, mock_requests):
         mock_requests.post.return_value.json.return_value = EXPECTED
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coveralls-python-1.8.2/tests/api_test.py 
new/coveralls-python-1.11.1/tests/api_test.py
--- old/coveralls-python-1.8.2/tests/api_test.py        2019-07-29 
21:36:54.000000000 +0200
+++ new/coveralls-python-1.11.1/tests/api_test.py       2020-02-15 
01:13:01.000000000 +0100
@@ -1,9 +1,12 @@
 # coding: utf-8
 import json
+import os
 
+import mock
 from coveralls import Coveralls
 
 
+@mock.patch.dict(os.environ, {}, clear=True)
 def test_output_to_file(tmpdir):
     """Check we can write coveralls report into the file."""
     test_log = tmpdir.join('test.log')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coveralls-python-1.8.2/tests/git_test.py 
new/coveralls-python-1.11.1/tests/git_test.py
--- old/coveralls-python-1.8.2/tests/git_test.py        2019-07-29 
21:36:54.000000000 +0200
+++ new/coveralls-python-1.11.1/tests/git_test.py       2020-02-15 
01:13:01.000000000 +0100
@@ -5,11 +5,11 @@
 import os
 import re
 import shutil
+import subprocess
 import tempfile
 import unittest
 
 import mock
-import sh
 
 import coveralls.git
 
@@ -25,15 +25,18 @@
     def setUp(self):
         self.dir = tempfile.mkdtemp()
 
-        sh.cd(self.dir)
-        sh.touch('README')
+        os.chdir(self.dir)
+        open('README', 'a').close()
 
-        sh.git.init()
-        sh.git.config('user.name', '"{}"'.format(GIT_NAME))
-        sh.git.config('user.email', '"{}"'.format(GIT_EMAIL))
-        sh.git.add('README')
-        sh.git.commit('-m', GIT_COMMIT_MSG)
-        sh.git.remote('add', GIT_REMOTE, GIT_URL)
+        subprocess.call(['git', 'init'], cwd=self.dir)
+        subprocess.call(['git', 'config', 'user.name',
+                         '"{}"'.format(GIT_NAME)], cwd=self.dir)
+        subprocess.call(['git', 'config', 'user.email',
+                         '"{}"'.format(GIT_EMAIL)], cwd=self.dir)
+        subprocess.call(['git', 'add', 'README'], cwd=self.dir)
+        subprocess.call(['git', 'commit', '-m', GIT_COMMIT_MSG], cwd=self.dir)
+        subprocess.call(['git', 'remote', 'add', GIT_REMOTE, GIT_URL],
+                        cwd=self.dir)
 
     def tearDown(self):
         shutil.rmtree(self.dir)
@@ -118,3 +121,25 @@
                 'branch': 'master',
             },
         }
+
+
+class GitInfoTestBranch(GitTest):
+    @mock.patch.dict(os.environ, {
+        'GITHUB_ACTIONS': 'true',
+        'GITHUB_REF': 'refs/pull/1234/merge',
+        'GITHUB_SHA': 'bb0e00166b28f49db04d6a8b8cb4bddb5afa529f',
+        'GITHUB_HEAD_REF': 'fixup-branch'
+    }, clear=True)
+    def test_gitinfo_github_pr(self):
+        git_info = coveralls.git.git_info()
+        assert git_info['git']['branch'] == 'fixup-branch'
+
+    @mock.patch.dict(os.environ, {
+        'GITHUB_ACTIONS': 'true',
+        'GITHUB_REF': 'refs/heads/master',
+        'GITHUB_SHA': 'bb0e00166b28f49db04d6a8b8cb4bddb5afa529f',
+        'GITHUB_HEAD_REF': ''
+    }, clear=True)
+    def test_gitinfo_github_nopr(self):
+        git_info = coveralls.git.git_info()
+        assert git_info['git']['branch'] == 'master'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/coveralls-python-1.8.2/tox.ini 
new/coveralls-python-1.11.1/tox.ini
--- old/coveralls-python-1.8.2/tox.ini  2019-07-29 21:36:54.000000000 +0200
+++ new/coveralls-python-1.11.1/tox.ini 2020-02-15 01:13:01.000000000 +0100
@@ -1,5 +1,13 @@
 [tox]
-envlist = 
py{27,34,35,py,py3}-cov{3,4,41,5}-{default,pyyaml},py{36,37}-cov{41,5}-{default,pyyaml}
+envlist = 
py{27,34,35,py}-cov{3,4,41}-{default,pyyaml},py{36,37,38,py3}-cov{41,5}-{default,pyyaml}
+
+[gh-actions]
+python =
+    2.7: py27
+    3.5: py35
+    3.6: py36-cov5
+    3.7: py37-cov5
+    3.8: py38-cov5
 
 [testenv]
 passenv = *
@@ -7,28 +15,15 @@
 deps =
     mock
     pytest
-    sh
-    pyyaml: PyYAML>=3.10
+    pyyaml: PyYAML>=3.10,<5.3
     cov3: coverage<4.0
     cov4: coverage>=4.0,<4.1
     cov41: coverage>=4.1,<5.0
-    cov5: coverage>=5.0
+    cov5: coverage>=5.0,<6.0
 commands =
     coverage run --branch --source=coveralls -m pytest tests/
     coverage report -m
 
-[testenv:coveralls3]
-deps =
-    coverage<4.0
-commands =
-    coveralls --verbose
-
-[testenv:coveralls4]
-deps =
-    coverage>=4.0,<4.1
-commands =
-    coveralls --verbose
-
 [testenv:coveralls41]
 deps =
     coverage>=4.1,<5.0
@@ -37,6 +32,6 @@
 
 [testenv:coveralls5]
 deps =
-    coverage>=5.0
+    coverage>=5.0,<6.0
 commands =
     coveralls --verbose


Reply via email to