Hello community,

here is the log from the commit of package python-plaster-pastedeploy for 
openSUSE:Factory checked in at 2019-06-06 18:15:54
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-plaster-pastedeploy (Old)
 and      /work/SRC/openSUSE:Factory/.python-plaster-pastedeploy.new.4811 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-plaster-pastedeploy"

Thu Jun  6 18:15:54 2019 rev:2 rq:707131 version:0.7

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-plaster-pastedeploy/python-plaster-pastedeploy.changes
    2017-09-25 13:57:58.211043591 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-plaster-pastedeploy.new.4811/python-plaster-pastedeploy.changes
  2019-06-06 18:15:55.628710542 +0200
@@ -1,0 +2,7 @@
+Mon Jun  3 10:49:58 UTC 2019 - Tomáš Chvátal <[email protected]>
+
+- Update to 0.7:
+  * distribute tests/license/documentation
+  * Many bugfixes around
+
+-------------------------------------------------------------------

Old:
----
  plaster_pastedeploy-0.4.1.tar.gz

New:
----
  plaster_pastedeploy-0.7.tar.gz

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

Other differences:
------------------
++++++ python-plaster-pastedeploy.spec ++++++
--- /var/tmp/diff_new_pack.E2rnu1/_old  2019-06-06 18:15:57.068710119 +0200
+++ /var/tmp/diff_new_pack.E2rnu1/_new  2019-06-06 18:15:57.096710111 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package python-plaster-pastedeploy
 #
-# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -12,27 +12,29 @@
 # license that conforms to the Open Source Definition (Version 1.9)
 # published by the Open Source Initiative.
 
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
 #
 
 
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-plaster-pastedeploy
-Version:        0.4.1
+Version:        0.7
 Release:        0
 Summary:        A loader implementing the PasteDeploy syntax to be used by 
plaster
 License:        MIT
 Group:          Development/Languages/Python
-Url:            https://github.com/Pylons/plaster_pastedeploy
+URL:            https://github.com/Pylons/plaster_pastedeploy
 Source0:        
https://files.pythonhosted.org/packages/source/p/plaster_pastedeploy/plaster_pastedeploy-%{version}.tar.gz
+BuildRequires:  %{python_module PasteDeploy >= 2.0}
+BuildRequires:  %{python_module plaster >= 0.5}
+BuildRequires:  %{python_module pytest}
 BuildRequires:  %{python_module setuptools}
 BuildRequires:  fdupes
 BuildRequires:  python-rpm-macros
-Requires:       python-PasteDeploy >= 1.5.0
+Requires:       python-PasteDeploy >= 2.0
 Requires:       python-plaster >= 0.5
-BuildRoot:      %{_tmppath}/%{name}-%{version}-build
-BuildArch:      noarch
 Provides:       python-plaster_pastedeploy = %{version}
+BuildArch:      noarch
 %python_subpackages
 
 %description
@@ -50,11 +52,14 @@
 
 %install
 %python_install
-%python_expand %fdupes -s %{buildroot}%{$python_sitelib}
+%python_expand %fdupes %{buildroot}%{$python_sitelib}
+
+%check
+%pytest
 
 %files %{python_files}
-%defattr(-,root,root,-)
-%doc
+%doc CHANGES.rst
+%license LICENSE.txt
 %{python_sitelib}/*
 
 %changelog

++++++ plaster_pastedeploy-0.4.1.tar.gz -> plaster_pastedeploy-0.7.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/plaster_pastedeploy-0.4.1/.flake8 
new/plaster_pastedeploy-0.7/.flake8
--- old/plaster_pastedeploy-0.4.1/.flake8       1970-01-01 01:00:00.000000000 
+0100
+++ new/plaster_pastedeploy-0.7/.flake8 2019-04-12 07:44:18.000000000 +0200
@@ -0,0 +1,12 @@
+[flake8]
+max-line-length = 79
+ignore =
+    # E203: whitespace before ':' (black fails to be PEP8 compliant)
+    E203
+    # E731: do not assign a lambda expression, use a def
+    E731
+    # W503: line break before binary operator (flake8 is not PEP8 compliant)
+    W503
+    # W504: line break after binary operator (flake8 is not PEP8 compliant)
+    W504
+show-source = True
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/plaster_pastedeploy-0.4.1/.travis.yml 
new/plaster_pastedeploy-0.7/.travis.yml
--- old/plaster_pastedeploy-0.4.1/.travis.yml   2017-06-29 07:28:23.000000000 
+0200
+++ new/plaster_pastedeploy-0.7/.travis.yml     2019-04-12 07:58:21.000000000 
+0200
@@ -8,6 +8,10 @@
 
 matrix:
   include:
+    - python: '3.7'
+      env: TOXENV=py37
+      dist: xenial
+      sudo: true
     - python: '3.6'
       env: TOXENV=py36
     - python: '3.5'
@@ -18,9 +22,11 @@
       env: TOXENV=py27
     - python: 'pypy'
       env: TOXENV=pypy
+    - python: 'pypy3'
+      env: TOXENV=pypy3
     - python: '3.5'
       env: TOXENV=py27,py35,coverage
-    - python: '3.5'
+    - python: '3.6'
       env: TOXENV=lint
 
 install: pip install tox
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/plaster_pastedeploy-0.4.1/CHANGES.rst 
new/plaster_pastedeploy-0.7/CHANGES.rst
--- old/plaster_pastedeploy-0.4.1/CHANGES.rst   2017-07-11 06:37:44.000000000 
+0200
+++ new/plaster_pastedeploy-0.7/CHANGES.rst     2019-04-12 07:58:54.000000000 
+0200
@@ -1,3 +1,35 @@
+0.7 (2019-04-12)
+================
+
+- Support Python 3.7.
+
+- Depend on ``pastedeploy >= 2.0`` to enforce new behavior when overriding
+  defaults. Default values passed into the loader will now override values in
+  the ``[DEFAULT]`` section.
+  See https://github.com/Pylons/plaster_pastedeploy/pull/17
+
+0.6 (2018-07-11)
+================
+
+- Change ``setup_logging`` to invoke ``logging.config.fileConfig`` with
+  ``disable_existing_loggers=False`` to avoid disabling any loggers that were
+  imported prior to configuration of the logging system.
+  See https://github.com/Pylons/plaster_pastedeploy/pull/16
+
+0.5 (2018-03-29)
+================
+
+- Removed environment variable support entirely for now. The feature requires
+  bugfixes upstream in PasteDeploy which have not been done yet and this was
+  breaking people's environments so it is gone for now.
+  See https://github.com/Pylons/plaster_pastedeploy/pull/15
+
+0.4.2 (2017-11-20)
+==================
+
+- Fix ``ConfigDict.copy`` so that it works.
+  See https://github.com/Pylons/plaster_pastedeploy/pull/14
+
 0.4.1 (2017-07-10)
 ==================
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/plaster_pastedeploy-0.4.1/CONTRIBUTORS.txt 
new/plaster_pastedeploy-0.7/CONTRIBUTORS.txt
--- old/plaster_pastedeploy-0.4.1/CONTRIBUTORS.txt      2017-05-22 
22:46:14.000000000 +0200
+++ new/plaster_pastedeploy-0.7/CONTRIBUTORS.txt        2017-11-21 
05:31:46.000000000 +0100
@@ -107,3 +107,5 @@
 ------------
 
 - Michael Merickel (2016-06-12)
+- Steve Piercy (2017-08-31)
+- Geoffrey T. Dairiki (2017-11-16)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/plaster_pastedeploy-0.4.1/MANIFEST.in 
new/plaster_pastedeploy-0.7/MANIFEST.in
--- old/plaster_pastedeploy-0.4.1/MANIFEST.in   2017-06-29 07:28:59.000000000 
+0200
+++ new/plaster_pastedeploy-0.7/MANIFEST.in     2019-04-12 08:05:20.000000000 
+0200
@@ -7,7 +7,8 @@
 include CONTRIBUTING.rst
 include CONTRIBUTORS.txt
 
-include .coveragerc
-include tox.ini appveyor.yml .travis.yml rtd.txt
+include pyproject.toml
+include .coveragerc .flake8 pytest.ini
+include tox.ini appveyor.yml .travis.yml
 
 recursive-exclude * __pycache__ *.py[cod]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/plaster_pastedeploy-0.4.1/PKG-INFO 
new/plaster_pastedeploy-0.7/PKG-INFO
--- old/plaster_pastedeploy-0.4.1/PKG-INFO      2017-07-11 06:43:30.000000000 
+0200
+++ new/plaster_pastedeploy-0.7/PKG-INFO        2019-04-12 08:21:03.000000000 
+0200
@@ -1,6 +1,6 @@
-Metadata-Version: 1.2
+Metadata-Version: 2.1
 Name: plaster_pastedeploy
-Version: 0.4.1
+Version: 0.7
 Summary: A loader implementing the PasteDeploy syntax to be used by plaster.
 Home-page: https://github.com/Pylons/plaster_pastedeploy
 Author: Hunter Senft-Grupp
@@ -75,33 +75,41 @@
         
         - ``egg:MyApp?debug=false#foo``
         
-        Environment Variables
-        ---------------------
+        .. _PasteDeploy: https://pastedeploy.readthedocs.io/en/latest/
+        .. _plaster: https://docs.pylonsproject.org/projects/plaster/en/latest/
         
-        **This feature is not supported on Python 2.**
         
-        This binding extends ``pastedeploy`` to inject environ variables as 
defaults
-        which are available to use in the INI file. Each ``os.environ`` key is 
prefixed
-        with ``ENV_`` and added as a default.
+        0.7 (2019-04-12)
+        ================
         
-        For example:
+        - Support Python 3.7.
         
-        .. code-block:: ini
+        - Depend on ``pastedeploy >= 2.0`` to enforce new behavior when 
overriding
+          defaults. Default values passed into the loader will now override 
values in
+          the ``[DEFAULT]`` section.
+          See https://github.com/Pylons/plaster_pastedeploy/pull/17
         
-           [app:main]
-           debug = %(ENV_APP_DEBUG)s
+        0.6 (2018-07-11)
+        ================
         
-        The only thing to be aware of here is that there is no fallback. The 
INI file
-        will fail to parse if the environment variable is not set. The app may 
be run
-        like so:
+        - Change ``setup_logging`` to invoke ``logging.config.fileConfig`` with
+          ``disable_existing_loggers=False`` to avoid disabling any loggers 
that were
+          imported prior to configuration of the logging system.
+          See https://github.com/Pylons/plaster_pastedeploy/pull/16
         
-        .. code-block:: bash
+        0.5 (2018-03-29)
+        ================
         
-           $ APP_DEBUG=true env/bin/pserve development.ini
+        - Removed environment variable support entirely for now. The feature 
requires
+          bugfixes upstream in PasteDeploy which have not been done yet and 
this was
+          breaking people's environments so it is gone for now.
+          See https://github.com/Pylons/plaster_pastedeploy/pull/15
         
-        .. _PasteDeploy: http://pastedeploy.readthedocs.io/en/latest/
-        .. _plaster: http://docs.pylonsproject.org/projects/plaster/en/latest/
+        0.4.2 (2017-11-20)
+        ==================
         
+        - Fix ``ConfigDict.copy`` so that it works.
+          See https://github.com/Pylons/plaster_pastedeploy/pull/14
         
         0.4.1 (2017-07-10)
         ==================
@@ -197,6 +205,8 @@
 Classifier: Programming Language :: Python :: 3.4
 Classifier: Programming Language :: Python :: 3.5
 Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
 Classifier: Programming Language :: Python :: Implementation :: CPython
 Classifier: Programming Language :: Python :: Implementation :: PyPy
 Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*
+Provides-Extra: testing
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/plaster_pastedeploy-0.4.1/README.rst 
new/plaster_pastedeploy-0.7/README.rst
--- old/plaster_pastedeploy-0.4.1/README.rst    2017-07-11 06:19:00.000000000 
+0200
+++ new/plaster_pastedeploy-0.7/README.rst      2019-04-12 07:34:27.000000000 
+0200
@@ -67,29 +67,5 @@
 
 - ``egg:MyApp?debug=false#foo``
 
-Environment Variables
----------------------
-
-**This feature is not supported on Python 2.**
-
-This binding extends ``pastedeploy`` to inject environ variables as defaults
-which are available to use in the INI file. Each ``os.environ`` key is prefixed
-with ``ENV_`` and added as a default.
-
-For example:
-
-.. code-block:: ini
-
-   [app:main]
-   debug = %(ENV_APP_DEBUG)s
-
-The only thing to be aware of here is that there is no fallback. The INI file
-will fail to parse if the environment variable is not set. The app may be run
-like so:
-
-.. code-block:: bash
-
-   $ APP_DEBUG=true env/bin/pserve development.ini
-
-.. _PasteDeploy: http://pastedeploy.readthedocs.io/en/latest/
-.. _plaster: http://docs.pylonsproject.org/projects/plaster/en/latest/
+.. _PasteDeploy: https://pastedeploy.readthedocs.io/en/latest/
+.. _plaster: https://docs.pylonsproject.org/projects/plaster/en/latest/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/plaster_pastedeploy-0.4.1/pyproject.toml 
new/plaster_pastedeploy-0.7/pyproject.toml
--- old/plaster_pastedeploy-0.4.1/pyproject.toml        1970-01-01 
01:00:00.000000000 +0100
+++ new/plaster_pastedeploy-0.7/pyproject.toml  2019-04-12 07:43:58.000000000 
+0200
@@ -0,0 +1,28 @@
+[build-system]
+requires = ["setuptools", "wheel"]
+
+[tool.black]
+line-length = 79
+skip-string-normalization = true
+py36 = false
+exclude = '''
+/(
+    \.git
+  | \.mypy_cache
+  | \.tox
+  | \.venv
+  | \.pytest_cache
+  | dist
+  | build
+  | docs
+)/
+'''
+
+ # This next section only exists for people that have their editors
+# automatically call isort, black already sorts entries on its own when run.
+[tool.isort]
+multi_line_output = 3
+include_trailing_comma = true
+force_grid_wrap = 0
+combine_as_imports = true
+line_length = 79
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/plaster_pastedeploy-0.4.1/pytest.ini 
new/plaster_pastedeploy-0.7/pytest.ini
--- old/plaster_pastedeploy-0.4.1/pytest.ini    1970-01-01 01:00:00.000000000 
+0100
+++ new/plaster_pastedeploy-0.7/pytest.ini      2019-04-12 07:43:05.000000000 
+0200
@@ -0,0 +1,5 @@
+[pytest]
+python_files = test_*.py
+testpaths =
+    src/plaster_pastedeploy
+    tests
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/plaster_pastedeploy-0.4.1/setup.cfg 
new/plaster_pastedeploy-0.7/setup.cfg
--- old/plaster_pastedeploy-0.4.1/setup.cfg     2017-07-11 06:43:30.000000000 
+0200
+++ new/plaster_pastedeploy-0.7/setup.cfg       2019-04-12 08:21:03.000000000 
+0200
@@ -1,16 +1,9 @@
-[wheel]
+[bdist_wheel]
 universal = 1
 
 [metadata]
 license_file = LICENSE.txt
 
-[flake8]
-exclude = 
-       tests/fake_packages,
-       tests/sample_configs,
-show-source = True
-max-line-length = 80
-
 [check-manifest]
 ignore = 
        .gitignore
@@ -21,12 +14,6 @@
 ignore-bad-ideas = 
        tests/*
 
-[tool:pytest]
-python_files = test_*.py
-testpaths = 
-       src/plaster_pastedeploy
-       tests
-
 [egg_info]
 tag_build = 
 tag_date = 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/plaster_pastedeploy-0.4.1/setup.py 
new/plaster_pastedeploy-0.7/setup.py
--- old/plaster_pastedeploy-0.4.1/setup.py      2017-07-11 06:22:19.000000000 
+0200
+++ new/plaster_pastedeploy-0.7/setup.py        2019-04-12 07:58:41.000000000 
+0200
@@ -1,70 +1,68 @@
 from setuptools import setup, find_packages
 
+
 def readfile(name):
     with open(name) as f:
         return f.read()
 
-readme = readfile('README.rst')
-changes = readfile('CHANGES.rst')
+
+readme = readfile("README.rst")
+changes = readfile("CHANGES.rst")
 
 install_requires = [
-    'PasteDeploy >= 1.5.0',  # py3 compat
-    'plaster >= 0.5',  # file schemes
+    "PasteDeploy >= 2.0",  # default override order has been changed in 
version 2
+    "plaster >= 0.5",  # file schemes
 ]
 
-tests_require = [
-    'pytest',
-    'pytest-cov',
-]
+tests_require = ["pytest", "pytest-cov"]
 
 setup(
-    name='plaster_pastedeploy',
-    version='0.4.1',
+    name="plaster_pastedeploy",
+    version="0.7",
     description=(
-        'A loader implementing the PasteDeploy syntax to be used by plaster.'
+        "A loader implementing the PasteDeploy syntax to be used by plaster."
     ),
-    long_description=readme + '\n\n' + changes,
-    author='Hunter Senft-Grupp',
-    author_email='[email protected]',
-    url='https://github.com/Pylons/plaster_pastedeploy',
-    packages=find_packages('src', exclude=['tests']),
-    package_dir={'': 'src'},
+    long_description=readme + "\n\n" + changes,
+    author="Hunter Senft-Grupp",
+    author_email="[email protected]",
+    url="https://github.com/Pylons/plaster_pastedeploy";,
+    packages=find_packages("src", exclude=["tests"]),
+    package_dir={"": "src"},
     include_package_data=True,
-    python_requires='>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*',
+    python_requires=">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*",
     install_requires=install_requires,
-    extras_require={
-        'testing': tests_require,
-    },
+    extras_require={"testing": tests_require},
     zip_safe=False,
-    keywords='plaster pastedeploy plaster_pastedeploy ini config egg',
+    keywords="plaster pastedeploy plaster_pastedeploy ini config egg",
     classifiers=[
-        'Development Status :: 5 - Production/Stable',
-        'Intended Audience :: Developers',
-        'License :: OSI Approved :: MIT License',
-        'Natural Language :: English',
-        'Programming Language :: Python :: 2',
-        'Programming Language :: Python :: 2.7',
-        'Programming Language :: Python :: 3',
-        'Programming Language :: Python :: 3.4',
-        'Programming Language :: Python :: 3.5',
-        'Programming Language :: Python :: 3.6',
-        'Programming Language :: Python :: Implementation :: CPython',
-        'Programming Language :: Python :: Implementation :: PyPy',
+        "Development Status :: 5 - Production/Stable",
+        "Intended Audience :: Developers",
+        "License :: OSI Approved :: MIT License",
+        "Natural Language :: English",
+        "Programming Language :: Python :: 2",
+        "Programming Language :: Python :: 2.7",
+        "Programming Language :: Python :: 3",
+        "Programming Language :: Python :: 3.4",
+        "Programming Language :: Python :: 3.5",
+        "Programming Language :: Python :: 3.6",
+        "Programming Language :: Python :: 3.7",
+        "Programming Language :: Python :: Implementation :: CPython",
+        "Programming Language :: Python :: Implementation :: PyPy",
     ],
     entry_points={
-        'plaster.loader_factory': [
-            'file+ini=plaster_pastedeploy:Loader',
-            'egg=plaster_pastedeploy:Loader',
-            'pastedeploy=plaster_pastedeploy:Loader',
-            'pastedeploy+ini=plaster_pastedeploy:Loader',
-            'pastedeploy+egg=plaster_pastedeploy:Loader',
+        "plaster.loader_factory": [
+            "file+ini=plaster_pastedeploy:Loader",
+            "egg=plaster_pastedeploy:Loader",
+            "pastedeploy=plaster_pastedeploy:Loader",
+            "pastedeploy+ini=plaster_pastedeploy:Loader",
+            "pastedeploy+egg=plaster_pastedeploy:Loader",
         ],
-        'plaster.wsgi_loader_factory': [
-            'file+ini=plaster_pastedeploy:Loader',
-            'egg=plaster_pastedeploy:Loader',
-            'pastedeploy=plaster_pastedeploy:Loader',
-            'pastedeploy+ini=plaster_pastedeploy:Loader',
-            'pastedeploy+egg=plaster_pastedeploy:Loader',
+        "plaster.wsgi_loader_factory": [
+            "file+ini=plaster_pastedeploy:Loader",
+            "egg=plaster_pastedeploy:Loader",
+            "pastedeploy=plaster_pastedeploy:Loader",
+            "pastedeploy+ini=plaster_pastedeploy:Loader",
+            "pastedeploy+egg=plaster_pastedeploy:Loader",
         ],
     },
 )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/plaster_pastedeploy-0.4.1/src/plaster_pastedeploy/__init__.py 
new/plaster_pastedeploy-0.7/src/plaster_pastedeploy/__init__.py
--- old/plaster_pastedeploy-0.4.1/src/plaster_pastedeploy/__init__.py   
2017-07-11 06:42:20.000000000 +0200
+++ new/plaster_pastedeploy-0.7/src/plaster_pastedeploy/__init__.py     
2019-04-12 08:02:58.000000000 +0200
@@ -4,12 +4,7 @@
 import os
 import sys
 
-from paste.deploy import (
-    loadapp,
-    loadserver,
-    loadfilter,
-    appconfig,
-)
+from paste.deploy import loadapp, loadserver, loadfilter, appconfig
 import paste.deploy.loadwsgi as loadwsgi
 
 from plaster import ILoader
@@ -22,7 +17,8 @@
     # is using so that we can catch the NoSectionError raised by it.
     #
     # Import the py2 version first to avoid name clash with the configparser
-    # module on PyPI. See 
https://github.com/Pylons/plaster_pastedeploy/issues/5
+    # module on PyPI.
+    # See https://github.com/Pylons/plaster_pastedeploy/issues/5
     from ConfigParser import NoSectionError
 else:
     from configparser import NoSectionError
@@ -40,13 +36,14 @@
 
     """
 
+    filepath = None
+
     def __init__(self, uri):
         self.uri = uri
-        self.pastedeploy_scheme = get_pastedeploy_scheme(uri)
-        self.pastedeploy_spec = '{0}:{1}'.format(
-            self.pastedeploy_scheme, uri.path)
-        if os.path.isabs(uri.path):
-            self.relative_to = os.path.dirname(uri.path)
+        scheme = get_pastedeploy_scheme(uri)
+        if scheme == "config":
+            self.filepath = os.path.abspath(uri.path)
+        self.pastedeploy_spec = "{0}:{1}".format(scheme, uri.path)
         self.relative_to = os.getcwd()
 
     def get_sections(self):
@@ -56,7 +53,7 @@
         :return: A list of the section names in the config file.
 
         """
-        if self.pastedeploy_scheme != 'config':
+        if self.filepath is None:
             return []
         parser = self._get_parser()
         return parser.sections()
@@ -78,7 +75,7 @@
         # ``paste.deploy.loadwsgi.ConfigLoader:get_context`` which supports
         # "set" and "get" options and filters out any other globals
         section = self._maybe_get_default_name(section)
-        if self.pastedeploy_scheme != 'config':
+        if self.filepath is None:
             return {}
         parser = self._get_parser(defaults)
         defaults = parser.defaults()
@@ -91,10 +88,10 @@
         local_conf = OrderedDict()
         get_from_globals = {}
         for option, value in raw_items:
-            if option.startswith('set '):
+            if option.startswith("set "):
                 name = option[4:].strip()
                 defaults[name] = value
-            elif option.startswith('get '):
+            elif option.startswith("get "):
                 name = option[4:].strip()
                 get_from_globals[name] = value
                 # insert a value into local_conf to preserve the order
@@ -125,10 +122,12 @@
         """
         name = self._maybe_get_default_name(name)
         defaults = self._get_defaults(defaults)
-        return loadapp(self.pastedeploy_spec,
-                       name=name,
-                       relative_to=self.relative_to,
-                       global_conf=defaults)
+        return loadapp(
+            self.pastedeploy_spec,
+            name=name,
+            relative_to=self.relative_to,
+            global_conf=defaults,
+        )
 
     def get_wsgi_server(self, name=None, defaults=None):
         """
@@ -146,10 +145,12 @@
         """
         name = self._maybe_get_default_name(name)
         defaults = self._get_defaults(defaults)
-        return loadserver(self.pastedeploy_spec,
-                          name=name,
-                          relative_to=self.relative_to,
-                          global_conf=defaults)
+        return loadserver(
+            self.pastedeploy_spec,
+            name=name,
+            relative_to=self.relative_to,
+            global_conf=defaults,
+        )
 
     def get_wsgi_filter(self, name=None, defaults=None):
         """Reads the configuration soruce and finds and loads a WSGI filter
@@ -165,10 +166,12 @@
         """
         name = self._maybe_get_default_name(name)
         defaults = self._get_defaults(defaults)
-        return loadfilter(self.pastedeploy_spec,
-                          name=name,
-                          relative_to=self.relative_to,
-                          global_conf=defaults)
+        return loadfilter(
+            self.pastedeploy_spec,
+            name=name,
+            relative_to=self.relative_to,
+            global_conf=defaults,
+        )
 
     def get_wsgi_app_settings(self, name=None, defaults=None):
         """
@@ -198,7 +201,8 @@
             self.pastedeploy_spec,
             name=name,
             relative_to=self.relative_to,
-            global_conf=defaults)
+            global_conf=defaults,
+        )
         return ConfigDict(conf.local_conf, conf.global_conf, self)
 
     def setup_logging(self, defaults=None):
@@ -214,28 +218,19 @@
         :return: ``None``.
 
         """
-        if 'loggers' in self.get_sections():
+        if "loggers" in self.get_sections():
             defaults = self._get_defaults(defaults)
-            fileConfig(self.uri.path, defaults)
+            fileConfig(self.uri.path, defaults, disable_existing_loggers=False)
 
         else:
             logging.basicConfig()
 
     def _get_defaults(self, defaults=None):
-        path = os.path.abspath(self.uri.path)
-        result = {
-            '__file__': path,
-            'here': os.path.dirname(path),
-        }
-        if not PY2:
-            # Only inject environment variables on py3+ where escaping is
-            # supported. On py2 any environment var with contents of the
-            # format %(foo)s would break the parser. Unfortunately, this is
-            # risky enough to simply not support it.
-            result.update({
-                'ENV_' + k: v.replace('%', '%%')
-                for k, v in os.environ.items()
-            })
+        result = {"__file__": self.filepath}
+        if self.filepath is None:
+            result["here"] = os.getcwd()
+        else:
+            result["here"] = os.path.dirname(self.filepath)
         result.update(self.uri.options)
         if defaults:
             result.update(defaults)
@@ -262,11 +257,11 @@
 
 
 def get_pastedeploy_scheme(uri):
-    scheme = 'config'
-    if uri.scheme.endswith('egg'):
-        scheme = 'egg'
-#    elif uri.scheme.startswith('call'):
-#        scheme = 'call'
+    scheme = "config"
+    if uri.scheme.endswith("egg"):
+        scheme = "egg"
+    #    elif uri.scheme.startswith('call'):
+    #        scheme = 'call'
     return scheme
 
 
@@ -275,3 +270,11 @@
         super(ConfigDict, self).__init__(local_conf)
         self.global_conf = global_conf
         self.loader = loader
+
+    def __reduce__(self):
+        initargs = list(self.items()), self.global_conf, self.loader
+        return self.__class__, initargs
+
+    def copy(self):
+        callable, args = self.__reduce__()
+        return callable(*args)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/plaster_pastedeploy-0.4.1/src/plaster_pastedeploy.egg-info/PKG-INFO 
new/plaster_pastedeploy-0.7/src/plaster_pastedeploy.egg-info/PKG-INFO
--- old/plaster_pastedeploy-0.4.1/src/plaster_pastedeploy.egg-info/PKG-INFO     
2017-07-11 06:43:30.000000000 +0200
+++ new/plaster_pastedeploy-0.7/src/plaster_pastedeploy.egg-info/PKG-INFO       
2019-04-12 08:21:03.000000000 +0200
@@ -1,6 +1,6 @@
-Metadata-Version: 1.2
+Metadata-Version: 2.1
 Name: plaster-pastedeploy
-Version: 0.4.1
+Version: 0.7
 Summary: A loader implementing the PasteDeploy syntax to be used by plaster.
 Home-page: https://github.com/Pylons/plaster_pastedeploy
 Author: Hunter Senft-Grupp
@@ -75,33 +75,41 @@
         
         - ``egg:MyApp?debug=false#foo``
         
-        Environment Variables
-        ---------------------
+        .. _PasteDeploy: https://pastedeploy.readthedocs.io/en/latest/
+        .. _plaster: https://docs.pylonsproject.org/projects/plaster/en/latest/
         
-        **This feature is not supported on Python 2.**
         
-        This binding extends ``pastedeploy`` to inject environ variables as 
defaults
-        which are available to use in the INI file. Each ``os.environ`` key is 
prefixed
-        with ``ENV_`` and added as a default.
+        0.7 (2019-04-12)
+        ================
         
-        For example:
+        - Support Python 3.7.
         
-        .. code-block:: ini
+        - Depend on ``pastedeploy >= 2.0`` to enforce new behavior when 
overriding
+          defaults. Default values passed into the loader will now override 
values in
+          the ``[DEFAULT]`` section.
+          See https://github.com/Pylons/plaster_pastedeploy/pull/17
         
-           [app:main]
-           debug = %(ENV_APP_DEBUG)s
+        0.6 (2018-07-11)
+        ================
         
-        The only thing to be aware of here is that there is no fallback. The 
INI file
-        will fail to parse if the environment variable is not set. The app may 
be run
-        like so:
+        - Change ``setup_logging`` to invoke ``logging.config.fileConfig`` with
+          ``disable_existing_loggers=False`` to avoid disabling any loggers 
that were
+          imported prior to configuration of the logging system.
+          See https://github.com/Pylons/plaster_pastedeploy/pull/16
         
-        .. code-block:: bash
+        0.5 (2018-03-29)
+        ================
         
-           $ APP_DEBUG=true env/bin/pserve development.ini
+        - Removed environment variable support entirely for now. The feature 
requires
+          bugfixes upstream in PasteDeploy which have not been done yet and 
this was
+          breaking people's environments so it is gone for now.
+          See https://github.com/Pylons/plaster_pastedeploy/pull/15
         
-        .. _PasteDeploy: http://pastedeploy.readthedocs.io/en/latest/
-        .. _plaster: http://docs.pylonsproject.org/projects/plaster/en/latest/
+        0.4.2 (2017-11-20)
+        ==================
         
+        - Fix ``ConfigDict.copy`` so that it works.
+          See https://github.com/Pylons/plaster_pastedeploy/pull/14
         
         0.4.1 (2017-07-10)
         ==================
@@ -197,6 +205,8 @@
 Classifier: Programming Language :: Python :: 3.4
 Classifier: Programming Language :: Python :: 3.5
 Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
 Classifier: Programming Language :: Python :: Implementation :: CPython
 Classifier: Programming Language :: Python :: Implementation :: PyPy
 Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*
+Provides-Extra: testing
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/plaster_pastedeploy-0.4.1/src/plaster_pastedeploy.egg-info/SOURCES.txt 
new/plaster_pastedeploy-0.7/src/plaster_pastedeploy.egg-info/SOURCES.txt
--- old/plaster_pastedeploy-0.4.1/src/plaster_pastedeploy.egg-info/SOURCES.txt  
2017-07-11 06:43:30.000000000 +0200
+++ new/plaster_pastedeploy-0.7/src/plaster_pastedeploy.egg-info/SOURCES.txt    
2019-04-12 08:21:03.000000000 +0200
@@ -1,4 +1,5 @@
 .coveragerc
+.flake8
 .gitignore
 .travis.yml
 CHANGES.rst
@@ -8,6 +9,8 @@
 MANIFEST.in
 README.rst
 appveyor.yml
+pyproject.toml
+pytest.ini
 setup.cfg
 setup.py
 tox.ini
@@ -21,6 +24,7 @@
 src/plaster_pastedeploy.egg-info/top_level.txt
 tests/__init__.py
 tests/conftest.py
+tests/test_configdict.py
 tests/test_get_settings.py
 tests/test_get_wsgi_app.py
 tests/test_get_wsgi_app_settings.py
@@ -39,6 +43,7 @@
 tests/fake_packages/FakeApp/fakeapp/configapps.py
 tests/sample_configs/basic_app.ini
 tests/sample_configs/test_config.ini
+tests/sample_configs/test_config_included.ini
 tests/sample_configs/test_filter.ini
 tests/sample_configs/test_filter_with.ini
 tests/sample_configs/test_settings.ini
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/plaster_pastedeploy-0.4.1/src/plaster_pastedeploy.egg-info/requires.txt 
new/plaster_pastedeploy-0.7/src/plaster_pastedeploy.egg-info/requires.txt
--- old/plaster_pastedeploy-0.4.1/src/plaster_pastedeploy.egg-info/requires.txt 
2017-07-11 06:43:30.000000000 +0200
+++ new/plaster_pastedeploy-0.7/src/plaster_pastedeploy.egg-info/requires.txt   
2019-04-12 08:21:03.000000000 +0200
@@ -1,5 +1,5 @@
-PasteDeploy >= 1.5.0
-plaster >= 0.5
+PasteDeploy>=2.0
+plaster>=0.5
 
 [testing]
 pytest
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/plaster_pastedeploy-0.4.1/tests/conftest.py 
new/plaster_pastedeploy-0.7/tests/conftest.py
--- old/plaster_pastedeploy-0.4.1/tests/conftest.py     2017-03-28 
02:34:02.000000000 +0200
+++ new/plaster_pastedeploy-0.7/tests/conftest.py       2019-04-12 
07:41:48.000000000 +0200
@@ -3,12 +3,13 @@
 import pytest
 import sys
 
[email protected](scope='session')
+
[email protected](scope="session")
 def fake_packages():
     # we'd like to keep this scope more focused but it's proven really
     # difficult to fully monkeypatch pkg_resources and so for now we just
     # install the packages for the duration of the test suite
     test_dir = os.path.dirname(__file__)
-    info_dir = os.path.join(test_dir, 'fake_packages', 'FakeApp')
+    info_dir = os.path.join(test_dir, "fake_packages", "FakeApp")
     sys.path.insert(0, info_dir)
     pkg_resources.working_set.add_entry(info_dir)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/plaster_pastedeploy-0.4.1/tests/fake_packages/FakeApp/fakeapp/apps.py 
new/plaster_pastedeploy-0.7/tests/fake_packages/FakeApp/fakeapp/apps.py
--- old/plaster_pastedeploy-0.4.1/tests/fake_packages/FakeApp/fakeapp/apps.py   
2017-03-30 03:48:55.000000000 +0200
+++ new/plaster_pastedeploy-0.7/tests/fake_packages/FakeApp/fakeapp/apps.py     
2019-04-12 07:41:48.000000000 +0200
@@ -4,12 +4,12 @@
 
 
 def simple_app(response, environ, start_response):
-    start_response('200 OK', [('Content-type', 'text/html')])
-    return ['This is ', response]
+    start_response("200 OK", [("Content-type", "text/html")])
+    return ["This is ", response]
 
 
 def basic_app(environ, start_response):
-    return simple_app('basic app', environ, start_response)
+    return simple_app("basic app", environ, start_response)
 
 
 def make_basic_app(global_conf, **conf):
@@ -20,7 +20,8 @@
 # Filters
 ############################################################
 
-def make_cap_filter(global_conf, method_to_call='upper'):
+
+def make_cap_filter(global_conf, method_to_call="upper"):
     def cap_filter(app):
         return CapFilter(app, global_conf, method_to_call)
 
@@ -28,7 +29,7 @@
 
 
 class CapFilter(object):
-    def __init__(self, app, global_conf, method_to_call='upper'):
+    def __init__(self, app, global_conf, method_to_call="upper"):
         self.app = app
         self.method_to_call = method_to_call
         self.global_conf = global_conf
@@ -37,7 +38,7 @@
         app_iter = self.app(environ, start_response)
         for item in app_iter:
             yield getattr(item, self.method_to_call)()
-        if hasattr(app_iter, 'close'):
+        if hasattr(app_iter, "close"):
             app_iter.close()
 
 
@@ -45,6 +46,7 @@
 # Servers
 ############################################################
 
+
 def make_fake_server(global_conf=None, **settings):
     return Server(global_conf, settings)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/plaster_pastedeploy-0.4.1/tests/fake_packages/FakeApp/fakeapp/configapps.py 
new/plaster_pastedeploy-0.7/tests/fake_packages/FakeApp/fakeapp/configapps.py
--- 
old/plaster_pastedeploy-0.4.1/tests/fake_packages/FakeApp/fakeapp/configapps.py 
    2017-03-28 02:34:02.000000000 +0200
+++ 
new/plaster_pastedeploy-0.7/tests/fake_packages/FakeApp/fakeapp/configapps.py   
    2019-04-12 07:41:48.000000000 +0200
@@ -5,10 +5,10 @@
         self.name = name
 
     def __call__(self, environ, start_response):
-        start_response('200 OK', [('Content-type', 'text/html')])
-        return ['I am: ', name]
-        
+        start_response("200 OK", [("Content-type", "text/html")])
+        return ["I am: ", name]
+
     def make_app(cls, global_conf, **conf):
-        return cls(global_conf, conf, 'basic')
-    make_app = classmethod(make_app)
+        return cls(global_conf, conf, "basic")
 
+    make_app = classmethod(make_app)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/plaster_pastedeploy-0.4.1/tests/fake_packages/FakeApp/setup.py 
new/plaster_pastedeploy-0.7/tests/fake_packages/FakeApp/setup.py
--- old/plaster_pastedeploy-0.4.1/tests/fake_packages/FakeApp/setup.py  
2017-03-30 03:49:57.000000000 +0200
+++ new/plaster_pastedeploy-0.7/tests/fake_packages/FakeApp/setup.py    
2019-04-12 07:41:48.000000000 +0200
@@ -5,15 +5,15 @@
     version="1.0",
     packages=find_packages(),
     entry_points={
-        'paste.app_factory': """
+        "paste.app_factory": """
         basic_app=fakeapp.apps:make_basic_app
         other=fakeapp.apps:make_basic_app2
         configed=fakeapp.configapps:SimpleApp.make_app
         """,
-        'paste.filter_factory': """
+        "paste.filter_factory": """
         caps=fakeapp.apps:make_cap_filter
         """,
-        'paste.server_factory': """
+        "paste.server_factory": """
         fake=fakeapp.apps:make_fake_server
         """,
     },
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/plaster_pastedeploy-0.4.1/tests/sample_configs/test_config_included.ini 
new/plaster_pastedeploy-0.7/tests/sample_configs/test_config_included.ini
--- old/plaster_pastedeploy-0.4.1/tests/sample_configs/test_config_included.ini 
1970-01-01 01:00:00.000000000 +0100
+++ new/plaster_pastedeploy-0.7/tests/sample_configs/test_config_included.ini   
2017-08-30 06:46:46.000000000 +0200
@@ -0,0 +1,10 @@
+[DEFAULT]
+def2 = from include
+def3 = c
+
+[app:main]
+# Equivalent to the egg reference, but just for kicks...
+paste.app_factory = fakeapp.configapps:SimpleApp.make_app
+set glob = orig
+bob = your uncle
+another = BAR
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/plaster_pastedeploy-0.4.1/tests/sample_configs/test_settings.ini 
new/plaster_pastedeploy-0.7/tests/sample_configs/test_settings.ini
--- old/plaster_pastedeploy-0.4.1/tests/sample_configs/test_settings.ini        
2017-07-11 06:18:57.000000000 +0200
+++ new/plaster_pastedeploy-0.7/tests/sample_configs/test_settings.ini  
2019-04-12 07:34:27.000000000 +0200
@@ -12,7 +12,3 @@
 a = a_val
 b = b_val
 c = %(default_c)s
-
-[section3]
-foo = %(ENV_PLASTER_FOO)s
-bar = %(ENV_PLASTER_BAR)s
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/plaster_pastedeploy-0.4.1/tests/test_configdict.py 
new/plaster_pastedeploy-0.7/tests/test_configdict.py
--- old/plaster_pastedeploy-0.4.1/tests/test_configdict.py      1970-01-01 
01:00:00.000000000 +0100
+++ new/plaster_pastedeploy-0.7/tests/test_configdict.py        2019-04-12 
07:45:29.000000000 +0200
@@ -0,0 +1,40 @@
+""" Tests for plaster_pastedeploy.ConfigDict
+"""
+import copy  # noqa: F401
+import plaster
+import pytest
+
+
[email protected]
+def loader():
+    from plaster_pastedeploy import Loader
+
+    uri = plaster.PlasterURL("pastedeploy+ini", "development.ini")
+    return Loader(uri)
+
+
+def dict_copy(d):
+    return d.copy()
+
+
+def copy_copy(d):
+    return copy.copy(d)
+
+
[email protected](
+    "copier", [dict_copy, copy_copy], ids=lambda f: f.__name__
+)
+def test_copy(copier, loader):
+    from plaster_pastedeploy import ConfigDict
+
+    x = []
+    global_conf = {}
+    configdict = ConfigDict({"x": x}, global_conf, loader)
+
+    duplicate = copier(configdict)
+
+    assert duplicate.items() == configdict.items()
+    # check that we got a shallow copy
+    assert duplicate["x"] is x
+    assert duplicate.global_conf is global_conf
+    assert duplicate.loader is loader
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/plaster_pastedeploy-0.4.1/tests/test_get_settings.py 
new/plaster_pastedeploy-0.7/tests/test_get_settings.py
--- old/plaster_pastedeploy-0.4.1/tests/test_get_settings.py    2017-07-11 
06:18:57.000000000 +0200
+++ new/plaster_pastedeploy-0.7/tests/test_get_settings.py      2019-04-12 
07:41:48.000000000 +0200
@@ -4,7 +4,7 @@
 
 here = os.path.dirname(__file__)
 
-test_settings_relpath = 'sample_configs/test_settings.ini'
+test_settings_relpath = "sample_configs/test_settings.ini"
 test_settings_path = os.path.abspath(os.path.join(here, test_settings_relpath))
 
 
@@ -17,76 +17,65 @@
 
     def test_sections(self):
         result = self.loader.get_sections()
-        assert set(result) == {'section1', 'section2', 'section3'}
+        assert set(result) == {"section1", "section2"}
 
     def test_missing_section(self):
-        result = self.loader.get_settings('missing', {'a': 'b'})
+        result = self.loader.get_settings("missing", {"a": "b"})
         assert result == {}
 
     def test_no_defaults_passed(self):
-        result = self.loader.get_settings('section1')
+        result = self.loader.get_settings("section1")
         assert list(result.items()) == [
-            ('a', 'a_val'),
-            ('c', 'override_b'),
-            ('b', 'default_b'),
+            ("a", "a_val"),
+            ("c", "override_b"),
+            ("b", "default_b"),
         ]
 
-        assert result.global_conf['default_a'] == 'default_a'
-        assert result.global_conf['default_b'] == 'override_b'
+        assert result.global_conf["default_a"] == "default_a"
+        assert result.global_conf["default_b"] == "override_b"
         assert result.loader == self.loader
 
         with pytest.raises(Exception):
-            self.loader.get_settings('section2')
+            self.loader.get_settings("section2")
 
     def test_defaults_passed(self):
-        defaults = {'default_c': 'default_c'}
-        result = self.loader.get_settings('section1', defaults=defaults)
-        assert result['a'] == 'a_val'
-        assert result['b'] == 'default_b'
-        assert 'default_c' not in result
-
-        assert result.global_conf['default_a'] == 'default_a'
-        assert result.global_conf['default_b'] == 'override_b'
-        assert result.global_conf['default_c'] == 'default_c'
-
-        result = self.loader.get_settings('section2', defaults=defaults)
-        assert result['a'] == 'a_val'
-        assert result['b'] == 'b_val'
-        assert result['c'] == 'default_c'
-
-        assert result.global_conf['default_a'] == 'default_a'
-        assert result.global_conf['default_b'] == 'default_b'
-        assert result.global_conf['default_c'] == 'default_c'
-
-    @pytest.mark.skipif('sys.version_info[0] == 2')
-    def test_environ_passed_and_escaped(self, monkeypatch):
-        monkeypatch.setenv('PLASTER_FOO', '%(foo)s')
-        monkeypatch.setenv('PLASTER_BAR', '%bar')
-        result = self.loader.get_settings('section3')
+        defaults = {"default_c": "default_c"}
+        result = self.loader.get_settings("section1", defaults=defaults)
+        assert result["a"] == "a_val"
+        assert result["b"] == "default_b"
+        assert "default_c" not in result
+
+        assert result.global_conf["default_a"] == "default_a"
+        assert result.global_conf["default_b"] == "override_b"
+        assert result.global_conf["default_c"] == "default_c"
+
+        result = self.loader.get_settings("section2", defaults=defaults)
+        assert result["a"] == "a_val"
+        assert result["b"] == "b_val"
+        assert result["c"] == "default_c"
+
+        assert result.global_conf["default_a"] == "default_a"
+        assert result.global_conf["default_b"] == "default_b"
+        assert result.global_conf["default_c"] == "default_c"
 
-        assert result['foo'] == '%(foo)s'
-        assert result.global_conf['ENV_PLASTER_FOO'] == '%(foo)s'
-
-        assert result['bar'] == '%bar'
-        assert result.global_conf['ENV_PLASTER_BAR'] == '%bar'
 
 class TestSectionedURI(TestSimpleUri):
-    config_uri = test_settings_path + '#section1'
+    config_uri = test_settings_path + "#section1"
 
     def test_no_section_name_passed(self):
         result = self.loader.get_settings()
-        assert result['a'] == 'a_val'
-        assert result['b'] == 'default_b'
-        assert result['c'] == 'override_b'
-        assert 'default_b' not in result
+        assert result["a"] == "a_val"
+        assert result["b"] == "default_b"
+        assert result["c"] == "override_b"
+        assert "default_b" not in result
 
 
 class TestFullURI(TestSectionedURI):
-    config_uri = 'pastedeploy+ini:' + test_settings_path + '#section1'
+    config_uri = "pastedeploy+ini:" + test_settings_path + "#section1"
 
 
 class TestEggURI(object):
-    config_uri = 'pastedeploy+egg:FakeApp#basic_app'
+    config_uri = "pastedeploy+egg:FakeApp#basic_app"
 
     @pytest.fixture(autouse=True)
     def loader(self, fake_packages):
@@ -101,5 +90,5 @@
         assert result == {}
 
     def test_named_settings(self):
-        result = self.loader.get_settings('missing')
+        result = self.loader.get_settings("missing")
         assert result == {}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/plaster_pastedeploy-0.4.1/tests/test_get_wsgi_app.py 
new/plaster_pastedeploy-0.7/tests/test_get_wsgi_app.py
--- old/plaster_pastedeploy-0.4.1/tests/test_get_wsgi_app.py    2017-06-02 
07:28:54.000000000 +0200
+++ new/plaster_pastedeploy-0.7/tests/test_get_wsgi_app.py      2019-04-12 
07:45:29.000000000 +0200
@@ -4,7 +4,7 @@
 
 here = os.path.dirname(__file__)
 
-basic_app_relpath = 'sample_configs/basic_app.ini'
+basic_app_relpath = "sample_configs/basic_app.ini"
 basic_app_path = os.path.abspath(os.path.join(here, basic_app_relpath))
 
 
@@ -14,16 +14,18 @@
     @pytest.fixture(autouse=True)
     def loader(self, fake_packages, monkeypatch):
         monkeypatch.chdir(here)
-        self.loader = plaster.get_loader(self.config_uri, protocols=['wsgi'])
+        self.loader = plaster.get_loader(self.config_uri, protocols=["wsgi"])
 
     def test_get_wsgi_app_with_relative(self):
         import fakeapp.apps
+
         app = self.loader.get_wsgi_app()
         assert app is fakeapp.apps.basic_app
 
     def test_get_wsgi_app_main(self):
         import fakeapp.apps
-        app = self.loader.get_wsgi_app('main')
+
+        app = self.loader.get_wsgi_app("main")
         assert app is fakeapp.apps.basic_app
 
         same_app = self.loader.get_wsgi_app()
@@ -31,15 +33,15 @@
 
     def test_invalid_name(self):
         with pytest.raises(LookupError):
-            self.loader.get_wsgi_app('invalid')
+            self.loader.get_wsgi_app("invalid")
 
 
 class TestSectionedURI(TestSimpleURI):
-    config_uri = basic_app_path + '#main'
+    config_uri = basic_app_path + "#main"
 
 
 class TestSchemeAndSectionedURI(TestSimpleURI):
-    config_uri = 'pastedeploy+ini:' + basic_app_path + '#main'
+    config_uri = "pastedeploy+ini:" + basic_app_path + "#main"
 
 
 class TestRelativeURI(TestSimpleURI):
@@ -47,31 +49,34 @@
 
 
 class TestRelativeSectionedURI(TestSectionedURI, TestRelativeURI):
-    config_uri = basic_app_relpath + '#main'
+    config_uri = basic_app_relpath + "#main"
 
 
-class TestRelativeSchemeAndSectionedURI(TestSchemeAndSectionedURI,
-                                        TestRelativeURI):
-    config_uri = 'pastedeploy+ini:' + basic_app_relpath + '#main'
+class TestRelativeSchemeAndSectionedURI(
+    TestSchemeAndSectionedURI, TestRelativeURI
+):
+    config_uri = "pastedeploy+ini:" + basic_app_relpath + "#main"
 
 
 class TestEggURI(object):
-    config_uri = 'egg:FakeApp#basic_app'
+    config_uri = "egg:FakeApp#basic_app"
 
     @pytest.fixture(autouse=True)
     def loader(self, fake_packages):
-        self.loader = plaster.get_loader(self.config_uri, protocols=['wsgi'])
+        self.loader = plaster.get_loader(self.config_uri, protocols=["wsgi"])
 
     def test_it(self):
         import fakeapp.apps
+
         app = self.loader.get_wsgi_app()
         assert app is fakeapp.apps.basic_app
 
     def test_it_override_name(self):
         import fakeapp.configapps
-        app = self.loader.get_wsgi_app('configed')
+
+        app = self.loader.get_wsgi_app("configed")
         assert isinstance(app, fakeapp.configapps.SimpleApp)
 
     def test_invalid_name(self):
         with pytest.raises(LookupError):
-            self.loader.get_wsgi_app('invalid')
+            self.loader.get_wsgi_app("invalid")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/plaster_pastedeploy-0.4.1/tests/test_get_wsgi_app_settings.py 
new/plaster_pastedeploy-0.7/tests/test_get_wsgi_app_settings.py
--- old/plaster_pastedeploy-0.4.1/tests/test_get_wsgi_app_settings.py   
2017-07-10 07:01:49.000000000 +0200
+++ new/plaster_pastedeploy-0.7/tests/test_get_wsgi_app_settings.py     
2019-04-12 07:45:29.000000000 +0200
@@ -3,7 +3,7 @@
 import pytest
 
 here = os.path.dirname(__file__)
-test_config_relpath = 'sample_configs/test_config.ini'
+test_config_relpath = "sample_configs/test_config.ini"
 test_config_path = os.path.abspath(os.path.join(here, test_config_relpath))
 
 
@@ -12,18 +12,28 @@
     def loader(self, fake_packages, monkeypatch):
         monkeypatch.chdir(here)
         self.loader = plaster.get_loader(
-            test_config_relpath, protocols=['wsgi'])
+            test_config_relpath, protocols=["wsgi"]
+        )
 
     def test_get_wsgi_app_settings(self):
-        result = self.loader.get_wsgi_app_settings('test_get')
-        assert result == {'def1': 'a', 'foo': 'TEST'}
-        assert result.global_conf['def1'] == 'a'
-        assert result.global_conf['def2'] == 'TEST'
-        assert 'basepath' in result.global_conf
+        result = self.loader.get_wsgi_app_settings("test_get")
+        assert result == {"def1": "a", "foo": "TEST"}
+        assert result.global_conf["def1"] == "a"
+        assert result.global_conf["def2"] == "TEST"
+        assert "basepath" in result.global_conf
 
     def test_invalid_name(self):
         with pytest.raises(LookupError):
-            self.loader.get_wsgi_app_settings('invalid')
+            self.loader.get_wsgi_app_settings("invalid")
+
+    def test_foreign_config(self):
+        result = self.loader.get_wsgi_app_settings("test_foreign_config")
+        assert result == {"another": "FOO", "bob": "your uncle"}
+        assert result.global_conf["def1"] == "a"
+        assert result.global_conf["def2"] == "b"
+        assert result.global_conf["def3"] == "c"
+        assert result.global_conf["glob"] == "override"
+        assert "basepath" in result.global_conf
 
 
 class TestSimpleURI(object):
@@ -31,19 +41,20 @@
     def loader(self, fake_packages, monkeypatch):
         monkeypatch.chdir(here)
         self.loader = plaster.get_loader(
-            'sample_configs/test_filter_with.ini', protocols=['wsgi'])
+            "sample_configs/test_filter_with.ini", protocols=["wsgi"]
+        )
 
     def test_get_wsgi_app_settings(self):
         conf = self.loader.get_wsgi_app_settings()
-        assert conf['example'] == 'test'
+        assert conf["example"] == "test"
 
 
 class TestEggURI(object):
-    config_uri = 'egg:FakeApp#configed'
+    config_uri = "egg:FakeApp#configed"
 
     @pytest.fixture(autouse=True)
     def loader(self, fake_packages):
-        self.loader = plaster.get_loader(self.config_uri, protocols=['wsgi'])
+        self.loader = plaster.get_loader(self.config_uri, protocols=["wsgi"])
 
     def test_it(self):
         conf = self.loader.get_wsgi_app_settings()
@@ -51,4 +62,4 @@
 
     def test_invalid_name(self):
         with pytest.raises(LookupError):
-            self.loader.get_wsgi_app_settings('invalid')
+            self.loader.get_wsgi_app_settings("invalid")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/plaster_pastedeploy-0.4.1/tests/test_get_wsgi_filter.py 
new/plaster_pastedeploy-0.7/tests/test_get_wsgi_filter.py
--- old/plaster_pastedeploy-0.4.1/tests/test_get_wsgi_filter.py 2017-06-02 
07:28:54.000000000 +0200
+++ new/plaster_pastedeploy-0.7/tests/test_get_wsgi_filter.py   2019-04-12 
07:45:29.000000000 +0200
@@ -4,7 +4,7 @@
 
 here = os.path.dirname(__file__)
 
-test_filter_path = 'sample_configs/test_filter.ini'
+test_filter_path = "sample_configs/test_filter.ini"
 
 
 class TestSimpleURI(object):
@@ -13,67 +13,73 @@
     @pytest.fixture(autouse=True)
     def loader(self, fake_packages, monkeypatch):
         monkeypatch.chdir(here)
-        self.loader = plaster.get_loader(self.config_uri, protocols=['wsgi'])
+        self.loader = plaster.get_loader(self.config_uri, protocols=["wsgi"])
 
     def test_get_wsgi_filter(self):
         import fakeapp.apps
-        app_filter_factory = self.loader.get_wsgi_filter('filt')
+
+        app_filter_factory = self.loader.get_wsgi_filter("filt")
 
         other_loader = plaster.get_loader(
-            'sample_configs/basic_app.ini', protocols=['wsgi'])
+            "sample_configs/basic_app.ini", protocols=["wsgi"]
+        )
         app = other_loader.get_wsgi_app()
         app_filter = app_filter_factory(app)
 
         assert isinstance(app_filter, fakeapp.apps.CapFilter)
-        assert app_filter.method_to_call == 'lower'
+        assert app_filter.method_to_call == "lower"
         assert app_filter.app is fakeapp.apps.basic_app
 
     def test_invalid_name(self):
         with pytest.raises(LookupError):
-            self.loader.get_wsgi_filter('invalid')
+            self.loader.get_wsgi_filter("invalid")
 
 
 class TestSectionedURI(TestSimpleURI):
-    config_uri = test_filter_path + '#filt'
+    config_uri = test_filter_path + "#filt"
 
     def test_get_wsgi_filter(self):
         import fakeapp.apps
+
         app_filter_factory = self.loader.get_wsgi_filter()
 
         other_loader = plaster.get_loader(
-            'pastedeploy+ini:sample_configs/basic_app.ini#main',
-            protocols=['wsgi'])
+            "pastedeploy+ini:sample_configs/basic_app.ini#main",
+            protocols=["wsgi"],
+        )
         app = other_loader.get_wsgi_app()
         app_filter = app_filter_factory(app)
 
         assert isinstance(app_filter, fakeapp.apps.CapFilter)
-        assert app_filter.method_to_call == 'lower'
+        assert app_filter.method_to_call == "lower"
         assert app_filter.app is fakeapp.apps.basic_app
 
 
 class TestSchemeAndSectionedURI(TestSectionedURI):
-    config_uri = 'pastedeploy+ini:' + test_filter_path + '#filt'
+    config_uri = "pastedeploy+ini:" + test_filter_path + "#filt"
 
 
 class TestEggURI(object):
-    config_uri = 'egg:FakeApp#caps'
+    config_uri = "egg:FakeApp#caps"
 
     @pytest.fixture(autouse=True)
     def loader(self, fake_packages):
-        self.loader = plaster.get_loader(self.config_uri, protocols=['wsgi'])
+        self.loader = plaster.get_loader(self.config_uri, protocols=["wsgi"])
 
     def test_it(self):
         import fakeapp.apps
+
         filter = self.loader.get_wsgi_filter()
-        filtered_app = filter('foo')
+        filtered_app = filter("foo")
         assert isinstance(filtered_app, fakeapp.apps.CapFilter)
 
     def test_it_override_name(self):
         import fakeapp.apps
-        filter = self.loader.get_wsgi_filter('caps')
-        filtered_app = filter('foo')
+
+        filter = self.loader.get_wsgi_filter("caps")
+        filtered_app = filter("foo")
         assert isinstance(filtered_app, fakeapp.apps.CapFilter)
 
     def test_invalid_name(self):
         with pytest.raises(LookupError):
-            self.loader.get_wsgi_filter('invalid')
+            self.loader.get_wsgi_filter("invalid")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/plaster_pastedeploy-0.4.1/tests/test_get_wsgi_server.py 
new/plaster_pastedeploy-0.7/tests/test_get_wsgi_server.py
--- old/plaster_pastedeploy-0.4.1/tests/test_get_wsgi_server.py 2017-06-02 
07:28:54.000000000 +0200
+++ new/plaster_pastedeploy-0.7/tests/test_get_wsgi_server.py   2019-04-12 
07:41:48.000000000 +0200
@@ -4,7 +4,7 @@
 
 here = os.path.dirname(__file__)
 
-test_config_path = 'sample_configs/test_config.ini'
+test_config_path = "sample_configs/test_config.ini"
 
 
 class TestSimpleURI(object):
@@ -13,52 +13,52 @@
     @pytest.fixture(autouse=True)
     def loader(self, fake_packages, monkeypatch):
         monkeypatch.chdir(here)
-        self.loader = plaster.get_loader(self.config_uri, protocols=['wsgi'])
+        self.loader = plaster.get_loader(self.config_uri, protocols=["wsgi"])
 
     def test_get_wsgi_server_default(self):
         server = self.loader.get_wsgi_server()
         dummy_app = object()
         result = server(dummy_app)
         assert result is dummy_app
-        assert server.settings['foo'] == 'main'
+        assert server.settings["foo"] == "main"
 
     def test_invalid_name(self):
         with pytest.raises(LookupError):
-            self.loader.get_wsgi_server('invalid')
+            self.loader.get_wsgi_server("invalid")
 
 
 class TestSectionedURI(TestSimpleURI):
-    config_uri = test_config_path + '#other'
+    config_uri = test_config_path + "#other"
 
     def test_get_wsgi_server_default(self):
         server = self.loader.get_wsgi_server()
         dummy_app = object()
         result = server(dummy_app)
         assert result is dummy_app
-        assert server.settings['foo'] == 'other'
+        assert server.settings["foo"] == "other"
 
 
 class TestSchemeAndSectionedURI(TestSectionedURI):
-    config_uri = 'pastedeploy+ini:' + test_config_path + '#other'
+    config_uri = "pastedeploy+ini:" + test_config_path + "#other"
 
 
 class TestEggURI(object):
-    config_uri = 'egg:FakeApp#fake'
+    config_uri = "egg:FakeApp#fake"
 
     @pytest.fixture(autouse=True)
     def loader(self, fake_packages):
-        self.loader = plaster.get_loader(self.config_uri, protocols=['wsgi'])
+        self.loader = plaster.get_loader(self.config_uri, protocols=["wsgi"])
 
     def test_it(self):
         server = self.loader.get_wsgi_server()
-        result = server('foo')
-        assert result == 'foo'
+        result = server("foo")
+        assert result == "foo"
 
     def test_it_override_name(self):
-        server = self.loader.get_wsgi_server('fake')
-        result = server('foo')
-        assert result == 'foo'
+        server = self.loader.get_wsgi_server("fake")
+        result = server("foo")
+        assert result == "foo"
 
     def test_invalid_name(self):
         with pytest.raises(LookupError):
-            self.loader.get_wsgi_server('invalid')
+            self.loader.get_wsgi_server("invalid")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/plaster_pastedeploy-0.4.1/tests/test_loader.py 
new/plaster_pastedeploy-0.7/tests/test_loader.py
--- old/plaster_pastedeploy-0.4.1/tests/test_loader.py  2017-06-02 
07:28:54.000000000 +0200
+++ new/plaster_pastedeploy-0.7/tests/test_loader.py    2019-04-12 
07:41:48.000000000 +0200
@@ -1,8 +1,10 @@
 import plaster
 
+
 def test___repr__():
     from plaster_pastedeploy import Loader
-    uri = plaster.PlasterURL('pastedeploy+ini', 'development.ini')
+
+    uri = plaster.PlasterURL("pastedeploy+ini", "development.ini")
     loader = Loader(uri)
     assert str(loader) == (
         'plaster_pastedeploy.Loader(uri="pastedeploy+ini://development.ini")'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/plaster_pastedeploy-0.4.1/tests/test_setup_logging.py 
new/plaster_pastedeploy-0.7/tests/test_setup_logging.py
--- old/plaster_pastedeploy-0.4.1/tests/test_setup_logging.py   2017-07-11 
06:42:20.000000000 +0200
+++ new/plaster_pastedeploy-0.7/tests/test_setup_logging.py     2019-04-12 
07:41:48.000000000 +0200
@@ -4,7 +4,7 @@
 
 here = os.path.dirname(__file__)
 
-test_config_relpath = 'sample_configs/test_config.ini'
+test_config_relpath = "sample_configs/test_config.ini"
 test_config_path = os.path.abspath(os.path.join(here, test_config_relpath))
 
 
@@ -13,8 +13,8 @@
     def logging(self, fake_packages, monkeypatch):
         self.basicConfig = DummyFileConfig()
         self.fileConfig = DummyFileConfig()
-        monkeypatch.setattr('logging.basicConfig', self.basicConfig)
-        monkeypatch.setattr('plaster_pastedeploy.fileConfig', self.fileConfig)
+        monkeypatch.setattr("logging.basicConfig", self.basicConfig)
+        monkeypatch.setattr("plaster_pastedeploy.fileConfig", self.fileConfig)
         monkeypatch.chdir(here)
 
     def _makeOne(self, uri=None):
@@ -29,8 +29,8 @@
 
         path, defaults = self.fileConfig.args
         assert path == test_config_relpath
-        assert defaults['__file__'] == test_config_path
-        assert defaults['here'] == os.path.dirname(test_config_path)
+        assert defaults["__file__"] == test_config_path
+        assert defaults["here"] == os.path.dirname(test_config_path)
 
     def test_it_global_conf_empty(self):
         loader = self._makeOne()
@@ -39,20 +39,20 @@
 
         path, defaults = self.fileConfig.args
         assert path == test_config_relpath
-        assert defaults['__file__'] == test_config_path
-        assert defaults['here'] == os.path.dirname(test_config_path)
+        assert defaults["__file__"] == test_config_path
+        assert defaults["here"] == os.path.dirname(test_config_path)
 
     def test_it_global_conf_not_empty(self):
-        defaults = {'key': 'val'}
+        defaults = {"key": "val"}
         loader = self._makeOne()
         loader.setup_logging(defaults=defaults)
         assert self.fileConfig.called
 
         path, defaults = self.fileConfig.args
         assert path == test_config_relpath
-        assert defaults['__file__'] == test_config_path
-        assert defaults['here'] == os.path.dirname(test_config_path)
-        assert defaults['key'] == 'val'
+        assert defaults["__file__"] == test_config_path
+        assert defaults["here"] == os.path.dirname(test_config_path)
+        assert defaults["key"] == "val"
 
     def test_no_logging_section(self):
         loader = self._makeOne()
@@ -63,12 +63,18 @@
         assert self.basicConfig.kwargs == {}
 
     def test_egg_uri(self):
-        loader = self._makeOne('egg:FakeApp#fake')
+        loader = self._makeOne("egg:FakeApp#fake")
         loader.setup_logging()
         assert self.basicConfig.called
         assert self.basicConfig.args == ()
         assert self.basicConfig.kwargs == {}
 
+    def test_it_keeps_existing_loggers(self):
+        loader = self._makeOne()
+        loader.setup_logging()
+        assert self.fileConfig.called
+        assert self.fileConfig.kwargs["disable_existing_loggers"] is False
+
 
 class DummyFileConfig(object):
     called = False
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/plaster_pastedeploy-0.4.1/tox.ini 
new/plaster_pastedeploy-0.7/tox.ini
--- old/plaster_pastedeploy-0.4.1/tox.ini       2017-07-01 17:42:22.000000000 
+0200
+++ new/plaster_pastedeploy-0.7/tox.ini 2019-04-12 07:54:51.000000000 +0200
@@ -1,33 +1,24 @@
 [tox]
 envlist =
     lint,
-    py27,py34,py35,py36,pypy,
+    py27,py34,py35,py36,pypy,pypy3,
     coverage
 
 [testenv]
-basepython =
-    py27: python2.7
-    py34: python3.4
-    py35: python3.5
-    py36: python3.6
-    pypy: pypy
-    py2: python2.7
-    py3: python3.5
-    pypy3: pypy3
-
 commands =
-    pip install plaster_pastedeploy[testing]
     py.test --cov --cov-report= {posargs:}
 
 setenv =
     COVERAGE_FILE=.coverage.{envname}
 
+extras =
+    testing
+
 deps =
     py27: configparser
 
 [testenv:coverage]
 skip_install = True
-basepython = python3.5
 commands =
     coverage combine
     coverage report --fail-under=100
@@ -37,13 +28,35 @@
     COVERAGE_FILE=.coverage
 
 [testenv:lint]
-skip_install = True
-basepython = python3.5
+skip_install = true
 commands =
     flake8 src/plaster_pastedeploy/
+    black --check --diff src/plaster_pastedeploy tests setup.py
     python setup.py check -r -s -m
     check-manifest
 deps =
+    black
+    check-manifest
     flake8
     readme_renderer
-    check-manifest
+
+[testenv:black]
+skip_install = true
+commands =
+    black src/plaster_pastedeploy tests setup.py
+deps =
+    black
+
+[testenv:build]
+skip_install = true
+commands =
+    # clean up build/ and dist/ folders
+    python -c 'import shutil; shutil.rmtree("dist", ignore_errors=True)'
+    python setup.py clean --all
+    # build sdist
+    python setup.py sdist --dist-dir {toxinidir}/dist
+    # build wheel from sdist
+    pip wheel -v --no-deps --no-index --no-build-isolation --wheel-dir 
{toxinidir}/dist --find-links {toxinidir}/dist plaster_pastedeploy
+deps =
+    setuptools
+    wheel


Reply via email to