Hello community,

here is the log from the commit of package python-testfixtures for 
openSUSE:Factory checked in at 2019-03-29 20:42:35
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-testfixtures (Old)
 and      /work/SRC/openSUSE:Factory/.python-testfixtures.new.25356 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-testfixtures"

Fri Mar 29 20:42:35 2019 rev:6 rq:689260 version:6.6.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-testfixtures/python-testfixtures.changes  
2019-02-27 17:27:57.935346241 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-testfixtures.new.25356/python-testfixtures.changes
       2019-03-29 20:42:36.950678340 +0100
@@ -1,0 +2,26 @@
+Tue Mar 26 22:09:06 UTC 2019 - John Vandenberg <[email protected]>
+
+- Add docs/*.txt to %docs
+- Remove tests from the runtime package
+- Update to v6.6.2
+  * popen.MockPopen.set_command is now symmetrical with
+    popen.MockPopen process instantiation in that both can be called with
+    either lists or strings, in the same way as subprocess.Popen.
+- from 6.6.1
+  * Fixed bugs where using 'not_there' to ensure a key or attribute
+    was not there but would be set by a test would result in the test
+    attribute or key being left behind.
+  * Add support for comparing functools.partial instances and fix
+    comparison of functions and other objects where vars() returns
+    an empty dict.
+- from v6.6.0
+  * Add the ability to ignore attributes of particular object types when
+    using `compare`.
+- from v6.5.2
+  * Fix bug when `compare` was used with objects that had __slots__ inherited
+    from a base class but where their __slots__ was an empty sequence.
+- from v6.5.1
+  * Fix bug when `compare` was used with objects that had __slots__ inherited
+    from a base class.
+
+-------------------------------------------------------------------

Old:
----
  testfixtures-6.5.0.tar.gz

New:
----
  testfixtures-6.6.2.tar.gz

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

Other differences:
------------------
++++++ python-testfixtures.spec ++++++
--- /var/tmp/diff_new_pack.v91Bb3/_old  2019-03-29 20:42:37.942678309 +0100
+++ /var/tmp/diff_new_pack.v91Bb3/_new  2019-03-29 20:42:37.946678309 +0100
@@ -18,7 +18,7 @@
 
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-testfixtures
-Version:        6.5.0
+Version:        6.6.2
 Release:        0
 Summary:        A collection of helpers and mock objects for unit tests and 
doc tests
 License:        MIT
@@ -56,13 +56,14 @@
 
 %prep
 %setup -q -n testfixtures-%{version}
-cp docs/changes.txt changes.txt
+chmod a-x docs/*.txt
 
 %build
 %python_build
 
 %install
 %python_install
+%python_expand rm -r %{buildroot}%{$python_sitelib}/testfixtures/tests
 %python_expand %fdupes %{buildroot}%{$python_sitelib}
 
 %check
@@ -71,7 +72,7 @@
 
 %files %{python_files}
 %license LICENSE.txt
-%doc README.rst changes.txt
+%doc README.rst docs/*.txt
 %{python_sitelib}/*
 
 %changelog

++++++ testfixtures-6.5.0.tar.gz -> testfixtures-6.6.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/testfixtures-6.5.0/.carthorse.yml 
new/testfixtures-6.6.2/.carthorse.yml
--- old/testfixtures-6.5.0/.carthorse.yml       1970-01-01 01:00:00.000000000 
+0100
+++ new/testfixtures-6.6.2/.carthorse.yml       2019-03-22 08:47:24.000000000 
+0100
@@ -0,0 +1,10 @@
+carthorse:
+  version-from: setup.py
+  tag-format: "{version}"
+  when:
+    - version-not-tagged
+  actions:
+    - run: "sudo pip install -e .[build]"
+    - run: "sudo python setup.py sdist bdist_wheel"
+    - run: "twine upload -u chrisw -p $PYPI_PASS dist/*"
+    - create-tag
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/testfixtures-6.5.0/.circleci/config.yml 
new/testfixtures-6.6.2/.circleci/config.yml
--- old/testfixtures-6.5.0/.circleci/config.yml 1970-01-01 01:00:00.000000000 
+0100
+++ new/testfixtures-6.6.2/.circleci/config.yml 2019-03-22 08:47:24.000000000 
+0100
@@ -0,0 +1,77 @@
+version: 2.1
+
+orbs:
+  python: cjw296/[email protected]
+
+common: &common
+  jobs:
+    - python/pip-run-tests:
+        name: python27
+        image: circleci/python:2.7
+    - python/pip-run-tests:
+        name: python36
+        image: circleci/python:3.6
+    - python/pip-run-tests:
+        name: python37
+        image: circleci/python:3.7
+    - python/pip-run-tests:
+        name: python36-mock-backport
+        image: circleci/python:3.6
+        extra_packages: "mock"
+    - python/pip-run-tests:
+        name: python37-mock-backport
+        image: circleci/python:3.7
+        extra_packages: "mock"
+    - python/pip-run-tests:
+        name: python27-django-1-9
+        image: circleci/python:2.7
+        extra_packages: "'django<1.10'"
+    - python/pip-run-tests:
+        name: python36-django-1-11
+        image: circleci/python:3.6
+        extra_packages: "'django<1.12'"
+    - python/pip-run-tests:
+        name: python37-django-1-11
+        image: circleci/python:3.7
+        extra_packages: "'django<1.12'"
+    - python/pip-run-tests:
+        name: python36-django-latest
+        image: circleci/python:3.6
+    - python/pip-run-tests:
+        name: python37-django-latest
+        image: circleci/python:3.7
+
+    - python/coverage:
+        name: coverage
+        requires:
+          - python27
+          - python36
+          - python37
+          - python36-mock-backport
+          - python37-mock-backport
+          - python27-django-1-9
+          - python36-django-1-11
+          - python37-django-1-11
+          - python36-django-latest
+          - python37-django-latest
+
+    - python/release:
+        name: release
+        config: .carthorse.yml
+        requires:
+          - coverage
+        filters:
+          branches:
+            only: master
+
+workflows:
+  push:
+    <<: *common
+  periodic:
+    <<: *common
+    triggers:
+      - schedule:
+          cron: "0 1 * * *"
+          filters:
+            branches:
+              only: master
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/testfixtures-6.5.0/.readthedocs.yml 
new/testfixtures-6.6.2/.readthedocs.yml
--- old/testfixtures-6.5.0/.readthedocs.yml     1970-01-01 01:00:00.000000000 
+0100
+++ new/testfixtures-6.6.2/.readthedocs.yml     2019-03-22 08:47:24.000000000 
+0100
@@ -0,0 +1,8 @@
+version: 2
+python:
+  version: 3.7
+  install:
+    - method: pip
+      path: .
+      extra_requirements:
+        - build
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/testfixtures-6.5.0/.travis.yml 
new/testfixtures-6.6.2/.travis.yml
--- old/testfixtures-6.5.0/.travis.yml  2018-12-19 13:08:08.000000000 +0100
+++ new/testfixtures-6.6.2/.travis.yml  1970-01-01 01:00:00.000000000 +0100
@@ -1,90 +0,0 @@
-group: travis_latest
-dist: xenial
-sudo: true
-cache:
-  directories:
-    - $HOME/.cache/pip
-
-language: python
-
-env:
-  global:
-    # travis encrypt COVERALLS_REPO_TOKEN=...
-    secure: 
"UOGwoOV0DuItLsE4yDnnm+UnYbmNUVJ+vU+ePEN17kRkFZyF9GYg+ZXr0uCAAdMC3okVaj6QrCk3OEDlUN8YKJzBIfn3pC3DB9CRneOWLwh+/D+iE6dtjBz+2MWthPFs3YLWlJYmF2TUrcj7ZI+DBAAbnm4JftX/uJi/ndht7Lo="
-  matrix:
-  - DJANGO_VERSION=latest
-  - DJANGO_VERSION=1.11
-  - DJANGO_VERSION=1.9
-  - MOCK_BACKPORT=true
-
-python:
-  - "2.7"
-  - "3.6"
-  - "3.7"
-
-matrix:
-
-  exclude:
-  - env: DJANGO_VERSION=latest
-    python: "2.7"
-  - env: MOCK_BACKPORT=true
-    python: "2.7"
-
-# command to install dependencies
-install: 
-# remove crap from Travis image:
-- "pip uninstall -y mock nose"
-# make sure we have the latest and greated:
-- "pip install --upgrade pip setuptools"
-# install the right versions of dependencies:
-- "pip install -Ue .[test]"
-- sh -c "if [ $DJANGO_VERSION = '1.11' ]; then pip install -U 'django<1.12'; 
fi"
-- sh -c "if [ $DJANGO_VERSION = '1.9' ]; then pip install -U 'django<1.10'; fi"
-- sh -c "if [ ${MOCK_BACKPORT:-'false'} = 'true' ]; then pip install -U 
'mock'; fi"
-# show what we have:
-- "pip freeze"
-
-# command to run tests, e.g. python setup.py test
-script: coverage run -m pytest
-
-after_success:
-  - coverage combine
-  - "COVERALLS_PARALLEL=true coveralls"
-
-# tell coveralls so we can ge a post back for PRs
-notifications:
-  webhooks: https://coveralls.io/webhook
-
-jobs:
-  include:
-
-    - stage: coverage
-      if: type != pull_request
-      python: 3.6
-      env: DJANGO_VERSION=latest
-      after_success: skip
-
-      install: "pip install -U coveralls-check"
-      script: "coveralls-check $TRAVIS_COMMIT --parallel-build-number 
$TRAVIS_BUILD_NUMBER --repo-token $COVERALLS_REPO_TOKEN"
-
-    - stage: release
-      if: tag IS present
-      python: 3.6
-      env: DJANGO_VERSION=latest
-      script: skip
-      # work around https://github.com/travis-ci/travis-ci/issues/8337:
-      after_success: true
-
-      install:
-      - "pip install --upgrade pip setuptools"
-      - "pip install -Ue .[build]"
-      deploy:
-        provider: pypi
-        user: chrisw
-        password:
-          secure: 
QrmUWPegJzGIYGI8XGY7ztjHTbpMgVDLNV6f9fjjAoo8efOubJh/BASjWD3ESPlIo1j5tGCcSRP2MN1+30zBxq7a7oiCnthISx42DP6Ih+wLHFCu7uBm12AH96hIOQUAtQotNSwB9dJAJIKKom7xkrV/nStjbcqC7hosTZlTy6o=
-        on:
-          tags: true
-          repo: Simplistix/testfixtures
-        skip_cleanup: true
-        distributions: "sdist bdist_wheel"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/testfixtures-6.5.0/PKG-INFO 
new/testfixtures-6.6.2/PKG-INFO
--- old/testfixtures-6.5.0/PKG-INFO     2019-01-28 23:53:02.000000000 +0100
+++ new/testfixtures-6.6.2/PKG-INFO     2019-03-22 08:47:36.000000000 +0100
@@ -1,12 +1,11 @@
-Metadata-Version: 1.1
+Metadata-Version: 2.1
 Name: testfixtures
-Version: 6.5.0
+Version: 6.6.2
 Summary: A collection of helpers and mock objects for unit tests and doc tests.
 Home-page: https://github.com/Simplistix/testfixtures
 Author: Chris Withers
 Author-email: [email protected]
 License: MIT
-Description-Content-Type: UNKNOWN
 Description: ============
         TestFixtures
         ============
@@ -76,3 +75,5 @@
 Classifier: Programming Language :: Python :: 3
 Classifier: Programming Language :: Python :: 3.6
 Classifier: Programming Language :: Python :: 3.7
+Provides-Extra: test
+Provides-Extra: build
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/testfixtures-6.5.0/README.rst 
new/testfixtures-6.6.2/README.rst
--- old/testfixtures-6.5.0/README.rst   2017-09-01 23:33:17.000000000 +0200
+++ new/testfixtures-6.6.2/README.rst   2019-03-22 08:47:24.000000000 +0100
@@ -1,18 +1,15 @@
-|Travis|_ |Coveralls|_ |Docs|_
+|CircleCI|_ |Docs|_
 
-.. |Travis| image:: 
https://api.travis-ci.org/Simplistix/testfixtures.svg?branch=master
-.. _Travis: https://travis-ci.org/Simplistix/testfixtures
-
-.. |Coveralls| image:: 
https://coveralls.io/repos/Simplistix/testfixtures/badge.svg?branch=master
-.. _Coveralls: https://coveralls.io/r/Simplistix/testfixtures?branch=master
+.. |CircleCI| image:: 
https://circleci.com/gh/Simplistix/testfixtures/tree/master.svg?style=shield
+.. _CircleCI: https://circleci.com/gh/Simplistix/testfixtures/tree/master
 
 .. |Docs| image:: 
https://readthedocs.org/projects/testfixtures/badge/?version=latest
 .. _Docs: http://testfixtures.readthedocs.org/en/latest/
 
 
-TestFixtures
+Testfixtures
 ============
 
-TestFixtures is a collection of helpers and mock objects that are useful when
-writing unit tests or doc tests.
+Testfixtures is a collection of helpers and mock objects that are useful when
+writing automated tests in Python.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/testfixtures-6.5.0/docs/api.txt 
new/testfixtures-6.6.2/docs/api.txt
--- old/testfixtures-6.5.0/docs/api.txt 2019-01-28 23:20:16.000000000 +0100
+++ new/testfixtures-6.6.2/docs/api.txt 2019-03-22 08:47:24.000000000 +0100
@@ -48,6 +48,10 @@
 
 .. autofunction:: testfixtures.comparison.compare_simple
 
+.. autofunction:: testfixtures.comparison.compare_object
+
+.. autofunction:: testfixtures.comparison.compare_exception
+
 .. autofunction:: testfixtures.comparison.compare_with_type
 
 .. autofunction:: testfixtures.comparison.compare_sequence
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/testfixtures-6.5.0/docs/changes.txt 
new/testfixtures-6.6.2/docs/changes.txt
--- old/testfixtures-6.5.0/docs/changes.txt     2019-01-28 23:25:22.000000000 
+0100
+++ new/testfixtures-6.6.2/docs/changes.txt     2019-03-22 08:47:24.000000000 
+0100
@@ -3,6 +3,40 @@
 
 .. currentmodule:: testfixtures
 
+6.6.2 (22 Mar 2019)
+-------------------
+
+- :meth:`popen.MockPopen.set_command` is now symmetrical with
+  :class:`popen.MockPopen` process instantiation in that both can be called 
with
+  either lists or strings, in the same way as :class:`subprocess.Popen`.
+
+6.6.1 (13 Mar 2019)
+-------------------
+
+- Fixed bugs where using :attr:`not_there` to ensure a key or attribute was 
not there
+  but would be set by a test would result in the test attribute or key being 
left behind.
+
+- Add support for comparing :func:`~functools.partial` instances and fix 
comparison of
+  functions and other objects where ``vars()`` returns an empty :class:`dict`.
+
+6.6.0 (22 Feb 2019)
+-------------------
+
+- Add the ability to ignore attributes of particular object types when using
+  :func:`compare`.
+
+6.5.2 (18 Feb 2019)
+-------------------
+
+- Fix bug when :func:`compare` was used with objects that had ``__slots__`` 
inherited from a
+  base class but where their ``__slots__`` was an empty sequence.
+
+6.5.1 (18 Feb 2019)
+-------------------
+
+- Fix bug when :func:`compare` was used with objects that had ``__slots__`` 
inherited from a
+  base class.
+
 6.5.0 (28 Jan 2019)
 -------------------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/testfixtures-6.5.0/docs/conf.py 
new/testfixtures-6.6.2/docs/conf.py
--- old/testfixtures-6.5.0/docs/conf.py 2017-09-01 23:33:17.000000000 +0200
+++ new/testfixtures-6.6.2/docs/conf.py 2019-03-22 08:47:24.000000000 +0100
@@ -1,12 +1,11 @@
 # -*- coding: utf-8 -*-
 import datetime
 import os
-import pkginfo
-import sys
 import time
 
+import pkg_resources
+
 on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
-pkg_info = pkginfo.Develop(os.path.join(os.path.dirname(__file__), '..'))
 build_date = 
datetime.datetime.utcfromtimestamp(int(os.environ.get('SOURCE_DATE_EPOCH', 
time.time())))
 
 extensions = [
@@ -23,9 +22,9 @@
 # General
 source_suffix = '.txt'
 master_doc = 'index'
-project = pkg_info.name
+project = 'testfixtures'
 copyright = '2008-2015 Simplistix Ltd, 2016-%s Chris Withers' % build_date.year
-version = release = pkg_info.version
+version = release = pkg_resources.get_distribution(project).version
 exclude_trees = ['_build']
 exclude_patterns = ['description.txt']
 pygments_style = 'sphinx'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/testfixtures-6.5.0/docs/development.txt 
new/testfixtures-6.6.2/docs/development.txt
--- old/testfixtures-6.5.0/docs/development.txt 2017-09-01 23:33:17.000000000 
+0200
+++ new/testfixtures-6.6.2/docs/development.txt 2019-03-22 08:47:24.000000000 
+0100
@@ -58,10 +58,6 @@
 Making a release
 ----------------
 
-To make a release, just update ``versions.txt``, update the change log, tag it
+To make a release, just update ``versions.txt``, update the change log
 and push to https://github.com/Simplistix/testfixtures
-and Travis CI should take care of the rest.
-
-Once Travis CI is done, make sure to go to
-https://readthedocs.org/projects/testfixtures/versions/
-and make sure the new release is marked as an Active Version.
+and Carthorse should take care of the rest.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/testfixtures-6.5.0/requirements.txt 
new/testfixtures-6.6.2/requirements.txt
--- old/testfixtures-6.5.0/requirements.txt     2015-11-15 00:44:35.000000000 
+0100
+++ new/testfixtures-6.6.2/requirements.txt     1970-01-01 01:00:00.000000000 
+0100
@@ -1 +0,0 @@
--e .[build]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/testfixtures-6.5.0/setup.py 
new/testfixtures-6.6.2/setup.py
--- old/testfixtures-6.5.0/setup.py     2019-01-28 18:20:45.000000000 +0100
+++ new/testfixtures-6.6.2/setup.py     2019-03-22 08:47:24.000000000 +0100
@@ -35,15 +35,14 @@
     include_package_data=True,
     extras_require=dict(
         test=['pytest>=3.6',
+              'pytest-cov',
+              'pytest-django',
               'mock;python_version<"3"',
               'sybil',
-              'coverage',
-              'coveralls',
               'zope.component',
               'django<2;python_version<"3"',
               'django;python_version>="3"',
-              'pytest-django',
               'twisted'],
-        build=['sphinx', 'pkginfo', 'setuptools-git', 'wheel', 'twine']
+        build=['sphinx', 'setuptools-git', 'wheel', 'twine']
     )
 )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/testfixtures-6.5.0/testfixtures/comparison.py 
new/testfixtures-6.6.2/testfixtures/comparison.py
--- old/testfixtures-6.5.0/testfixtures/comparison.py   2019-01-28 
18:16:09.000000000 +0100
+++ new/testfixtures-6.6.2/testfixtures/comparison.py   2019-03-22 
08:47:24.000000000 +0100
@@ -1,5 +1,6 @@
 from collections import Iterable
 from difflib import unified_diff
+from functools import partial
 from pprint import pformat
 from re import compile, MULTILINE
 from types import GeneratorType
@@ -19,9 +20,12 @@
         return context.label('x', repr(x)) + ' != ' + context.label('y', 
repr(y))
 
 
-def _extract_attrs(obj):
-    slots = getattr(obj, '__slots__', None)
-    if slots:
+def _extract_attrs(obj, ignore=None):
+    has_slots = getattr(obj, '__slots__', not_there) is not not_there
+    if has_slots:
+        slots = set()
+        for cls in type(obj).__mro__:
+            slots.update(getattr(cls, '__slots__', ()))
         attrs = {}
         for n in slots:
             value = getattr(obj, n, not_there)
@@ -35,18 +39,30 @@
         else:
             if isinstance(obj, BaseException):
                 attrs['args'] = obj.args
+    if ignore is not None:
+        if isinstance(ignore, dict):
+            ignore = ignore.get(type(obj), ())
+        for attr in ignore:
+            attrs.pop(attr, None)
     return attrs
 
 
 def compare_object(x, y, context):
     """
     Compare the two supplied objects based on their type and attributes.
+
+    :param ignore_attributes:
+
+       Either a sequence of strings containing attribute names to be ignored
+       when comparing or a mapping of type to sequence of strings containing
+       attribute names to be ignored when comparing that type.
     """
+    ignore_attributes = context.get_option('ignore_attributes', ())
     if type(x) is not type(y) or isinstance(x, ClassType):
         return compare_simple(x, y, context)
-    x_attrs = _extract_attrs(x)
-    y_attrs = _extract_attrs(y)
-    if x_attrs is None or y_attrs is None:
+    x_attrs = _extract_attrs(x, ignore_attributes)
+    y_attrs = _extract_attrs(y, ignore_attributes)
+    if x_attrs is None or y_attrs is None or not (x_attrs and y_attrs):
         return compare_simple(x, y, context)
     if x_attrs != y_attrs:
         return _compare_mapping(x_attrs, y_attrs, context, x,
@@ -321,6 +337,14 @@
     return compare_text(repr(x), repr(y), context)
 
 
+def compare_partial(x, y, context):
+    x_attrs = dict(func=x.func, args=x.args, keywords=x.keywords)
+    y_attrs = dict(func=y.func, args=y.args, keywords=y.keywords)
+    if x_attrs != y_attrs:
+        return _compare_mapping(x_attrs, y_attrs, context, x,
+                                'attributes ', '.%s')
+
+
 def _short_repr(obj):
     repr_ = repr(obj)
     if len(repr_) > 30:
@@ -341,6 +365,7 @@
     mock_call.__class__: compare_call,
     unittest_mock_call.__class__: compare_call,
     BaseException: compare_exception,
+    partial: compare_partial,
     }
 
 if PY3:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/testfixtures-6.5.0/testfixtures/components.py 
new/testfixtures-6.6.2/testfixtures/components.py
--- old/testfixtures-6.5.0/testfixtures/components.py   2018-06-16 
18:29:16.000000000 +0200
+++ new/testfixtures-6.6.2/testfixtures/components.py   2019-03-22 
08:47:24.000000000 +0100
@@ -2,7 +2,7 @@
 import warnings
 
 from zope.component import getSiteManager
-from zope.component.registry import Components
+from zope.interface.registry import Components
 
 
 class TestComponents:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/testfixtures-6.5.0/testfixtures/logcapture.py 
new/testfixtures-6.6.2/testfixtures/logcapture.py
--- old/testfixtures-6.5.0/testfixtures/logcapture.py   2018-06-16 
18:29:16.000000000 +0200
+++ new/testfixtures-6.6.2/testfixtures/logcapture.py   2019-03-22 
08:47:24.000000000 +0100
@@ -111,7 +111,7 @@
         framework for the named loggers.
 
         This will re-instate any existing handlers for those loggers
-        that were removed during installation and retore their level
+        that were removed during installation and restore their level
         that prior to installation.
         """
         if self in self.instances:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/testfixtures-6.5.0/testfixtures/popen.py 
new/testfixtures-6.6.2/testfixtures/popen.py
--- old/testfixtures-6.5.0/testfixtures/popen.py        2019-01-09 
09:16:37.000000000 +0100
+++ new/testfixtures-6.6.2/testfixtures/popen.py        2019-03-22 
08:47:24.000000000 +0100
@@ -1,3 +1,4 @@
+import pipes
 from functools import wraps, partial
 from itertools import chain
 from subprocess import STDOUT, PIPE
@@ -8,6 +9,12 @@
 from .mock import Mock, call
 
 
+def shell_join(command):
+    if not isinstance(command, basestring):
+        command = " ".join(pipes.quote(part) for part in command)
+    return command
+
+
 class PopenBehaviour(object):
     """
     An object representing the behaviour of a :class:`MockPopen` when
@@ -65,10 +72,7 @@
         self.calls = []
         self.all_calls = mock_class.all_calls
 
-        if isinstance(args, basestring):
-            cmd = args
-        else:
-            cmd = ' '.join(args)
+        cmd = shell_join(args)
 
         behaviour = mock_class.commands.get(cmd, mock_class.default_behaviour)
         if behaviour is None:
@@ -223,7 +227,7 @@
 
         :param command: A string representing the command to be simulated.
         """
-        self.commands[command] = self._resolve_behaviour(
+        self.commands[shell_join(command)] = self._resolve_behaviour(
             stdout, stderr, returncode, pid, poll_count, behaviour
         )
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/testfixtures-6.5.0/testfixtures/replace.py 
new/testfixtures-6.6.2/testfixtures/replace.py
--- old/testfixtures-6.5.0/testfixtures/replace.py      2018-06-16 
18:29:16.000000000 +0200
+++ new/testfixtures-6.6.2/testfixtures/replace.py      2019-03-22 
08:47:24.000000000 +0100
@@ -23,9 +23,15 @@
     def _replace(self, container, name, method, value, strict=True):
         if value is not_there:
             if method == 'a':
-                delattr(container, name)
+                try:
+                    delattr(container, name)
+                except AttributeError:
+                    pass
             if method == 'i':
-                del container[name]
+                try:
+                    del container[name]
+                except KeyError:
+                    pass
         else:
             if method == 'a':
                 setattr(container, name, value)
@@ -42,8 +48,6 @@
             raise ValueError('target must contain at least one dot!')
         if t_obj is not_there and strict:
             raise AttributeError('Original %r not found' % attribute)
-        if t_obj is not_there and replacement is not_there:
-            return not_there
 
         replacement_to_use = replacement
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/testfixtures-6.5.0/testfixtures/tests/test_compare.py 
new/testfixtures-6.6.2/testfixtures/tests/test_compare.py
--- old/testfixtures-6.5.0/testfixtures/tests/test_compare.py   2018-12-19 
13:08:08.000000000 +0100
+++ new/testfixtures-6.6.2/testfixtures/tests/test_compare.py   2019-03-22 
08:47:24.000000000 +0100
@@ -1581,3 +1581,158 @@
             "datetime.datetime(2001, 1, 1, 0, 0) != "
             "datetime.datetime(2001, 1, 2, 0, 0)"
         )
+
+    def test_inherited_slots(self):
+
+        class Parent(object):
+            __slots__ = ('a',)
+
+        class Child(Parent):
+            __slots__ = ('b',)
+
+            def __init__(self, a, b):
+                self.a, self.b = a, b
+
+        self.check_raises(
+            Child(1, 'x'),
+            Child(2, 'x'),
+            'Child not as expected:\n'
+            '\n'
+            'attributes same:\n'
+            "['b']\n"
+            '\n'
+            'attributes differ:\n'
+            "'a': 1 != 2"
+        )
+
+    def test_empty_child_slots(self):
+
+        class Parent(object):
+            __slots__ = ('a',)
+
+            def __init__(self, a):
+                self.a = a
+
+        class Child(Parent):
+            __slots__ = ()
+
+        compare(Child(1), Child(1))
+
+    def test_partial_callable_different(self):
+
+        def foo(x): pass
+        def bar(y): pass
+
+        self.check_raises(
+            partial(foo),
+            partial(bar),
+            (
+                'partial not as expected:\n'
+                '\n'
+                'attributes same:\n'
+                "['args', 'keywords']\n"
+                '\n'
+                'attributes differ:\n'
+                "'func': {foo} != {bar}\n"
+                '\n'
+                'While comparing .func: {foo} != {bar}'
+            ).format(foo=hexsub(repr(foo)), bar=hexsub(repr(bar))))
+
+    def test_partial_args_different(self):
+
+        def foo(x): pass
+
+        self.check_raises(
+            partial(foo, 1),
+            partial(foo, 2),
+            'partial not as expected:\n'
+            '\n'
+            'attributes same:\n'
+            "['func', 'keywords']\n"
+            '\n'
+            'attributes differ:\n'
+            "'args': (1,) != (2,)\n"
+            '\n'
+            'While comparing .args: sequence not as expected:\n'
+            '\n'
+            'same:\n'
+            '()\n'
+            '\n'
+            'first:\n'
+            '(1,)\n'
+            '\n'
+            'second:\n'
+            '(2,)'
+        )
+
+    def test_partial_kw_different(self):
+
+        def foo(x): pass
+
+        self.check_raises(
+            partial(foo, x=1, y=3),
+            partial(foo, x=2, z=4),
+            'partial not as expected:\n'
+            '\n'
+            'attributes same:\n'
+            "['args', 'func']\n"
+            '\n'
+            'attributes differ:\n'
+            "'keywords': {'x': 1, 'y': 3} != {'x': 2, 'z': 4}\n"
+            '\n'
+            'While comparing .keywords: dict not as expected:\n'
+            '\n'
+            'in first but not second:\n'
+            "'y': 3\n"
+            '\n'
+            'in second but not first:\n'
+            "'z': 4\n"
+            '\n'
+            'values differ:\n'
+            "'x': 1 != 2"
+        )
+
+    def test_partial_equal(self):
+
+        def foo(x): pass
+
+        compare(partial(foo, 1, x=2), partial(foo, 1, x=2))
+
+
+class TestIgnore(CompareHelper):
+
+    class Parent(object):
+        def __init__(self, id, other):
+            self.id = id
+            self.other = other
+        def __repr__(self):
+            return '<{}:{}>'.format(type(self).__name__, self.id)
+
+    class Child(Parent): pass
+
+    def test_ignore_attributes(self):
+        compare(self.Parent(1, 3), self.Parent(2, 3), ignore_attributes={'id'})
+
+    def test_ignore_attributes_different_types(self):
+        self.check_raises(
+            self.Parent(1, 3),
+            self.Child(2, 3),
+            '<Parent:1> != <Child:2>',
+            ignore_attributes={'id'}
+        )
+
+    def test_ignore_attributes_per_type(self):
+        ignore = {self.Parent: {'id'}}
+        compare(self.Parent(1, 3), self.Parent(2, 3), ignore_attributes=ignore)
+        self.check_raises(
+            self.Child(1, 3),
+            self.Child(2, 3),
+            'Child not as expected:\n'
+            '\n'
+            'attributes same:\n'
+            "['other']\n"
+            '\n'
+            'attributes differ:\n'
+            "'id': 1 != 2",
+            ignore_attributes=ignore
+        )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/testfixtures-6.5.0/testfixtures/tests/test_popen.py 
new/testfixtures-6.6.2/testfixtures/tests/test_popen.py
--- old/testfixtures-6.5.0/testfixtures/tests/test_popen.py     2019-01-09 
09:16:37.000000000 +0100
+++ new/testfixtures-6.6.2/testfixtures/tests/test_popen.py     2019-03-22 
08:47:24.000000000 +0100
@@ -599,6 +599,13 @@
             call.Popen('a command', executable='/foo/bar')
         ])
 
+    def test_set_command_with_list(self):
+        Popen = MockPopen()
+        Popen.set_command(['a', 'command'])
+        Popen(['a', 'command'], stdout=PIPE, stderr=PIPE)
+        compare([call.Popen(['a',  'command'], stderr=-1, stdout=-1)],
+                actual=Popen.all_calls)
+
 
 class IntegrationTests(TestCase):
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/testfixtures-6.5.0/testfixtures/tests/test_popen_docs.py 
new/testfixtures-6.6.2/testfixtures/tests/test_popen_docs.py
--- old/testfixtures-6.5.0/testfixtures/tests/test_popen_docs.py        
2018-12-19 13:08:08.000000000 +0100
+++ new/testfixtures-6.6.2/testfixtures/tests/test_popen_docs.py        
2019-03-22 08:47:24.000000000 +0100
@@ -5,7 +5,7 @@
 
 
 def my_func():
-    process = Popen('svn ls -R foo', stdout=PIPE, stderr=PIPE, shell=True)
+    process = Popen(['svn', 'ls', '-R', 'foo'], stdout=PIPE, stderr=PIPE)
     out, err = process.communicate()
     if process.returncode:
         raise RuntimeError('something bad happened')
@@ -36,7 +36,7 @@
         compare(my_func(), b'o')
 
         # testing calls were in the right order and with the correct 
parameters:
-        process = call.Popen('svn ls -R foo', shell=True, stderr=PIPE, 
stdout=PIPE)
+        process = call.Popen(['svn', 'ls', '-R', 'foo'], stderr=PIPE, 
stdout=PIPE)
         compare(Popen.all_calls, expected=[
             process,
             process.communicate()
@@ -144,8 +144,8 @@
         compare(my_func(), b'o')
 
         # testing calls were in the right order and with the correct 
parameters:
-        root_call = call.Popen('svn ls -R foo',
-                               shell=True, stderr=PIPE, stdout=PIPE)
+        root_call = call.Popen(['svn', 'ls', '-R', 'foo'],
+                               stderr=PIPE, stdout=PIPE)
         compare(Popen.all_calls, expected=[
             root_call,
             root_call.communicate()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/testfixtures-6.5.0/testfixtures/tests/test_replace.py 
new/testfixtures-6.6.2/testfixtures/tests/test_replace.py
--- old/testfixtures-6.5.0/testfixtures/tests/test_replace.py   2018-12-19 
13:08:08.000000000 +0100
+++ new/testfixtures-6.6.2/testfixtures/tests/test_replace.py   2019-03-22 
08:47:24.000000000 +0100
@@ -246,6 +246,18 @@
 
         test_something()
 
+    def test_replace_delattr_not_there_restored(self):
+
+        from testfixtures.tests import sample1
+
+        @replace('testfixtures.tests.sample1.foo',
+                 not_there, strict=False)
+        def test_something(obj):
+            sample1.foo = 'bar'
+
+        test_something()
+        self.failIf(hasattr(sample1, 'foo'))
+
     def test_replace_delattr_cant_remove(self):
         with Replacer() as r:
             with ShouldRaise(TypeError(
@@ -298,6 +310,19 @@
 
         test_something()
 
+        self.assertEqual(sorted(someDict.keys()), ['complex_key', 'key'])
+
+    def test_replace_dict_ensure_key_not_there_restored(self):
+
+        from testfixtures.tests.sample1 import someDict
+
+        @replace('testfixtures.tests.sample1.someDict.badkey',
+                 not_there, strict=False)
+        def test_something(obj):
+            someDict['badkey'] = 'some test value'
+
+        test_something()
+
         self.assertEqual(sorted(someDict.keys()), ['complex_key', 'key'])
 
     def test_replace_dict_not_there(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/testfixtures-6.5.0/testfixtures/version.txt 
new/testfixtures-6.6.2/testfixtures/version.txt
--- old/testfixtures-6.5.0/testfixtures/version.txt     2019-01-28 
23:25:22.000000000 +0100
+++ new/testfixtures-6.6.2/testfixtures/version.txt     2019-03-22 
08:47:24.000000000 +0100
@@ -1 +1 @@
-6.5.0
+6.6.2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/testfixtures-6.5.0/testfixtures.egg-info/PKG-INFO 
new/testfixtures-6.6.2/testfixtures.egg-info/PKG-INFO
--- old/testfixtures-6.5.0/testfixtures.egg-info/PKG-INFO       2019-01-28 
23:53:02.000000000 +0100
+++ new/testfixtures-6.6.2/testfixtures.egg-info/PKG-INFO       2019-03-22 
08:47:36.000000000 +0100
@@ -1,12 +1,11 @@
-Metadata-Version: 1.1
+Metadata-Version: 2.1
 Name: testfixtures
-Version: 6.5.0
+Version: 6.6.2
 Summary: A collection of helpers and mock objects for unit tests and doc tests.
 Home-page: https://github.com/Simplistix/testfixtures
 Author: Chris Withers
 Author-email: [email protected]
 License: MIT
-Description-Content-Type: UNKNOWN
 Description: ============
         TestFixtures
         ============
@@ -76,3 +75,5 @@
 Classifier: Programming Language :: Python :: 3
 Classifier: Programming Language :: Python :: 3.6
 Classifier: Programming Language :: Python :: 3.7
+Provides-Extra: test
+Provides-Extra: build
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/testfixtures-6.5.0/testfixtures.egg-info/SOURCES.txt 
new/testfixtures-6.6.2/testfixtures.egg-info/SOURCES.txt
--- old/testfixtures-6.5.0/testfixtures.egg-info/SOURCES.txt    2019-01-28 
23:53:02.000000000 +0100
+++ new/testfixtures-6.6.2/testfixtures.egg-info/SOURCES.txt    2019-03-22 
08:47:36.000000000 +0100
@@ -1,11 +1,12 @@
+.carthorse.yml
 .coveragerc
 .gitignore
-.travis.yml
+.readthedocs.yml
 LICENSE.txt
 README.rst
-requirements.txt
 setup.cfg
 setup.py
+.circleci/config.yml
 docs/Makefile
 docs/api.txt
 docs/changes.txt
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/testfixtures-6.5.0/testfixtures.egg-info/requires.txt 
new/testfixtures-6.6.2/testfixtures.egg-info/requires.txt
--- old/testfixtures-6.5.0/testfixtures.egg-info/requires.txt   2019-01-28 
23:53:02.000000000 +0100
+++ new/testfixtures-6.6.2/testfixtures.egg-info/requires.txt   2019-03-22 
08:47:36.000000000 +0100
@@ -1,18 +1,16 @@
 
 [build]
 sphinx
-pkginfo
 setuptools-git
 wheel
 twine
 
 [test]
 pytest>=3.6
+pytest-cov
+pytest-django
 sybil
-coverage
-coveralls
 zope.component
-pytest-django
 twisted
 
 [test:python_version < "3"]


Reply via email to