diff --git a/CHANGES.txt b/CHANGES.txt index 75c4b34..10fc493 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -5,7 +5,7 @@ Changes 1.2 (unreleased) ================ -- Nothing changed yet. +- Add support for Python 3.8 and 3.9. 1.1 (2018-11-07) diff --git a/setup.py b/setup.py index bee9dec..f766753 100644 --- a/setup.py +++ b/setup.py @@ -22,6 +22,7 @@ def read_file(*args): with open(path, 'r') as f: return f.read() + '\n\n' + setup( name='zc.sourcefactory', version='1.2.dev0', @@ -56,6 +57,8 @@ def read_file(*args): 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: Implementation :: CPython', 'Natural Language :: English', 'Operating System :: OS Independent', diff --git a/src/zc/__init__.py b/src/zc/__init__.py index 849d98f..656dc0f 100644 --- a/src/zc/__init__.py +++ b/src/zc/__init__.py @@ -1,7 +1 @@ -# This directory is a Python namespace package. -try: - import pkg_resources - pkg_resources.declare_namespace(__name__) -except ImportError: - import pkgutil - __path__ = pkgutil.extend_path(__path__, __name__) +__import__('pkg_resources').declare_namespace(__name__) # pragma: no cover diff --git a/src/zc/sourcefactory/adapters.py b/src/zc/sourcefactory/adapters.py index dd36915..e85b4c9 100644 --- a/src/zc/sourcefactory/adapters.py +++ b/src/zc/sourcefactory/adapters.py @@ -20,6 +20,7 @@ import zope.component import zc.sourcefactory.source + @zope.interface.implementer(zope.schema.interfaces.ISourceQueriables) @zope.component.adapter(zc.sourcefactory.source.FactoredSource) def getSourceQueriables(factored_source): diff --git a/src/zc/sourcefactory/basic.py b/src/zc/sourcefactory/basic.py index 094afb9..cd2e9c8 100644 --- a/src/zc/sourcefactory/basic.py +++ b/src/zc/sourcefactory/basic.py @@ -22,6 +22,7 @@ import zc.sourcefactory.factories import zc.sourcefactory.policies + class BasicSourceFactory(zc.sourcefactory.factories.BasicSourceFactory, zc.sourcefactory.policies.BasicSourcePolicy): """Basic source factory implementation including a factory and the diff --git a/src/zc/sourcefactory/browser/mapping.py b/src/zc/sourcefactory/browser/mapping.py index 7a0a0c8..1246574 100644 --- a/src/zc/sourcefactory/browser/mapping.py +++ b/src/zc/sourcefactory/browser/mapping.py @@ -24,12 +24,12 @@ @zope.interface.implementer(zope.browser.interfaces.ITerms) class MappedTerms(object): - """A terms implementation that knows how to handle a source that was + """A terms implementation that knows how to handle a source that was created through a source factory. """ zope.component.adapts(zc.sourcefactory.mapping.ValueMappingSource, - zope.publisher.interfaces.browser.IBrowserRequest) + zope.publisher.interfaces.browser.IBrowserRequest) def __init__(self, source, request): self.base = zope.component.getMultiAdapter( diff --git a/src/zc/sourcefactory/browser/tests.py b/src/zc/sourcefactory/browser/tests.py index 5da5614..fca9ab4 100644 --- a/src/zc/sourcefactory/browser/tests.py +++ b/src/zc/sourcefactory/browser/tests.py @@ -18,12 +18,13 @@ from zc.sourcefactory.tests import setUp, tearDown, checker + def test_suite(): return unittest.TestSuite(( - doctest.DocFileSuite( - 'token.txt', setUp=setUp, tearDown=tearDown, - checker=checker, optionflags=doctest.ELLIPSIS), - doctest.DocFileSuite( - 'README.txt', setUp=setUp, tearDown=tearDown, - checker=checker, optionflags=doctest.ELLIPSIS), - )) + doctest.DocFileSuite( + 'token.txt', setUp=setUp, tearDown=tearDown, + checker=checker, optionflags=doctest.ELLIPSIS), + doctest.DocFileSuite( + 'README.txt', setUp=setUp, tearDown=tearDown, + checker=checker, optionflags=doctest.ELLIPSIS), + )) diff --git a/src/zc/sourcefactory/browser/token.py b/src/zc/sourcefactory/browser/token.py index 261265f..47bbcef 100644 --- a/src/zc/sourcefactory/browser/token.py +++ b/src/zc/sourcefactory/browser/token.py @@ -34,6 +34,7 @@ PY3 = sys.version_info[0] == 3 + @zope.component.adapter(bytes) @zope.interface.implementer(zc.sourcefactory.interfaces.IToken) def fromString(value): diff --git a/src/zc/sourcefactory/contextual.py b/src/zc/sourcefactory/contextual.py index 2ea11bf..f106177 100644 --- a/src/zc/sourcefactory/contextual.py +++ b/src/zc/sourcefactory/contextual.py @@ -22,6 +22,6 @@ class BasicContextualSourceFactory( - zc.sourcefactory.factories.ContextualSourceFactory, - zc.sourcefactory.policies.BasicContextualSourcePolicy): + zc.sourcefactory.factories.ContextualSourceFactory, + zc.sourcefactory.policies.BasicContextualSourcePolicy): """Abstract base implementation for a basic contextual source factory.""" diff --git a/src/zc/sourcefactory/interfaces.py b/src/zc/sourcefactory/interfaces.py index 85111fe..6105005 100644 --- a/src/zc/sourcefactory/interfaces.py +++ b/src/zc/sourcefactory/interfaces.py @@ -20,6 +20,7 @@ import zope.interface import zope.schema.interfaces + class ISourceFactory(zope.interface.Interface): def __call__(): @@ -133,10 +134,11 @@ def filterValue(context, value): # Standard combined policies + class ISourcePolicy(ITokenPolicy, ITermPolicy, IValuePolicy): pass class IContextualSourcePolicy( - ITokenPolicy, IContextualTermPolicy, IContextualValuePolicy): + ITokenPolicy, IContextualTermPolicy, IContextualValuePolicy): pass diff --git a/src/zc/sourcefactory/policies.py b/src/zc/sourcefactory/policies.py index d0d3dc0..019e9ce 100644 --- a/src/zc/sourcefactory/policies.py +++ b/src/zc/sourcefactory/policies.py @@ -26,11 +26,12 @@ try: unicode except NameError: - # Py3: Define unicode + # PY3: Define unicode unicode = str # Term policies + @zope.interface.implementer(zc.sourcefactory.interfaces.ITermPolicy) class BasicTermPolicy(object): """A basic term policy. @@ -54,7 +55,8 @@ def getTitle(self, value): if md: title = md.title else: - title = value.decode() if isinstance(value, bytes) else unicode(value) + title = value.decode() if isinstance(value, + bytes) else unicode(value) return title @@ -156,8 +158,9 @@ class BasicValuePolicy(object): def filterValue(self, value): return True + @zope.interface.implementer( - zc.sourcefactory.interfaces.IContextualValuePolicy) + zc.sourcefactory.interfaces.IContextualValuePolicy) class BasicContextualValuePolicy(BasicValuePolicy): """An abstract basic value policy. @@ -177,7 +180,9 @@ class BasicSourcePolicy(BasicValuePolicy, BasicTokenPolicy, BasicTermPolicy): class BasicContextualSourcePolicy( - BasicContextualValuePolicy, BasicContextualTokenPolicy, BasicContextualTermPolicy): + BasicContextualValuePolicy, + BasicContextualTokenPolicy, + BasicContextualTermPolicy): pass diff --git a/src/zc/sourcefactory/tests.py b/src/zc/sourcefactory/tests.py index 1c63134..1cb15da 100644 --- a/src/zc/sourcefactory/tests.py +++ b/src/zc/sourcefactory/tests.py @@ -46,7 +46,8 @@ # Python 3 adds module name to exceptions. (re.compile("zope.security.interfaces.ForbiddenAttribute"), r"ForbiddenAttribute"), - ]) +]) + class ConnectionStub(object): @@ -56,7 +57,7 @@ def __call__(self, obj): return self def add(self, obj): - self._id +=1 + self._id += 1 obj._p_oid = ZODB.utils.p64(self._id) @@ -67,18 +68,20 @@ def setUp(test): ConnectionStub(), (IFolder,), ZODB.interfaces.IConnection) test.globs['rootFolder'] = folder.rootFolder() + def tearDown(test): testing.tearDown(test) + def test_suite(): return unittest.TestSuite(( - doctest.DocFileSuite( - 'README.txt'), - doctest.DocFileSuite( - 'mapping.txt'), - doctest.DocFileSuite( - 'constructors.txt'), - doctest.DocFileSuite( - 'adapters.txt', setUp=setUp, tearDown=tearDown, - optionflags=doctest.ELLIPSIS), - )) + doctest.DocFileSuite( + 'README.txt'), + doctest.DocFileSuite( + 'mapping.txt'), + doctest.DocFileSuite( + 'constructors.txt'), + doctest.DocFileSuite( + 'adapters.txt', setUp=setUp, tearDown=tearDown, + optionflags=doctest.ELLIPSIS), + ))