Pyobjc

Latest version: v10.3.2

Safety actively analyzes 688568 Python packages for vulnerabilities to keep your Python projects secure.

Scan your dependencies

Page 3 of 8

8.2

This release contains a lot of little fixes due to improving
test coverage of the C code in pyobjc-core. These are mostly fixes
for edge cases that don't happen in normal programs.

* Reintroduce binary wheels for Python 3.6

PyObjC 8.x still supports Python 3.6, but I didn't ship binary wheels
until now.

I plan to explicitly remove support for Python 3.6 in PyObjC 9, which
will include updating package metadata to ensure that users of Python 3.6
will keep using PyObjC 8.x.

* 414: [Python 3.10] The representation for C structures, like
``Foundation.NSPoint`` now have a ``__match_args__`` attribute, which means
it is now possible to use positional arguments to these types in match expressions.

For example:

.. sourcecode:: python

from Foundation import NSPoint

value = ...

match value:
case NSPoint(0, _):
print("On the Y axis")

* The internal extension API between framework bindings and pyobjc-core has
been cleaned up a little. Because of this extensions need to be
recompiled for this version.

* :func:`objc.allocateBuffer` is deprecated, use :class:`bytearray` instead

This function has always returned a bytearray object in Python 3 and it
no longer necessary.

As a side effect of this change the function is now implemented in Python
instead of C.
* The private function ``objc._dyld_shared_cache_contains_path`` is now
always available, and unconditionally returns :data:`False` on systems without
a shared library cache.

* The private function ``objc._setClassExtender`` is now implemented in Python
and will be removed in PyObjC 9.

* Removed private function ``objc._typestr2typestr``.

This function was untested and is no longer used by PyObjC.

* Removed the selector ``supportsWeakPointers`` from a number of classes.

This method may have been needed during Apple's transition to ARC, but is
no longer document and I've never seen it called during testing on recent
versions of the OS.

Furthermore the custom implementation of ``retain`` and ``release`` in PyObjC
is a thin wrapper around the default one with additional locking to avoid
race conditions during deallocation.

* :func:`objc.recylceAutoReleasePool` will now restore the global release pool
when called after calling :func:`objc.removeAutoreleasePool`.

* Removed ``objc.FSSpec``

This is a wrapper for a C type that's only usable in 32-bit code, PyObjC
no longer supports 32-bit.

* The default implementation of ``-copy`` for subclasses of Objective-C
classes that implemented ``-copy`` (needed to adjust Python attributes)
didn't consider that the superclass implementation of ``-copy`` may
return an instance of a different class. This caused a hard crash.

The easiest way to trigger this bug: Create a subclass of NSMutableData
in Python, create an instance of that class and call the ``copy`` method.

* The module ``PyObjCTools.TestSupport`` was modernized a little

This most visible part of this is that a number of functions and assertion
method have been removed because they have a better alternative in the
:mod:`unittest` library.
* 404: Instances of the Python represention of C structs can now be pickled.

That is, instances of ``AppKit.NSPoint``, ``Foundation.NSRange``, etc. can
be pickled. The exception are a number of types in the CoreAudio bindings
that have manual wrapper types instead of the generic support in pyobjc-core.

* Switch to :c:func:`PyCapsule_Import` to load the PyObjC API object in
extension modules.

* Fix crash when calling ``objc.FSRef.from_pathname()`` with a path
that cannot be encoded in the filesystem encoding (UTF-8).

* Fix name of opaque pointer type wrappers (such as ``Foundation.NSZonePtr``)

The "__name__" and "__qualname__" attributes were correct, but the
corresponding slot in the C struct of the type could point to
no longer valid memory.

* Function :func:`objc.registerABCForClass` now actually works

* Fix bug in lazyloader where fetching the module's ``__all__`` could
raise :exc:`AttributeError` for some particular constants.

* 317: Cleanup code dealing with libffi closures APIs on various versions
of macOS.

* If fetching the ``__pyobjc_object__`` attribute during conversion from
Python to Objective-C raisea an exception other than :exc:`AttributeError`
the conversion will fail.

In previous versions the attribute was ignored when this happens.

* Fix error in ``__str__`` and ``__repr__`` of an Objective-C instance
when the class' ``description`` selector returns ``nil``.

* Fixed crash in conversion of an Objective-C exception to a Python
exception when the exception name is ``NULL``.

* Type encoding that ends with an incomplete pointer definition will
now raise an error earlier, in particular before the first time the
callable is used.

* Using a value for the metadata dict of functions and selectors that
is not a :class:`dict` now raises an exception instead of being silently
ignored.

* The "suggestion" function metadata was ignored for :class:`objc.function`
instances using the fast FFI variant.

* Deprecating the function returned by an API exposed through :class:`objc.function`
would cause a crash.

* Fix value of the "deprecated" key in the result of ``__metadata__()`` for
callables that are deprecated in a macOS version.

* Loading metadata for a function with more than 63 arguments would
crash the interpreter.

Note that calling such function is not supported even with this bugfix.

* 406: The "docstring" field in the function list argument for
:func:`objc.loadBundleFunctions` was effectively ignored. It is now
part of the document string (``__doc__``) of the :class:`objc.function`
object.

* Actually implemented cyclic GC support in :class:`objc.python_method`.

* Fix crash when calling ``-[NSObject dealloc]``, ``-[NSObject retain]``
or ``-[NSObject release]`` though an :class:`objc.IMP`, for example:

.. sourcecode:: python

anObject = NSObject.alloc().init()
retain = anObject.methodForSelector_("retain")
retain(anObject)

* Tests in pyobjc-core better check the message of raised exceptions

This resulted in some minor changes in messages, this should not affect
code using PyObjC.

* Fix the ``__name__`` and ``__repr__`` result for the exact class
:class:`objc.objc_object`.

* Fix use of uninitialized variable in the code that converts a C struct
from Objective-C to a Python tuple.

* Added :func:`PyObjCTools.TestSupport.no_autorelease_pool` to disable
autorelease pool management by the test runnner for a specific test.

* ``NSMutableArray.insert(idx, value)`` would fail when ``idx`` is beyond
the length of the array. It now behaves the same as :meth:`list.insert`,
the item will be appended to the array.

* Change the way type specific class methods are added to :class:`objc.ivar`.

This changes the way class methods are added to :class:`objc.ivar` to
be more correct in the CPython interpreter.

* 425: Fix CoreMIDI bindings

The CoreMIDI is a wheel with a limited ABI tag, but one of the two
extensions was build without using the limited ABI, resulting in a wheel
that worked only for one python version.

8.0

Backward incompatible changes

* In PyObjC 7 and earlier it was possible to leave out "output" arguments when
calling a method with a Python implementation:

.. sourcecode:: python

class MyClass(NSObject):

objc.typedSelector(b":o^")
def methodWithOutput_(self, a):
return 1, 2


o = MyClass.alloc().init()
print(o.methodWithOutput_())

This no longer works, it is always necessary to pass in all arguments, which
was already true for methods implemented in Objective-C. That is:

.. sourcecode:: python

print(o.methodWithOutput_(None))

This change both simplifies the PyObjC code base and was required to cleanly
implement vectorcall support (see the section on performance below).

* Removed bindings for ``InterfaceBuilderKit``. This was a way to integrate
with InterfaceBuilder in old versions of Xcode, but support for that was
dropped before the release of Mac OS X 10.8.

* Bindings for the Objective-C runtime API related to "associated objects" is
now enabled unconditionally. This will cause problems when running or building
on macOS 10.6 or earlier.

* It is no longer possible to deploy to macOS 10.7 or earlier when you attempt to
create a formal protocol. Protocol creation already failed on those platform
due to lack of the required runtime API, and that will now result in a crash
because PyObjC no longer checks for availability of that runtime API.

* 371: Remove manual bindings for a number of old CoreGraphics APIs

The following functions are no longer available:

* ``CGDataProviderCreate``

* ``CGDataProviderCreateDirectAccess``

These functions were removed as a public API in macOS 10.8, but were still
available through PyObjC through old backward compatibility code. That code has
now been removed.

* For compatibility with Python's socket APIs functions that return a
"struct sockaddr" (either by reference or as a function result) will now
encode the IP address as a string and not a bytes object.

* The (undocumented) API in pyobjc-api.h (used in some framework bindings to
integratie with pyobjc-core) has changed in an incompatible way, in particular
the API for "caller" functions now mostly mirrors the vectorcall convention.

* Adding a method with a double underscore name will now raise an exception at
class definition time instead of silently not creating the Objective-C method.

.. sourcecode::

class AClass (NSObject):
...

def __foo_bar__(self, a, b, c):
pass

MethodNamesClass.__foo_bar__ = __foo_bar__


Before PyObjC 8 this would add a ``__foo_bar__`` selector to the Python
representation of the class without adding a selector to the Objective-C class.

Use :func:`objc.python_method` to mark this as a python-only function.

Upcoming incompatible changes

* The module :mod:`PyObjCTools.Signals` is deprecated and will be removed
in PyObjC 9.

* :func:`objc.initFrameworkWrapper` and :func:`objc.parseBridgeSupport`
are deprecated and will be removed in PyObjC 9.

These functions implement support for ".bridgesupport" XML files,
something that PyObjC hasn't used itself in a number of releases (in
part because system versions of those files are at best incomplete).


Performance

Most performance changes use features introduced in Python 3.9, performance
in older Python versions is unchanged except for the effects of general cleanup.

* Implement the "vectorcall" protocol for :class:`objc.function`, :class:`objc.WeakRef`,
:class:`objc.selector`, :class:`objc.IMP`, :class:`objc.python_method`.

This reduces the interpreter overhead for calling instances of these objects.

* Implement Py_TPFLAGS_METHOD_DESCRIPTOR for :class:`objc.selector`,
:class:`objc.python_method`.

* Use vectorcall in the method stub that forwards Objective-C calls to Python.

* Convert internal calls into Python to the vectorcall protocol (pyobjc-core)

* Add more optimized vectorcall implementation to :class:`objc.function`,
:class:`objc.IMP` and :class:`objc.selector` for simpler callables.

In the current version "simpole enough" callables have a 8 or fewer
arguments, and none of those arguments are pass by reference. This will
change over time.

Generic Implementation Quality

* 391: Fix some spelling errors found by the
`codespell <https://pypi.org/project/codespell/>`_ tool.

The codespell tool is also run as part of pre-commit hooks.

* 296: use clang-format for Objective-C code

The Objective-C code for the various extensions has been reformatted
using clang-format, and this enforced by a pre-commit hook.

* 374: Use pyupgrade to modernize the code base

This is enforced by a pre-commit hook.

* 388: Added "nullability" attributes to Objectice-C sources for pyobjc-core.

This gives the compiler and clang static analyzer more information
that can be used to pinpoint possible bugs in the implementation. As a
side effect of this a number of internal checks were strengthened, although
most of them were for error conditions that should never happen.

That said, this change also found a number of places where Python reference
counts weren't updated properly, which may have led to refcount overflows
in long running programs.

* Add more error checking to pyobjc-core to catch (very) unlikely error conditions.

This is a side effect of the previous item.

New features

* Updated framework bindings for macOS 12

* New framework bindings for the following frameworks:

- AudioVideoBridging (introduced in macOS 10.8)

- DataDetection (introduced in macOS 12.0)

- IntentsUI (introduced in macOS 12.0)

- LocalAuthenticationEmbeddedUI (introduced in macOS 12.0)

- MailKit (introduced in macOS 12.0)

- MetricKit (introduced in macOS 12.0)

- ShazamKit (introduced in macOS 12.0)


* 318: Implement support for ``__class_getitem__`` for Objective-C classes

The result of this is that effectively all Objective-C classes can be used
as generic classes, without runtime type checking. This is meant to be used
with optional type checking (for example MyPy)

Usage:

.. sourcecode:: python

def create_integers(count: int) -> NSArray[int]:
return NSArray[int].arrayWithArray_([i for i in range(count)])

.. note::

This requires typing stubs for framework bindings to be really useful,
and those do not yet exist.

* 354: Add an option to install all framework bindings, including those not
relevant for the current platform. To use this:

.. sourcecode:: sh

$ pip install 'pyobjc[allbindings]'


Other changes and bugfixes

* 390: pyobjc-core is no longer linked with the Carbon framework.

Due to implicit dependencies this also required a change to the Metal
bindings: those now import AppKit instead of Foundation.

* PyObjC only ships "Universal 2" wheels for Python 3.8 and later. Those work
with single-architecture builds of Python as well.

* PyObjC 8 only ships with source archives and "univeral2" binary
wheels (Python 3.? and later). There are no longer "x86_64" binary wheels.

* The *AVFoundation* bindings (in ``pyobjc-framework-AVFoundation``) now have
an install dependency on the *CoreAudio* bindings (``pyobjc-framework-CoreAudio``).

This is needed for a new API introduced in macOS 12.

* 371: Link extensions in the Quartz bindings to the Quartz frameworks

A number of C extensions in the Quartz bindings package were not
linked to a framework. Those now link to the Quartz framework.

* 378: Fix raising ``ImportError`` when doing ``from ApplicationServices import *``

The root cause for this were private classes in system frameworks that contain
a dot in their name (for example ``Swift.DispatchQueueShim``. Those names are
both private and invalid attribute names.

* Creating protocols that contain methods that have a method signature containing
PyObjC custom type encodings now works (those encodings are translated to
the corresponding Objective-C encoding.

* Fix bindings for ``SKIndexCopyDocumentRefsForDocumentIDs``, that binding
didn't work due to a typo in the metadata.

* 365: The ``PyObjCTools`` namespace package no longer has an ``__init__.py``
file in the source tree (that is, the tree switches to implicit namespace
packages instead of the older setuptools style for namespace packages).

This primarily affects testing with recent versions of pip/setuptools (which
seem to no longer install the ``__init__.py`` file for namespace packages).

* ``development-support/run-testsuite`` now uses ``venv`` instead of
``virtualenv``. This removes a development dependency.

* PR 367: Tweak the code that calculates ``PyObjC_BUILD_RELEASE`` in
the various setup.py files to deal with versions with more than two
labels (can happen when building using Xcode 13 beta)

PR by Eric Lin (Tzu Hsiang Lin), github user eric100lin.

* ``PyObjCTest.TestSupport`` now never uses "10.16" as the
OS release but always uses the actual platform version, even
when Python was compiled using an old SDK.

* Adjusted PyObjC testcases to check for 11.0 instead of 10.16
now that testsupport uses the real platform version.

* 385: Fix race condition the lazy importer

When two threads simultaneously try to get an attribute from a framework
binding one of them might fail with an attribute error because information
for resolving the name was removed before actually resolving the name.

* Fix various issues with invalid indices in :class:`objc.varlist`

* Fix support for ``AF_UNIX`` in the support code for ``struct sockaddr``.

* The implementation for opaque pointer types (such as the proxy for
'NSZone*') has switched to :c:func:`PyType_FromSpec`.

* The :meth:`objc.FSRef.from_path` and :meth:`objc.FSRef.as_pathname`,
methods now use the filesystem encoding instead of the default encoding.
C string. This shouldn't affect any code, both encoding default to UTF-8 on macOS.

* Inheriting directly from :class:`objc.objc_object` now raises :class:`TypeError`
instead of :class:`objc.InternalError`. User code should always inherit from
a Cocoa class.

7.3

With WWDC and beta of a new major release of macOS approaching fast it is high time to push out a new release for PyObjC. PyObjC 7.3 is primarily a bugfix release, with one minor feature.

I expect this to be the last release for PyObjC 7.x and will start working on PyObjC 8 soon.

- issue 356: Explicitly error out when building for unsupported architectures

"python setup.py build" will now fail with a clear error when
trying to build PyObjC for a CPU architecture that is no longer
supported (such as 32-bit Intel)

* issue 319: Use memset instead of bzero in C code to clear memory

Based on a PR by GitHub user stbdang.

* issue 348: Fix platform version guard for using protocols in MetalPerformanceShaders bindings

* issue 344: Fix test for CFMessagePortCreateLocal

The tests didn't actually test calling the callback function
for CFMessagePortCreateLocal.

* issue 349: Change calls to htonl in pyobjc-core to avoid compiler warning

The original code had a 32-bit assumption (using 'long' to represent
a 32-bit value), and that causes problems for some users build from
source.

* issue 315: Fix binding for ``SecAddSharedWebCredential`` (Security framework)

Trying to use this function will no longer crash Python.

* issue 357: Calling ``Metal.MTLCopyAllDevices()`` no longer crashes

The reference count of the result of this function was handled incorrect,
causing access to an already deallocated value when the Python reference
was garbage collected.

* issue 260: Add manual bindings for AXValueCreate and AXValueGetValue in ApplicationServices

Calling these crashed in previous versions.

* issue 320, 324: Fix the type encoding for a number of CoreFoundation types in the Security bindings

* issue 336: Add core support for "final" classes

It is now possible to mark Objective-C classes as final,
that is to disable subclassing for such classes.

This is primarily meant to be used in framework bindings for
matching Objective-C semantics.

The "final" feature adds two new APIs:

1. A keyword argument "final" when defining a new class

class MyClass (NSObject, final=True):
pass

2. An read-write attribute ``__objc_final__`` on all subclasses of NSObject.

Note that this is a separate concept from ``typing.final``.

6.2.2

* 311: Build for the Metal bindings failed on macOS 10.14

* 309: Fix incompatibility with macOS 11 in framework loader

* Another attempt at giving a nice error message when trying to install on
platforms other than macOS.

* The classifiers now correctly identify supported Python versions

6.2.1

* Issue 299: Ensure package 'pyobjc' won't try to build the PubSub bindings on macOS 10.15

Reported by Thomas Buchberger

* Minor tweaks to build and pass tests on macOS 10.14 with the latest Xcode
that can be installed on that version of macOS.

* Issue 300: Fix SystemError in block edge case

PyObjC raised a SystemError when converting a callable into
an ObjC block when the callable is a bound method without
positional arguments.

* Issue 275: Fix crash on catalina caused by writing to read-only memory.

Patch by Dan Villiom Podlaski Christiansen

* PR 302: Make sure the SDK detection works when the version is not in the SDK name

Patch by Joshua Root

* There were no SDK updates in Xcode 11.5 and Xcode 11.6 (beta)

6.2

* The project has moved from Bitbucket to Github

* Remove most remnants of Python 2 support

* Clean up code quality issues found using flake8

* Add pre-commit hook to run black on all Python code.

* 290: Fix protocol conformance testing when explicitly implementing a protocol

Before this bugfix a class explicitly conforming to a protocol could not
implement any method that wasn't declared in the protocol, the bridge would
erroneously raise an exception when checking the additional method.

Issue reported by Georg Seifert.

* 289: Fix Python 3 issues in ``PyObjCTools.Conversion``

Reported by vinolin asokan.

* ``PyObjCTools.Conversio.propertyListFromPythonCollection`` didn't
recursively convert members of lists and tuples.

* ``PyObjCTools.Conversio.propertyListFromPythonCollection`` and
``PyObjCTools.Conversio.pythonCollectionFromPropertyList`` now
support sets.

* Update metadata for Xcode 11.4 (beta 2)

* Added bindings for framework ``AutomaticAssessmentConfiguration.framework``
introduced in macOS 10.15.4

* 298: In some cases the compiler uses the type encoding "^{NSObject=}"
instead of "".

Reported by Georg Seifert.

* 264: Added bindings for the Metal framework (new in macOS 10.11)

* Most framework bindings now use the limited ABI for the included C extensions,
reducing the number of wheels that are needed. The exception are
the bindings for Cocoa, Quartz and libdispatch, those use functionality not
available in the limited ABI.

The bridge itself (pyobjc-core) still uses the full CPython API.

The CoreAudio bindings also don't use the limited ABI for now, those
need more work to work with that ABI.

Page 3 of 8

© 2024 Safety CLI Cybersecurity Inc. All Rights Reserved.