diff --git a/CHANGES.rst b/CHANGES.rst index 6976bcd..2ec67e6 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,15 @@ Changelog 3.0.0 (unreleased) ------------------ +- When ``bin/develop`` is called without arguments, show the help text instead of an ugly error. + [maurits] + +- Move to PEP-420 native namespaces. [maurits] + +- Replace our use of ``pkg_resources`` with ``importlib.metadata``. [maurits] + +- Require ``zc.buildout`` 3.0.0 or higher. [maurits] + - Add support for Python 3.14 and 3.15. [maurits] - Require Python 3.10 or higher. [maurits] diff --git a/setup.py b/setup.py index 4fd426a..d04e363 100644 --- a/setup.py +++ b/setup.py @@ -3,16 +3,6 @@ version = "3.0.0.dev0" -install_requires = [ - "setuptools", - "zc.buildout", -] - -tests_require = ["mock"] - -extras_require = {"test": tests_require} - - def get_text_from_file(fn): text = open(fn, "rb").read() return text.decode("utf-8") @@ -48,16 +38,13 @@ def get_text_from_file(fn): author_email="florian.schulze@gmx.net", url="https://github.com/fschulze/mr.developer", license="BSD", - packages=["mr", "mr.developer", "mr.developer.tests"], - package_dir={"": "src"}, - namespace_packages=["mr", "mr.developer"], include_package_data=True, zip_safe=False, - install_requires=install_requires, - tests_require=tests_require, - extras_require=extras_require, + install_requires=[ + "zc.buildout>=3.0.0", + ], + extras_require={"test": "mock"}, python_requires=">=3.10", - test_suite="mr.developer.tests", entry_points=""" [console_scripts] develop = mr.developer.develop:develop diff --git a/src/mr/__init__.py b/src/mr/__init__.py deleted file mode 100644 index 05f0beb..0000000 --- a/src/mr/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages -try: - __import__("pkg_resources").declare_namespace(__name__) -except ImportError: - from pkgutil import extend_path - - __path__ = extend_path(__path__, __name__) diff --git a/src/mr/developer/__init__.py b/src/mr/developer/__init__.py deleted file mode 100644 index 05f0beb..0000000 --- a/src/mr/developer/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages -try: - __import__("pkg_resources").declare_namespace(__name__) -except ImportError: - from pkgutil import extend_path - - __path__ = extend_path(__path__, __name__) diff --git a/src/mr/developer/common.py b/src/mr/developer/common.py index 80880e6..54f8851 100644 --- a/src/mr/developer/common.py +++ b/src/mr/developer/common.py @@ -1,8 +1,8 @@ from configparser import RawConfigParser +from importlib.metadata import entry_points import logging import os -import pkg_resources import platform import queue import re @@ -190,10 +190,10 @@ def get_workingcopytypes(): group = "mr.developer.workingcopytypes" _workingcopytypes = {} addons = {} - for entrypoint in pkg_resources.iter_entry_points(group=group): + for entrypoint in entry_points().select(group=group): key = entrypoint.name workingcopytype = entrypoint.load() - if entrypoint.dist.project_name == "mr.developer": + if entrypoint.dist.name == "mr.developer": _workingcopytypes[key] = workingcopytype else: if key in addons: @@ -205,7 +205,7 @@ def get_workingcopytypes(): logger.info( "Overwriting '%s' with addon from '%s'.", key, - entrypoint.dist.project_name, + entrypoint.dist.name, ) addons[key] = workingcopytype _workingcopytypes.update(addons) @@ -216,10 +216,10 @@ def get_commands(): commands = {} group = "mr.developer.commands" addons = {} - for entrypoint in pkg_resources.iter_entry_points(group=group): + for entrypoint in entry_points().select(group=group): key = entrypoint.name command = entrypoint.load() - if entrypoint.dist.project_name == "mr.developer": + if entrypoint.dist.name == "mr.developer": commands[key] = command else: if key in addons: @@ -230,7 +230,7 @@ def get_commands(): logger.info( 'Overwriting "%s" with addon from "%s".', key, - entrypoint.dist.project_name, + entrypoint.dist.name, ) addons[key] = command commands.update(addons) @@ -394,11 +394,7 @@ def parse_buildout_args(args): debug=False, ) options = [] - version = pkg_resources.get_distribution("zc.buildout").version - if tuple(version.split(".")[:2]) <= ("1", "4"): - option_str = "vqhWUoOnNDA" - else: - option_str = "vqhWUoOnNDAs" + option_str = "vqhWUoOnNDAs" while args: if args[0][0] == "-": op = orig_op = args.pop(0) diff --git a/src/mr/developer/develop.py b/src/mr/developer/develop.py index 7feb851..c5a2761 100644 --- a/src/mr/developer/develop.py +++ b/src/mr/developer/develop.py @@ -7,9 +7,9 @@ import argparse import atexit +import importlib.metadata import logging import os -import pkg_resources import sys import textwrap @@ -60,7 +60,7 @@ def __call__(self, *args, **kwargs): ch.setFormatter(logging.Formatter("%(levelname)s: %(message)s")) logger.addHandler(ch) self.parser = ArgumentParser() - version = pkg_resources.get_distribution("mr.developer").version + version = importlib.metadata.version("mr.developer") self.parser.add_argument( "-v", "--version", action="version", version="mr.developer %s" % version ) @@ -73,6 +73,15 @@ def __call__(self, *args, **kwargs): args = None args = self.parser.parse_args(args) + # When you call `bin/develop` without any arguments, you will get an + # error later on because we call `args.func` and there is no `func`: + # AttributeError: 'Namespace' object has no attribute 'func' + if not hasattr(args, "func"): + # So pretend the user has asked for the help function. + args = self.parser.parse_args(["help"]) + args.func(args) + return + try: self.buildout_dir = find_base() except OSError: diff --git a/tox.ini b/tox.ini index d58a9b1..9db4aea 100644 --- a/tox.ini +++ b/tox.ini @@ -12,7 +12,6 @@ commands = py.test --cov {envsitepackagesdir}/mr/developer --cov-report=term --c deps = {[base]deps} pytest-cov - configparser: configparser [testenv:lint]