diff --git a/.flake8 b/.flake8 index 25f2bda..641a1bd 100644 --- a/.flake8 +++ b/.flake8 @@ -1,5 +1,5 @@ [flake8] -max-line-length = 79 +max-line-length = 88 ignore = # E203: whitespace before ':' (black fails to be PEP8 compliant) E203 diff --git a/CHANGES.rst b/CHANGES.rst index c563af5..c05aab8 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,10 @@ +unreleased +========== + +- Drop Python 3.5, and 3.6. + +- Add Python 3.9, 3.10, 3.11. + 0.3 (2020-11-29) ================ diff --git a/docs/conf.py b/docs/conf.py index 71d39a4..4faf693 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -14,9 +14,9 @@ # All configuration values have a default; values that are commented out # serve to show the default. -import sys import os import pkg_resources +import sys # If extensions (or modules to document with autodoc) are in another # directory, add these directories to sys.path here. If the directory is @@ -241,9 +241,7 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). -man_pages = [ - ('index', 'wired', u'wired Documentation', [u'Michael Merickel'], 1) -] +man_pages = [('index', 'wired', u'wired Documentation', [u'Michael Merickel'], 1)] # If true, show URL addresses after external links. # man_show_urls = False diff --git a/docs/dc/attributes/app.py b/docs/dc/attributes/app.py index 6f463e6..7963a94 100644 --- a/docs/dc/attributes/app.py +++ b/docs/dc/attributes/app.py @@ -1,9 +1,9 @@ # app.py from dataclasses import dataclass, field - from venusian import Scanner from wired import ServiceRegistry + from . import models diff --git a/docs/dc/attributes/models.py b/docs/dc/attributes/models.py index 2561b52..c4bbf34 100644 --- a/docs/dc/attributes/models.py +++ b/docs/dc/attributes/models.py @@ -1,7 +1,7 @@ # models.py from dataclasses import dataclass -from wired.dataclasses import factory, injected, Context +from wired.dataclasses import Context, factory, injected @factory() diff --git a/docs/dc/attributes/request.py b/docs/dc/attributes/request.py index 3dfbc1b..0bdf07f 100644 --- a/docs/dc/attributes/request.py +++ b/docs/dc/attributes/request.py @@ -1,5 +1,5 @@ # request.py -from .models import Greeter, Customer, FrenchCustomer +from .models import Customer, FrenchCustomer, Greeter def process_request(registry): diff --git a/docs/dc/decorators/app.py b/docs/dc/decorators/app.py index 6f463e6..7963a94 100644 --- a/docs/dc/decorators/app.py +++ b/docs/dc/decorators/app.py @@ -1,9 +1,9 @@ # app.py from dataclasses import dataclass, field - from venusian import Scanner from wired import ServiceRegistry + from . import models diff --git a/docs/dc/injected/app.py b/docs/dc/injected/app.py index 6f463e6..7963a94 100644 --- a/docs/dc/injected/app.py +++ b/docs/dc/injected/app.py @@ -1,9 +1,9 @@ # app.py from dataclasses import dataclass, field - from venusian import Scanner from wired import ServiceRegistry + from . import models diff --git a/docs/dc/injected/models.py b/docs/dc/injected/models.py index b429ee2..c0827c0 100644 --- a/docs/dc/injected/models.py +++ b/docs/dc/injected/models.py @@ -1,7 +1,7 @@ # models.py from dataclasses import dataclass -from wired.dataclasses import factory, injected, Context +from wired.dataclasses import Context, factory, injected @factory() diff --git a/docs/dc/injected/request.py b/docs/dc/injected/request.py index 3dfbc1b..0bdf07f 100644 --- a/docs/dc/injected/request.py +++ b/docs/dc/injected/request.py @@ -1,5 +1,5 @@ # request.py -from .models import Greeter, Customer, FrenchCustomer +from .models import Customer, FrenchCustomer, Greeter def process_request(registry): diff --git a/docs/dc/overrides/app.py b/docs/dc/overrides/app.py index 6f463e6..7963a94 100644 --- a/docs/dc/overrides/app.py +++ b/docs/dc/overrides/app.py @@ -1,9 +1,9 @@ # app.py from dataclasses import dataclass, field - from venusian import Scanner from wired import ServiceRegistry + from . import models diff --git a/docs/dc/overrides/request.py b/docs/dc/overrides/request.py index 7d7aa0c..c58975e 100644 --- a/docs/dc/overrides/request.py +++ b/docs/dc/overrides/request.py @@ -1,5 +1,5 @@ # request.py -from .models import Greeter, Customer, FrenchCustomer +from .models import Customer, FrenchCustomer, Greeter def process_request(registry): diff --git a/docs/dc/simple_construction/configure.py b/docs/dc/simple_construction/configure.py index 8645e24..3897ea1 100644 --- a/docs/dc/simple_construction/configure.py +++ b/docs/dc/simple_construction/configure.py @@ -1,6 +1,7 @@ # configure.py from wired import ServiceRegistry from wired.dataclasses import register_dataclass + from .models import Greeter diff --git a/docs/dc/simple_injection/app.py b/docs/dc/simple_injection/app.py index 6f463e6..7963a94 100644 --- a/docs/dc/simple_injection/app.py +++ b/docs/dc/simple_injection/app.py @@ -1,9 +1,9 @@ # app.py from dataclasses import dataclass, field - from venusian import Scanner from wired import ServiceRegistry + from . import models diff --git a/docs/dc/singleton/app.py b/docs/dc/singleton/app.py index 6f463e6..7963a94 100644 --- a/docs/dc/singleton/app.py +++ b/docs/dc/singleton/app.py @@ -1,9 +1,9 @@ # app.py from dataclasses import dataclass, field - from venusian import Scanner from wired import ServiceRegistry + from . import models diff --git a/docs/tutorial/context/app.py b/docs/tutorial/context/app.py index 1649638..c727eb0 100644 --- a/docs/tutorial/context/app.py +++ b/docs/tutorial/context/app.py @@ -76,9 +76,7 @@ def french_greeter_factory(container) -> Greeter: # Register it as a factory using its class for the "key", but # this time register with a "context" - registry.register_factory( - french_greeter_factory, Greeter, context=FrenchCustomer - ) + registry.register_factory(french_greeter_factory, Greeter, context=FrenchCustomer) return registry diff --git a/docs/tutorial/datastore/__init__.py b/docs/tutorial/datastore/__init__.py index 8e271b3..a9d7305 100644 --- a/docs/tutorial/datastore/__init__.py +++ b/docs/tutorial/datastore/__init__.py @@ -22,7 +22,7 @@ from dataclasses import dataclass, field from typing import List -from wired import ServiceRegistry, ServiceContainer +from wired import ServiceContainer, ServiceRegistry @dataclass @@ -87,9 +87,7 @@ def app_bootstrap(settings: Settings) -> ServiceRegistry: return registry -def customer_interaction( - container: ServiceContainer, customer: Customer -) -> str: +def customer_interaction(container: ServiceContainer, customer: Customer) -> str: """Customer comes in, handle the steps in greeting them""" # Get a Greeter using the customer as context. Use the Customer when diff --git a/docs/tutorial/datastore/custom.py b/docs/tutorial/datastore/custom.py index 41f4cc5..607ab8a 100644 --- a/docs/tutorial/datastore/custom.py +++ b/docs/tutorial/datastore/custom.py @@ -6,8 +6,9 @@ """ from dataclasses import dataclass -from wired import ServiceRegistry, ServiceContainer -from . import Customer, Greeter, Settings, Datastore +from wired import ServiceContainer, ServiceRegistry + +from . import Customer, Datastore, Greeter, Settings @dataclass @@ -30,9 +31,7 @@ def french_greeter_factory(container) -> Greeter: # Register it as a factory using its class for the "key", but # this time register with a "context" - registry.register_factory( - french_greeter_factory, Greeter, context=FrenchCustomer - ) + registry.register_factory(french_greeter_factory, Greeter, context=FrenchCustomer) # Grab the Datastore and add a FrenchCustomer container: ServiceContainer = registry.create_container() diff --git a/docs/tutorial/decoupled/custom.py b/docs/tutorial/decoupled/custom.py index 2f4a187..c758842 100644 --- a/docs/tutorial/decoupled/custom.py +++ b/docs/tutorial/decoupled/custom.py @@ -7,6 +7,7 @@ from dataclasses import dataclass from wired import ServiceRegistry + from . import Customer, Greeter, Settings @@ -30,6 +31,4 @@ def french_greeter_factory(container) -> Greeter: # Register it as a factory using its class for the "key", but # this time register with a "context" - registry.register_factory( - french_greeter_factory, Greeter, context=FrenchCustomer - ) + registry.register_factory(french_greeter_factory, Greeter, context=FrenchCustomer) diff --git a/docs/tutorial/overrides/__init__.py b/docs/tutorial/overrides/__init__.py index 721cec9..d0fa2f5 100644 --- a/docs/tutorial/overrides/__init__.py +++ b/docs/tutorial/overrides/__init__.py @@ -21,7 +21,8 @@ """ from typing import List -from wired import ServiceRegistry, ServiceContainer +from wired import ServiceContainer, ServiceRegistry + from .models import Customer, Datastore, Greeter, Settings @@ -62,9 +63,7 @@ def app_bootstrap(settings: Settings) -> ServiceRegistry: return registry -def customer_interaction( - container: ServiceContainer, customer: Customer -) -> str: +def customer_interaction(container: ServiceContainer, customer: Customer) -> str: """Customer comes in, handle the steps in greeting them""" # Get a Greeter using the customer as context. Use the Customer when diff --git a/docs/tutorial/overrides/custom.py b/docs/tutorial/overrides/custom.py index 392020d..fca3a55 100644 --- a/docs/tutorial/overrides/custom.py +++ b/docs/tutorial/overrides/custom.py @@ -6,8 +6,9 @@ """ from dataclasses import dataclass -from wired import ServiceRegistry, ServiceContainer -from .models import Customer, Greeter, Settings, Datastore +from wired import ServiceContainer, ServiceRegistry + +from .models import Customer, Datastore, Greeter, Settings @dataclass @@ -34,9 +35,7 @@ def french_greeter_factory(container) -> Greeter: # Register it as a factory using its class for the "key", but # this time register with a "context" - registry.register_factory( - french_greeter_factory, Greeter, context=FrenchCustomer - ) + registry.register_factory(french_greeter_factory, Greeter, context=FrenchCustomer) # *** OVERRIDE !!! This add-on replaces the core, built-in Greeter # with a different implementation. @@ -45,9 +44,7 @@ def override_greeter_factory(container) -> Greeter: # Register it as a factory using its class for the "key", but # this time register with a "context" - registry.register_factory( - override_greeter_factory, Greeter, context=Customer - ) + registry.register_factory(override_greeter_factory, Greeter, context=Customer) # Grab the Datastore and add a FrenchCustomer container: ServiceContainer = registry.create_container() diff --git a/docs/tutorial/requests_views/__init__.py b/docs/tutorial/requests_views/__init__.py index ea90ef2..dfd6633 100644 --- a/docs/tutorial/requests_views/__init__.py +++ b/docs/tutorial/requests_views/__init__.py @@ -24,16 +24,8 @@ from typing import List from wired import ServiceRegistry -from .models import ( - Customer, - Datastore, - Greeter, - Resource, - Request, - Settings, - Url, - View, -) + +from .models import Customer, Datastore, Greeter, Request, Resource, Settings, Url, View def app_bootstrap(settings: Settings) -> ServiceRegistry: diff --git a/docs/tutorial/requests_views/custom.py b/docs/tutorial/requests_views/custom.py index 260e587..c29d25c 100644 --- a/docs/tutorial/requests_views/custom.py +++ b/docs/tutorial/requests_views/custom.py @@ -6,8 +6,9 @@ """ from dataclasses import dataclass -from wired import ServiceRegistry, ServiceContainer -from .models import Customer, Greeter, Settings, Datastore +from wired import ServiceContainer, ServiceRegistry + +from .models import Customer, Datastore, Greeter, Settings @dataclass @@ -29,9 +30,7 @@ def french_greeter_factory(container) -> Greeter: # Register it as a factory using its class for the "key", but # this time register with a "context" - registry.register_factory( - french_greeter_factory, Greeter, context=FrenchCustomer - ) + registry.register_factory(french_greeter_factory, Greeter, context=FrenchCustomer) # Grab the Datastore and add a FrenchCustomer container: ServiceContainer = registry.create_container() diff --git a/pyproject.toml b/pyproject.toml index bb12a60..1e07beb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,15 +3,17 @@ requires = ["setuptools>=41.0.1", "wheel"] build-backend = "setuptools.build_meta" [tool.black] -line-length = 79 +target-version = ['py37', 'py38', 'py39', 'py310', 'py311'] skip-string-normalization = true -py36 = false - # This next section only exists for people that have their editors +# 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 +profile = "black" combine_as_imports = true -line_length = 79 +line_length = 88 +force_sort_within_sections = true +no_lines_before = "THIRDPARTY" +sections = "FUTURE,THIRDPARTY,FIRSTPARTY,LOCALFOLDER" +default_section = "THIRDPARTY" +known_first_party = "wired" \ No newline at end of file diff --git a/src/wired/__init__.py b/src/wired/__init__.py index 579387e..1621ed7 100644 --- a/src/wired/__init__.py +++ b/src/wired/__init__.py @@ -1,5 +1,4 @@ __all__ = ['ServiceContainer', 'ServiceRegistry', 'service_factory'] -from .container import ServiceContainer -from .container import ServiceRegistry +from .container import ServiceContainer, ServiceRegistry from .decorators import service_factory diff --git a/src/wired/container.py b/src/wired/container.py index b10ff80..dd4612e 100644 --- a/src/wired/container.py +++ b/src/wired/container.py @@ -1,9 +1,8 @@ import weakref from zope.interface import Interface, implementedBy, providedBy +from zope.interface.adapter import AdapterRegistry from zope.interface.interface import InterfaceClass from zope.interface.interfaces import IInterface -from zope.interface.adapter import AdapterRegistry - __all__ = ['ServiceContainer', 'ServiceRegistry'] @@ -150,12 +149,7 @@ def bind(self, *, context): ) def get( - self, - iface_or_type=Interface, - *, - context=_marker, - name='', - default=_marker + self, iface_or_type=Interface, *, context=_marker, name='', default=_marker ): """ Find a cached instance or create one from the registered factory. @@ -208,9 +202,7 @@ def get( # lookup in the global registry if svc_info is None: - svc_info = _find_factory( - self._factories, iface, context_iface, name - ) + svc_info = _find_factory(self._factories, iface, context_iface, name) if svc_info is None: if default is not _marker: @@ -236,9 +228,7 @@ def get( ) return inst - def set( - self, service, iface_or_type=Interface, *, context=_marker, name='' - ): + def set(self, service, iface_or_type=Interface, *, context=_marker, name=''): """ Add a service instance to the container. diff --git a/src/wired/dataclasses/decorators.py b/src/wired/dataclasses/decorators.py index ae826af..23b052e 100644 --- a/src/wired/dataclasses/decorators.py +++ b/src/wired/dataclasses/decorators.py @@ -1,4 +1,5 @@ -from venusian import attach, Scanner +from venusian import Scanner, attach + from wired import ServiceRegistry from .registration import register_dataclass diff --git a/src/wired/dataclasses/field_types.py b/src/wired/dataclasses/field_types.py index 886ce08..2abd85e 100644 --- a/src/wired/dataclasses/field_types.py +++ b/src/wired/dataclasses/field_types.py @@ -16,13 +16,11 @@ cases. """ -from dataclasses import field, Field +from dataclasses import Field, field from zope.interface import Interface -def injected( - iface_or_type=Interface, *, name='', attr=None, **kwargs -) -> Field: +def injected(iface_or_type=Interface, *, name='', attr=None, **kwargs) -> Field: """ Customize how the field is populated from the generated factory. diff --git a/src/wired/dataclasses/injector.py b/src/wired/dataclasses/injector.py index 8db88b3..23aa81d 100644 --- a/src/wired/dataclasses/injector.py +++ b/src/wired/dataclasses/injector.py @@ -1,4 +1,4 @@ -from dataclasses import dataclass, fields, Field, MISSING +from dataclasses import MISSING, Field, dataclass, fields from typing import get_type_hints from wired import ServiceContainer @@ -59,9 +59,7 @@ def __call__(self, container): injected_target = container else: # Ask the registry for one of these - injected_target = container.get( - injected_type, name=injected_name - ) + injected_target = container.get(injected_type, name=injected_name) # If attr is used, get specified attribute off that instance if injected_attr: diff --git a/src/wired/dataclasses/registration.py b/src/wired/dataclasses/registration.py index 7c91769..5149c97 100644 --- a/src/wired/dataclasses/registration.py +++ b/src/wired/dataclasses/registration.py @@ -1,4 +1,5 @@ from wired import ServiceRegistry + from .injector import Injector diff --git a/src/wired/decorators.py b/src/wired/decorators.py index b44d82a..b9c6fb3 100644 --- a/src/wired/decorators.py +++ b/src/wired/decorators.py @@ -31,9 +31,7 @@ def callback(scanner: venusian.Scanner, name: str, cls): # class as the instance for_ = self.for_ if self.for_ else cls - registry.register_factory( - cls, for_, context=self.context, name=self.name - ) + registry.register_factory(cls, for_, context=self.context, name=self.name) venusian.attach(wrapped, callback, category='wired') return wrapped diff --git a/tests/conftest.py b/tests/conftest.py index 684a76f..fb18c94 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,13 +1,10 @@ import os -import sys - import pytest +import sys @pytest.fixture(scope="session", autouse=True) def examples_path(): """Automatically add the root of the repo to path""" - tutorial_path = os.path.abspath( - os.path.join(os.path.dirname(__file__), '..') - ) + tutorial_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) sys.path.insert(0, tutorial_path) diff --git a/tests/dataclasses/integration/conftest.py b/tests/dataclasses/integration/conftest.py index 7ebcb78..576c952 100644 --- a/tests/dataclasses/integration/conftest.py +++ b/tests/dataclasses/integration/conftest.py @@ -1,7 +1,6 @@ import os -import sys - import pytest +import sys @pytest.fixture(scope="session", autouse=True) diff --git a/tests/dataclasses/integration/test_attribute.py b/tests/dataclasses/integration/test_attribute.py index 6d26698..43c986a 100644 --- a/tests/dataclasses/integration/test_attribute.py +++ b/tests/dataclasses/integration/test_attribute.py @@ -1,5 +1,4 @@ from dataclasses import dataclass - import pytest import venusian diff --git a/tests/dataclasses/integration/test_basic.py b/tests/dataclasses/integration/test_basic.py index 2beceef..5af7062 100644 --- a/tests/dataclasses/integration/test_basic.py +++ b/tests/dataclasses/integration/test_basic.py @@ -1,5 +1,4 @@ from dataclasses import dataclass - import pytest from wired import ServiceRegistry diff --git a/tests/dataclasses/integration/test_containers.py b/tests/dataclasses/integration/test_containers.py index 3894ac9..d0d9c6d 100644 --- a/tests/dataclasses/integration/test_containers.py +++ b/tests/dataclasses/integration/test_containers.py @@ -1,9 +1,8 @@ from dataclasses import dataclass, field - import pytest import venusian -from wired import ServiceRegistry, ServiceContainer +from wired import ServiceContainer, ServiceRegistry from wired.dataclasses import factory diff --git a/tests/dataclasses/integration/test_dc_simple_construction.py b/tests/dataclasses/integration/test_dc_simple_construction.py index f92d514..cc8f958 100644 --- a/tests/dataclasses/integration/test_dc_simple_construction.py +++ b/tests/dataclasses/integration/test_dc_simple_construction.py @@ -1,6 +1,6 @@ def test_greeter(): - from dc.simple_construction.app import App from dc.simple_construction import configure + from dc.simple_construction.app import App from dc.simple_construction.request import process_request # start-after diff --git a/tests/dataclasses/integration/test_injected.py b/tests/dataclasses/integration/test_injected.py index 5787a56..cbdfbea 100644 --- a/tests/dataclasses/integration/test_injected.py +++ b/tests/dataclasses/integration/test_injected.py @@ -1,5 +1,4 @@ from dataclasses import dataclass - import pytest import venusian diff --git a/tests/dataclasses/integration/test_override.py b/tests/dataclasses/integration/test_override.py index abf86cf..d0933d7 100644 --- a/tests/dataclasses/integration/test_override.py +++ b/tests/dataclasses/integration/test_override.py @@ -1,5 +1,4 @@ from dataclasses import dataclass - import pytest import venusian diff --git a/tests/dataclasses/integration/test_simple_injection.py b/tests/dataclasses/integration/test_simple_injection.py index 9d46cc9..d79a7da 100644 --- a/tests/dataclasses/integration/test_simple_injection.py +++ b/tests/dataclasses/integration/test_simple_injection.py @@ -1,5 +1,4 @@ from dataclasses import dataclass - import pytest import venusian diff --git a/tests/dataclasses/unit/test_injector.py b/tests/dataclasses/unit/test_injector.py index d948e68..282c9e9 100644 --- a/tests/dataclasses/unit/test_injector.py +++ b/tests/dataclasses/unit/test_injector.py @@ -1,10 +1,9 @@ from dataclasses import dataclass, field -from typing import Optional - import pytest +from typing import Optional -from wired import ServiceRegistry, ServiceContainer -from wired.dataclasses import injected, Context +from wired import ServiceContainer, ServiceRegistry +from wired.dataclasses import Context, injected from wired.dataclasses.injector import Injector diff --git a/tests/examples/test_examples.py b/tests/examples/test_examples.py index db93ebb..b5635c1 100644 --- a/tests/examples/test_examples.py +++ b/tests/examples/test_examples.py @@ -1,11 +1,11 @@ import pytest from examples.decorators import ( - no_decorator, - no_decorator_class, basic_class, - decorator_with_wired_factory, decorator_args, + decorator_with_wired_factory, + no_decorator, + no_decorator_class, ) from examples.wired_factory import register_wired_factory diff --git a/tests/test_container.py b/tests/test_container.py index 438e504..879593f 100644 --- a/tests/test_container.py +++ b/tests/test_container.py @@ -160,16 +160,12 @@ class DefaultArea: def admin_roles_factory(_): return AdminRoles() - registry.register_factory( - admin_roles_factory, UserRoles, context=AdminArea - ) + registry.register_factory(admin_roles_factory, UserRoles, context=AdminArea) def default_roles_factory(_): return DefaultRoles() - registry.register_factory( - default_roles_factory, UserRoles, context=DefaultArea - ) + registry.register_factory(default_roles_factory, UserRoles, context=DefaultArea) def user_factory(container): roles = container.get(UserRoles) diff --git a/tox.ini b/tox.ini index 1b009a4..1ade769 100644 --- a/tox.ini +++ b/tox.ini @@ -1,7 +1,7 @@ [tox] envlist = lint, - py35,py36,py37,pypy3, + py37,py38,py39,py310,py311,pypy3, coverage,docs isolated_build = true @@ -40,25 +40,31 @@ skip_install = true commands = flake8 src/wired docs tests setup.py black --check --diff src/wired docs tests setup.py + isort --check-only --df src/wired docs tests setup.py check-manifest # check the readme by building and using twine check - python -m pep517.build --out-dir {envtmpdir}/dist . + python -m build --outdir {envtmpdir}/dist . twine check {envtmpdir}/dist/* deps = black + build check-manifest flake8 - pep517 + isort readme_renderer twine -[testenv:black] +[testenv:format] skip_install = true commands = + isort src/wired docs tests setup.py black src/wired docs tests setup.py + flake8 src/wired docs tests setup.py deps = black + flake8 + isort [testenv:build] skip_install = true