Internalization

We can create or update an existing object using external data with the functions new_from_external_object() or update_from_external_object(), respectively.

In a web framework like Pyramid where an application object is located by route matching or traversal, update_from_external_object makes the most sense.

Factories

While updating objects, internalization will, by default, create a new instance for every mapping that contains a MimeType or Class key using Zope Component factories. Factories are named utilities, that implement IFactory (essentially, a callable of no arguments) This package uses extensions of that interface, namely IMimeObjectFactory, IClassObjectFactory and IAnonymousObjectFactory (whose default implementations are found in nti.externalization.factory).

The factory matching MimeType is preferred, but we can fall back to one matching Class if needed.

Factories are usually registered automatically by ext:registerAutoPackageIO at the same time it creates the InterfaceObjectIO adapters.

You can manually register factories from particular modules using ext:registerMimeFactories.

Lets look at the factories registered for our address:

>>> from zope.configuration import xmlconfig
>>> from zope import component
>>> from nti.externalization.interfaces import IMimeObjectFactory
>>> import nti.externalization.tests.benchmarks
>>> _ = xmlconfig.file('configure.zcml', nti.externalization.tests.benchmarks)
>>> factory = component.getUtility(IMimeObjectFactory, 'application/vnd.nextthought.benchmarks.address')
>>> factory
<MimeObjectFactory titled 'Address' using <class 'nti.externalization.tests.benchmarks.objects.Address'>...>
>>> factory()
<nti.externalization.tests.benchmarks.objects.Address ...>

Mime Types are found in the class attribute mimeType; ext:registerAutoPackageIO will add computed mimeType values to factory objects if needed.