diff --git a/.travis.yml b/.travis.yml index 9175ac0..dfe6bc3 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=no_such_extra +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