From 56741e7630b00a476a02f16cb909f05dd3300376 Mon Sep 17 00:00:00 2001 From: Jason Madden Date: Thu, 28 Sep 2017 12:56:40 -0500 Subject: [PATCH 1/2] Move the heavy browser dependencies to a 'browser' extra And make the tests that rely on them conditional. Ensure that the ZCML can be executed either way, though. Add tox and Travis environments to be sure this is exercised. Also: - Rename remaining .txt to .rst - Drop support for Python 3.3 - Badges in readme. - setup.cfg for universal wheels. --- .travis.yml | 40 ++++---- CHANGES.rst | 8 +- MANIFEST.in | 2 + README.rst | 11 +++ setup.cfg | 2 + setup.py | 95 ++++++++++--------- src/zope/__init__.py | 2 +- src/zope/mimetype/{README.txt => README.rst} | 0 src/zope/mimetype/{TODO.txt => TODO.rst} | 0 src/zope/mimetype/{codec.txt => codec.rst} | 0 .../mimetype/{configure.txt => configure.rst} | 16 +++- src/zope/mimetype/configure.zcml | 43 +++++---- .../{constraints.txt => constraints.rst} | 0 .../{contentinfo.txt => contentinfo.rst} | 0 src/zope/mimetype/{event.txt => event.rst} | 0 ...me_types.txt => retrieving_mime_types.rst} | 0 src/zope/mimetype/{source.txt => source.rst} | 0 src/zope/mimetype/tests/test_doctests.py | 66 +++++++------ .../{typegetter.txt => typegetter.rst} | 0 src/zope/mimetype/{utils.txt => utils.rst} | 0 src/zope/mimetype/{widget.txt => widget.rst} | 0 src/zope/mimetype/zcml.py | 15 ++- tox.ini | 20 +++- 23 files changed, 193 insertions(+), 127 deletions(-) create mode 100644 setup.cfg rename src/zope/mimetype/{README.txt => README.rst} (100%) rename src/zope/mimetype/{TODO.txt => TODO.rst} (100%) rename src/zope/mimetype/{codec.txt => codec.rst} (100%) rename src/zope/mimetype/{configure.txt => configure.rst} (66%) rename src/zope/mimetype/{constraints.txt => constraints.rst} (100%) rename src/zope/mimetype/{contentinfo.txt => contentinfo.rst} (100%) rename src/zope/mimetype/{event.txt => event.rst} (100%) rename src/zope/mimetype/{retrieving_mime_types.txt => retrieving_mime_types.rst} (100%) rename src/zope/mimetype/{source.txt => source.rst} (100%) rename src/zope/mimetype/{typegetter.txt => typegetter.rst} (100%) rename src/zope/mimetype/{utils.txt => utils.rst} (100%) rename src/zope/mimetype/{widget.txt => widget.rst} (100%) diff --git a/.travis.yml b/.travis.yml index 9175ac0..c301056 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,28 +1,26 @@ language: python sudo: false python: - - 2.7 - - 3.3 - - 3.4 - - 3.5 - - 3.6 - - pypy-5.4.1 - - pypy3.3-5.2-alpha1 + - 2.7 + - 3.4 + - 3.5 + - 3.6 + - pypy + - pypy3 +env: + - DEP=test +matrix: + include: + - python: 2.7 + env: DEP= +install: + - pip install -U pip setuptools + - pip install -U coverage coveralls zope.testing zope.testrunner + - pip install -U -e .[$DEP] script: - - coverage run -m zope.testrunner --test-path=src --auto-color --auto-progress - + - coverage run -m zope.testrunner --test-path=src after_success: - - coveralls + - coveralls notifications: - email: false - -install: - - pip install -U pip setuptools - - pip install -U coveralls coverage zope.testrunner - - pip install -U -e ".[test]" - - + email: false cache: pip - -before_cache: - - rm -f $HOME/.cache/pip/log/debug.log diff --git a/CHANGES.rst b/CHANGES.rst index 29f7382..8b2597f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,10 +1,14 @@ Changes ======= -2.2.1 (unreleased) +2.3.0 (unreleased) ------------------ -- TBD +- Drop support for Python 3.3. + +- Move the dependencies on ``zope.browser``, ``zope.publisher`` and + ``zope.formlib`` (only needed to use the ``source`` and ``widget`` + modules) into a new ``browser`` extra. 2.2.0 (2017-04-24) ------------------ diff --git a/MANIFEST.in b/MANIFEST.in index e9ec60d..45019b2 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -3,6 +3,8 @@ include *.txt include *.py include buildout.cfg include tox.ini +include .travis.yml +include .coveragerc recursive-include src * diff --git a/README.rst b/README.rst index fae2a10..e937217 100644 --- a/README.rst +++ b/README.rst @@ -1,9 +1,20 @@ ``zope.mimetype`` ================= +.. image:: https://img.shields.io/pypi/v/zope.mimetype.svg + :target: https://pypi.python.org/pypi/zope.mimetype/ + :alt: Latest release + +.. image:: https://img.shields.io/pypi/pyversions/zope.mimetype.svg + :target: https://pypi.org/project/zope.mimetype/ + :alt: Supported Python versions + .. image:: https://travis-ci.org/zopefoundation/zope.mimetype.png?branch=master :target: https://travis-ci.org/zopefoundation/zope.mimetype +.. image:: https://coveralls.io/repos/github/zopefoundation/zope.mimetype/badge.svg?branch=master + :target: https://coveralls.io/github/zopefoundation/zope.mimetype?branch=master + This package provides a way to work with MIME content types. There are several interfaces defined here, many of which are used primarily to look things up based on different bits of information. diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..2a9acf1 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,2 @@ +[bdist_wheel] +universal = 1 diff --git a/setup.py b/setup.py index 8132f58..2177af4 100644 --- a/setup.py +++ b/setup.py @@ -25,38 +25,50 @@ def read(*rnames): with open(os.path.join(os.path.dirname(__file__), *rnames)) as f: return f.read() +BROWSER_REQUIRES = [ + 'zope.browser', # ITerms in source.py + 'zope.browserresource', # metaconfigure for icon in zcml.py + 'zope.formlib>=4.0', # widget.py + 'zope.publisher', # IBrowserRequest +] + +TEST_REQUIRES = BROWSER_REQUIRES + [ + 'zope.testing', + 'zope.testrunner', +] + setup(name='zope.mimetype', - version='2.2.1.dev0', + version='2.3.0.dev0', author='Zope Foundation and Contributors', author_email='zope-dev@zope.org', - description = "A simple package for working with MIME content types", + description="A simple package for working with MIME content types", long_description=( read('README.rst') + '\n\n' + - read('src', 'zope', 'mimetype', 'README.txt') + read('src', 'zope', 'mimetype', 'README.rst') + '\n\n' + - read('src', 'zope', 'mimetype', 'retrieving_mime_types.txt') + read('src', 'zope', 'mimetype', 'retrieving_mime_types.rst') + '\n\n' + - read('src', 'zope', 'mimetype', 'codec.txt') + read('src', 'zope', 'mimetype', 'codec.rst') + '\n\n' + - read('src', 'zope', 'mimetype', 'constraints.txt') + read('src', 'zope', 'mimetype', 'constraints.rst') + '\n\n' + - read('src', 'zope', 'mimetype', 'contentinfo.txt') + read('src', 'zope', 'mimetype', 'contentinfo.rst') + '\n\n' + - read('src', 'zope', 'mimetype', 'event.txt') + read('src', 'zope', 'mimetype', 'event.rst') + '\n\n' + - read('src', 'zope', 'mimetype', 'typegetter.txt') + read('src', 'zope', 'mimetype', 'typegetter.rst') + '\n\n' + - read('src', 'zope', 'mimetype', 'source.txt') + read('src', 'zope', 'mimetype', 'source.rst') + '\n\n' + - read('src', 'zope', 'mimetype', 'widget.txt') + read('src', 'zope', 'mimetype', 'widget.rst') + '\n\n' + - read('src', 'zope', 'mimetype', 'utils.txt') + read('src', 'zope', 'mimetype', 'utils.rst') + '\n\n' + read('CHANGES.rst') - ), - keywords = "file content mimetype", - classifiers = [ + ), + keywords="file content mimetype", + classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Web Environment', 'Intended Audience :: Developers', @@ -65,7 +77,6 @@ def read(*rnames): 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.3', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', @@ -75,37 +86,29 @@ def read(*rnames): 'Operating System :: OS Independent', 'Topic :: Internet :: WWW/HTTP', 'Framework :: Zope3'], - url='http://pypi.python.org/pypi/zope.mimetype', + url='https://github.com/zopefoundation/zope.mimetype', license='ZPL 2.1', packages=find_packages('src'), - package_dir = {'': 'src'}, + package_dir={'': 'src'}, namespace_packages=['zope'], - extras_require = dict( - test=[ - 'zope.component', - 'zope.testing', - ] - ), - install_requires=['setuptools', - 'zope.browser', - 'zope.browserresource', - 'zope.component', - 'zope.configuration', - 'zope.contenttype>=3.5', - 'zope.event', - 'zope.formlib>=4.0', - 'zope.i18n', - 'zope.i18nmessageid', - 'zope.interface', - 'zope.publisher', - 'zope.schema', - 'zope.security', - ], - tests_require=[ - 'zope.component', - 'zope.testing', - ], + extras_require={ + 'test': TEST_REQUIRES, + 'browser': BROWSER_REQUIRES, + }, + install_requires=[ + 'setuptools', + 'zope.component', + 'zope.configuration', + 'zope.contenttype>=3.5', + 'zope.event', + 'zope.i18n', + 'zope.i18nmessageid', + 'zope.interface', + 'zope.schema', + 'zope.security', + ], + tests_require=TEST_REQUIRES, test_suite='zope.mimetype.tests', - include_package_data = True, - zip_safe = False, - ) + include_package_data=True, + zip_safe=False, +) diff --git a/src/zope/__init__.py b/src/zope/__init__.py index de40ea7..2cdb0e4 100644 --- a/src/zope/__init__.py +++ b/src/zope/__init__.py @@ -1 +1 @@ -__import__('pkg_resources').declare_namespace(__name__) +__import__('pkg_resources').declare_namespace(__name__) # pragma: no cover diff --git a/src/zope/mimetype/README.txt b/src/zope/mimetype/README.rst similarity index 100% rename from src/zope/mimetype/README.txt rename to src/zope/mimetype/README.rst diff --git a/src/zope/mimetype/TODO.txt b/src/zope/mimetype/TODO.rst similarity index 100% rename from src/zope/mimetype/TODO.txt rename to src/zope/mimetype/TODO.rst diff --git a/src/zope/mimetype/codec.txt b/src/zope/mimetype/codec.rst similarity index 100% rename from src/zope/mimetype/codec.txt rename to src/zope/mimetype/codec.rst diff --git a/src/zope/mimetype/configure.txt b/src/zope/mimetype/configure.rst similarity index 66% rename from src/zope/mimetype/configure.txt rename to src/zope/mimetype/configure.rst index 0eed822..7055ddb 100644 --- a/src/zope/mimetype/configure.txt +++ b/src/zope/mimetype/configure.rst @@ -12,8 +12,18 @@ adapters and utilities and a couple of views: >>> XMLConfig('configure.zcml', zope.mimetype)() - >>> len(list(zope.component.getGlobalSiteManager().registeredUtilities())) >= 760 + >>> len(list(zope.component.getGlobalSiteManager().registeredUtilities())) >= 755 True - >>> len(list(zope.component.getGlobalSiteManager().registeredAdapters())) - 107 + +The 'zmi_icon' adapters are only installed if zope.browserresource +is available: + + >>> try: + ... import zope.browserresource + ... except ImportError: + ... expected = 1 + ... else: + ... expected = 107 + >>> len(list(zope.component.getGlobalSiteManager().registeredAdapters())) == expected + True diff --git a/src/zope/mimetype/configure.zcml b/src/zope/mimetype/configure.zcml index e03fea0..6c4de06 100644 --- a/src/zope/mimetype/configure.zcml +++ b/src/zope/mimetype/configure.zcml @@ -1,5 +1,6 @@ @@ -21,25 +22,29 @@ /> - - - - - + + + + + + + + + diff --git a/src/zope/mimetype/constraints.txt b/src/zope/mimetype/constraints.rst similarity index 100% rename from src/zope/mimetype/constraints.txt rename to src/zope/mimetype/constraints.rst diff --git a/src/zope/mimetype/contentinfo.txt b/src/zope/mimetype/contentinfo.rst similarity index 100% rename from src/zope/mimetype/contentinfo.txt rename to src/zope/mimetype/contentinfo.rst diff --git a/src/zope/mimetype/event.txt b/src/zope/mimetype/event.rst similarity index 100% rename from src/zope/mimetype/event.txt rename to src/zope/mimetype/event.rst diff --git a/src/zope/mimetype/retrieving_mime_types.txt b/src/zope/mimetype/retrieving_mime_types.rst similarity index 100% rename from src/zope/mimetype/retrieving_mime_types.txt rename to src/zope/mimetype/retrieving_mime_types.rst diff --git a/src/zope/mimetype/source.txt b/src/zope/mimetype/source.rst similarity index 100% rename from src/zope/mimetype/source.txt rename to src/zope/mimetype/source.rst diff --git a/src/zope/mimetype/tests/test_doctests.py b/src/zope/mimetype/tests/test_doctests.py index 534f1f6..3780617 100644 --- a/src/zope/mimetype/tests/test_doctests.py +++ b/src/zope/mimetype/tests/test_doctests.py @@ -37,48 +37,58 @@ r"builtins"), ]) +def optional_test_suite_setUp(required_module): + + def setUp(test): + import importlib + try: + importlib.import_module(required_module) + except ImportError: + raise unittest.SkipTest("Required module %r missing" % (required_module,)) + testing.setUp(test) + return setUp def test_suite(): return unittest.TestSuite(( doctest.DocFileSuite( - '../retrieving_mime_types.txt', - setUp=testing.setUp, tearDown=testing.tearDown, - checker=checker), + '../retrieving_mime_types.rst', + setUp=testing.setUp, tearDown=testing.tearDown, + checker=checker), doctest.DocFileSuite( - '../event.txt', - setUp=testing.setUp, tearDown=testing.tearDown, - globs={'print_function': print_function}, - checker=checker), + '../event.rst', + setUp=testing.setUp, tearDown=testing.tearDown, + globs={'print_function': print_function}, + checker=checker), doctest.DocFileSuite( - '../source.txt', - setUp=testing.setUp, tearDown=testing.tearDown, - checker=checker), + '../source.rst', + setUp=optional_test_suite_setUp('zope.browser'), tearDown=testing.tearDown, + checker=checker), doctest.DocFileSuite( - '../constraints.txt', - checker=checker), + '../constraints.rst', + checker=checker), doctest.DocFileSuite( - '../contentinfo.txt', - setUp=testing.setUp, tearDown=testing.tearDown, - checker=checker), + '../contentinfo.rst', + setUp=testing.setUp, tearDown=testing.tearDown, + checker=checker), doctest.DocFileSuite( - '../typegetter.txt', - checker=checker), + '../typegetter.rst', + checker=checker), doctest.DocFileSuite( - '../utils.txt', - checker=checker), + '../utils.rst', + checker=checker), doctest.DocFileSuite( - '../widget.txt', - setUp=testing.setUp, tearDown=testing.tearDown, - checker=checker), + '../widget.rst', + setUp=optional_test_suite_setUp('zope.publisher'), tearDown=testing.tearDown, + checker=checker), doctest.DocFileSuite( - '../codec.txt', - optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS, - checker=checker, + '../codec.rst', + optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS, + checker=checker, ), doctest.DocFileSuite( - '../configure.txt', - setUp=testing.setUp, tearDown=testing.tearDown, - checker=checker + '../configure.rst', + setUp=testing.setUp, tearDown=testing.tearDown, + checker=checker ), )) diff --git a/src/zope/mimetype/typegetter.txt b/src/zope/mimetype/typegetter.rst similarity index 100% rename from src/zope/mimetype/typegetter.txt rename to src/zope/mimetype/typegetter.rst diff --git a/src/zope/mimetype/utils.txt b/src/zope/mimetype/utils.rst similarity index 100% rename from src/zope/mimetype/utils.txt rename to src/zope/mimetype/utils.rst diff --git a/src/zope/mimetype/widget.txt b/src/zope/mimetype/widget.rst similarity index 100% rename from src/zope/mimetype/widget.txt rename to src/zope/mimetype/widget.rst diff --git a/src/zope/mimetype/zcml.py b/src/zope/mimetype/zcml.py index 3d0bd9e..d657be7 100644 --- a/src/zope/mimetype/zcml.py +++ b/src/zope/mimetype/zcml.py @@ -22,7 +22,13 @@ from zope.mimetype import interfaces from zope.mimetype import mtypes -import zope.browserresource.metaconfigure +try: + from zope.browserresource.metaconfigure import icon +except ImportError: + def icon(*args): + import warnings + warnings.warn("No icon support: zope.browserresource is not installed") + import zope.component.zcml import zope.component.interface @@ -76,10 +82,9 @@ def mimeTypesDirective(_context, file, module): callable = zope.component.zcml.handler, args = ('registerUtility', iface, provides, mime_type), ) - icon = os.path.join(directory, info[3]) - if icon and os.path.isfile(icon): - zope.browserresource.metaconfigure.icon( - _context, "zmi_icon", iface, icon) + icon_path = os.path.join(directory, info[3]) + if icon_path and os.path.isfile(icon_path): + icon(_context, "zmi_icon", iface, icon_path) class ICodecDirective(interface.Interface): diff --git a/tox.ini b/tox.ini index 870445a..9d5d66d 100644 --- a/tox.ini +++ b/tox.ini @@ -1,10 +1,26 @@ [tox] envlist = - py27,py33,py34,py35,py36,pypy,pypy3 + py27,py34,py35,py36,pypy,pypy3,coverage,minimal [testenv] commands = - zope-testrunner --test-path=src + zope-testrunner --test-path=src [] deps = .[test] + +[testenv:minimal] +deps = + . zope.testrunner + zope.testing + +[testenv:coverage] +usedevelop = true +basepython = + python2.7 +commands = + coverage run -m zope.testrunner --test-path=src [] + coverage report --fail-under=94 +deps = + {[testenv]deps} + coverage From e38a5d2138eaa5c04a77796330252a547b28ea6f Mon Sep 17 00:00:00 2001 From: Jason Madden Date: Thu, 28 Sep 2017 13:07:16 -0500 Subject: [PATCH 2/2] Use a nonsesnse extra name in .travis.yml to prevent the pip error '.[] should be a path or VCS url' --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c301056..dfe6bc3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,7 @@ env: matrix: include: - python: 2.7 - env: DEP= + env: DEP=no_such_extra install: - pip install -U pip setuptools - pip install -U coverage coveralls zope.testing zope.testrunner