Skip to content

Releases: hynek/svcs

25.1.0

25 Jan 13:14
25.1.0
1a54b88
Compare
Choose a tag to compare

Highlights

This is mostly a grab bag of smaller features and bug fixes that I've been carrying around forever, because I was getting ready to tackle a bunch of bigger projects like multiple scopes soon™. I'm still getting ready, but I don't want to withhold these improvements any further.

Full changelog below!

Special Thanks

This release would not be possible without my generous sponsors! Thank you to all of you making sustainable maintenance possible! If you would like to join them, go to https://github.com/sponsors/hynek and check out the sweet perks!

Above and Beyond

Variomedia AG (@variomedia), Tidelift (@tidelift), Klaviyo (@klaviyo), FilePreviews (@filepreviews), Privacy Solutions GmbH (@privacy-solutions), Gedankenspieler (@Gedankenspieler), Daniel Fortunov (@asqui), Kevin P. Fleming (@kpfleming), and Polar (@polarsource).

Maintenance Sustainers

Buttondown (@buttondown), Christopher Dignam (@chdsbd), Magnus Watn (@magnuswatn), David Cramer (@dcramer), Jesse Snyder (@jessesnyder), Rivo Laks (@rivol), Chris Withers (@cjw296), Mike Fiedler (@miketheman), Duncan Hill (@cricalix), Colin Marquardt (@cmarqu), Pieter Swinkels (@swinkels), Nick Libertini (@libertininick), Moving Content AG (@moving-content), ProteinQure (@ProteinQure), The Westervelt Company (@westerveltco), Sławomir Ehlert (@slafs), Mostafa Khalil (@khadrawy), Filip Mularczyk (@mukiblejlok), Thomas Klinger (@thmsklngr), Andreas Poehlmann (@ap--), August Bigelow (@atbigelow), Carlton Gibson (@carltongibson), and Roboflow (@roboflow).

Not to forget 11 more amazing humans who chose to be generous but anonymous!

Full Changelog

Added

  • Python 3.13 support.

  • svcs.Registry now implements a __iter__ method that allows to iterate over its registered services. #106

Removed

  • Python 3.8 support.

Changed

  • Flask: The registry is now stored on app.extensions, not app.config. This is an implementation detail. If you are directly accessing the registry via app.config, this is a breaking change, though you should ideally move to svcs.flask.registry anyway. #71 #72 #73

  • Registry.register_factory() is now more lenient regarding the arguments of the factory. It only looks at the first argument (if present) and ignores the rest. #110

Fixed

  • Container.aget() now also enters and exits synchronous context managers. #93

  • Container.aget() now also enters and exits context managers that are returned by async factories. #105


This release contains contributions from @alexrudy, @hynek, and @wbolster.

Artifact Attestations

You can verify this release's artifact attestions using GitHub's CLI tool by downloading the sdist and wheel from PyPI and running:

$ gh attestation verify --owner hynek svcs-25.1.0.tar.gz

and

$ gh attestation verify --owner hynek svcs-25.1.0-py3-none-any.whl

24.1.0

25 Jan 08:20
24.1.0
3eda22c
Compare
Choose a tag to compare

Highlights

This is just a quick fix for a warning in AIOHTTP 3.9+.

Full changelog below!

Special Thanks

This release would not be possible without my generous sponsors! Thank you to all of you making sustainable maintenance possible! If you would like to join them, go to https://github.com/sponsors/hynek and check out the sweet perks!

Above and Beyond

Variomedia AG (@variomedia), Tidelift (@tidelift), FilePreviews (@filepreviews), Daniel Fortunov (@asqui), Kevin P. Fleming (@kpfleming), and Sören Weber (@SoerenWeber).

Maintenance Sustainers

Adam Hill (@adamghill), Dan Groshev (@si14), Magnus Watn (@magnuswatn), David Cramer (@dcramer), Moving Content AG (@moving-content), ProteinQure (@ProteinQure), Jesse Snyder (@jessesnyder), Rivo Laks (@rivol), Ionel Cristian Mărieș (@ionelmc), The Westervelt Company (@westerveltco), Philippe Galvan (@PhilippeGalvan), Birk Jernström (@birkjernstrom), Tim Schilling (@tim-schilling), Chris Withers (@cjw296), Christopher Dignam (@chdsbd), Stefan Hagen (@sthagen), Sławomir Ehlert (@slafs), Mostafa Khalil (@khadrawy), Filip Mularczyk (@mukiblejlok), Mike Fiedler (@miketheman), and Michel Vittória (@michelvittoria).

Not to forget 5 more amazing humans who chose to be generous but anonymous!

Full Changelog

Fixed

  • AIOHTTP: The registry is now stored using aiohttp.web.AppKeys on the application. This is an implementation detail and shouldn't matter, but it fixes a warning on AIOHTTP 3.9 and later.

23.21.0

21 Nov 15:35
23.21.0
2d119dc
Compare
Choose a tag to compare

Highlights

The main feature of this release are container-local registries that allow you to define factories that are only valid for a container. For example, based on request metadata! Check out the docs for details.

There's one minor backward-incompatible change regarding the handling of values and context managers – please refer to #50 for the reasons.

Finally there's a bunch of fixes around typing.

Special Thanks

This release would not be possible without my generous sponsors! Thank you to all of you making sustainable maintenance possible! If you would like to join them, go to https://github.com/sponsors/hynek and check out the sweet perks!

Above and Beyond

Variomedia AG (@variomedia), Tidelift (@tidelift), FilePreviews (@filepreviews), Daniel Fortunov (@asqui), and Kevin P. Fleming (@kpfleming).

Maintenance Sustainers

Adam Hill (@adamghill), Dan Groshev (@si14), Magnus Watn (@magnuswatn), David Cramer (@dcramer), Moving Content AG (@moving-content), ProteinQure (@ProteinQure), Jesse Snyder (@jessesnyder), Rivo Laks (@rivol), Ionel Cristian Mărieș (@ionelmc), The Westervelt Company (@westerveltco), Philippe Galvan (@PhilippeGalvan), Birk Jernström (@birkjernstrom), Tim Schilling (@tim-schilling), Chris Withers (@cjw296), Christopher Dignam (@chdsbd), Stefan Hagen (@sthagen), Sławomir Ehlert (@slafs), and Mostafa Khalil (@khadrawy).

Not to forget 5 more amazing humans who chose to be generous but anonymous!

Full Changelog

Changed

  • Backwards-Incompatible: Since multiple people have been bit by the enter=True default for Registry.register_value(), and it's very early in svcs life, we're changing the default to enter=False for all versions of register_value().

    This means that you have to explicitly opt-in to context manager behavior which makes a lot more sense for singletons like connection pools which are the most common candidates for registered values.

    (The irony of shipping a backwards-incompatible change in the release directly following the adoption of a backwards-compatibility policy not lost on me.) #50 #51

Added

  • Container-local registries! Sometimes it's useful to bind a value or factory only to a container. For example, request metadata or authentication information.

    You can now achieve that with svcs.Container.register_local_factory() and svcs.Container.register_local_value(). Once something local is registered, a registry is transparently created and it takes precedence over the global one when a service is requested. The local registry is closed together with the container. #56

  • Flask: svcs.flask.registry which is a werkzeug.local.LocalProxy for the currently active registry on flask.current_app.

Fixed

  • We've stopped rewriting the public names of our objects and typing.get_type_hints() now works on them as expected for Python 3.10 and later. #52 #53

  • The detection of container arguments in svcs.Registry() when using string-based type annotations is more robust now. #55

23.20.0

05 Sep 08:49
23.20.0
e77bff2
Compare
Choose a tag to compare

Highlights

I'm very proud to hereby announce the first stable version of svcs.

I'm both excited and anxious how it's going to be received.

Please give it a shot and let me know!

Special Thanks

This release would not be possible without my generous sponsors! Thank you to all of you making sustainable maintenance possible! If you would like to join them, go to https://github.com/sponsors/hynek and check out the sweet perks!

Above and Beyond

Variomedia AG (@variomedia), Tidelift (@tidelift), Sentry (@getsentry), HiredScore (@HiredScore), FilePreviews (@filepreviews), Daniel Fortunov (@asqui), and Kevin P. Fleming (@kpfleming).

Maintenance Sustainers

Adam Hill (@adamghill), Dan Groshev (@si14), Magnus Watn (@magnuswatn), David Cramer (@dcramer), Moving Content AG (@moving-content), Stein Magnus Jodal (@jodal), ProteinQure (@ProteinQure), Jesse Snyder (@jessesnyder), Rivo Laks (@rivol), Tom Ballinger (@thomasballinger), Ionel Cristian Mărieș (@ionelmc), The Westervelt Company (@westerveltco), Philippe Galvan (@PhilippeGalvan), Birk Jernström (@birkjernstrom), Tim Schilling (@tim-schilling), Chris Withers (@cjw296), Christopher Dignam (@chdsbd), and Stefan Hagen (@sthagen).

Not to forget 3 more amazing humans who chose to be generous but anonymous!

Full Changelog

Added

  • Backwards-compatibility! svcs is pronounced stable now -- no more rug-pulls planned! #36

  • Flask: svcs.flask.container which is a werkzeug.local.LocalProxy (like, for example, flask.current_app) and is the currently active container when accessed within a request context.

23.19.0

21 Aug 06:53
23.19.0
6e2945b
Compare
Choose a tag to compare

Just internal re-jiggerings.

23.18.0

17 Aug 05:26
23.18.0
4de7e22
Compare
Choose a tag to compare

With Starlette successfully added, I hope svcs is now feature-complete and won't need any bigger changes in the future.

I suspect it can be proclaimed stable soon, just when I realize how to market it…

Added

  • Flask: svcs.flask.get_registry().

  • Starlette integration. #31

23.17.0

15 Aug 17:14
23.17.0
c52d8bc
Compare
Choose a tag to compare

FastAPI integration has landed in #30!

23.16.0

14 Aug 08:43
23.16.0
b3c9b73
Compare
Choose a tag to compare

Added

  • enter keyword argument to all register_(value|factory)(). It prevents svcs from entering context managers if the factory returns one. This is useful for context managers like database transactions that you want to start manually.

  • Services acquired using aget() now also can receive the current container if they take one argument that is named svcs_container or that is annotated as being svcs.Container and has any name.

23.15.0

14 Aug 06:26
23.15.0
ab7c58a
Compare
Choose a tag to compare

Added

  • A ResourceWarning is now raised when a container or a registry are garbage-collected with pending cleanups.

Changed

  • Cleanups for services are internally context managers now. For your convenience, if you pass an (async) generator function for a factory, the registry will automatically wrap it for you into an (async) context manager. #92

  • Pyramid: svcs.pyramid.get() now takes a Pyramid request as the first argument. svcs.pyramid.get_pings() also doesn't look at thread locals anymore. If you still want to use thread locals, you can use svcs.pyramid.from_svcs(None) to obtain the currently active container.

  • Flask: replace_(value|factory)() is now called overwrite_(value|factory()) to be consistent with the docs lingo. They also completely reset the instantiation cache now (practically speaking: they close the container).

Removed

  • svcs.Container.forget_about(). It doesn't make any sense in a world of recursive dependencies. Just reset the container using svcs.Container.(a)close().

23.14.0

11 Aug 08:47
23.14.0
0b3f1c2
Compare
Choose a tag to compare

Added

  • aiohttp: missing aget_abstract() function.
  • pyramid: missing get_pings() function.