Acquisition


NameAcquisition JSON
Version 6.0 PyPI version JSON
download
home_pagehttps://github.com/zopefoundation/Acquisition
SummaryAcquisition is a mechanism that allows objects to obtain attributes from the containment hierarchy they're in.
upload_time2024-05-30 09:18:22
maintainerNone
docs_urlNone
authorZope Foundation and Contributors
requires_python>=3.8
licenseZPL 2.1
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage
            Environmental Acquisiton
========================

This package implements "environmental acquisiton" for Python, as
proposed in the OOPSLA96_ paper by Joseph Gil and David H. Lorenz:

    We propose a new programming paradigm, environmental acquisition in
    the context of object aggregation, in which objects acquire
    behaviour from their current containers at runtime. The key idea is
    that the behaviour of a component may depend upon its enclosing
    composite(s). In particular, we propose a form of feature sharing in
    which an object "inherits" features from the classes of objects in
    its environment.  By examining the declaration of classes, it is
    possible to determine which kinds of classes may contain a
    component, and which components must be contained in a given kind of
    composite. These relationships are the basis for language constructs
    that supports acquisition.

.. _OOPSLA96: http://www.cs.virginia.edu/~lorenz/papers/oopsla96/>`_:

.. contents::

Introductory Example
--------------------

Zope implements acquisition with "Extension Class" mix-in classes. To
use acquisition your classes must inherit from an acquisition base
class. For example::

  >>> import ExtensionClass, Acquisition

  >>> class C(ExtensionClass.Base):
  ...     color = 'red'

  >>> class A(Acquisition.Implicit):
  ...     def report(self):
  ...         print(self.color)
  ...
  >>> a = A()
  >>> c = C()
  >>> c.a = a

  >>> c.a.report()
  red

  >>> d = C()
  >>> d.color = 'green'
  >>> d.a = a

  >>> d.a.report()
  green

  >>> try:
  ...     a.report()
  ... except AttributeError:
  ...     pass
  ... else:
  ...     raise AssertionError('AttributeError not raised.')

The class ``A`` inherits acquisition behavior from
``Acquisition.Implicit``. The object, ``a``, "has" the color of
objects ``c`` and d when it is accessed through them, but it has no
color by itself. The object ``a`` obtains attributes from its
environment, where its environment is defined by the access path used
to reach ``a``.

Acquisition Wrappers
--------------------

When an object that supports acquisition is accessed through an
extension class instance, a special object, called an acquisition
wrapper, is returned. In the example above, the expression ``c.a``
returns an acquisition wrapper that contains references to both ``c``
and ``a``. It is this wrapper that performs attribute lookup in ``c``
when an attribute cannot be found in ``a``.

Acquisition wrappers provide access to the wrapped objects through the
attributes ``aq_parent``, ``aq_self``, ``aq_base``.  Continue the
example from above::

  >>> c.a.aq_parent is c
  True
  >>> c.a.aq_self is a
  True

Explicit and Implicit Acquisition
---------------------------------

Two styles of acquisition are supported: implicit and explicit
acquisition.

Implicit acquisition
--------------------

Implicit acquisition is so named because it searches for attributes
from the environment automatically whenever an attribute cannot be
obtained directly from an object or through inheritance.

An attribute can be implicitly acquired if its name does not begin
with an underscore.

To support implicit acquisition, your class should inherit from the
mix-in class ``Acquisition.Implicit``.

Explicit Acquisition
--------------------

When explicit acquisition is used, attributes are not automatically
obtained from the environment. Instead, the method aq_acquire must be
used. For example::

  >>> print(c.a.aq_acquire('color'))
  red

To support explicit acquisition, your class should inherit from the
mix-in class ``Acquisition.Explicit``.

Controlling Acquisition
-----------------------

A class (or instance) can provide attribute by attribute control over
acquisition. You should subclass from ``Acquisition.Explicit``, and set
all attributes that should be acquired to the special value
``Acquisition.Acquired``. Setting an attribute to this value also allows
inherited attributes to be overridden with acquired ones. For example::

  >>> class C(Acquisition.Explicit):
  ...     id = 1
  ...     secret = 2
  ...     color = Acquisition.Acquired
  ...     __roles__ = Acquisition.Acquired

The only attributes that are automatically acquired from containing
objects are color, and ``__roles__``. Note that the ``__roles__``
attribute is acquired even though its name begins with an
underscore. In fact, the special ``Acquisition.Acquired`` value can be
used in ``Acquisition.Implicit`` objects to implicitly acquire
selected objects that smell like private objects.

Sometimes, you want to dynamically make an implicitly acquiring object
acquire explicitly. You can do this by getting the object's
aq_explicit attribute. This attribute provides the object with an
explicit wrapper that replaces the original implicit wrapper.

Filtered Acquisition
--------------------

The acquisition method, ``aq_acquire``, accepts two optional
arguments. The first of the additional arguments is a "filtering"
function that is used when considering whether to acquire an
object. The second of the additional arguments is an object that is
passed as extra data when calling the filtering function and which
defaults to ``None``. The filter function is called with five
arguments:

* The object that the aq_acquire method was called on,

* The object where an object was found,

* The name of the object, as passed to aq_acquire,

* The object found, and

* The extra data passed to aq_acquire.

If the filter returns a true object that the object found is returned,
otherwise, the acquisition search continues.

Here's an example::

  >>> from Acquisition import Explicit

  >>> class HandyForTesting(object):
  ...     def __init__(self, name):
  ...         self.name = name
  ...     def __str__(self):
  ...         return "%s(%s)" % (self.name, self.__class__.__name__)
  ...     __repr__=__str__
  ...
  >>> class E(Explicit, HandyForTesting): pass
  ...
  >>> class Nice(HandyForTesting):
  ...     isNice = 1
  ...     def __str__(self):
  ...         return HandyForTesting.__str__(self)+' and I am nice!'
  ...     __repr__ = __str__
  ...
  >>> a = E('a')
  >>> a.b = E('b')
  >>> a.b.c = E('c')
  >>> a.p = Nice('spam')
  >>> a.b.p = E('p')

  >>> def find_nice(self, ancestor, name, object, extra):
  ...     return hasattr(object,'isNice') and object.isNice

  >>> print(a.b.c.aq_acquire('p', find_nice))
  spam(Nice) and I am nice!

The filtered acquisition in the last line skips over the first
attribute it finds with the name ``p``, because the attribute doesn't
satisfy the condition given in the filter.

Filtered acquisition is rarely used in Zope.

Acquiring from Context
----------------------

Normally acquisition allows objects to acquire data from their
containers. However an object can acquire from objects that aren't its
containers.

Most of the examples we've seen so far show establishing of an
acquisition context using getattr semantics. For example, ``a.b`` is a
reference to ``b`` in the context of ``a``.

You can also manually set acquisition context using the ``__of__``
method. For example::

  >>> from Acquisition import Implicit
  >>> class C(Implicit): pass
  ...
  >>> a = C()
  >>> b = C()
  >>> a.color = "red"
  >>> print(b.__of__(a).color)
  red

In this case, ``a`` does not contain ``b``, but it is put in ``b``'s
context using the ``__of__`` method.

Here's another subtler example that shows how you can construct an
acquisition context that includes non-container objects::

  >>> from Acquisition import Implicit

  >>> class C(Implicit):
  ...     def __init__(self, name):
  ...         self.name = name

  >>> a = C("a")
  >>> a.b = C("b")
  >>> a.b.color = "red"
  >>> a.x = C("x")

  >>> print(a.b.x.color)
  red

Even though ``b`` does not contain ``x``, ``x`` can acquire the color
attribute from ``b``. This works because in this case, ``x`` is accessed
in the context of ``b`` even though it is not contained by ``b``.

Here acquisition context is defined by the objects used to access
another object.

Containment Before Context
--------------------------

If in the example above suppose both a and b have an color attribute::

  >>> a = C("a")
  >>> a.color = "green"
  >>> a.b = C("b")
  >>> a.b.color = "red"
  >>> a.x = C("x")

  >>> print(a.b.x.color)
  green

Why does ``a.b.x.color`` acquire color from ``a`` and not from ``b``?
The answer is that an object acquires from its containers before
non-containers in its context.

To see why consider this example in terms of expressions using the
``__of__`` method::

  a.x -> x.__of__(a)

  a.b -> b.__of__(a)

  a.b.x -> x.__of__(a).__of__(b.__of__(a))

Keep in mind that attribute lookup in a wrapper is done by trying to
look up the attribute in the wrapped object first and then in the
parent object. So in the expressions above proceeds from left to
right.

The upshot of these rules is that attributes are looked up by
containment before context.

This rule holds true also for more complex examples. For example,
``a.b.c.d.e.f.g.attribute`` would search for attribute in ``g`` and
all its containers first. (Containers are searched in order from the
innermost parent to the outermost container.) If the attribute is not
found in ``g`` or any of its containers, then the search moves to
``f`` and all its containers, and so on.

Additional Attributes and Methods
---------------------------------

You can use the special method ``aq_inner`` to access an object
wrapped only by containment. So in the example above,
``a.b.x.aq_inner`` is equivalent to ``a.x``.

You can find out the acquisition context of an object using the
aq_chain method like so:

  >>> [obj.name for obj in a.b.x.aq_chain]
  ['x', 'b', 'a']

You can find out if an object is in the containment context of another
object using the ``aq_inContextOf`` method. For example:

  >>> a.b.aq_inContextOf(a)
  True

.. Note: as of this writing the aq_inContextOf examples don't work the
   way they should be working. According to Jim, this is because
   aq_inContextOf works by comparing object pointer addresses, which
   (because they are actually different wrapper objects) doesn't give
   you the expected results. He acknowledges that this behavior is
   controversial, and says that there is a collector entry to change
   it so that you would get the answer you expect in the above. (We
   just need to get to it).

Acquisition Module Functions
----------------------------

In addition to using acquisition attributes and methods directly on
objects you can use similar functions defined in the ``Acquisition``
module. These functions have the advantage that you don't need to
check to make sure that the object has the method or attribute before
calling it.

``aq_acquire(object, name [, filter, extra, explicit, default, containment])``
    Acquires an object with the given name.

    This function can be used to explictly acquire when using explicit
    acquisition and to acquire names that wouldn't normally be
    acquired.

    The function accepts a number of optional arguments:

    ``filter``
        A callable filter object that is used to decide if an object
        should be acquired.

        The filter is called with five arguments:

        * The object that the aq_acquire method was called on,

        * The object where an object was found,

        * The name of the object, as passed to aq_acquire,

        * The object found, and

        * The extra argument passed to aq_acquire.

        If the filter returns a true object that the object found is
        returned, otherwise, the acquisition search continues.

    ``extra``
        Extra data to be passed as the last argument to the filter.

    ``explicit``
        A flag (boolean value) indicating whether explicit acquisition
        should be used. The default value is true. If the flag is
        true, then acquisition will proceed regardless of whether
        wrappers encountered in the search of the acquisition
        hierarchy are explicit or implicit wrappers. If the flag is
        false, then parents of explicit wrappers are not searched.

        This argument is useful if you want to apply a filter without
        overriding explicit wrappers.

    ``default``
        A default value to return if no value can be acquired.

    ``containment``
        A flag indicating whether the search should be limited to the
        containment hierarchy.

    In addition, arguments can be provided as keywords.

``aq_base(object)``
    Return the object with all wrapping removed.

``aq_chain(object [, containment])``
    Return a list containing the object and it's acquisition
    parents. The optional argument, containment, controls whether the
    containment or access hierarchy is used.

``aq_get(object, name [, default, containment])``
    Acquire an attribute, name. A default value can be provided, as
    can a flag that limits search to the containment hierarchy.

``aq_inner(object)``
    Return the object with all but the innermost layer of wrapping
    removed.

``aq_parent(object)``
    Return the acquisition parent of the object or None if the object
    is unwrapped.

``aq_self(object)``
    Return the object with one layer of wrapping removed, unless the
    object is unwrapped, in which case the object is returned.

In most cases it is more convenient to use these module functions
instead of the acquisition attributes and methods directly.

Acquisition and Methods
-----------------------

Python methods of objects that support acquisition can use acquired
attributes. When a Python method is called on an object that is
wrapped by an acquisition wrapper, the wrapper is passed to the method
as the first argument. This rule also applies to user-defined method
types and to C methods defined in pure mix-in classes.

Unfortunately, C methods defined in extension base classes that define
their own data structures, cannot use aquired attributes at this
time. This is because wrapper objects do not conform to the data
structures expected by these methods. In practice, you will seldom
find this a problem.

Conclusion
----------

Acquisition provides a powerful way to dynamically share information
between objects. Zope uses acquisition for a number of its key
features including security, object publishing, and DTML variable
lookup. Acquisition also provides an elegant solution to the problem
of circular references for many classes of problems. While acquisition
is powerful, you should take care when using acquisition in your
applications. The details can get complex, especially with the
differences between acquiring from context and acquiring from
containment.


Changelog
=========

6.0 (2024-05-30)
----------------

- Drop support for Python 3.7.

- Build Windows wheels on GHA.


5.2 (2024-02-13)
----------------

- Add preliminary support for Python 3.13 as of 3.13a3.


5.1 (2023-10-05)
----------------

- Add support for Python 3.12.


5.0 (2023-03-24)
----------------

- Build Linux binary wheels for Python 3.11.

- Drop support for Python 2.7, 3.5, 3.6.

- Add preliminary support for Python 3.12a5.


4.13 (2022-11-17)
-----------------

- Add support for building arm64 wheels on macOS.


4.12 (2022-11-03)
-----------------

- Add support for final Python 3.11 release.


4.11 (2022-09-16)
-----------------

- Add support for Python 3.11 (as of 3.11.0rc1).

- Switch from ``-Ofast`` to ``-O3`` when compiling code for Linux wheels.
  (`#64 <https://github.com/zopefoundation/Acquisition/pull/64>`_)


4.10 (2021-12-07)
-----------------

- Fix bug in the ``PURE_PYTHON`` version affecting ``aq_acquire`` applied
  to a class with a filter.

- Improve interface documentation.

- Add support for Python 3.10.


4.9 (2021-08-19)
----------------

- On CPython no longer omit compiling the C code when ``PURE_PYTHON`` is
  required. Just evaluate it at runtime.
  (`#53 <https://github.com/zopefoundation/Acquisition/issues/53>`_)


4.8 (2021-07-20)
----------------

- Various fixes for the ``PURE_PYTHON`` version, e.g.
  make ``Acquired`` an ``str`` (as required by ``Zope``),
  avoid infinite ``__cmp__`` loop.
  (`#51 <https://github.com/zopefoundation/Acquisition/issues/51>`_,
  `#48 <https://github.com/zopefoundation/Acquisition/issues/48>`_)

- Create aarch64 wheels.


4.7 (2020-10-07)
----------------

- Add support for Python 3.8 and 3.9.


4.6 (2019-04-24)
----------------

- Drop support for Python 3.4.

- Add support for Python 3.8a3.

- Add support to call ``bytes()`` on an object wrapped by an
  ``ImplicitAcquisitionWrapper``.
  (`#38 <https://github.com/zopefoundation/Acquisition/issues/38>`_)


4.5 (2018-10-05)
----------------

- Avoid deprecation warnings by using current API.

- Add support for Python 3.7.

4.4.4 (2017-11-24)
------------------

- Add Appveyor configuration to automate building Windows eggs.

4.4.3 (2017-11-23)
------------------

- Fix the extremely rare potential for a crash when the C extensions
  are in use. See `issue 21 <https://github.com/zopefoundation/Acquisition/issues/21>`_.

4.4.2 (2017-05-12)
------------------

- Fix C capsule name to fix import errors.

- Ensure our dependencies match our expactations about C extensions.

4.4.1 (2017-05-04)
------------------

- Fix C code under Python 3.4, with missing Py_XSETREF.

4.4.0 (2017-05-04)
------------------

- Enable the C extension under Python 3.

- Drop support for Python 3.3.

4.3.0 (2017-01-20)
------------------

- Make tests compatible with ExtensionClass 4.2.0.

- Drop support for Python 2.6 and 3.2.

- Add support for Python 3.5 and 3.6.

4.2.2 (2015-05-19)
------------------

- Make the pure-Python Acquirer objects cooperatively use the
  superclass ``__getattribute__`` method, like the C implementation.
  See https://github.com/zopefoundation/Acquisition/issues/7.

- The pure-Python implicit acquisition wrapper allows wrapped objects
  to use ``object.__getattribute__(self, name)``. This differs from
  the C implementation, but is important for compatibility with the
  pure-Python versions of libraries like ``persistent``. See
  https://github.com/zopefoundation/Acquisition/issues/9.

4.2.1 (2015-04-23)
------------------

- Correct several dangling pointer uses in the C extension,
  potentially fixing a few interpreter crashes. See
  https://github.com/zopefoundation/Acquisition/issues/5.

4.2 (2015-04-04)
----------------

- Add support for PyPy, PyPy3, and Python 3.2, 3.3, and 3.4.

4.1 (2014-12-18)
----------------

- Bump dependency on ``ExtensionClass`` to match current release.

4.0.3 (2014-11-02)
------------------

- Skip readme.rst tests when tests are run outside a source checkout.

4.0.2 (2014-11-02)
------------------

- Include ``*.rst`` files in the release.

4.0.1 (2014-10-30)
------------------

- Tolerate Unicode attribute names (ASCII only).  LP #143358.

- Make module-level ``aq_acquire`` API respect the ``default`` parameter.
  LP #1387363.

- Don't raise an attribute error for ``__iter__`` if the fallback to
  ``__getitem__`` succeeds.  LP #1155760.


4.0 (2013-02-24)
----------------

- Added trove classifiers to project metadata.

4.0a1 (2011-12-13)
------------------

- Raise `RuntimeError: Recursion detected in acquisition wrapper` if an object
  with a `__parent__` pointer points to a wrapper that in turn points to the
  original object.

- Prevent wrappers to be created while accessing `__parent__` on types derived
  from Explicit or Implicit base classes.

2.13.9 (2015-02-17)
-------------------

- Tolerate Unicode attribute names (ASCII only).  LP #143358.

- Make module-level ``aq_acquire`` API respect the ``default`` parameter.
  LP #1387363.

- Don't raise an attribute error for ``__iter__`` if the fallback to
  ``__getitem__`` succeeds.  LP #1155760.

2.13.8 (2011-06-11)
-------------------

- Fixed a segfault on 64bit platforms when providing the `explicit` argument to
  the aq_acquire method of an Acquisition wrapper. Thx to LP #675064 for the
  hint to the solution. The code passed an int instead of a pointer into a
  function.

2.13.7 (2011-03-02)
-------------------

- Fixed bug: When an object did not implement ``__unicode__``, calling
  ``unicode(wrapped)`` was calling ``__str__`` with an unwrapped ``self``.

2.13.6 (2011-02-19)
-------------------

- Add ``aq_explicit`` to ``IAcquisitionWrapper``.

- Fixed bug: ``unicode(wrapped)`` was not calling a ``__unicode__``
  method on wrapped objects.

2.13.5 (2010-09-29)
-------------------

- Fixed unit tests that failed on 64bit Python on Windows machines.

2.13.4 (2010-08-31)
-------------------

- LP 623665: Fixed typo in Acquisition.h.

2.13.3 (2010-04-19)
-------------------

- Use the doctest module from the standard library and no longer depend on
  zope.testing.

2.13.2 (2010-04-04)
-------------------

- Give both wrapper classes a ``__getnewargs__`` method, which causes the ZODB
  optimization to fail and create persistent references using the ``_p_oid``
  alone. This happens to be the persistent oid of the wrapped object. This lets
  these objects to be persisted correctly, even though they are passed to the
  ZODB in a wrapped state.

- Added failing tests for http://dev.plone.org/plone/ticket/10318. This shows
  an edge-case where AQ wrappers can be pickled using the specific combination
  of cPickle, pickle protocol one and a custom Pickler class with an
  ``inst_persistent_id`` hook. Unfortunately this is the exact combination used
  by ZODB3.

2.13.1 (2010-02-23)
-------------------

- Update to include ExtensionClass 2.13.0.

- Fix the ``tp_name`` of the ImplicitAcquisitionWrapper and
  ExplicitAcquisitionWrapper to match their Python visible names and thus have
  a correct ``__name__``.

- Expand the ``tp_name`` of our extension types to hold the fully qualified
  name. This ensures classes have their ``__module__`` set correctly.

2.13.0 (2010-02-14)
-------------------

- Added support for method cache in Acquisition. Patch contributed by
  Yoshinori K. Okuji. See https://bugs.launchpad.net/zope2/+bug/486182.

2.12.4 (2009-10-29)
-------------------

- Fix iteration proxying to pass `self` acquisition-wrapped into both
  `__iter__` as well as `__getitem__` (this fixes
  https://bugs.launchpad.net/zope2/+bug/360761).

- Add tests for the __getslice__ proxying, including open-ended slicing.

2.12.3 (2009-08-08)
-------------------

- More 64-bit fixes in Py_BuildValue calls.

- More 64-bit issues fixed: Use correct integer size for slice operations.

2.12.2 (2009-08-02)
-------------------

- Fixed 64-bit compatibility issues for Python 2.5.x / 2.6.x.  See
  http://www.python.org/dev/peps/pep-0353/ for details.

2.12.1 (2009-04-15)
-------------------

- Update for iteration proxying: The proxy for `__iter__` must not rely on the
  object to have an `__iter__` itself, but also support fall-back iteration via
  `__getitem__` (this fixes https://bugs.launchpad.net/zope2/+bug/360761).

2.12 (2009-01-25)
-----------------

- Release as separate package.

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/zopefoundation/Acquisition",
    "name": "Acquisition",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": null,
    "author": "Zope Foundation and Contributors",
    "author_email": "zope-dev@zope.org",
    "download_url": null,
    "platform": null,
    "description": "Environmental Acquisiton\n========================\n\nThis package implements \"environmental acquisiton\" for Python, as\nproposed in the OOPSLA96_ paper by Joseph Gil and David H. Lorenz:\n\n    We propose a new programming paradigm, environmental acquisition in\n    the context of object aggregation, in which objects acquire\n    behaviour from their current containers at runtime. The key idea is\n    that the behaviour of a component may depend upon its enclosing\n    composite(s). In particular, we propose a form of feature sharing in\n    which an object \"inherits\" features from the classes of objects in\n    its environment.  By examining the declaration of classes, it is\n    possible to determine which kinds of classes may contain a\n    component, and which components must be contained in a given kind of\n    composite. These relationships are the basis for language constructs\n    that supports acquisition.\n\n.. _OOPSLA96: http://www.cs.virginia.edu/~lorenz/papers/oopsla96/>`_:\n\n.. contents::\n\nIntroductory Example\n--------------------\n\nZope implements acquisition with \"Extension Class\" mix-in classes. To\nuse acquisition your classes must inherit from an acquisition base\nclass. For example::\n\n  >>> import ExtensionClass, Acquisition\n\n  >>> class C(ExtensionClass.Base):\n  ...     color = 'red'\n\n  >>> class A(Acquisition.Implicit):\n  ...     def report(self):\n  ...         print(self.color)\n  ...\n  >>> a = A()\n  >>> c = C()\n  >>> c.a = a\n\n  >>> c.a.report()\n  red\n\n  >>> d = C()\n  >>> d.color = 'green'\n  >>> d.a = a\n\n  >>> d.a.report()\n  green\n\n  >>> try:\n  ...     a.report()\n  ... except AttributeError:\n  ...     pass\n  ... else:\n  ...     raise AssertionError('AttributeError not raised.')\n\nThe class ``A`` inherits acquisition behavior from\n``Acquisition.Implicit``. The object, ``a``, \"has\" the color of\nobjects ``c`` and d when it is accessed through them, but it has no\ncolor by itself. The object ``a`` obtains attributes from its\nenvironment, where its environment is defined by the access path used\nto reach ``a``.\n\nAcquisition Wrappers\n--------------------\n\nWhen an object that supports acquisition is accessed through an\nextension class instance, a special object, called an acquisition\nwrapper, is returned. In the example above, the expression ``c.a``\nreturns an acquisition wrapper that contains references to both ``c``\nand ``a``. It is this wrapper that performs attribute lookup in ``c``\nwhen an attribute cannot be found in ``a``.\n\nAcquisition wrappers provide access to the wrapped objects through the\nattributes ``aq_parent``, ``aq_self``, ``aq_base``.  Continue the\nexample from above::\n\n  >>> c.a.aq_parent is c\n  True\n  >>> c.a.aq_self is a\n  True\n\nExplicit and Implicit Acquisition\n---------------------------------\n\nTwo styles of acquisition are supported: implicit and explicit\nacquisition.\n\nImplicit acquisition\n--------------------\n\nImplicit acquisition is so named because it searches for attributes\nfrom the environment automatically whenever an attribute cannot be\nobtained directly from an object or through inheritance.\n\nAn attribute can be implicitly acquired if its name does not begin\nwith an underscore.\n\nTo support implicit acquisition, your class should inherit from the\nmix-in class ``Acquisition.Implicit``.\n\nExplicit Acquisition\n--------------------\n\nWhen explicit acquisition is used, attributes are not automatically\nobtained from the environment. Instead, the method aq_acquire must be\nused. For example::\n\n  >>> print(c.a.aq_acquire('color'))\n  red\n\nTo support explicit acquisition, your class should inherit from the\nmix-in class ``Acquisition.Explicit``.\n\nControlling Acquisition\n-----------------------\n\nA class (or instance) can provide attribute by attribute control over\nacquisition. You should subclass from ``Acquisition.Explicit``, and set\nall attributes that should be acquired to the special value\n``Acquisition.Acquired``. Setting an attribute to this value also allows\ninherited attributes to be overridden with acquired ones. For example::\n\n  >>> class C(Acquisition.Explicit):\n  ...     id = 1\n  ...     secret = 2\n  ...     color = Acquisition.Acquired\n  ...     __roles__ = Acquisition.Acquired\n\nThe only attributes that are automatically acquired from containing\nobjects are color, and ``__roles__``. Note that the ``__roles__``\nattribute is acquired even though its name begins with an\nunderscore. In fact, the special ``Acquisition.Acquired`` value can be\nused in ``Acquisition.Implicit`` objects to implicitly acquire\nselected objects that smell like private objects.\n\nSometimes, you want to dynamically make an implicitly acquiring object\nacquire explicitly. You can do this by getting the object's\naq_explicit attribute. This attribute provides the object with an\nexplicit wrapper that replaces the original implicit wrapper.\n\nFiltered Acquisition\n--------------------\n\nThe acquisition method, ``aq_acquire``, accepts two optional\narguments. The first of the additional arguments is a \"filtering\"\nfunction that is used when considering whether to acquire an\nobject. The second of the additional arguments is an object that is\npassed as extra data when calling the filtering function and which\ndefaults to ``None``. The filter function is called with five\narguments:\n\n* The object that the aq_acquire method was called on,\n\n* The object where an object was found,\n\n* The name of the object, as passed to aq_acquire,\n\n* The object found, and\n\n* The extra data passed to aq_acquire.\n\nIf the filter returns a true object that the object found is returned,\notherwise, the acquisition search continues.\n\nHere's an example::\n\n  >>> from Acquisition import Explicit\n\n  >>> class HandyForTesting(object):\n  ...     def __init__(self, name):\n  ...         self.name = name\n  ...     def __str__(self):\n  ...         return \"%s(%s)\" % (self.name, self.__class__.__name__)\n  ...     __repr__=__str__\n  ...\n  >>> class E(Explicit, HandyForTesting): pass\n  ...\n  >>> class Nice(HandyForTesting):\n  ...     isNice = 1\n  ...     def __str__(self):\n  ...         return HandyForTesting.__str__(self)+' and I am nice!'\n  ...     __repr__ = __str__\n  ...\n  >>> a = E('a')\n  >>> a.b = E('b')\n  >>> a.b.c = E('c')\n  >>> a.p = Nice('spam')\n  >>> a.b.p = E('p')\n\n  >>> def find_nice(self, ancestor, name, object, extra):\n  ...     return hasattr(object,'isNice') and object.isNice\n\n  >>> print(a.b.c.aq_acquire('p', find_nice))\n  spam(Nice) and I am nice!\n\nThe filtered acquisition in the last line skips over the first\nattribute it finds with the name ``p``, because the attribute doesn't\nsatisfy the condition given in the filter.\n\nFiltered acquisition is rarely used in Zope.\n\nAcquiring from Context\n----------------------\n\nNormally acquisition allows objects to acquire data from their\ncontainers. However an object can acquire from objects that aren't its\ncontainers.\n\nMost of the examples we've seen so far show establishing of an\nacquisition context using getattr semantics. For example, ``a.b`` is a\nreference to ``b`` in the context of ``a``.\n\nYou can also manually set acquisition context using the ``__of__``\nmethod. For example::\n\n  >>> from Acquisition import Implicit\n  >>> class C(Implicit): pass\n  ...\n  >>> a = C()\n  >>> b = C()\n  >>> a.color = \"red\"\n  >>> print(b.__of__(a).color)\n  red\n\nIn this case, ``a`` does not contain ``b``, but it is put in ``b``'s\ncontext using the ``__of__`` method.\n\nHere's another subtler example that shows how you can construct an\nacquisition context that includes non-container objects::\n\n  >>> from Acquisition import Implicit\n\n  >>> class C(Implicit):\n  ...     def __init__(self, name):\n  ...         self.name = name\n\n  >>> a = C(\"a\")\n  >>> a.b = C(\"b\")\n  >>> a.b.color = \"red\"\n  >>> a.x = C(\"x\")\n\n  >>> print(a.b.x.color)\n  red\n\nEven though ``b`` does not contain ``x``, ``x`` can acquire the color\nattribute from ``b``. This works because in this case, ``x`` is accessed\nin the context of ``b`` even though it is not contained by ``b``.\n\nHere acquisition context is defined by the objects used to access\nanother object.\n\nContainment Before Context\n--------------------------\n\nIf in the example above suppose both a and b have an color attribute::\n\n  >>> a = C(\"a\")\n  >>> a.color = \"green\"\n  >>> a.b = C(\"b\")\n  >>> a.b.color = \"red\"\n  >>> a.x = C(\"x\")\n\n  >>> print(a.b.x.color)\n  green\n\nWhy does ``a.b.x.color`` acquire color from ``a`` and not from ``b``?\nThe answer is that an object acquires from its containers before\nnon-containers in its context.\n\nTo see why consider this example in terms of expressions using the\n``__of__`` method::\n\n  a.x -> x.__of__(a)\n\n  a.b -> b.__of__(a)\n\n  a.b.x -> x.__of__(a).__of__(b.__of__(a))\n\nKeep in mind that attribute lookup in a wrapper is done by trying to\nlook up the attribute in the wrapped object first and then in the\nparent object. So in the expressions above proceeds from left to\nright.\n\nThe upshot of these rules is that attributes are looked up by\ncontainment before context.\n\nThis rule holds true also for more complex examples. For example,\n``a.b.c.d.e.f.g.attribute`` would search for attribute in ``g`` and\nall its containers first. (Containers are searched in order from the\ninnermost parent to the outermost container.) If the attribute is not\nfound in ``g`` or any of its containers, then the search moves to\n``f`` and all its containers, and so on.\n\nAdditional Attributes and Methods\n---------------------------------\n\nYou can use the special method ``aq_inner`` to access an object\nwrapped only by containment. So in the example above,\n``a.b.x.aq_inner`` is equivalent to ``a.x``.\n\nYou can find out the acquisition context of an object using the\naq_chain method like so:\n\n  >>> [obj.name for obj in a.b.x.aq_chain]\n  ['x', 'b', 'a']\n\nYou can find out if an object is in the containment context of another\nobject using the ``aq_inContextOf`` method. For example:\n\n  >>> a.b.aq_inContextOf(a)\n  True\n\n.. Note: as of this writing the aq_inContextOf examples don't work the\n   way they should be working. According to Jim, this is because\n   aq_inContextOf works by comparing object pointer addresses, which\n   (because they are actually different wrapper objects) doesn't give\n   you the expected results. He acknowledges that this behavior is\n   controversial, and says that there is a collector entry to change\n   it so that you would get the answer you expect in the above. (We\n   just need to get to it).\n\nAcquisition Module Functions\n----------------------------\n\nIn addition to using acquisition attributes and methods directly on\nobjects you can use similar functions defined in the ``Acquisition``\nmodule. These functions have the advantage that you don't need to\ncheck to make sure that the object has the method or attribute before\ncalling it.\n\n``aq_acquire(object, name [, filter, extra, explicit, default, containment])``\n    Acquires an object with the given name.\n\n    This function can be used to explictly acquire when using explicit\n    acquisition and to acquire names that wouldn't normally be\n    acquired.\n\n    The function accepts a number of optional arguments:\n\n    ``filter``\n        A callable filter object that is used to decide if an object\n        should be acquired.\n\n        The filter is called with five arguments:\n\n        * The object that the aq_acquire method was called on,\n\n        * The object where an object was found,\n\n        * The name of the object, as passed to aq_acquire,\n\n        * The object found, and\n\n        * The extra argument passed to aq_acquire.\n\n        If the filter returns a true object that the object found is\n        returned, otherwise, the acquisition search continues.\n\n    ``extra``\n        Extra data to be passed as the last argument to the filter.\n\n    ``explicit``\n        A flag (boolean value) indicating whether explicit acquisition\n        should be used. The default value is true. If the flag is\n        true, then acquisition will proceed regardless of whether\n        wrappers encountered in the search of the acquisition\n        hierarchy are explicit or implicit wrappers. If the flag is\n        false, then parents of explicit wrappers are not searched.\n\n        This argument is useful if you want to apply a filter without\n        overriding explicit wrappers.\n\n    ``default``\n        A default value to return if no value can be acquired.\n\n    ``containment``\n        A flag indicating whether the search should be limited to the\n        containment hierarchy.\n\n    In addition, arguments can be provided as keywords.\n\n``aq_base(object)``\n    Return the object with all wrapping removed.\n\n``aq_chain(object [, containment])``\n    Return a list containing the object and it's acquisition\n    parents. The optional argument, containment, controls whether the\n    containment or access hierarchy is used.\n\n``aq_get(object, name [, default, containment])``\n    Acquire an attribute, name. A default value can be provided, as\n    can a flag that limits search to the containment hierarchy.\n\n``aq_inner(object)``\n    Return the object with all but the innermost layer of wrapping\n    removed.\n\n``aq_parent(object)``\n    Return the acquisition parent of the object or None if the object\n    is unwrapped.\n\n``aq_self(object)``\n    Return the object with one layer of wrapping removed, unless the\n    object is unwrapped, in which case the object is returned.\n\nIn most cases it is more convenient to use these module functions\ninstead of the acquisition attributes and methods directly.\n\nAcquisition and Methods\n-----------------------\n\nPython methods of objects that support acquisition can use acquired\nattributes. When a Python method is called on an object that is\nwrapped by an acquisition wrapper, the wrapper is passed to the method\nas the first argument. This rule also applies to user-defined method\ntypes and to C methods defined in pure mix-in classes.\n\nUnfortunately, C methods defined in extension base classes that define\ntheir own data structures, cannot use aquired attributes at this\ntime. This is because wrapper objects do not conform to the data\nstructures expected by these methods. In practice, you will seldom\nfind this a problem.\n\nConclusion\n----------\n\nAcquisition provides a powerful way to dynamically share information\nbetween objects. Zope uses acquisition for a number of its key\nfeatures including security, object publishing, and DTML variable\nlookup. Acquisition also provides an elegant solution to the problem\nof circular references for many classes of problems. While acquisition\nis powerful, you should take care when using acquisition in your\napplications. The details can get complex, especially with the\ndifferences between acquiring from context and acquiring from\ncontainment.\n\n\nChangelog\n=========\n\n6.0 (2024-05-30)\n----------------\n\n- Drop support for Python 3.7.\n\n- Build Windows wheels on GHA.\n\n\n5.2 (2024-02-13)\n----------------\n\n- Add preliminary support for Python 3.13 as of 3.13a3.\n\n\n5.1 (2023-10-05)\n----------------\n\n- Add support for Python 3.12.\n\n\n5.0 (2023-03-24)\n----------------\n\n- Build Linux binary wheels for Python 3.11.\n\n- Drop support for Python 2.7, 3.5, 3.6.\n\n- Add preliminary support for Python 3.12a5.\n\n\n4.13 (2022-11-17)\n-----------------\n\n- Add support for building arm64 wheels on macOS.\n\n\n4.12 (2022-11-03)\n-----------------\n\n- Add support for final Python 3.11 release.\n\n\n4.11 (2022-09-16)\n-----------------\n\n- Add support for Python 3.11 (as of 3.11.0rc1).\n\n- Switch from ``-Ofast`` to ``-O3`` when compiling code for Linux wheels.\n  (`#64 <https://github.com/zopefoundation/Acquisition/pull/64>`_)\n\n\n4.10 (2021-12-07)\n-----------------\n\n- Fix bug in the ``PURE_PYTHON`` version affecting ``aq_acquire`` applied\n  to a class with a filter.\n\n- Improve interface documentation.\n\n- Add support for Python 3.10.\n\n\n4.9 (2021-08-19)\n----------------\n\n- On CPython no longer omit compiling the C code when ``PURE_PYTHON`` is\n  required. Just evaluate it at runtime.\n  (`#53 <https://github.com/zopefoundation/Acquisition/issues/53>`_)\n\n\n4.8 (2021-07-20)\n----------------\n\n- Various fixes for the ``PURE_PYTHON`` version, e.g.\n  make ``Acquired`` an ``str`` (as required by ``Zope``),\n  avoid infinite ``__cmp__`` loop.\n  (`#51 <https://github.com/zopefoundation/Acquisition/issues/51>`_,\n  `#48 <https://github.com/zopefoundation/Acquisition/issues/48>`_)\n\n- Create aarch64 wheels.\n\n\n4.7 (2020-10-07)\n----------------\n\n- Add support for Python 3.8 and 3.9.\n\n\n4.6 (2019-04-24)\n----------------\n\n- Drop support for Python 3.4.\n\n- Add support for Python 3.8a3.\n\n- Add support to call ``bytes()`` on an object wrapped by an\n  ``ImplicitAcquisitionWrapper``.\n  (`#38 <https://github.com/zopefoundation/Acquisition/issues/38>`_)\n\n\n4.5 (2018-10-05)\n----------------\n\n- Avoid deprecation warnings by using current API.\n\n- Add support for Python 3.7.\n\n4.4.4 (2017-11-24)\n------------------\n\n- Add Appveyor configuration to automate building Windows eggs.\n\n4.4.3 (2017-11-23)\n------------------\n\n- Fix the extremely rare potential for a crash when the C extensions\n  are in use. See `issue 21 <https://github.com/zopefoundation/Acquisition/issues/21>`_.\n\n4.4.2 (2017-05-12)\n------------------\n\n- Fix C capsule name to fix import errors.\n\n- Ensure our dependencies match our expactations about C extensions.\n\n4.4.1 (2017-05-04)\n------------------\n\n- Fix C code under Python 3.4, with missing Py_XSETREF.\n\n4.4.0 (2017-05-04)\n------------------\n\n- Enable the C extension under Python 3.\n\n- Drop support for Python 3.3.\n\n4.3.0 (2017-01-20)\n------------------\n\n- Make tests compatible with ExtensionClass 4.2.0.\n\n- Drop support for Python 2.6 and 3.2.\n\n- Add support for Python 3.5 and 3.6.\n\n4.2.2 (2015-05-19)\n------------------\n\n- Make the pure-Python Acquirer objects cooperatively use the\n  superclass ``__getattribute__`` method, like the C implementation.\n  See https://github.com/zopefoundation/Acquisition/issues/7.\n\n- The pure-Python implicit acquisition wrapper allows wrapped objects\n  to use ``object.__getattribute__(self, name)``. This differs from\n  the C implementation, but is important for compatibility with the\n  pure-Python versions of libraries like ``persistent``. See\n  https://github.com/zopefoundation/Acquisition/issues/9.\n\n4.2.1 (2015-04-23)\n------------------\n\n- Correct several dangling pointer uses in the C extension,\n  potentially fixing a few interpreter crashes. See\n  https://github.com/zopefoundation/Acquisition/issues/5.\n\n4.2 (2015-04-04)\n----------------\n\n- Add support for PyPy, PyPy3, and Python 3.2, 3.3, and 3.4.\n\n4.1 (2014-12-18)\n----------------\n\n- Bump dependency on ``ExtensionClass`` to match current release.\n\n4.0.3 (2014-11-02)\n------------------\n\n- Skip readme.rst tests when tests are run outside a source checkout.\n\n4.0.2 (2014-11-02)\n------------------\n\n- Include ``*.rst`` files in the release.\n\n4.0.1 (2014-10-30)\n------------------\n\n- Tolerate Unicode attribute names (ASCII only).  LP #143358.\n\n- Make module-level ``aq_acquire`` API respect the ``default`` parameter.\n  LP #1387363.\n\n- Don't raise an attribute error for ``__iter__`` if the fallback to\n  ``__getitem__`` succeeds.  LP #1155760.\n\n\n4.0 (2013-02-24)\n----------------\n\n- Added trove classifiers to project metadata.\n\n4.0a1 (2011-12-13)\n------------------\n\n- Raise `RuntimeError: Recursion detected in acquisition wrapper` if an object\n  with a `__parent__` pointer points to a wrapper that in turn points to the\n  original object.\n\n- Prevent wrappers to be created while accessing `__parent__` on types derived\n  from Explicit or Implicit base classes.\n\n2.13.9 (2015-02-17)\n-------------------\n\n- Tolerate Unicode attribute names (ASCII only).  LP #143358.\n\n- Make module-level ``aq_acquire`` API respect the ``default`` parameter.\n  LP #1387363.\n\n- Don't raise an attribute error for ``__iter__`` if the fallback to\n  ``__getitem__`` succeeds.  LP #1155760.\n\n2.13.8 (2011-06-11)\n-------------------\n\n- Fixed a segfault on 64bit platforms when providing the `explicit` argument to\n  the aq_acquire method of an Acquisition wrapper. Thx to LP #675064 for the\n  hint to the solution. The code passed an int instead of a pointer into a\n  function.\n\n2.13.7 (2011-03-02)\n-------------------\n\n- Fixed bug: When an object did not implement ``__unicode__``, calling\n  ``unicode(wrapped)`` was calling ``__str__`` with an unwrapped ``self``.\n\n2.13.6 (2011-02-19)\n-------------------\n\n- Add ``aq_explicit`` to ``IAcquisitionWrapper``.\n\n- Fixed bug: ``unicode(wrapped)`` was not calling a ``__unicode__``\n  method on wrapped objects.\n\n2.13.5 (2010-09-29)\n-------------------\n\n- Fixed unit tests that failed on 64bit Python on Windows machines.\n\n2.13.4 (2010-08-31)\n-------------------\n\n- LP 623665: Fixed typo in Acquisition.h.\n\n2.13.3 (2010-04-19)\n-------------------\n\n- Use the doctest module from the standard library and no longer depend on\n  zope.testing.\n\n2.13.2 (2010-04-04)\n-------------------\n\n- Give both wrapper classes a ``__getnewargs__`` method, which causes the ZODB\n  optimization to fail and create persistent references using the ``_p_oid``\n  alone. This happens to be the persistent oid of the wrapped object. This lets\n  these objects to be persisted correctly, even though they are passed to the\n  ZODB in a wrapped state.\n\n- Added failing tests for http://dev.plone.org/plone/ticket/10318. This shows\n  an edge-case where AQ wrappers can be pickled using the specific combination\n  of cPickle, pickle protocol one and a custom Pickler class with an\n  ``inst_persistent_id`` hook. Unfortunately this is the exact combination used\n  by ZODB3.\n\n2.13.1 (2010-02-23)\n-------------------\n\n- Update to include ExtensionClass 2.13.0.\n\n- Fix the ``tp_name`` of the ImplicitAcquisitionWrapper and\n  ExplicitAcquisitionWrapper to match their Python visible names and thus have\n  a correct ``__name__``.\n\n- Expand the ``tp_name`` of our extension types to hold the fully qualified\n  name. This ensures classes have their ``__module__`` set correctly.\n\n2.13.0 (2010-02-14)\n-------------------\n\n- Added support for method cache in Acquisition. Patch contributed by\n  Yoshinori K. Okuji. See https://bugs.launchpad.net/zope2/+bug/486182.\n\n2.12.4 (2009-10-29)\n-------------------\n\n- Fix iteration proxying to pass `self` acquisition-wrapped into both\n  `__iter__` as well as `__getitem__` (this fixes\n  https://bugs.launchpad.net/zope2/+bug/360761).\n\n- Add tests for the __getslice__ proxying, including open-ended slicing.\n\n2.12.3 (2009-08-08)\n-------------------\n\n- More 64-bit fixes in Py_BuildValue calls.\n\n- More 64-bit issues fixed: Use correct integer size for slice operations.\n\n2.12.2 (2009-08-02)\n-------------------\n\n- Fixed 64-bit compatibility issues for Python 2.5.x / 2.6.x.  See\n  http://www.python.org/dev/peps/pep-0353/ for details.\n\n2.12.1 (2009-04-15)\n-------------------\n\n- Update for iteration proxying: The proxy for `__iter__` must not rely on the\n  object to have an `__iter__` itself, but also support fall-back iteration via\n  `__getitem__` (this fixes https://bugs.launchpad.net/zope2/+bug/360761).\n\n2.12 (2009-01-25)\n-----------------\n\n- Release as separate package.\n",
    "bugtrack_url": null,
    "license": "ZPL 2.1",
    "summary": "Acquisition is a mechanism that allows objects to obtain attributes from the containment hierarchy they're in.",
    "version": "6.0",
    "project_urls": {
        "Homepage": "https://github.com/zopefoundation/Acquisition"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4a30ebfcacafb9615a1bb126af7a0ed4643acbe449ce2d397003b2c9440a642d",
                "md5": "ac8deb2fd7dea16c2e9a81e16f5c64ed",
                "sha256": "61206d6ab4b89514d03ebc952053ed230f4a269ea09696b502181e1e2a450d3e"
            },
            "downloads": -1,
            "filename": "Acquisition-6.0-cp310-cp310-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "ac8deb2fd7dea16c2e9a81e16f5c64ed",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 64756,
            "upload_time": "2024-05-30T09:18:22",
            "upload_time_iso_8601": "2024-05-30T09:18:22.267160Z",
            "url": "https://files.pythonhosted.org/packages/4a/30/ebfcacafb9615a1bb126af7a0ed4643acbe449ce2d397003b2c9440a642d/Acquisition-6.0-cp310-cp310-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "7e957b9abc7bea6fa82ba6f8c4e89ece5f3d214ed55640529c5661ef9e3dfdea",
                "md5": "0f3d7488606b562a8341917b3e4c2e4d",
                "sha256": "ce5478ba2f98c6b9989695e5f8b25a16021c731dc1c575329a831072dc693399"
            },
            "downloads": -1,
            "filename": "Acquisition-6.0-cp310-cp310-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "0f3d7488606b562a8341917b3e4c2e4d",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 64385,
            "upload_time": "2024-05-30T09:18:24",
            "upload_time_iso_8601": "2024-05-30T09:18:24.743707Z",
            "url": "https://files.pythonhosted.org/packages/7e/95/7b9abc7bea6fa82ba6f8c4e89ece5f3d214ed55640529c5661ef9e3dfdea/Acquisition-6.0-cp310-cp310-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8673720c00f7199d878b1bcdf1b6c1646a7359f63193310e658401f9802e24d5",
                "md5": "7b795bee9bfe711cc14b42f053255526",
                "sha256": "41feb45c75f312c1eeb43ae0a0afea03f5384749d8f80c184e64a76b8cdd7978"
            },
            "downloads": -1,
            "filename": "Acquisition-6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "7b795bee9bfe711cc14b42f053255526",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 112290,
            "upload_time": "2024-05-30T09:39:09",
            "upload_time_iso_8601": "2024-05-30T09:39:09.528946Z",
            "url": "https://files.pythonhosted.org/packages/86/73/720c00f7199d878b1bcdf1b6c1646a7359f63193310e658401f9802e24d5/Acquisition-6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1ecea29dfc01a3da77db03fd52e9ae0664cf5b3ddc20b11fb0341e03facfc1f1",
                "md5": "b77bf9e938ce1fbd1c8b6e582a650575",
                "sha256": "a2c3e2e96e38f36bafa317a7e8f02222829874f2617fa44795d45fdb7e3c33b1"
            },
            "downloads": -1,
            "filename": "Acquisition-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "b77bf9e938ce1fbd1c8b6e582a650575",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 119312,
            "upload_time": "2024-05-30T09:39:36",
            "upload_time_iso_8601": "2024-05-30T09:39:36.224594Z",
            "url": "https://files.pythonhosted.org/packages/1e/ce/a29dfc01a3da77db03fd52e9ae0664cf5b3ddc20b11fb0341e03facfc1f1/Acquisition-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "adea514cc70ac37dab038dd2e493ab377864c6e21efe7428b0ce5e0575116ee5",
                "md5": "4a4b13f0c7388ce331c6a647f046b993",
                "sha256": "527c7c503e289ac61346d8c8fb038cf4486cca5ab8f709176786d5458cf6af5c"
            },
            "downloads": -1,
            "filename": "Acquisition-6.0-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "4a4b13f0c7388ce331c6a647f046b993",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 65258,
            "upload_time": "2024-05-30T09:18:44",
            "upload_time_iso_8601": "2024-05-30T09:18:44.803177Z",
            "url": "https://files.pythonhosted.org/packages/ad/ea/514cc70ac37dab038dd2e493ab377864c6e21efe7428b0ce5e0575116ee5/Acquisition-6.0-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c465d4c4b0548aff466f912b5a2c4faef66173a26795c9f567fb5782dea54996",
                "md5": "9f732b758852510819c308c656ad0d68",
                "sha256": "86069ae8c2c6a98ffca6b0047e1d9d1b4d44c8b98e2087cd532ec8c4cbc4986d"
            },
            "downloads": -1,
            "filename": "Acquisition-6.0-cp311-cp311-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "9f732b758852510819c308c656ad0d68",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 64765,
            "upload_time": "2024-05-30T09:19:15",
            "upload_time_iso_8601": "2024-05-30T09:19:15.807576Z",
            "url": "https://files.pythonhosted.org/packages/c4/65/d4c4b0548aff466f912b5a2c4faef66173a26795c9f567fb5782dea54996/Acquisition-6.0-cp311-cp311-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "cc33376372d737293a50edcc318b9d4f6f76727cef2dea65be0039f8ee3b950e",
                "md5": "1d381f72c0f2aea1e4ad06084e1f89c5",
                "sha256": "f8cc76fca89eae61fdb9d183248451421e98e084bf97fc4bd17df33b75fbce53"
            },
            "downloads": -1,
            "filename": "Acquisition-6.0-cp311-cp311-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "1d381f72c0f2aea1e4ad06084e1f89c5",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 64374,
            "upload_time": "2024-05-30T09:19:17",
            "upload_time_iso_8601": "2024-05-30T09:19:17.187258Z",
            "url": "https://files.pythonhosted.org/packages/cc/33/376372d737293a50edcc318b9d4f6f76727cef2dea65be0039f8ee3b950e/Acquisition-6.0-cp311-cp311-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e288865f42554e4f4468f30a70f6939c1cae528158b775f444d5ed17846d6a62",
                "md5": "726c5a1c153929e20d0ed4b75a0edb95",
                "sha256": "2c2b63c2b53de6093766348ef142b7d7dc019eab792f4478b2fdfd22baa1da08"
            },
            "downloads": -1,
            "filename": "Acquisition-6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "726c5a1c153929e20d0ed4b75a0edb95",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 115667,
            "upload_time": "2024-05-30T09:39:11",
            "upload_time_iso_8601": "2024-05-30T09:39:11.491081Z",
            "url": "https://files.pythonhosted.org/packages/e2/88/865f42554e4f4468f30a70f6939c1cae528158b775f444d5ed17846d6a62/Acquisition-6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "7116e93441e54868b6534f15136be8016c8fce576e1016dbb98b87fd596b5db2",
                "md5": "ca4ee713247812592b54c7f9bcba9760",
                "sha256": "242046928a91cacd4fd748371e2d423f5458d5972e8efdbf42d389968e6b8c5e"
            },
            "downloads": -1,
            "filename": "Acquisition-6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "ca4ee713247812592b54c7f9bcba9760",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 122821,
            "upload_time": "2024-05-30T09:39:37",
            "upload_time_iso_8601": "2024-05-30T09:39:37.710373Z",
            "url": "https://files.pythonhosted.org/packages/71/16/e93441e54868b6534f15136be8016c8fce576e1016dbb98b87fd596b5db2/Acquisition-6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "270c20537bc232ab09cd00601a6fa32848aee2c2a196b4ec825c60117fb5b0ed",
                "md5": "7c2fe1d1ca305a8fc50100d2f7755e95",
                "sha256": "ef9f4b055f2e55c0ea927eeb46fa6614f545466ca2803a6a47f54fb398f2a969"
            },
            "downloads": -1,
            "filename": "Acquisition-6.0-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "7c2fe1d1ca305a8fc50100d2f7755e95",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 65454,
            "upload_time": "2024-05-30T09:19:08",
            "upload_time_iso_8601": "2024-05-30T09:19:08.514937Z",
            "url": "https://files.pythonhosted.org/packages/27/0c/20537bc232ab09cd00601a6fa32848aee2c2a196b4ec825c60117fb5b0ed/Acquisition-6.0-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8e1d574437612d253b0103b9356d3a486bdded1b9e4d0846d46c9ad2b273dbff",
                "md5": "7af6cd6c174af957c4dd0fa16cda5c7e",
                "sha256": "f907ed1dc647b8c6344071d6ed2353cd8816726f6d513b4e64d789e2c810d16f"
            },
            "downloads": -1,
            "filename": "Acquisition-6.0-cp312-cp312-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "7af6cd6c174af957c4dd0fa16cda5c7e",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 64890,
            "upload_time": "2024-05-30T09:32:21",
            "upload_time_iso_8601": "2024-05-30T09:32:21.558110Z",
            "url": "https://files.pythonhosted.org/packages/8e/1d/574437612d253b0103b9356d3a486bdded1b9e4d0846d46c9ad2b273dbff/Acquisition-6.0-cp312-cp312-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "252f3015bbea5faff6db382a0fbfeb4c82169c2891b86b0c23c6e5150ff27b88",
                "md5": "a0dee2beab877ddd098aca386ccdafd4",
                "sha256": "88b30739ddcc7668ba91a02913c1870cfe0de04cdb67103fd15e269fe582d17e"
            },
            "downloads": -1,
            "filename": "Acquisition-6.0-cp312-cp312-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "a0dee2beab877ddd098aca386ccdafd4",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 64322,
            "upload_time": "2024-05-30T09:32:23",
            "upload_time_iso_8601": "2024-05-30T09:32:23.369666Z",
            "url": "https://files.pythonhosted.org/packages/25/2f/3015bbea5faff6db382a0fbfeb4c82169c2891b86b0c23c6e5150ff27b88/Acquisition-6.0-cp312-cp312-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "32a70c3469f366ee96de5242b3f09bfef45d9b3c8ca2896151bea7988bd718e3",
                "md5": "35fa8bdbfb1e0f5281b8bc686a76ce96",
                "sha256": "b00ba164419434a74a94f334366be52cc9c5de5c01725d40d884646499ecbfc7"
            },
            "downloads": -1,
            "filename": "Acquisition-6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "35fa8bdbfb1e0f5281b8bc686a76ce96",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 114315,
            "upload_time": "2024-05-30T09:39:13",
            "upload_time_iso_8601": "2024-05-30T09:39:13.433815Z",
            "url": "https://files.pythonhosted.org/packages/32/a7/0c3469f366ee96de5242b3f09bfef45d9b3c8ca2896151bea7988bd718e3/Acquisition-6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "7b74e5a8c1b002ebd32f5a501eb8d8faac0268b96356064b9eb47f115c32e17b",
                "md5": "c73264b06357507b4835cd37aef1b306",
                "sha256": "c9014ff86c7f5f574af9186fa766305063b9848637b26c25040ae0f6ff3737b9"
            },
            "downloads": -1,
            "filename": "Acquisition-6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c73264b06357507b4835cd37aef1b306",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 122191,
            "upload_time": "2024-05-30T09:39:39",
            "upload_time_iso_8601": "2024-05-30T09:39:39.350876Z",
            "url": "https://files.pythonhosted.org/packages/7b/74/e5a8c1b002ebd32f5a501eb8d8faac0268b96356064b9eb47f115c32e17b/Acquisition-6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "6308324560b49bacda3e8aafc0251bfc44f769f8e9fb1b8e1720b825defde779",
                "md5": "79b3294af300baecf943eb820638ce18",
                "sha256": "363ca2c576c6bbd73c8f785c7431e1ff74eafff78c13ca956ea57b814184f4e8"
            },
            "downloads": -1,
            "filename": "Acquisition-6.0-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "79b3294af300baecf943eb820638ce18",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 65552,
            "upload_time": "2024-05-30T09:31:52",
            "upload_time_iso_8601": "2024-05-30T09:31:52.276482Z",
            "url": "https://files.pythonhosted.org/packages/63/08/324560b49bacda3e8aafc0251bfc44f769f8e9fb1b8e1720b825defde779/Acquisition-6.0-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e83f845c5bc8bd202070c4d2cc8f4102f7217e3bbaab2319464092d47352e0e6",
                "md5": "5e083d1acae812e515594062552c6331",
                "sha256": "99d31bfbef75cab688dfad217e666b98b5a97a6a7a7bf47a5312578aa7b4d1fb"
            },
            "downloads": -1,
            "filename": "Acquisition-6.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "5e083d1acae812e515594062552c6331",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 114299,
            "upload_time": "2024-05-30T09:39:15",
            "upload_time_iso_8601": "2024-05-30T09:39:15.292687Z",
            "url": "https://files.pythonhosted.org/packages/e8/3f/845c5bc8bd202070c4d2cc8f4102f7217e3bbaab2319464092d47352e0e6/Acquisition-6.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ed5c24b25e70b251f0bad8b846f02531bdc6e873f99ffa8af8e7b19e94bca44f",
                "md5": "4079993668b7f2a4861c119424fdb34c",
                "sha256": "a665832481751e6e75cf0f33ec33515fbc53d16e6055ec7ec094031487866da8"
            },
            "downloads": -1,
            "filename": "Acquisition-6.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "4079993668b7f2a4861c119424fdb34c",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": ">=3.8",
            "size": 122161,
            "upload_time": "2024-05-30T09:39:40",
            "upload_time_iso_8601": "2024-05-30T09:39:40.908837Z",
            "url": "https://files.pythonhosted.org/packages/ed/5c/24b25e70b251f0bad8b846f02531bdc6e873f99ffa8af8e7b19e94bca44f/Acquisition-6.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a71c591ea0c921cc04f2421f3ea80d22b7f4df9d1ed3d70a7ae4dc6192e48bab",
                "md5": "c197e8319d2a3ee0a88af5e44ed1c2fb",
                "sha256": "3d6b2fbc3eaf7ec4b53788210d012d4b903eb850152600b6b5df340910f60108"
            },
            "downloads": -1,
            "filename": "Acquisition-6.0-cp38-cp38-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c197e8319d2a3ee0a88af5e44ed1c2fb",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 64788,
            "upload_time": "2024-05-30T09:35:59",
            "upload_time_iso_8601": "2024-05-30T09:35:59.947879Z",
            "url": "https://files.pythonhosted.org/packages/a7/1c/591ea0c921cc04f2421f3ea80d22b7f4df9d1ed3d70a7ae4dc6192e48bab/Acquisition-6.0-cp38-cp38-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "00ec25738166cef8872e3890b2eb4273ce0e6c076ebba9fdf5aef7e657d6bc6c",
                "md5": "98eb6263d492cc62a84c1d0be5288ecb",
                "sha256": "600fff93883ff98c125fd0d41dc58ef3fda78f7df48a58763cbe2594d78f3cfc"
            },
            "downloads": -1,
            "filename": "Acquisition-6.0-cp38-cp38-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "98eb6263d492cc62a84c1d0be5288ecb",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 64403,
            "upload_time": "2024-05-30T09:36:02",
            "upload_time_iso_8601": "2024-05-30T09:36:02.004339Z",
            "url": "https://files.pythonhosted.org/packages/00/ec/25738166cef8872e3890b2eb4273ce0e6c076ebba9fdf5aef7e657d6bc6c/Acquisition-6.0-cp38-cp38-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c110fd18f7d597f6db22db01c7108c1ccbae7b84df05ae9eeb95e0291246e185",
                "md5": "e4ae256c28de62fdc3ad39569b40c1e0",
                "sha256": "7c9b4abcd98f971523dacf01faa30c82bc79612f235427d5b3321bfad91d1941"
            },
            "downloads": -1,
            "filename": "Acquisition-6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "e4ae256c28de62fdc3ad39569b40c1e0",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 112684,
            "upload_time": "2024-05-30T09:39:17",
            "upload_time_iso_8601": "2024-05-30T09:39:17.069386Z",
            "url": "https://files.pythonhosted.org/packages/c1/10/fd18f7d597f6db22db01c7108c1ccbae7b84df05ae9eeb95e0291246e185/Acquisition-6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "335d9ceef7835dedff45532662423dd68ea05e7f5a308213872e9b919b49737b",
                "md5": "82cf0a8379d80f4b2580a49c2ca21743",
                "sha256": "e678f407c8afbc709b1b7979205c1e99260f9b2508730cfc5f17d4265a3b44b9"
            },
            "downloads": -1,
            "filename": "Acquisition-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "82cf0a8379d80f4b2580a49c2ca21743",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 119681,
            "upload_time": "2024-05-30T09:39:42",
            "upload_time_iso_8601": "2024-05-30T09:39:42.485731Z",
            "url": "https://files.pythonhosted.org/packages/33/5d/9ceef7835dedff45532662423dd68ea05e7f5a308213872e9b919b49737b/Acquisition-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "de6f1df1bd45ad23190ab28abcecacb64270856ea71767c7c49513a31fd7e979",
                "md5": "439373d52ab324fd1c820be9eaa827d1",
                "sha256": "7e8cc36e54e6d8931761b944a9167bba6228d02443f70eb2688b26980fd79414"
            },
            "downloads": -1,
            "filename": "Acquisition-6.0-cp38-cp38-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "439373d52ab324fd1c820be9eaa827d1",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 65294,
            "upload_time": "2024-05-30T09:36:51",
            "upload_time_iso_8601": "2024-05-30T09:36:51.709821Z",
            "url": "https://files.pythonhosted.org/packages/de/6f/1df1bd45ad23190ab28abcecacb64270856ea71767c7c49513a31fd7e979/Acquisition-6.0-cp38-cp38-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "fc77a239f069ddccf3e4d5c7dbb4a0cf7137e9e25246896fd4aca93958a7449b",
                "md5": "c6c2a7fc2cf95bf710bcfc0fe62405c6",
                "sha256": "1b2c03c39d54838d15abfa7615444d3f6c8d4b9acb2a3036716640f9c2becd45"
            },
            "downloads": -1,
            "filename": "Acquisition-6.0-cp39-cp39-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c6c2a7fc2cf95bf710bcfc0fe62405c6",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 64771,
            "upload_time": "2024-05-30T09:36:11",
            "upload_time_iso_8601": "2024-05-30T09:36:11.643463Z",
            "url": "https://files.pythonhosted.org/packages/fc/77/a239f069ddccf3e4d5c7dbb4a0cf7137e9e25246896fd4aca93958a7449b/Acquisition-6.0-cp39-cp39-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a071b2dc44e118a6211e9ff3fe4b58a2f17ffc450c60f3357ac16c79674f23e7",
                "md5": "8d78e303dbaf30514452430eb9887e45",
                "sha256": "2f53bebfa22f27883a787da872f9b404c94f17f022234abb1364f5643eeb07f6"
            },
            "downloads": -1,
            "filename": "Acquisition-6.0-cp39-cp39-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "8d78e303dbaf30514452430eb9887e45",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 64372,
            "upload_time": "2024-05-30T09:36:13",
            "upload_time_iso_8601": "2024-05-30T09:36:13.731551Z",
            "url": "https://files.pythonhosted.org/packages/a0/71/b2dc44e118a6211e9ff3fe4b58a2f17ffc450c60f3357ac16c79674f23e7/Acquisition-6.0-cp39-cp39-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "713f407306320ee3352d592da9a30fb0eb00e29effb96c88e77b4a16e7856615",
                "md5": "836ba6dbe1b7e40cb883f90365dd3f52",
                "sha256": "a0d08ca982aabcce6f15fe438db1f198025818518431998817d0c5f308d73732"
            },
            "downloads": -1,
            "filename": "Acquisition-6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "836ba6dbe1b7e40cb883f90365dd3f52",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 111648,
            "upload_time": "2024-05-30T09:39:19",
            "upload_time_iso_8601": "2024-05-30T09:39:19.113536Z",
            "url": "https://files.pythonhosted.org/packages/71/3f/407306320ee3352d592da9a30fb0eb00e29effb96c88e77b4a16e7856615/Acquisition-6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "08cec0f1cdd92515eb69da9d5a8c382b52e5f1267b70539c6028c0724c108a22",
                "md5": "9378b6520d395ea2b85bfa80cb3edeb8",
                "sha256": "0059c1b28188ffba472d8a6a0ada92f6886e75a0b341f1fb81bcde049bca2799"
            },
            "downloads": -1,
            "filename": "Acquisition-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "9378b6520d395ea2b85bfa80cb3edeb8",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 118666,
            "upload_time": "2024-05-30T09:39:44",
            "upload_time_iso_8601": "2024-05-30T09:39:44.227551Z",
            "url": "https://files.pythonhosted.org/packages/08/ce/c0f1cdd92515eb69da9d5a8c382b52e5f1267b70539c6028c0724c108a22/Acquisition-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "5385c47146d68169fe970d8cbbd1447c76124f9b61c4f1fee28b521487faadd3",
                "md5": "0af77d66d80e1856268e2088f5bf7cfb",
                "sha256": "f61a3765ec3c435f269b8687a89752af69631fff3509e250c5764f6348b70552"
            },
            "downloads": -1,
            "filename": "Acquisition-6.0-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "0af77d66d80e1856268e2088f5bf7cfb",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 65400,
            "upload_time": "2024-05-30T09:37:16",
            "upload_time_iso_8601": "2024-05-30T09:37:16.615332Z",
            "url": "https://files.pythonhosted.org/packages/53/85/c47146d68169fe970d8cbbd1447c76124f9b61c4f1fee28b521487faadd3/Acquisition-6.0-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-05-30 09:18:22",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "zopefoundation",
    "github_project": "Acquisition",
    "travis_ci": false,
    "coveralls": true,
    "github_actions": true,
    "tox": true,
    "lcname": "acquisition"
}
        
Elapsed time: 0.45297s