New Upstream Release - python-gnocchiclient

Ready changes

Summary

Merged new upstream version: 7.0.8 (was: 7.0.7).

Resulting package

Built on 2023-08-15T10:05 (took 10m3s)

The resulting binary packages can be installed (if you have the apt repository enabled) by running one of:

apt install -t fresh-releases python-gnocchiclient-docapt install -t fresh-releases python3-gnocchiclient

Diff

diff --git a/.github/workflows/python-gnocchiclient.yml b/.github/workflows/python-gnocchiclient.yml
new file mode 100644
index 0000000..a099fb7
--- /dev/null
+++ b/.github/workflows/python-gnocchiclient.yml
@@ -0,0 +1,27 @@
+name: python-gnocchiclient
+
+on:
+  workflow_dispatch:
+  pull_request:
+
+jobs:
+  test:
+    runs-on: ubuntu-20.04
+    timeout-minutes: 30
+    strategy:
+      matrix:
+        env:
+          - docs-gnocchi-web
+          - build
+          - pep8
+          - py36
+          - py38
+          - py39
+    steps:
+      - uses: actions/checkout@v2
+        with:
+          fetch-depth: 0
+      - name: Install dependencies
+        run: ./tools/install_deps.sh
+      - name: Run tox
+        run: tox -e ${{ matrix.env }}
diff --git a/.gitignore b/.gitignore
index 6697db3..633143f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -20,10 +20,6 @@ pip-log.txt
 # Sphinx
 doc/build
 
-# pbr generates these
-AUTHORS
-ChangeLog
-
 # generated docs
 doc/source/api
 doc/source/gnocchi.rst
diff --git a/.mergify.yml b/.mergify.yml
index e183241..fa4cf45 100644
--- a/.mergify.yml
+++ b/.mergify.yml
@@ -1,15 +1,40 @@
-rules:
-  default:
-    protection:
-      required_status_checks:
-        strict: True
-        contexts:
-          - continuous-integration/travis-ci
-      required_pull_request_reviews:
-        required_approving_review_count: 2
-  branches:
-    stable/.*:
-      protection:
-        required_pull_request_reviews:
-          required_approving_review_count: 1
+queue_rules:
+  - name: default
+    conditions:
+    - check-success=test (docs-gnocchi-web)
+    - check-success=test (build)
+    - check-success=test (pep8)
+    - check-success=test (py36)
+    - check-success=test (py38)
+    - check-success=test (py39)
 
+pull_request_rules:
+  - name: automatic merge
+    actions:
+      queue:
+        method: merge
+        name: default
+    conditions:
+    - label!=work-in-progress
+    - '#approved-reviews-by>=1'
+    - check-success=test (docs-gnocchi-web)
+    - check-success=test (build)
+    - check-success=test (pep8)
+    - check-success=test (py36)
+    - check-success=test (py38)
+    - check-success=test (py39)
+
+  - name: automatic merge backports from Mergify
+    actions:
+      queue:
+        method: merge
+        name: default
+    conditions:
+    - base~=^stable/.*
+    - label!=work-in-progress
+    - author=mergify[bot]
+
+  - name: dismiss reviews on additional commit
+    actions:
+      dismiss_reviews: {}
+    conditions: []
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index f4e096f..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,43 +0,0 @@
-language: python
-sudo: required
-
-services:
-  - docker
-
-cache:
-  directories:
-    - ~/.cache/pip
-env:
-  - TARGET: pep8
-  - TARGET: py27
-  - TARGET: py37
-  - TARGET: docs-gnocchi.xyz
-
-before_script:
-  # Only run if this is a pull-request
-  - if \[ "$TRAVIS_PULL_REQUEST" != "false" -o  -n "$TRAVIS_TAG" \]; then
-      docker pull gnocchixyz/ci-tools:latest ;
-    fi
-script:
-  # Only run if this is a pull-request
-  - if \[ "$TRAVIS_PULL_REQUEST" != "false" -o  -n "$TRAVIS_TAG" \]; then
-      docker run -v ~/.cache/pip:/home/tester/.cache/pip -v $(pwd):/home/tester/src gnocchixyz/ci-tools:latest tox -e ${TARGET} ;
-    fi
-
-notifications:
-  email: false
-  irc:
-    on_success: change
-    on_failure: always
-    channels:
-      - "irc.freenode.org#gnocchi"
-
-deploy:
-  provider: pypi
-  user: jd
-  password:
-    secure: eQzA9F55MW2v2eQysmV38tyuj0cqYaQh6iTWLf5ZBBqiSu8OwmJeouRCDpHOM93XDerLwzlNfmq2NwaP3lxbhc1kU9fxkyI9CbX4fQzHkrl30Eee9fq82qfnH+cBt9zZBGgk+HEClHxZINiQKF1NTzWA7PDkGRnLDfBrMqUum1FqYoli1XNoCOwgYRcI0UdaE96qqSqE4rlp4vuAR8sfDSh6SxLBUtEHzZM2ScreRZV11DwRSB5a9nc+PGAU6FdmSU6uil2kojmKU84q/+BbSpRG4Ch10MDWIN3UIuPfP4t8zhgC3grfTzq7Q+9l6VYFeQHdAsoHb050d9YabnZNxUqDt/ZIABKcpu/YiZzIXGbpGh4fw4mVupbOoFpVFg1Zg/nQAv99HYDtp5QwqYbA5T3LZXDi2v6+oPWCrBh5ll9bk7DhWsPhBFj5jjBIDY4sgXuRTLaGbik+CLxnmqR/KwOFtLM9cJQjCdfpi1K9VIqNI+NpIgQN5++FhqkL2vWTeiypraK5p1MiuHN0+UA2bdnKpadzE6VuIqjIbfZIKHRZDMkejQ9ruZgIMUTscafyMf9mY9NHXtqD6PA1rK/S4+3n5KIFRDFVVsBUPpao4jIFzaLfSPYciC4PrhyVNzfoIRnlStzuiUPjU0S89UwRAQiapf0NMNmXK2CMWvR9xIg=
-  on:
-    all_branches: true
-    tags: true
-  distributions: "sdist bdist_wheel"
diff --git a/README.rst b/README.rst
index 35417f8..3482529 100644
--- a/README.rst
+++ b/README.rst
@@ -2,20 +2,16 @@
 gnocchiclient
 =============
 
-.. image:: https://travis-ci.org/gnocchixyz/python-gnocchiclient.png?branch=master
-    :target: https://travis-ci.org/gnocchixyz/python-gnocchiclient
-    :alt: Build Status
-
 .. image:: https://badge.fury.io/py/gnocchiclient.svg
     :target: https://badge.fury.io/py/gnocchiclient
 
 Python bindings to the Gnocchi API
 
-This is a client for Gnocchi API. There's a Python API (the ``gnocchiclient```
-module), and a ``command-line script`` (installed as ```gnocchi``). Each
+This is a client for Gnocchi API. There's a Python API (the ``gnocchiclient``
+module), and a ``command-line script`` (installed as ``gnocchi``). Each
 implements the entire Gnocchi API.
 
 * Free software: Apache license
-* Documentation: http://gnocchi.xyz/gnocchiclient
+* Documentation: http://gnocchi.osci.io/gnocchiclient
 * Source: https://github.com/gnocchixyz/python-gnocchiclient
 * Bugs: https://github.com/gnocchixyz/python-gnocchiclient/issues
diff --git a/debian/changelog b/debian/changelog
index 7421cf2..7ed8d94 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+python-gnocchiclient (7.0.8-1) UNRELEASED; urgency=low
+
+  * New upstream release.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Tue, 15 Aug 2023 09:56:03 -0000
+
 python-gnocchiclient (7.0.7-5) unstable; urgency=medium
 
   * Cleans better (Closes: #1045269).
diff --git a/debian/patches/do-not-use-numprocesses-pytest-option.patch b/debian/patches/do-not-use-numprocesses-pytest-option.patch
index 9a0e651..40c3845 100644
--- a/debian/patches/do-not-use-numprocesses-pytest-option.patch
+++ b/debian/patches/do-not-use-numprocesses-pytest-option.patch
@@ -4,11 +4,11 @@ Author: Thomas Goirand <zigo@debian.org>
 Forwarded: not-needed
 Last-Update: 2018-02-27
 
-Index: python-gnocchiclient/tox.ini
+Index: python-gnocchiclient.git/tox.ini
 ===================================================================
---- python-gnocchiclient.orig/tox.ini
-+++ python-gnocchiclient/tox.ini
-@@ -51,5 +51,5 @@ exclude=.git,.tox,dist,doc,*egg,build
+--- python-gnocchiclient.git.orig/tox.ini
++++ python-gnocchiclient.git/tox.ini
+@@ -61,5 +61,5 @@ enable-extensions=G
  application-import-names = gnocchiclient
  
  [pytest]
diff --git a/doc/source/conf.py b/doc/source/conf.py
index c300f63..76e3c42 100644
--- a/doc/source/conf.py
+++ b/doc/source/conf.py
@@ -11,7 +11,7 @@
 # serve to show the default.
 
 import datetime
-import subprocess
+import pkg_resources
 
 # If extensions (or modules to document with autodoc) are in another directory,
 # add these directories to sys.path here. If the directory is relative to the
@@ -51,9 +51,8 @@ copyright = u'%s, The Gnocchi Developers' % datetime.date.today().year
 # built documents.
 #
 # The short X.Y version.
-version = subprocess.Popen(['sh', '-c', 'cd ../..; python setup.py --version'],
-                           stdout=subprocess.PIPE).stdout.read()
-version = version.strip()
+version = pkg_resources.get_distribution('gnocchiclient').version
+
 # The full version, including alpha/beta/rc tags.
 release = version
 
diff --git a/doc/source/index.rst b/doc/source/index.rst
index 45ae4fb..a6414d6 100644
--- a/doc/source/index.rst
+++ b/doc/source/index.rst
@@ -16,9 +16,9 @@ This is a client for `Gnocchi`_. There's :doc:`a Python API <api>` (the
     concepts. By understanding the concepts this library and client should make
     more sense.
 
-    __ http://gnocchi.xyz
+    __ http://gnocchi.osci.io
 
-.. _Gnocchi: http://gnocchi.xyz
+.. _Gnocchi: http://gnocchi.osci.io
 
 Contents:
 
diff --git a/gnocchiclient/benchmark.py b/gnocchiclient/benchmark.py
index bb4701e..dfe2d39 100644
--- a/gnocchiclient/benchmark.py
+++ b/gnocchiclient/benchmark.py
@@ -27,8 +27,6 @@ import futurist
 
 import iso8601
 
-from monotonic import monotonic as now  # noqa
-
 import six.moves
 
 from gnocchiclient import utils
@@ -64,10 +62,10 @@ def _positive_non_zero_int(argument_value):
 
 class StopWatch(object):
     def __init__(self):
-        self.started_at = now()
+        self.started_at = time.monotonic()
 
     def elapsed(self):
-        return max(0.0, now() - self.started_at)
+        return max(0.0, time.monotonic() - self.started_at)
 
 
 def measure_job(fn, *args, **kwargs):
@@ -116,7 +114,7 @@ class BenchmarkPool(futurist.ProcessPoolExecutor):
                 result, latency = f.result()
                 results.append(result)
                 latencies.append(latency)
-            except Exception as e:
+            except Exception as e:  # noqa
                 LOG.error("Error with %s metric: %s", (verb, e))
         latencies = sorted(latencies)
         return results, runtime, {
diff --git a/gnocchiclient/exceptions.py b/gnocchiclient/exceptions.py
index 66be50d..acfb093 100644
--- a/gnocchiclient/exceptions.py
+++ b/gnocchiclient/exceptions.py
@@ -215,7 +215,8 @@ _code_map = dict(
 
 
 def from_response(response, method=None):
-    """Return an instance of one of the ClientException on an requests response.
+    """
+    Return an instance of one of the ClientException on an requests response.
 
     Usage::
 
diff --git a/gnocchiclient/gendoc.py b/gnocchiclient/gendoc.py
index 224faa8..db602fd 100644
--- a/gnocchiclient/gendoc.py
+++ b/gnocchiclient/gendoc.py
@@ -38,3 +38,4 @@ def setup(app):
     app.add_directive('autodoc-gnocchi', GnocchiAutoDocDirective)
     app.add_config_value('autoprogram_cliff_application', 'gnocchi', True)
     app.add_config_value('autoprogram_cliff_ignored', ['--help'], True)
+    app.add_config_value('autoprogram_cliff_app_dist_name', None, True)
diff --git a/gnocchiclient/shell.py b/gnocchiclient/shell.py
index 4d4fddf..7de1d99 100644
--- a/gnocchiclient/shell.py
+++ b/gnocchiclient/shell.py
@@ -194,7 +194,7 @@ class GnocchiShell(app.App):
         if err and isinstance(err, exceptions.HttpError):
             try:
                 error = err.response.json()
-            except Exception:
+            except Exception:  # noqa
                 pass
             else:
                 if 'description' in error:
diff --git a/gnocchiclient/v1/aggregates.py b/gnocchiclient/v1/aggregates.py
index a26ec4e..8f1a2c2 100644
--- a/gnocchiclient/v1/aggregates.py
+++ b/gnocchiclient/v1/aggregates.py
@@ -24,7 +24,8 @@ from gnocchiclient.v1 import base
 class AggregatesManager(base.Manager):
     def fetch(self, operations, search=None,
               resource_type='generic', start=None, stop=None, granularity=None,
-              needed_overlap=None, groupby=None, fill=None, details=False):
+              needed_overlap=None, groupby=None, fill=None, details=False,
+              use_history=False):
         """Get measurements of an aggregated metrics.
 
         :param operations: operations
@@ -44,6 +45,10 @@ class AggregatesManager(base.Manager):
         :param details: also returns the list of metrics or resources
                         associated to the operations
         :type details: boolean
+        :param use_history: indicates if Gnocchi server must include in the
+                            response the tag history for resources. The
+                            default value is `False`.
+        :type use_history: boolean
 
         See Gnocchi REST API documentation for the format
         of *query dictionary*
@@ -66,6 +71,8 @@ class AggregatesManager(base.Manager):
             data["resource_type"] = resource_type
             params["groupby"] = groupby
 
+        params['use_history'] = use_history
+
         aggregates = self._post("v1/aggregates?%s" % (
             utils.dict_to_querystring(params)),
             headers={'Content-Type': "application/json"},
diff --git a/gnocchiclient/v1/aggregates_cli.py b/gnocchiclient/v1/aggregates_cli.py
index ab82b4d..931525b 100644
--- a/gnocchiclient/v1/aggregates_cli.py
+++ b/gnocchiclient/v1/aggregates_cli.py
@@ -42,7 +42,16 @@ class CliAggregates(lister.Lister):
         parser.add_argument("--fill",
                             help=("Value to use when backfilling timestamps "
                                   "with missing values in a subset of series. "
-                                  "Value should be a float or 'null'."))
+                                  "Value should be a float or 'null'.")),
+        parser.add_argument("--use-history", default=False,
+                            help=("Indicates if Gnocchi server should respond "
+                                  "with the resource tags history for the "
+                                  "aggregation query. If set to `False`, only "
+                                  "the latest tag values will be returned. "
+                                  "Otherwise, the measures will be split "
+                                  "proportionally if a tag has been changed "
+                                  "in the `granularity` requested.")
+                            )
         return parser
 
     def take_action(self, parsed_args):
@@ -55,6 +64,8 @@ class CliAggregates(lister.Lister):
             granularity=parsed_args.granularity,
             needed_overlap=parsed_args.needed_overlap,
             groupby=parsed_args.groupby,
+            fill=parsed_args.fill,
+            use_history=parsed_args.use_history
         )
 
         if parsed_args.search and parsed_args.groupby:
diff --git a/gnocchiclient/v1/resource.py b/gnocchiclient/v1/resource.py
index 306b913..cc2103b 100644
--- a/gnocchiclient/v1/resource.py
+++ b/gnocchiclient/v1/resource.py
@@ -41,9 +41,17 @@ class ResourceManager(base.Manager):
         """
         params = utils.build_pagination_options(
             details, history, limit, marker, sorts)
-        url = "%s%s?%s" % (self.url, resource_type,
-                           utils.dict_to_querystring(params))
-        return self._get(url).json()
+        resources = []
+        page_url = "%s%s?%s" % (self.url, resource_type,
+                                utils.dict_to_querystring(params))
+        while page_url:
+            page = self._get(page_url)
+            resources.extend(page.json())
+            if limit is None or len(resources) < limit:
+                page_url = page.links.get("next", {'url': None})['url']
+            else:
+                break
+        return resources
 
     def get(self, resource_type, resource_id, history=False):
         """Get a resource.
@@ -158,20 +166,29 @@ class ResourceManager(base.Manager):
 
         See Gnocchi REST API documentation for the format
         of *query dictionary*
-        http://gnocchi.xyz/rest.html#searching-for-resources
+        http://gnocchi.osci.io/rest.html#searching-for-resources
         """
         query = query or {}
         params = utils.build_pagination_options(
             details, history, limit, marker, sorts)
         url = "v1/search/resource/%s?%%s" % resource_type
+        resources = []
 
         if isinstance(query, dict):
-            return self._post(
-                url % utils.dict_to_querystring(params),
-                headers={'Content-Type': "application/json"},
-                data=ujson.dumps(query)).json()
-
-        params['filter'] = query
-        return self._post(
-            url % utils.dict_to_querystring(params),
-            headers={'Content-Type': "application/json"}).json()
+            page_url = url % utils.dict_to_querystring(params)
+            data = ujson.dumps(query)
+        else:
+            params['filter'] = query
+            page_url = url % utils.dict_to_querystring(params)
+            data = None
+
+        while page_url:
+            page = self._post(
+                page_url, headers={'Content-Type': "application/json"},
+                data=data)
+            resources.extend(page.json())
+            if limit is None or len(resources) < limit:
+                page_url = page.links.get("next", {'url': None})['url']
+            else:
+                break
+        return resources
diff --git a/gnocchiclient/version.py b/gnocchiclient/version.py
index 683c55e..1b80522 100644
--- a/gnocchiclient/version.py
+++ b/gnocchiclient/version.py
@@ -12,7 +12,11 @@
 #    under the License.
 #
 
-import pbr.version
+import pkg_resources
 
 
-__version__ = pbr.version.VersionInfo('gnocchiclient').version_string()
+try:
+    __version__ = pkg_resources.get_distribution('gnocchiclient').version
+except pkg_resources.DistributionNotFound:
+    # package is not installed
+    pass
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..9375da2
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,5 @@
+[build-system]
+requires = ["setuptools", "setuptools_scm", "wheel"]
+build-backend = "setuptools.build_meta"
+
+[tool.setuptools_scm]
diff --git a/requirements.txt b/requirements.txt
deleted file mode 100644
index f4d64cc..0000000
--- a/requirements.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-# The order of packages is significant, because pip processes them in the order
-# of appearance. Changing the order has an impact on the overall integration
-# process, which may cause wedges in the gate later.
-
-pbr>=1.4
-cliff>=2.10 # Apache-2.0
-ujson
-keystoneauth1>=2.0.0
-six
-futurist
-iso8601
-monotonic
-python-dateutil
-debtcollector
diff --git a/setup.cfg b/setup.cfg
index 6e7d65d..766e7a7 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,26 +1,51 @@
 [metadata]
 name = gnocchiclient
 summary = Python client library for Gnocchi
-description-file =
+description_file =
     README.rst
 author = Gnocchi
-home-page = http://gnocchi.xyz/gnocchiclient
+home_page = http://gnocchi.osci.io/gnocchiclient
+python_requires = >=3.6
 classifier =
     Intended Audience :: Information Technology
     Intended Audience :: System Administrators
     License :: OSI Approved :: Apache Software License
     Operating System :: POSIX :: Linux
     Programming Language :: Python
-    Programming Language :: Python :: 2
-    Programming Language :: Python :: 2.7
     Programming Language :: Python :: 3
-    Programming Language :: Python :: 3.7
+    Programming Language :: Python :: 3 :: Only
+    Programming Language :: Python :: 3.6
+    Programming Language :: Python :: 3.8
+    Programming Language :: Python :: 3.9
 
-[files]
+[options]
 packages =
     gnocchiclient
 
-[entry_points]
+install_requires =
+    cliff>=2.10 # Apache-2.0
+    ujson
+    keystoneauth1>=2.0.0
+    six
+    futurist
+    iso8601
+    python-dateutil
+    debtcollector
+
+[options.extras_require]
+test =
+  python-openstackclient
+  pytest
+  pytest-xdist
+
+doc =
+  sphinx
+  sphinx_rtd_theme
+
+openstack =
+  osc-lib>=0.3.0 # Apache-2.0
+
+[options.entry_points]
 console_scripts =
     gnocchi = gnocchiclient.shell:main
 
@@ -73,19 +98,6 @@ openstack.metric.v1 =
     metric_benchmark measures add = gnocchiclient.benchmark:CliBenchmarkMeasuresAdd
     metric_benchmark measures show = gnocchiclient.benchmark:CliBenchmarkMeasuresShow
 
-[extras]
-test =
-  python-openstackclient
-  pytest
-  pytest-xdist
-
-doc =
-  sphinx!=1.2.0,!=1.3b1,>=1.1.2
-  sphinx_rtd_theme
-
-openstack =
-  osc-lib>=0.3.0 # Apache-2.0
-
 [build_sphinx]
 source-dir = doc/source
 build-dir = doc/build
@@ -94,10 +106,5 @@ all_files = 1
 [upload_sphinx]
 upload-dir = doc/build/html
 
-[pbr]
-autodoc_index_modules = true
-autodoc_exclude_modules =
-  gnocchiclient.tests.*
-
 [wheel]
 universal = 1
diff --git a/setup.py b/setup.py
index 056c16c..81d45af 100644
--- a/setup.py
+++ b/setup.py
@@ -13,17 +13,20 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# THIS FILE IS MANAGED BY THE GLOBAL REQUIREMENTS REPO - DO NOT EDIT
 import setuptools
 
-# In python < 2.7.4, a lazy loading of package `pbr` will break
-# setuptools if some other modules registered functions in `atexit`.
-# solution from: http://bugs.python.org/issue15881#msg170215
+
+cmdclass = {}
+
 try:
-    import multiprocessing  # noqa
+    from sphinx import setup_command
+    cmdclass['build_sphinx'] = setup_command.BuildDoc
 except ImportError:
     pass
 
+
 setuptools.setup(
-    setup_requires=['pbr'],
-    pbr=True)
+    packages=setuptools.find_packages(),
+    cmdclass=cmdclass,
+    py_modules=[],
+)
diff --git a/tools/install_deps.sh b/tools/install_deps.sh
new file mode 100755
index 0000000..012ae16
--- /dev/null
+++ b/tools/install_deps.sh
@@ -0,0 +1,26 @@
+#!/bin/bash -ex
+
+sudo apt-get update -y && sudo apt-get install -qy gnupg software-properties-common
+sudo add-apt-repository -y ppa:deadsnakes/ppa
+sudo apt-get update -y && sudo apt-get install -qy \
+        locales \
+        git \
+        wget \
+        curl \
+        python3 \
+        python3-dev \
+        python3-pip \
+        python3.6 \
+        python3.6-dev \
+        python3.6-distutils \
+        python3.9 \
+        python3.9-dev \
+
+sudo rm -rf /var/lib/apt/lists/*
+
+export LANG=en_US.UTF-8
+sudo update-locale
+sudo locale-gen $LANG
+
+sudo python3 -m pip install -U pip tox virtualenv
+sudo python3.6 -m pip install -U pip tox virtualenv
diff --git a/tox.ini b/tox.ini
index 345458b..be44788 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,20 +1,28 @@
 [tox]
 minversion = 1.6
-envlist = py37,py27,pypy,pep8,docs-gnocchi.xyz
+envlist = py36,py38,py39,pep8,docs-gnocchi-web
 skipsdist = True
 
 [testenv]
+basepython =
+   py36: {env:TOXPYTHON:python3.6}
+   py38: {env:TOXPYTHON:python3.8}
+   py39: {env:TOXPYTHON:python3.9}
 usedevelop = True
 setenv =
    VIRTUAL_ENV={envdir}
    GNOCCHI_CLIENT_EXEC_DIR={envdir}/bin
 passenv = GNOCCHI_*
-# NOTE(jd): the -e argument is on its own line so it's passed as an argument to pip
 deps = .[test,openstack]
-       -e
        git+https://github.com/gnocchixyz/gnocchi.git#egg=gnocchi[postgresql,file]
        pifpaf[gnocchi]
-commands = pifpaf run gnocchi -- pytest {posargs:gnocchiclient/tests}
+# TODO(tobias-urdin): Skip benchmark tests since they just hang right now.
+commands = pifpaf run gnocchi -- pytest -k 'not test_benchmark_' {posargs:gnocchiclient/tests}
+
+[testenv:build]
+basepython = python3.8
+deps = build
+commands = python3 -m build
 
 [testenv:pep8]
 basepython = python3
@@ -36,9 +44,10 @@ commands = {posargs}
 [testenv:cover]
 deps = {[testenv]deps}
        pytest-cov
-commands = pifpaf run gnocchi -- pytest --cov=gnocchiclient {posargs:gnocchiclient/tests}
+# TODO(tobias-urdin): Skip benchmark tests since they just hang right now.
+commands = pifpaf run gnocchi -- pytest -k 'not test_benchmark_' --cov=gnocchiclient {posargs:gnocchiclient/tests}
 
-[testenv:docs-gnocchi.xyz]
+[testenv:docs-gnocchi-web]
 basepython = python3
 deps = .[test,doc]
 commands =

Debdiff

[The following lists of changes regard files as different if they have different names, permissions or owners.]

Files in second set of .debs but not in first

-rw-r--r--  root/root   /usr/lib/python3/dist-packages/gnocchiclient-0.0.0.egg-info/PKG-INFO
-rw-r--r--  root/root   /usr/lib/python3/dist-packages/gnocchiclient-0.0.0.egg-info/dependency_links.txt
-rw-r--r--  root/root   /usr/lib/python3/dist-packages/gnocchiclient-0.0.0.egg-info/entry_points.txt
-rw-r--r--  root/root   /usr/lib/python3/dist-packages/gnocchiclient-0.0.0.egg-info/requires.txt
-rw-r--r--  root/root   /usr/lib/python3/dist-packages/gnocchiclient-0.0.0.egg-info/top_level.txt

Files in first set of .debs but not in second

-rw-r--r--  root/root   /usr/lib/python3/dist-packages/gnocchiclient-7.0.7.egg-info/PKG-INFO
-rw-r--r--  root/root   /usr/lib/python3/dist-packages/gnocchiclient-7.0.7.egg-info/dependency_links.txt
-rw-r--r--  root/root   /usr/lib/python3/dist-packages/gnocchiclient-7.0.7.egg-info/entry_points.txt
-rw-r--r--  root/root   /usr/lib/python3/dist-packages/gnocchiclient-7.0.7.egg-info/not-zip-safe
-rw-r--r--  root/root   /usr/lib/python3/dist-packages/gnocchiclient-7.0.7.egg-info/requires.txt
-rw-r--r--  root/root   /usr/lib/python3/dist-packages/gnocchiclient-7.0.7.egg-info/top_level.txt

No differences were encountered between the control files of package python-gnocchiclient-doc

No differences were encountered between the control files of package python3-gnocchiclient

More details

Full run details