Hello community,
here is the log from the commit of package python-gabbi for openSUSE:Factory checked in at 2017-08-04 11:59:48
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-gabbi (Old)
and /work/SRC/openSUSE:Factory/.python-gabbi.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-gabbi"
Fri Aug 4 11:59:48 2017 rev:2 rq:511532 version:1.35.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-gabbi/python-gabbi.changes 2017-04-17 10:25:19.470598774 +0200
+++ /work/SRC/openSUSE:Factory/.python-gabbi.new/python-gabbi.changes 2017-08-04 11:59:49.911801387 +0200
@@ -1,0 +2,38 @@
+Thu Jul 20 05:41:40 UTC 2017 - tbechtold@suse.com
+
+- update to 1.35.0:
+ * release 1.35.0
+ * Documentation for <@ in json path values
+ * Allow value of a json path query to be read from disk
+ * Make _load_data_file public
+ * Add some simple docs for the LHS json path substitution
+ * Template expansion in LHS of json path test
+ * Correct location of gnocchi repo in gnocchi tests
+
+-------------------------------------------------------------------
+Wed Jul 5 08:23:44 UTC 2017 - tbechtold@suse.com
+
+- update to 1.34.1:
+ * Release 1.34.1
+ * Add configuration for uploading signed sdists and wheels
+ * use assertRegex not assertRegexpMatches
+ * Update contributors list to reflect recent activity
+ * Relase 1.34.0
+ * Add additional test to coerce.yaml
+ * Manage numerals more effectively in replacers
+ * Add optional `test` param for custom content handlers (#212)
+ * Remove .testrepository/times.dbm each test run
+ * release 1.33.0
+ * Enforce type of response/content-handler test data
+ * Make verbose accept additional valid strings
+ * Add verbose option to `build_tests`
+ * Allow substitutions in count and delay
+ * Fix prefix handling for relative urls
+ * Add a test for a relative link and add a comment
+ * Avoid duplicating prefix when re-using urls
+ * Ensure that $HOME is in passenv
+ * Unicode content from disk must become bytes
+- convert to singlespec
+- disable tests for now. remote access needed for some
+
+-------------------------------------------------------------------
Old:
----
gabbi-1.32.0.tar.gz
New:
----
gabbi-1.35.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-gabbi.spec ++++++
--- /var/tmp/diff_new_pack.POpNC4/_old 2017-08-04 11:59:50.791677194 +0200
+++ /var/tmp/diff_new_pack.POpNC4/_new 2017-08-04 11:59:50.795676629 +0200
@@ -16,39 +16,49 @@
#
+%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-gabbi
-Version: 1.32.0
+Version: 1.35.0
Release: 0
Summary: Declarative HTTP testing library
License: Apache-2.0
Group: Development/Languages/Python
Url: https://github.com/cdent/gabbi
Source: https://pypi.io/packages/source/g/gabbi/gabbi-%{version}.tar.gz
-BuildRequires: python-colorama
-#BuildRequires: python-coverage, python-hacking, python-testtools, python-testrepository
-BuildRequires: python-PyYAML
-BuildRequires: python-devel
-BuildRequires: python-httplib2
-BuildRequires: python-jsonpath-rw
-BuildRequires: python-mock
-BuildRequires: python-nose
-BuildRequires: python-pbr
-BuildRequires: python-setuptools
-BuildRequires: python-six
-BuildRequires: python-wsgi_intercept >= 1.0
+# BuildRequires: %{python_module PyYAML}
+# BuildRequires: %{python_module Sphinx}
+# BuildRequires: %{python_module colorama}
+# BuildRequires: %{python_module fixtures}
+# BuildRequires: %{python_module httplib2}
+# BuildRequires: %{python_module jsonpath-rw-ext}
+# BuildRequires: %{python_module jsonpath-rw}
+# BuildRequires: %{python_module mock}
+# BuildRequires: %{python_module nose}
+# BuildRequires: %{python_module pytest-cov}
+# BuildRequires: %{python_module pytest}
+# BuildRequires: %{python_module six}
+# BuildRequires: %{python_module testrepository}
+# BuildRequires: %{python_module testtools}
+# BuildRequires: %{python_module urllib3}
+# BuildRequires: %{python_module wsgi_intercept}
+BuildRequires: %{python_module devel}
+BuildRequires: %{python_module pbr}
+BuildRequires: %{python_module setuptools}
+BuildRequires: python-rpm-macros
Requires: python-PyYAML
Requires: python-colorama
Requires: python-jsonpath-rw-ext
Requires: python-pytest
Requires: python-six
+Requires: python-testtools
Requires: python-urllib3 >= 1.11.0
Requires: python-wsgi_intercept >= 1.2.2
BuildRoot: %{_tmppath}/%{name}-%{version}-build
-%if 0%{?suse_version} && 0%{?suse_version} <= 1110
-%{!?python_sitelib: %global python_sitelib %(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
-%else
+Requires(post): update-alternatives
+Requires(postun): update-alternatives
BuildArch: noarch
-%endif
+
+%python_subpackages
%description
Gabbi is a tool for running HTTP tests where requests and responses
@@ -59,18 +69,22 @@
%setup -q -n gabbi-%{version}
%build
-python setup.py build
+%python_build
%install
-python setup.py install --prefix=%{_prefix} --root=%{buildroot}
+%python_install
+%python_clone -a %{buildroot}%{_bindir}/gabbi-run
+
+%post
+%python_install_alternative gabbi-run
-%check
-python setup.py testr
+%postun
+%python_uninstall_alternative gabbi-run
-%files
+%files %{python_files}
%defattr(-,root,root,-)
%doc AUTHORS ChangeLog LICENSE README.rst
%{python_sitelib}/*
-%{_bindir}/gabbi-run
+%python_alternative %{_bindir}/gabbi-run
%changelog
++++++ gabbi-1.32.0.tar.gz -> gabbi-1.35.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/AUTHORS new/gabbi-1.35.0/AUTHORS
--- old/gabbi-1.32.0/AUTHORS 2017-02-06 14:44:48.000000000 +0100
+++ new/gabbi-1.35.0/AUTHORS 2017-07-07 15:36:26.000000000 +0200
@@ -12,6 +12,8 @@
Mehdi Abaakouk
Mehdi Abaakouk
Michael McCune
+Ryan James Spencer
+Ryan Spencer
Samuel Fekete
Tom Viner
Tom Viner
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/ChangeLog new/gabbi-1.35.0/ChangeLog
--- old/gabbi-1.32.0/ChangeLog 2017-02-06 14:44:48.000000000 +0100
+++ new/gabbi-1.35.0/ChangeLog 2017-07-07 15:36:26.000000000 +0200
@@ -1,6 +1,44 @@
CHANGES
=======
+1.35.0
+------
+
+* release 1.35.0
+* Documentation for <@ in json path values
+* Allow value of a json path query to be read from disk
+* Make _load_data_file public
+* Add some simple docs for the LHS json path substitution
+* Template expansion in LHS of json path test
+* Correct location of gnocchi repo in gnocchi tests
+* Release 1.34.1
+* Add configuration for uploading signed sdists and wheels
+* use assertRegex not assertRegexpMatches
+* Update contributors list to reflect recent activity
+
+1.34.0
+------
+
+* Relase 1.34.0
+* Add additional test to coerce.yaml
+* Manage numerals more effectively in replacers
+* Add optional `test` param for custom content handlers (#212)
+
+1.33.0
+------
+
+* Remove .testrepository/times.dbm each test run
+* release 1.33.0
+* Enforce type of response/content-handler test data
+* Make verbose accept additional valid strings
+* Add verbose option to `build_tests`
+* Allow substitutions in count and delay
+* Fix prefix handling for relative urls
+* Add a test for a relative link and add a comment
+* Avoid duplicating prefix when re-using urls
+* Ensure that $HOME is in passenv
+* Unicode content from disk must become bytes
+
1.32.0
------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/Makefile new/gabbi-1.35.0/Makefile
--- old/gabbi-1.32.0/Makefile 2017-01-06 23:00:06.000000000 +0100
+++ new/gabbi-1.35.0/Makefile 2017-06-28 16:57:09.000000000 +0200
@@ -34,9 +34,9 @@
tox --skip-missing-interpreters
dist: test
- python setup.py sdist
+ python setup.py sdist bdist_wheel
release: clean test cleanagain tagv pypi
pypi:
- python setup.py sdist upload
+ python setup.py sdist bdist_wheel upload --sign
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/PKG-INFO new/gabbi-1.35.0/PKG-INFO
--- old/gabbi-1.32.0/PKG-INFO 2017-02-06 14:44:48.000000000 +0100
+++ new/gabbi-1.35.0/PKG-INFO 2017-07-07 15:36:27.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: gabbi
-Version: 1.32.0
+Version: 1.35.0
Summary: Declarative HTTP testing library
Home-page: https://github.com/cdent/gabbi
Author: Chris Dent
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/docs/source/format.rst new/gabbi-1.35.0/docs/source/format.rst
--- old/gabbi-1.32.0/docs/source/format.rst 2016-12-30 16:42:42.000000000 +0100
+++ new/gabbi-1.35.0/docs/source/format.rst 2017-07-07 15:03:57.000000000 +0200
@@ -274,9 +274,11 @@
* ``data``
* ``request_headers``
* ``response_strings``
-* ``response_json_paths`` (on the value side of the key value pair)
+* ``response_json_paths`` (in both the key and value, see
+ :ref:`json path substitution <json-subs>` for more info)
* ``response_headers`` (on the value side of the key value pair)
* ``response_forbidden_headers``
+* ``count`` and ``delay`` fields of ``poll``
With these variables it ought to be possible to traverse an API without any
explicit statements about the URLs being used. If you need a
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/docs/source/handlers.rst new/gabbi-1.35.0/docs/source/handlers.rst
--- old/gabbi-1.32.0/docs/source/handlers.rst 2016-09-27 12:20:21.000000000 +0200
+++ new/gabbi-1.35.0/docs/source/handlers.rst 2017-04-26 14:15:42.000000000 +0200
@@ -107,8 +107,12 @@
If ``accepts`` is defined two additional static methods should be defined:
-* ``dumps``: Turn structured Python data from the ``data`` key in a
- test into a string or byte stream.
+* ``dumps``: Turn structured Python data from the ``data`` key in a test into a
+ string or byte stream. The optional ``test`` param allows you to access the
+ current test case which may help with manipulations for custom content
+ handlers, e.g. ``multipart/form-data`` needs to add a ``boundary`` to the
+ ``Content-Type`` header in order to mark the appropriate sections of the
+ body.
* ``loads``: Turn a string or byte stream in a response into a Python data
structure. Gabbi will put this data on the ``response_data``
attribute on the test, where it can be used in the evaluations
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/docs/source/jsonpath.rst new/gabbi-1.35.0/docs/source/jsonpath.rst
--- old/gabbi-1.32.0/docs/source/jsonpath.rst 2016-07-13 05:57:28.000000000 +0200
+++ new/gabbi-1.35.0/docs/source/jsonpath.rst 2017-07-07 15:03:57.000000000 +0200
@@ -64,8 +64,48 @@
gabbi tests are being used to test your serializers and data models,
not just your API interactions.
+It is also possible to read raw JSON from disk for either all or
+some of a JSON response::
+
+ response_json_paths:
+ $: @http://jsonpath-rw.readthedocs.io/en/latest/
.. _jsonpath_rw_ext: https://python-jsonpath-rw-ext.readthedocs.io/en/latest/
+.. _own tests: https://github.com/cdent/gabbi/blob/master/gabbi/tests/gabbits_intercept/dat...
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/docs/source/release.rst new/gabbi-1.35.0/docs/source/release.rst
--- old/gabbi-1.32.0/docs/source/release.rst 2017-02-06 14:28:32.000000000 +0100
+++ new/gabbi-1.35.0/docs/source/release.rst 2017-07-07 15:22:42.000000000 +0200
@@ -5,6 +5,34 @@
highlighting major features and changes. For more detail see
the `commit logs`_ on GitHub.
+1.35.0
+------
+
+:doc:`jsonpath` handling gets two improvements:
+
+* The value side of a ``response_json_paths`` entry can be loaded
+ from a file using the ``<@file.json`` syntax also used in
+ :ref:`data`.
+* The key side of a ``response_json_paths`` entry can use
+ :ref:`substitutions <state-substitution>`. This was already true
+ for the value side.
+
+1.34.0
+------
+
+:ref:`Substitutions <state-substitution>` in ``$RESPONSE`` handling
+now preserve numeric types instead of casting to a string. This is
+useful when servers are expecting strong types and tests want to
+send response data back to the server.
+
+1.33.0
+------
+
+``count`` and ``delay`` test keys allow :ref:`substitutions
+<state-substitution>`. :meth:`gabbi.driver.build_tests` accepts
+a ``verbose`` parameter to set test :ref:`verbosity <metadata>` for
+an entire session.
+
1.32.0
------
@@ -191,8 +219,11 @@
* Chris Dent
* FND
* Mehdi Abaakouk
+* Tom Viner
* Jason Myers
+* Ryan Spencer
* Kim Raymoure
+* Travis Truman
* Samuel Fekete
* Michael McCune
* Imran Hayder
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/gabbi/__init__.py new/gabbi-1.35.0/gabbi/__init__.py
--- old/gabbi-1.32.0/gabbi/__init__.py 2017-02-06 14:27:22.000000000 +0100
+++ new/gabbi-1.35.0/gabbi/__init__.py 2017-07-07 15:17:56.000000000 +0200
@@ -12,4 +12,4 @@
# under the License.
"""See gabbi.driver and gabbbi.case."""
-__version__ = '1.32.0'
+__version__ = '1.35.0'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/gabbi/case.py new/gabbi-1.35.0/gabbi/case.py
--- old/gabbi-1.32.0/gabbi/case.py 2016-12-23 16:00:53.000000000 +0100
+++ new/gabbi-1.35.0/gabbi/case.py 2017-07-07 15:03:57.000000000 +0200
@@ -154,6 +154,9 @@
message[k] = self.replace_template(message[k])
return message
+ if isinstance(message, list):
+ return [self.replace_template(line) for line in message]
+
for replacer in REPLACERS:
template = '$%s' % replacer
method = '_%s_replace' % replacer.lower()
@@ -171,6 +174,10 @@
return message
+ def load_data_file(self, filename):
+ """Read a file from the current test directory."""
+ return self._load_data_file(filename)
+
def _assert_response(self):
"""Compare the response with expected data."""
self._test_status(self.test_data['status'], self.response['status'])
@@ -187,13 +194,27 @@
return value
def _environ_replace(self, message):
- """Replace an indicator in a message with the environment value."""
+ """Replace an indicator in a message with the environment value.
+
+ If value can be a number, cast it as such. If value is a form of
+ "null", "true", or "false" cast it to None, True, False.
+ """
value = re.sub(self._replacer_regex('ENVIRON'),
self._environ_replacer, message)
- if value == "False":
+ try:
+ if '.' in value:
+ value = float(value)
+ else:
+ value = int(value)
+ return value
+ except ValueError:
+ pass
+ if value.lower() == "false":
return False
- if value == "True":
+ if value.lower() == "true":
return True
+ if value.lower() == "null":
+ return None
return value
@staticmethod
@@ -351,11 +372,18 @@
return r"%s\$%s" % (case, key)
def _response_replace(self, message):
- """Replace a content path with the value from a previous response."""
- return re.sub(self._replacer_regex('RESPONSE'),
- self._response_replacer, message)
+ """Replace a content path with the value from a previous response.
+
+ If the match would replace the entire message, then don't cast it
+ to a string.
+ """
+ regex = self._replacer_regex('RESPONSE')
+ match = re.match('^%s$' % regex, message)
+ if match:
+ return self._response_replacer(match, preserve=True)
+ return re.sub(regex, self._response_replacer, message)
- def _response_replacer(self, match):
+ def _response_replacer(self, match, preserve=False):
"""Replace a regex match with the value from a previous response."""
response_path = match.group('arg')
case = match.group('case')
@@ -368,8 +396,12 @@
# If no handler can be found use the null replacer,
# which returns "foo" when "$RESPONSE['foo']".
replacer_class = replacer_class or base.ContentHandler
- return replacer_class.replacer(
+ result = replacer_class.replacer(
referred_case.response_data, response_path)
+ if preserve:
+ return result
+ else:
+ return six.text_type(result)
def _run_request(self, url, method, headers, body, redirect=False):
"""Run the http request and decode output.
@@ -436,9 +468,15 @@
else:
body = ''
+ # ensure body is bytes, encoding as UTF-8 because that's
+ # what we do here
+ if isinstance(body, six.text_type):
+ body = body.encode('UTF-8')
+
if test['poll']:
- count = test['poll'].get('count', 1)
- delay = test['poll'].get('delay', 1)
+ count = int(float(self.replace_template(
+ test['poll'].get('count', 1))))
+ delay = float(self.replace_template(test['poll'].get('delay', 1)))
failure = None
while count:
try:
@@ -471,19 +509,16 @@
"""
if isinstance(data, str):
if data.startswith('<@'):
- info = self._load_data_file(data.replace('<@', '', 1))
+ info = self.load_data_file(data.replace('<@', '', 1))
if utils.not_binary(content_type):
- try:
- info = str(info, 'UTF-8')
- except TypeError:
- info = info.encode('UTF-8')
- data = info
+ data = six.text_type(info, 'UTF-8')
else:
return info
else:
dumper_class = self.get_content_handler(content_type)
if dumper_class:
- data = dumper_class.dumps(data)
+ data = self.replace_template(data)
+ data = dumper_class.dumps(data, test=self)
else:
raise ValueError(
'unable to process data to %s' % content_type)
@@ -542,7 +577,7 @@
dumper_class = self.get_content_handler(self.content_type)
if dumper_class:
full_response = dumper_class.dumps(self.response_data,
- pretty=True)
+ pretty=True, test=self)
else:
full_response = self.output
else:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/gabbi/driver.py new/gabbi-1.35.0/gabbi/driver.py
--- old/gabbi-1.32.0/gabbi/driver.py 2016-11-30 18:47:39.000000000 +0100
+++ new/gabbi-1.35.0/gabbi/driver.py 2017-04-26 14:15:42.000000000 +0200
@@ -42,7 +42,7 @@
test_loader_name=None, fixture_module=None,
response_handlers=None, content_handlers=None,
prefix='', require_ssl=False, url=None,
- inner_fixtures=None):
+ inner_fixtures=None, verbose=False):
"""Read YAML files from a directory to create tests.
Each YAML file represents an ordered sequence of HTTP requests.
@@ -64,6 +64,8 @@
:param require_ssl: If ``True``, make all tests default to using SSL.
:param inner_fixtures: A list of ``Fixtures`` to use with each
individual test request.
+ :param verbose: If ``True`` or ``'all'``, make tests verbose by default
+ ``'headers'`` and ``'body'`` are also accepted.
:type inner_fixtures: List of fixtures.Fixture classes.
:rtype: TestSuite containing multiple TestSuites (one for each YAML file).
"""
@@ -117,6 +119,12 @@
else:
suite_dict['defaults'] = {'ssl': True}
+ if any((verbose == opt for opt in [True, 'all', 'headers', 'body'])):
+ if 'defaults' in suite_dict:
+ suite_dict['defaults']['verbose'] = verbose
+ else:
+ suite_dict['defaults'] = {'verbose': verbose}
+
file_suite = suitemaker.test_suite_from_dict(
loader, test_base_name, suite_dict, path, host, port,
fixture_module, intercept, prefix=prefix,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/gabbi/handlers/base.py new/gabbi-1.35.0/gabbi/handlers/base.py
--- old/gabbi-1.32.0/gabbi/handlers/base.py 2016-12-23 16:00:53.000000000 +0100
+++ new/gabbi-1.35.0/gabbi/handlers/base.py 2017-04-26 14:15:42.000000000 +0200
@@ -13,6 +13,9 @@
"""Base classes for response and content handlers."""
+from gabbi.exception import GabbiFormatError
+
+
class ResponseHandler(object):
"""Add functionality for making assertions about an HTTP response.
@@ -38,6 +41,11 @@
def __call__(self, test):
if test.test_data[self._key]:
self.preprocess(test)
+ if type(self.test_key_value) != type(test.test_data[self._key]):
+ raise GabbiFormatError(
+ "%s in '%s' has incorrect type, must be %s"
+ % (self._key, test.test_data['name'],
+ type(self.test_key_value)))
for item in test.test_data[self._key]:
try:
value = test.test_data[self._key][item]
@@ -92,7 +100,7 @@
return path
@staticmethod
- def dumps(data, pretty=False):
+ def dumps(data, pretty=False, test=None):
"""Return structured data as a string.
If pretty is true, prettify.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/gabbi/handlers/core.py new/gabbi-1.35.0/gabbi/handlers/core.py
--- old/gabbi-1.32.0/gabbi/handlers/core.py 2016-09-27 12:20:21.000000000 +0200
+++ new/gabbi-1.35.0/gabbi/handlers/core.py 2017-06-28 16:57:09.000000000 +0200
@@ -66,7 +66,7 @@
if header_value.startswith('/') and header_value.endswith('/'):
header_value = header_value.strip('/').rstrip('/')
- test.assertRegexpMatches(
+ test.assertRegex(
response_value, header_value,
'Expect header %s to match /%s/, got %s' %
(header, header_value, response_value))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/gabbi/handlers/jsonhandler.py new/gabbi-1.35.0/gabbi/handlers/jsonhandler.py
--- old/gabbi-1.32.0/gabbi/handlers/jsonhandler.py 2016-10-28 12:04:01.000000000 +0200
+++ new/gabbi-1.35.0/gabbi/handlers/jsonhandler.py 2017-07-07 15:03:57.000000000 +0200
@@ -14,6 +14,8 @@
import json
+import six
+
from gabbi.handlers import base
from gabbi import json_parser
@@ -41,10 +43,10 @@
@classmethod
def replacer(cls, response_data, match):
- return str(cls.extract_json_path_value(response_data, match))
+ return cls.extract_json_path_value(response_data, match)
@staticmethod
- def dumps(data, pretty=False):
+ def dumps(data, pretty=False, test=None):
if pretty:
return json.dumps(data, indent=2, separators=(',', ': '))
else:
@@ -73,11 +75,8 @@
def action(self, test, path, value=None):
"""Test json_paths against json data."""
- # NOTE: This process has some advantages over other process that
- # might come along because the JSON data has already been
- # processed (to provided for the magic template replacing).
- # Other handlers that want access to data structures will need
- # to do their own processing.
+ # Do template expansion in the left hand side.
+ path = test.replace_template(path)
try:
match = self.extract_json_path_value(
test.response_data, path)
@@ -86,6 +85,13 @@
except ValueError:
raise AssertionError('json path %s cannot match %s' %
(path, test.response_data))
+
+ # read data from disk if the value starts with '<@'
+ if isinstance(value, str) and value.startswith('<@'):
+ info = test.load_data_file(value.replace('<@', '', 1))
+ info = six.text_type(info, 'UTF-8')
+ value = self.loads(info)
+
expected = test.replace_template(value)
# If expected is a string, check to see if it is a regex.
if (hasattr(expected, 'startswith') and expected.startswith('/')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/gabbi/tests/gabbits_intercept/cat.json new/gabbi-1.35.0/gabbi/tests/gabbits_intercept/cat.json
--- old/gabbi-1.32.0/gabbi/tests/gabbits_intercept/cat.json 1970-01-01 01:00:00.000000000 +0100
+++ new/gabbi-1.35.0/gabbi/tests/gabbits_intercept/cat.json 2017-07-07 15:03:57.000000000 +0200
@@ -0,0 +1,4 @@
+{
+ "type": "cat",
+ "sound": "meow"
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/gabbi/tests/gabbits_intercept/coerce.yaml new/gabbi-1.35.0/gabbi/tests/gabbits_intercept/coerce.yaml
--- old/gabbi-1.32.0/gabbi/tests/gabbits_intercept/coerce.yaml 1970-01-01 01:00:00.000000000 +0100
+++ new/gabbi-1.35.0/gabbi/tests/gabbits_intercept/coerce.yaml 2017-04-26 22:25:27.000000000 +0200
@@ -0,0 +1,201 @@
+defaults:
+ request_headers:
+ content-type: application/json
+ verbose: True
+
+tests:
+- name: post data
+ POST: /
+ data:
+ one_string: "1"
+ one_int: 1
+ one_float: 1.1
+ response_json_paths:
+ $.one_string: "1"
+ $.one_int: 1
+ $.one_float: 1.1
+ response_strings:
+ - '"one_string": "1"'
+ - '"one_int": 1'
+ - '"one_float": 1.1'
+
+- name: use data
+ desc: data will be coerced because templates in use
+ POST: /
+ data:
+ one_string: !!str "$RESPONSE['$.one_string']"
+ one_int: $RESPONSE['$.one_int']
+ one_float: $RESPONSE['$.one_float']
+ response_json_paths:
+ $.one_string: "1"
+ $.one_int: 1
+ $.one_float: 1.1
+ response_strings:
+ - '"one_string": "1"'
+ - '"one_int": 1'
+ - '"one_float": 1.1'
+
+- name: from environ
+ POST: /
+ data:
+ one_environ: $ENVIRON['ONE']
+ response_json_paths:
+ $.one_environ: 1
+ response_strings:
+ - '"one_environ": 1'
+
+- name: with list
+ POST: /
+ data:
+ - $ENVIRON['ONE']
+ - 2
+ - "3"
+ response_json_paths:
+ $[0]: 1
+ $[1]: 2
+ $[2]: "3"
+ response_strings:
+ - '[1, 2, "3"]'
+
+- name: object with list
+ desc: without recursive handling no coersion
+ POST: /
+ data:
+ collection:
+ - alpha: $ENVIRON['ONE']
+ beta: max
+ - alpha: 2
+ beta: climb
+ response_json_paths:
+ $.collection[0].alpha: 1
+ $.collection[0].beta: max
+ $.collection[1].alpha: 2
+ $.collection[1].beta: climb
+ response_strings:
+ - '"alpha": 1'
+ - '"beta": "max"'
+
+- name: post extra data
+ POST: /
+ data:
+ a: 1
+ b: 1.0
+ c: '[1,2,3]'
+ d: true
+ e: false
+ f:
+ key: val
+ g: null
+ h:
+ key:
+ less_key: [1, true, null]
+ more_key: 1
+ response_json_paths:
+ a: 1
+ b: 1.0
+ c: '[1,2,3]'
+ d: true
+ e: false
+ f:
+ key: val
+ g: null
+ h:
+ key:
+ less_key: [1, true, null]
+ more_key: 1
+
+- name: check posted data
+ POST: /
+ data:
+ a: $RESPONSE['$.a']
+ b: $RESPONSE['$.b']
+ c: $RESPONSE['$.c']
+ d: $RESPONSE['$.d']
+ e: $RESPONSE['$.e']
+ f: $RESPONSE['$.f']
+ g: $RESPONSE['$.g']
+ h: $RESPONSE['$.h']
+ response_json_paths:
+ a: 1
+ b: 1.0
+ c: '[1,2,3]'
+ d: true
+ e: false
+ f:
+ key: val
+ g: null
+ h:
+ key:
+ less_key: [1, true, null]
+ more_key: 1
+
+- name: Post again and check the results
+ POST: /
+ data:
+ a: $HISTORY['post extra data'].$RESPONSE['$.a']
+ b: $HISTORY['post extra data'].$RESPONSE['$.b']
+ c: $HISTORY['post extra data'].$RESPONSE['$.c']
+ d: $HISTORY['post extra data'].$RESPONSE['$.d']
+ e: $HISTORY['post extra data'].$RESPONSE['$.e']
+ f: $HISTORY['post extra data'].$RESPONSE['$.f']
+ g: $HISTORY['post extra data'].$RESPONSE['$.g']
+ h: $HISTORY['post extra data'].$RESPONSE['$.h']
+ response_json_paths:
+ a: $ENVIRON['ONE']
+ b: $ENVIRON['DECIMAL']
+ c: $ENVIRON['ARRAY_STRING']
+ d: $ENVIRON['TRUE']
+ e: $ENVIRON['FALSE']
+ f:
+ key: $ENVIRON['STRING']
+ g: $ENVIRON['NULL']
+ h:
+ key:
+ less_key:
+ - $ENVIRON['ONE']
+ - $ENVIRON['TRUE']
+ - $ENVIRON['NULL']
+ more_key: $ENVIRON['ONE']
+
+- name: Post again and check the results (reversed)
+ POST: /
+ data:
+ a: $ENVIRON['ONE']
+ b: $ENVIRON['DECIMAL']
+ c: $ENVIRON['ARRAY_STRING']
+ d: $ENVIRON['TRUE']
+ e: $ENVIRON['FALSE']
+ f:
+ key: $ENVIRON['STRING']
+ g: $ENVIRON['NULL']
+ h:
+ key:
+ less_key:
+ - $ENVIRON['ONE']
+ - $ENVIRON['TRUE']
+ - $ENVIRON['NULL']
+ more_key: $ENVIRON['ONE']
+ response_json_paths:
+ a: $HISTORY['check posted data'].$RESPONSE['$.a']
+ b: $HISTORY['check posted data'].$RESPONSE['$.b']
+ c: $HISTORY['check posted data'].$RESPONSE['$.c']
+ d: $HISTORY['check posted data'].$RESPONSE['$.d']
+ e: $HISTORY['check posted data'].$RESPONSE['$.e']
+ f: $HISTORY['check posted data'].$RESPONSE['$.f']
+ g: $HISTORY['check posted data'].$RESPONSE['$.g']
+ h:
+ key:
+ less_key:
+ - $HISTORY['check posted data'].$RESPONSE['$.h.key.less_key[0]']
+ - $HISTORY['check posted data'].$RESPONSE['$.h.key.less_key[1]']
+ - $HISTORY['check posted data'].$RESPONSE['$.h.key.less_key[2]']
+ more_key: $HISTORY['check posted data'].$RESPONSE['$.h.key.more_key']
+
+- name: string internal replace
+ POST: /
+ data:
+ endpoint_resp: /api/0.1/item/$HISTORY['check posted data'].$RESPONSE['$.a']
+ endpoint_var: /api/0.1/item/$ENVIRON['ONE']
+ response_json_paths:
+ endpoint_resp: /api/0.1/item/1
+ endpoint_var: /api/0.1/item/1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/gabbi/tests/gabbits_intercept/data.json new/gabbi-1.35.0/gabbi/tests/gabbits_intercept/data.json
--- old/gabbi-1.32.0/gabbi/tests/gabbits_intercept/data.json 2016-07-13 05:57:28.000000000 +0200
+++ new/gabbi-1.35.0/gabbi/tests/gabbits_intercept/data.json 2017-04-26 14:15:42.000000000 +0200
@@ -1 +1 @@
-{"foo": {"bar": 1}}
+{"foo": {"bár": 1}}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/gabbi/tests/gabbits_intercept/data.yaml new/gabbi-1.35.0/gabbi/tests/gabbits_intercept/data.yaml
--- old/gabbi-1.32.0/gabbi/tests/gabbits_intercept/data.yaml 2016-07-13 05:57:28.000000000 +0200
+++ new/gabbi-1.35.0/gabbi/tests/gabbits_intercept/data.yaml 2017-07-07 15:03:57.000000000 +0200
@@ -34,7 +34,7 @@
content-type: application/json
data: <@data.json
response_json_paths:
- foo.bar: 1
+ foo['bár']: 1
- name: load image file
url: /
@@ -42,3 +42,33 @@
request_headers:
content-type: image/png
data: <@kitten.png
+
+ - name: load encoded text
+ url: /
+ method: POST
+ request_headers:
+ content-type: text/plain
+ data: <@utf8.txt
+
+ - name: json value from disk
+ POST: /
+ request_headers:
+ content-type: application/json
+ data: <@data.json
+ response_json_paths:
+ foo['bár']: 1
+ $: <@data.json
+
+ - name: partial json from disk
+ POST: /
+ request_headers:
+ content-type: application/json
+ data:
+ pets:
+ - type: cat
+ sound: meow
+ - type: dog
+ sound: woof
+ response_json_paths:
+ $.pets: <@pets.json
+ $.pets[0]: <@cat.json
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/gabbi/tests/gabbits_intercept/json-left-side.yaml new/gabbi-1.35.0/gabbi/tests/gabbits_intercept/json-left-side.yaml
--- old/gabbi-1.32.0/gabbi/tests/gabbits_intercept/json-left-side.yaml 1970-01-01 01:00:00.000000000 +0100
+++ new/gabbi-1.35.0/gabbi/tests/gabbits_intercept/json-left-side.yaml 2017-07-07 15:03:57.000000000 +0200
@@ -0,0 +1,37 @@
+defaults:
+ request_headers:
+ content-type: application/json
+ verbose: True
+
+tests:
+- name: left side json one
+ desc: for reuse on the next test
+ POST: /
+ data:
+ alpha: alpha1
+ beta: beta1
+
+- name: expand left side
+ POST: /
+ data:
+ alpha1: alpha
+ beta1: beta
+ response_json_paths:
+ $["$RESPONSE['$.alpha']"]: alpha
+
+- name: expand environ left side
+ POST: /
+ data:
+ alpha1: alpha
+ beta1: beta
+ 1: cow
+ response_json_paths:
+ $.['$ENVIRON['ONE']']: cow
+
+- name: set key and value
+ GET: /jsonator?key=$ENVIRON['ONE']&value=10
+
+- name: check key and value
+ GET: /jsonator?key=$ENVIRON['ONE']&value=10
+ response_json_paths:
+ $.["$ENVIRON['ONE']"]: $RESPONSE['$['1']']
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/gabbi/tests/gabbits_intercept/pets.json new/gabbi-1.35.0/gabbi/tests/gabbits_intercept/pets.json
--- old/gabbi-1.32.0/gabbi/tests/gabbits_intercept/pets.json 1970-01-01 01:00:00.000000000 +0100
+++ new/gabbi-1.35.0/gabbi/tests/gabbits_intercept/pets.json 2017-07-07 15:03:57.000000000 +0200
@@ -0,0 +1,10 @@
+[
+ {
+ "type": "cat",
+ "sound": "meow"
+ },
+ {
+ "type": "dog",
+ "sound": "woof"
+ }
+]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/gabbi/tests/gabbits_intercept/poll.yaml new/gabbi-1.35.0/gabbi/tests/gabbits_intercept/poll.yaml
--- old/gabbi-1.32.0/gabbi/tests/gabbits_intercept/poll.yaml 2016-08-05 20:51:31.000000000 +0200
+++ new/gabbi-1.35.0/gabbi/tests/gabbits_intercept/poll.yaml 2017-04-26 14:15:42.000000000 +0200
@@ -26,7 +26,7 @@
# Confirm that $LOCATION and $RESPONSE behave in poll.
- name: create a thing
- url: /poller?count=2&x=1&y=2
+ url: /poller?count=2&x=1&y=2&z=3.4
method: POST
request_headers:
content-type: application/json
@@ -34,15 +34,16 @@
count: 3
delay: .01
response_json_paths:
- $.x[0]: '1'
- $.y[0]: '2'
+ $.x[0]: "1"
+ $.y[0]: "2"
+ $.z[0]: "3.4"
- name: loop location
url: $LOCATION
verbose: True
poll:
- count: 3
+ count: $RESPONSE['$.z[0]']
delay: .01
response_json_paths:
$.x[0]: $RESPONSE['$.x[0]']
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/gabbi/tests/gabbits_intercept/prefix.yaml new/gabbi-1.35.0/gabbi/tests/gabbits_intercept/prefix.yaml
--- old/gabbi-1.32.0/gabbi/tests/gabbits_intercept/prefix.yaml 1970-01-01 01:00:00.000000000 +0100
+++ new/gabbi-1.35.0/gabbi/tests/gabbits_intercept/prefix.yaml 2017-04-26 14:15:42.000000000 +0200
@@ -0,0 +1,20 @@
+
+tests:
+
+- name: provide a link
+ POST: /
+ request_headers:
+ content-type: application/json
+ data:
+ link: $ENVIRON['GABBI_PREFIX']/barnabas
+ relative: link
+
+- name: get that link
+ GET: $RESPONSE['$.link']
+ response_headers:
+ x-gabbi-url: "///[a-f0-9:-]+$ENVIRON['GABBI_PREFIX']/barnabas/"
+
+- name: get relative link
+ GET: $HISTORY['provide a link'].$RESPONSE['$.relative']
+ response_headers:
+ x-gabbi-url: "///[a-f0-9:-]+$ENVIRON['GABBI_PREFIX']/link/"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/gabbi/tests/gabbits_intercept/utf8.txt new/gabbi-1.35.0/gabbi/tests/gabbits_intercept/utf8.txt
--- old/gabbi-1.32.0/gabbi/tests/gabbits_intercept/utf8.txt 1970-01-01 01:00:00.000000000 +0100
+++ new/gabbi-1.35.0/gabbi/tests/gabbits_intercept/utf8.txt 2017-04-26 14:15:42.000000000 +0200
@@ -0,0 +1,222 @@
+<h1>Unicode Demo</h1>
+
+<p>Taken from http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-demo.txt">http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-demo.txt</a></p>
+
+<pre>
+
+$ENVIRON['HOME']
+
+UTF-8 encoded sample plain-text file
+‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
+
+Markus Kuhn [ˈmaʳkʊs kuːn] http://www.cl.cam.ac.uk/~mgk25/ — 2002-07-25
+
+
+The ASCII compatible UTF-8 encoding used in this plain-text file
+is defined in Unicode, ISO 10646-1, and RFC 2279.
+
+
+Using Unicode/UTF-8, you can write in emails and source code things such as
+
+Mathematics and sciences:
+
+ ∮ E⋅da = Q, n → ∞, ∑ f(i) = ∏ g(i), ⎧⎡⎛┌─────┐⎞⎤⎫
+ ⎪⎢⎜│a²+b³ ⎟⎥⎪
+ ∀x∈ℝ: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β), ⎪⎢⎜│───── ⎟⎥⎪
+ ⎪⎢⎜⎷ c₈ ⎟⎥⎪
+ ℕ ⊆ ℕ₀ ⊂ ℤ ⊂ ℚ ⊂ ℝ ⊂ ℂ, ⎨⎢⎜ ⎟⎥⎬
+ ⎪⎢⎜ ∞ ⎟⎥⎪
+ ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (⟦A⟧ ⇔ ⟪B⟫), ⎪⎢⎜ ⎲ ⎟⎥⎪
+ ⎪⎢⎜ ⎳aⁱ-bⁱ⎟⎥⎪
+ 2H₂ + O₂ ⇌ 2H₂O, R = 4.7 kΩ, ⌀ 200 mm ⎩⎣⎝i=1 ⎠⎦⎭
+
+Linguistics and dictionaries:
+
+ ði ıntəˈnæʃənəl fəˈnɛtık əsoʊsiˈeıʃn
+ Y [ˈʏpsilɔn], Yen [jɛn], Yoga [ˈjoːgɑ]
+
+APL:
+
+ ((V⍳V)=⍳⍴V)/V←,V ⌷←⍳→⍴∆∇⊃‾⍎⍕⌈
+
+Nicer typography in plain text files:
+
+ ╔══════════════════════════════════════════╗
+ ║ ║
+ ║ • ‘single’ and “double” quotes ║
+ ║ ║
+ ║ • Curly apostrophes: “We’ve been here” ║
+ ║ ║
+ ║ • Latin-1 apostrophe and accents: '´` ║
+ ║ ║
+ ║ • ‚deutsche‘ „Anführungszeichen“ ║
+ ║ ║
+ ║ • †, ‡, ‰, •, 3–4, —, −5/+5, ™, … ║
+ ║ ║
+ ║ • ASCII safety test: 1lI|, 0OD, 8B ║
+ ║ ╭─────────╮ ║
+ ║ • the euro symbol: │ 14.95 € │ ║
+ ║ ╰─────────╯ ║
+ ╚══════════════════════════════════════════╝
+
+Combining characters:
+
+ STARGΛ̊TE SG-1, a = v̇ = r̈, a⃑ ⊥ b⃑
+
+Greek (in Polytonic):
+
+ The Greek anthem:
+
+ Σὲ γνωρίζω ἀπὸ τὴν κόψη
+ τοῦ σπαθιοῦ τὴν τρομερή,
+ σὲ γνωρίζω ἀπὸ τὴν ὄψη
+ ποὺ μὲ βία μετράει τὴ γῆ.
+
+ ᾿Απ᾿ τὰ κόκκαλα βγαλμένη
+ τῶν ῾Ελλήνων τὰ ἱερά
+ καὶ σὰν πρῶτα ἀνδρειωμένη
+ χαῖρε, ὦ χαῖρε, ᾿Ελευθεριά!
+
+ From a speech of Demosthenes in the 4th century BC:
+
+ Οὐχὶ ταὐτὰ παρίσταταί μοι γιγνώσκειν, ὦ ἄνδρες ᾿Αθηναῖοι,
+ ὅταν τ᾿ εἰς τὰ πράγματα ἀποβλέψω καὶ ὅταν πρὸς τοὺς
+ λόγους οὓς ἀκούω· τοὺς μὲν γὰρ λόγους περὶ τοῦ
+ τιμωρήσασθαι Φίλιππον ὁρῶ γιγνομένους, τὰ δὲ πράγματ᾿
+ εἰς τοῦτο προήκοντα, ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αὐτοὶ
+ πρότερον κακῶς σκέψασθαι δέον. οὐδέν οὖν ἄλλο μοι δοκοῦσιν
+ οἱ τὰ τοιαῦτα λέγοντες ἢ τὴν ὑπόθεσιν, περὶ ἧς βουλεύεσθαι,
+ οὐχὶ τὴν οὖσαν παριστάντες ὑμῖν ἁμαρτάνειν. ἐγὼ δέ, ὅτι μέν
+ ποτ᾿ ἐξῆν τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον
+ τιμωρήσασθαι, καὶ μάλ᾿ ἀκριβῶς οἶδα· ἐπ᾿ ἐμοῦ γάρ, οὐ πάλαι
+ γέγονεν ταῦτ᾿ ἀμφότερα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν
+ προλαβεῖν ἡμῖν εἶναι τὴν πρώτην, ὅπως τοὺς συμμάχους
+ σώσομεν. ἐὰν γὰρ τοῦτο βεβαίως ὑπάρξῃ, τότε καὶ περὶ τοῦ
+ τίνα τιμωρήσεταί τις καὶ ὃν τρόπον ἐξέσται σκοπεῖν· πρὶν δὲ
+ τὴν ἀρχὴν ὀρθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι περὶ τῆς
+ τελευτῆς ὁντινοῦν ποιεῖσθαι λόγον.
+
+ Δημοσθένους, Γ´ ᾿Ολυνθιακὸς
+
+Georgian:
+
+ From a Unicode conference invitation:
+
+ გთხოვთ ახლავე გაიაროთ რეგისტრაცია Unicode-ის მეათე საერთაშორისო
+ კონფერენციაზე დასასწრებად, რომელიც გაიმართება 10-12 მარტს,
+ ქ. მაინცში, გერმანიაში. კონფერენცია შეჰკრებს ერთად მსოფლიოს
+ ექსპერტებს ისეთ დარგებში როგორიცაა ინტერნეტი და Unicode-ი,
+ ინტერნაციონალიზაცია და ლოკალიზაცია, Unicode-ის გამოყენება
+ ოპერაციულ სისტემებსა, და გამოყენებით პროგრამებში, შრიფტებში,
+ ტექსტების დამუშავებასა და მრავალენოვან კომპიუტერულ სისტემებში.
+
+Russian:
+
+ From a Unicode conference invitation:
+
+ Зарегистрируйтесь сейчас на Десятую Международную Конференцию по
+ Unicode, которая состоится 10-12 марта 1997 года в Майнце в Германии.
+ Конференция соберет широкий круг экспертов по вопросам глобального
+ Интернета и Unicode, локализации и интернационализации, воплощению и
+ применению Unicode в различных операционных системах и программных
+ приложениях, шрифтах, верстке и многоязычных компьютерных системах.
+
+Thai (UCS Level 2):
+
+ Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese
+ classic 'San Gua'):
+
+ [----------------------------|------------------------]
+ ๏ แผ่นดินฮั่นเสื่อมโทรมแสนสังเวช พระปกเกศกองบู๊กู้ขึ้นใหม่
+ สิบสองกษัตริย์ก่อนหน้าแลถัดไป สององค์ไซร้โง่เขลาเบาปัญญา
+ ทรงนับถือขันทีเป็นที่พึ่ง บ้านเมืองจึงวิปริตเป็นนักหนา
+ โฮจิ๋นเรียกทัพทั่วหัวเมืองมา หมายจะฆ่ามดชั่วตัวสำคัญ
+ เหมือนขับไสไล่เสือจากเคหา รับหมาป่าเข้ามาเลยอาสัญ
+ ฝ่ายอ้องอุ้นยุแยกให้แตกกัน ใช้สาวนั้นเป็นชนวนชื่นชวนใจ
+ พลันลิฉุยกุยกีกลับก่อเหตุ ช่างอาเพศจริงหนาฟ้าร้องไห้
+ ต้องรบราฆ่าฟันจนบรรลัย ฤๅหาใครค้ำชูกู้บรรลังก์ ฯ
+
+ (The above is a two-column text. If combining characters are handled
+ correctly, the lines of the second column should be aligned with the
+ | character above.)
+
+Ethiopian:
+
+ Proverbs in the Amharic language:
+
+ ሰማይ አይታረስ ንጉሥ አይከሰስ።
+ ብላ ካለኝ እንደአባቴ በቆመጠኝ።
+ ጌጥ ያለቤቱ ቁምጥና ነው።
+ ደሀ በሕልሙ ቅቤ ባይጠጣ ንጣት በገደለው።
+ የአፍ ወለምታ በቅቤ አይታሽም።
+ አይጥ በበላ ዳዋ ተመታ።
+ ሲተረጉሙ ይደረግሙ።
+ ቀስ በቀስ፥ ዕንቁላል በእግሩ ይሄዳል።
+ ድር ቢያብር አንበሳ ያስር።
+ ሰው እንደቤቱ እንጅ እንደ ጉረቤቱ አይተዳደርም።
+ እግዜር የከፈተውን ጉሮሮ ሳይዘጋው አይድርም።
+ የጎረቤት ሌባ፥ ቢያዩት ይስቅ ባያዩት ያጠልቅ።
+ ሥራ ከመፍታት ልጄን ላፋታት።
+ ዓባይ ማደሪያ የለው፥ ግንድ ይዞ ይዞራል።
+ የእስላም አገሩ መካ የአሞራ አገሩ ዋርካ።
+ ተንጋሎ ቢተፉ ተመልሶ ባፉ።
+ ወዳጅህ ማር ቢሆን ጨርስህ አትላሰው።
+ እግርህን በፍራሽህ ልክ ዘርጋ።
+
+Runes:
+
+ ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛏ ᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ ᚹᛁᚦ ᚦᚪ ᚹᛖᛥᚫ
+
+ (Old English, which transcribed into Latin reads 'He cwaeth that he
+ bude thaem lande northweardum with tha Westsae.' and means 'He said
+ that he lived in the northern land near the Western Sea.')
+
+Braille:
+
+ ⡌⠁⠧⠑ ⠼⠁⠒ ⡍⠜⠇⠑⠹⠰⠎ ⡣⠕⠌
+
+ ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠙⠑⠁⠙⠒ ⠞⠕ ⠃⠑⠛⠔ ⠺⠊⠹⠲ ⡹⠻⠑ ⠊⠎ ⠝⠕ ⠙⠳⠃⠞
+ ⠱⠁⠞⠑⠧⠻ ⠁⠃⠳⠞ ⠹⠁⠞⠲ ⡹⠑ ⠗⠑⠛⠊⠌⠻ ⠕⠋ ⠙⠊⠎ ⠃⠥⠗⠊⠁⠇ ⠺⠁⠎
+ ⠎⠊⠛⠝⠫ ⠃⠹ ⠹⠑ ⠊⠇⠻⠛⠹⠍⠁⠝⠂ ⠹⠑ ⠊⠇⠻⠅⠂ ⠹⠑ ⠥⠝⠙⠻⠞⠁⠅⠻⠂
+ ⠁⠝⠙ ⠹⠑ ⠡⠊⠑⠋ ⠍⠳⠗⠝⠻⠲ ⡎⠊⠗⠕⠕⠛⠑ ⠎⠊⠛⠝⠫ ⠊⠞⠲ ⡁⠝⠙
+ ⡎⠊⠗⠕⠕⠛⠑⠰⠎ ⠝⠁⠍⠑ ⠺⠁⠎ ⠛⠕⠕⠙ ⠥⠏⠕⠝ ⠰⡡⠁⠝⠛⠑⠂ ⠋⠕⠗ ⠁⠝⠹⠹⠔⠛ ⠙⠑
+ ⠡⠕⠎⠑ ⠞⠕ ⠏⠥⠞ ⠙⠊⠎ ⠙⠁⠝⠙ ⠞⠕⠲
+
+ ⡕⠇⠙ ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠁⠎ ⠙⠑⠁⠙ ⠁⠎ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲
+
+ ⡍⠔⠙⠖ ⡊ ⠙⠕⠝⠰⠞ ⠍⠑⠁⠝ ⠞⠕ ⠎⠁⠹ ⠹⠁⠞ ⡊ ⠅⠝⠪⠂ ⠕⠋ ⠍⠹
+ ⠪⠝ ⠅⠝⠪⠇⠫⠛⠑⠂ ⠱⠁⠞ ⠹⠻⠑ ⠊⠎ ⠏⠜⠞⠊⠊⠥⠇⠜⠇⠹ ⠙⠑⠁⠙ ⠁⠃⠳⠞
+ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲ ⡊ ⠍⠊⠣⠞ ⠙⠁⠧⠑ ⠃⠑⠲ ⠔⠊⠇⠔⠫⠂ ⠍⠹⠎⠑⠇⠋⠂ ⠞⠕
+ ⠗⠑⠛⠜⠙ ⠁ ⠊⠕⠋⠋⠔⠤⠝⠁⠊⠇ ⠁⠎ ⠹⠑ ⠙⠑⠁⠙⠑⠌ ⠏⠊⠑⠊⠑ ⠕⠋ ⠊⠗⠕⠝⠍⠕⠝⠛⠻⠹
+ ⠔ ⠹⠑ ⠞⠗⠁⠙⠑⠲ ⡃⠥⠞ ⠹⠑ ⠺⠊⠎⠙⠕⠍ ⠕⠋ ⠳⠗ ⠁⠝⠊⠑⠌⠕⠗⠎
+ ⠊⠎ ⠔ ⠹⠑ ⠎⠊⠍⠊⠇⠑⠆ ⠁⠝⠙ ⠍⠹ ⠥⠝⠙⠁⠇⠇⠪⠫ ⠙⠁⠝⠙⠎
+ ⠩⠁⠇⠇ ⠝⠕⠞ ⠙⠊⠌⠥⠗⠃ ⠊⠞⠂ ⠕⠗ ⠹⠑ ⡊⠳⠝⠞⠗⠹⠰⠎ ⠙⠕⠝⠑ ⠋⠕⠗⠲ ⡹⠳
+ ⠺⠊⠇⠇ ⠹⠻⠑⠋⠕⠗⠑ ⠏⠻⠍⠊⠞ ⠍⠑ ⠞⠕ ⠗⠑⠏⠑⠁⠞⠂ ⠑⠍⠏⠙⠁⠞⠊⠊⠁⠇⠇⠹⠂ ⠹⠁⠞
+ ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠁⠎ ⠙⠑⠁⠙ ⠁⠎ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲
+
+ (The first couple of paragraphs of "A Christmas Carol" by Dickens)
+
+Compact font selection example text:
+
+ ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789
+ abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ
+ –—‘“”„†•…‰™œŠŸž€ ΑΒΓΔΩαβγδω АБВГДабвгд
+ ∀∂∈ℝ∧∪≡∞ ↑↗↨↻⇣ ┐┼╔╘░►☺♀ fi�⑀₂ἠḂӥẄɐː⍎אԱა
+
+Greetings in various languages:
+
+ Hello world, Καλημέρα κόσμε, コンニチハ
+
+Box drawing alignment tests: █
+ ▉
+ ╔══╦══╗ ┌──┬──┐ ╭──┬──╮ ╭──┬──╮ ┏━━┳━━┓ ┎┒┏┑ ╷ ╻ ┏┯┓ ┌┰┐ ▊ ╱╲╱╲╳╳╳
+ ║┌─╨─┐║ │╔═╧═╗│ │╒═╪═╕│ │╓─╁─╖│ ┃┌─╂─┐┃ ┗╃╄┙ ╶┼╴╺╋╸┠┼┨ ┝╋┥ ▋ ╲╱╲╱╳╳╳
+ ║│╲ ╱│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╿ │┃ ┍╅╆┓ ╵ ╹ ┗┷┛ └┸┘ ▌ ╱╲╱╲╳╳╳
+ ╠╡ ╳ ╞╣ ├╢ ╟┤ ├┼─┼─┼┤ ├╫─╂─╫┤ ┣┿╾┼╼┿┫ ┕┛┖┚ ┌┄┄┐ ╎ ┏┅┅┓ ┋ ▍ ╲╱╲╱╳╳╳
+ ║│╱ ╲│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╽ │┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▎
+ ║└─╥─┘║ │╚═╤═╝│ │╘═╪═╛│ │╙─╀─╜│ ┃└─╂─┘┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▏
+ ╚══╩══╝ └──┴──┘ ╰──┴──╯ ╰──┴──╯ ┗━━┻━━┛ ▗▄▖▛▀▜ └╌╌┘ ╎ ┗╍╍┛ ┋ ▁▂▃▄▅▆▇█
+ ▝▀▘▙▄▟
+
+</pre>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/gabbi/tests/simple_wsgi.py new/gabbi-1.35.0/gabbi/tests/simple_wsgi.py
--- old/gabbi-1.32.0/gabbi/tests/simple_wsgi.py 2016-10-28 12:04:01.000000000 +0200
+++ new/gabbi-1.35.0/gabbi/tests/simple_wsgi.py 2017-07-07 15:03:57.000000000 +0200
@@ -107,6 +107,11 @@
# fall through if we've ended the loop
elif path_info == '/cookie':
headers.append(('Set-Cookie', 'session=1234; domain=.example.com'))
+ elif path_info == '/jsonator':
+ json_data = json.dumps({query_data['key'][0]:
+ query_data['value'][0]})
+ start_response('200 OK', [('Content-Type', 'application/json')])
+ return [json_data.encode('utf-8')]
start_response('200 OK', headers)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/gabbi/tests/test_gabbits_pytest.py new/gabbi-1.35.0/gabbi/tests/test_gabbits_pytest.py
--- old/gabbi-1.32.0/gabbi/tests/test_gabbits_pytest.py 2016-11-30 18:47:39.000000000 +0100
+++ new/gabbi-1.35.0/gabbi/tests/test_gabbits_pytest.py 2017-04-26 22:25:27.000000000 +0200
@@ -24,12 +24,13 @@
from gabbi.driver import test_pytest # noqa
from gabbi.tests import simple_wsgi
from gabbi.tests import test_intercept
+from gabbi.tests import util
TESTS_DIR = 'gabbits_intercept'
def pytest_generate_tests(metafunc):
- os.environ['GABBI_TEST_URL'] = 'takingnames'
+ util.set_test_environ()
test_dir = os.path.join(os.path.dirname(__file__), TESTS_DIR)
driver.py_test_generator(
test_dir, intercept=simple_wsgi.SimpleWsgi,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/gabbi/tests/test_handlers.py new/gabbi-1.35.0/gabbi/tests/test_handlers.py
--- old/gabbi-1.32.0/gabbi/tests/test_handlers.py 2016-10-28 12:04:01.000000000 +0200
+++ new/gabbi-1.35.0/gabbi/tests/test_handlers.py 2017-04-26 14:15:42.000000000 +0200
@@ -17,6 +17,7 @@
import unittest
from gabbi import case
+from gabbi.exception import GabbiFormatError
from gabbi.handlers import core
from gabbi.handlers import jsonhandler
from gabbi import suitemaker
@@ -104,6 +105,19 @@
# Check the pprint of the json
self.assertIn(' "location": "house"', msg)
+ def test_response_string_list_type(self):
+ handler = core.StringResponseHandler()
+ self.test.test_data = {
+ 'name': 'omega test',
+ 'response_strings': 'omega'
+ }
+ self.test.output = 'omega\n'
+ with self.assertRaises(GabbiFormatError) as exc:
+ self._assert_handler(handler)
+ self.assertIn('has incorrect type', str(exc))
+ self.assertIn("response_strings in 'omega test'",
+ str(exc))
+
def test_response_json_paths(self):
handler = jsonhandler.JSONHandler()
self.test.content_type = "application/json"
@@ -178,6 +192,19 @@
}
self._assert_handler(handler)
+ def test_response_json_paths_dict_type(self):
+ handler = jsonhandler.JSONHandler()
+ self.test.test_data = {
+ 'name': 'omega test',
+ 'response_json_paths': ['alpha', 'beta']
+ }
+ self.test.output = 'omega\n'
+ with self.assertRaises(GabbiFormatError) as exc:
+ self._assert_handler(handler)
+ self.assertIn('has incorrect type', str(exc))
+ self.assertIn("response_json_paths in 'omega test'",
+ str(exc))
+
def test_response_headers(self):
handler = core.HeadersResponseHandler()
self.test.response = {'content-type': 'text/plain'}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/gabbi/tests/test_intercept.py new/gabbi-1.35.0/gabbi/tests/test_intercept.py
--- old/gabbi-1.32.0/gabbi/tests/test_intercept.py 2017-01-13 16:05:52.000000000 +0100
+++ new/gabbi-1.35.0/gabbi/tests/test_intercept.py 2017-04-26 22:25:27.000000000 +0200
@@ -23,6 +23,7 @@
from gabbi import fixture
from gabbi.handlers import base
from gabbi.tests import simple_wsgi
+from gabbi.tests import util
TESTS_DIR = 'gabbits_intercept'
@@ -64,7 +65,8 @@
def load_tests(loader, tests, pattern):
"""Provide a TestSuite to the discovery process."""
# Set and environment variable for one of the tests.
- os.environ['GABBI_TEST_URL'] = 'takingnames'
+ util.set_test_environ()
+
prefix = os.environ.get('GABBI_PREFIX')
test_dir = os.path.join(os.path.dirname(__file__), TESTS_DIR)
return driver.build_tests(test_dir, loader, host=None,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/gabbi/tests/test_load_data_file.py new/gabbi-1.35.0/gabbi/tests/test_load_data_file.py
--- old/gabbi-1.32.0/gabbi/tests/test_load_data_file.py 2016-11-28 21:19:29.000000000 +0100
+++ new/gabbi-1.35.0/gabbi/tests/test_load_data_file.py 2017-07-07 15:03:57.000000000 +0200
@@ -35,7 +35,7 @@
def _assert_content_read(self, filepath):
self.assertEqual(
- 'dummy content', self.http_case._load_data_file(filepath))
+ 'dummy content', self.http_case.load_data_file(filepath))
def test_load_file(self, m_open):
self.http_case.test_directory = '.'
@@ -52,7 +52,7 @@
filepath = '/top-level.private'
with self.assertRaises(ValueError):
- self.http_case._load_data_file(filepath)
+ self.http_case.load_data_file(filepath)
self.assertFalse(m_open.called)
def test_load_file_in_parent_dir(self, m_open):
@@ -60,7 +60,7 @@
filepath = '../file-in-parent-dir.txt'
with self.assertRaises(ValueError):
- self.http_case._load_data_file(filepath)
+ self.http_case.load_data_file(filepath)
self.assertFalse(m_open.called)
def test_load_file_within_test_directory(self, m_open):
@@ -73,5 +73,5 @@
self.http_case.test_directory = '/a/b/c'
filepath = '../../b/E/file-in-test-dir.txt'
with self.assertRaises(ValueError):
- self.http_case._load_data_file(filepath)
+ self.http_case.load_data_file(filepath)
self.assertFalse(m_open.called)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/gabbi/tests/test_replacers.py new/gabbi-1.35.0/gabbi/tests/test_replacers.py
--- old/gabbi-1.32.0/gabbi/tests/test_replacers.py 2016-07-13 05:57:28.000000000 +0200
+++ new/gabbi-1.35.0/gabbi/tests/test_replacers.py 2017-04-26 22:25:27.000000000 +0200
@@ -37,8 +37,17 @@
os.environ['moo'] = "False"
self.assertEqual(False, http_case._environ_replace(message))
+ os.environ['moo'] = "true"
+ self.assertEqual(True, http_case._environ_replace(message))
+
+ os.environ['moo'] = "faLse"
+ self.assertEqual(False, http_case._environ_replace(message))
+
+ os.environ['moo'] = "null"
+ self.assertEqual(None, http_case._environ_replace(message))
+
os.environ['moo'] = "1"
- self.assertEqual("1", http_case._environ_replace(message))
+ self.assertEqual(1, http_case._environ_replace(message))
os.environ['moo'] = "cow"
self.assertEqual("cow", http_case._environ_replace(message))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/gabbi/tests/util.py new/gabbi-1.35.0/gabbi/tests/util.py
--- old/gabbi-1.32.0/gabbi/tests/util.py 1970-01-01 01:00:00.000000000 +0100
+++ new/gabbi-1.35.0/gabbi/tests/util.py 2017-04-26 22:25:27.000000000 +0200
@@ -0,0 +1,29 @@
+#
+# 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.
+"""Utility methods shared by some tests."""
+
+import os
+
+
+def set_test_environ():
+ """Set some environment variables used in tests."""
+ os.environ['GABBI_TEST_URL'] = 'takingnames'
+
+ # Setup environment variables for `coerce.yaml`
+ os.environ['ONE'] = '1'
+ os.environ['DECIMAL'] = '1.0'
+ os.environ['ARRAY_STRING'] = '[1,2,3]'
+ os.environ['TRUE'] = 'true'
+ os.environ['FALSE'] = 'false'
+ os.environ['STRING'] = 'val'
+ os.environ['NULL'] = 'null'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/gabbi/utils.py new/gabbi-1.35.0/gabbi/utils.py
--- old/gabbi-1.32.0/gabbi/utils.py 2017-01-06 23:00:06.000000000 +0100
+++ new/gabbi-1.35.0/gabbi/utils.py 2017-04-26 14:15:42.000000000 +0200
@@ -52,9 +52,20 @@
query_string = parsed_url.query
path = parsed_url.path
- # Guard against a prefix of None
- if prefix:
- path = '%s%s' % (prefix, path)
+ # Guard against a prefix of None or the url already having the
+ # prefix. Without the startswith check, the tests in prefix.yaml
+ # fail. This is a pragmatic fix which does this for any URL in a
+ # test request that does not have a scheme and does not
+ # distinguish between URLs in a gabbi test file and those
+ # generated by the server. Idealy we would not mutate nor need
+ # to check URLs returned from the server. Doing that, however,
+ # would require more complex data handling than we have now and
+ # this covers most common cases and will be okay until someone
+ # reports a bug.
+ if prefix and not path.startswith(prefix):
+ prefix = prefix.rstrip('/')
+ path = path.lstrip('/')
+ path = '%s/%s' % (prefix, path)
return urlparse.urlunsplit((scheme, netloc, path, query_string, ''))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/gabbi.egg-info/PKG-INFO new/gabbi-1.35.0/gabbi.egg-info/PKG-INFO
--- old/gabbi-1.32.0/gabbi.egg-info/PKG-INFO 2017-02-06 14:44:48.000000000 +0100
+++ new/gabbi-1.35.0/gabbi.egg-info/PKG-INFO 2017-07-07 15:36:26.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: gabbi
-Version: 1.32.0
+Version: 1.35.0
Summary: Declarative HTTP testing library
Home-page: https://github.com/cdent/gabbi
Author: Chris Dent
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/gabbi.egg-info/SOURCES.txt new/gabbi-1.35.0/gabbi.egg-info/SOURCES.txt
--- old/gabbi-1.32.0/gabbi.egg-info/SOURCES.txt 2017-02-06 14:44:48.000000000 +0100
+++ new/gabbi-1.35.0/gabbi.egg-info/SOURCES.txt 2017-07-07 15:36:27.000000000 +0200
@@ -79,8 +79,11 @@
gabbi/tests/test_suitemaker.py
gabbi/tests/test_syntax_warning.py
gabbi/tests/test_utils.py
+gabbi/tests/util.py
gabbi/tests/gabbits_inner/inner.yaml
gabbi/tests/gabbits_intercept/backref.yaml
+gabbi/tests/gabbits_intercept/cat.json
+gabbi/tests/gabbits_intercept/coerce.yaml
gabbi/tests/gabbits_intercept/contenttype.yaml
gabbi/tests/gabbits_intercept/cookie.yaml
gabbi/tests/gabbits_intercept/data.json
@@ -90,15 +93,19 @@
gabbi/tests/gabbits_intercept/forbiddenheaders.yaml
gabbi/tests/gabbits_intercept/horse
gabbi/tests/gabbits_intercept/json-extensions.yaml
+gabbi/tests/gabbits_intercept/json-left-side.yaml
gabbi/tests/gabbits_intercept/jsonbody.yaml
gabbi/tests/gabbits_intercept/kitten.png
gabbi/tests/gabbits_intercept/last-url.yaml
gabbi/tests/gabbits_intercept/method-shortcut.yaml
+gabbi/tests/gabbits_intercept/pets.json
gabbi/tests/gabbits_intercept/poll.yaml
+gabbi/tests/gabbits_intercept/prefix.yaml
gabbi/tests/gabbits_intercept/queryparams.yaml
gabbi/tests/gabbits_intercept/regex.yaml
gabbi/tests/gabbits_intercept/self.yaml
gabbi/tests/gabbits_intercept/skipall.yaml
+gabbi/tests/gabbits_intercept/utf8.txt
gabbi/tests/gabbits_live/google.yaml
gabbi/tests/gabbits_runner/failure.yaml
gabbi/tests/gabbits_runner/success.yaml
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/gabbi.egg-info/pbr.json new/gabbi-1.35.0/gabbi.egg-info/pbr.json
--- old/gabbi-1.32.0/gabbi.egg-info/pbr.json 2017-02-06 14:44:48.000000000 +0100
+++ new/gabbi-1.35.0/gabbi.egg-info/pbr.json 2017-07-07 15:36:26.000000000 +0200
@@ -1 +1 @@
-{"is_release": true, "git_version": "d8fe9f8"}
\ No newline at end of file
+{"is_release": true, "git_version": "64f274d"}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/setup.cfg new/gabbi-1.35.0/setup.cfg
--- old/gabbi-1.32.0/setup.cfg 2017-02-06 14:44:48.000000000 +0100
+++ new/gabbi-1.35.0/setup.cfg 2017-07-07 15:36:27.000000000 +0200
@@ -36,8 +36,10 @@
console_scripts =
gabbi-run = gabbi.runner:run
+[bdist_wheel]
+universal = 1
+
[egg_info]
tag_build =
tag_date = 0
-tag_svn_revision = 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gabbi-1.32.0/tox.ini new/gabbi-1.35.0/tox.ini
--- old/gabbi-1.32.0/tox.ini 2017-01-02 18:00:16.000000000 +0100
+++ new/gabbi-1.35.0/tox.ini 2017-06-28 16:57:09.000000000 +0200
@@ -6,9 +6,13 @@
[testenv]
deps = -r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt
+whitelist_externals = rm
install_command = pip install -U {opts} {packages}
-commands = python setup.py testr --testr-args="{posargs}"
-passenv = GABBI_*
+commands =
+ rm -f .testrepository/times.dbm
+ python setup.py testr --testr-args="{posargs}"
+setenv = GABBI_PREFIX=
+passenv = GABBI_* HOME
[testenv:venv]
deps = -r{toxinidir}/requirements.txt
@@ -52,7 +56,7 @@
[testenv:gnocchi]
basepython = python2.7
-deps = -egit+http://git.openstack.org/openstack/gnocchi#egg=gnocchi
+deps = -egit+https://github.com/gnocchixyz/gnocchi#egg=gnocchi
tox
changedir = {envdir}/src/gnocchi
commands = tox -e py27-gabbi --notest # ensure a virtualenv is built