Changelog
### 8.4
```
-----------
* .. note::
The bindings for the Message and ServerNotification frameworks,
which were removed in macOS 10.9, will be removed in PyObjC 9.
* Added bindings for ScreenCaptureKit (new in macOS 12.3)
* Updated framework bindings for the macOS 12.3 SDK.
Based on Xcode 13.3 beta 3
* Reverted a change in 8.3: It is once again not possible to
use the "is" operator to check if two proxies for an NSString
refer to the same Cocoa object.
The change in 8.3 changed long standng behaviour for mutable
strings and may have caused unintended problems.
* 418: Added :class:`typing.NewType` definitions to the
various framework bindings for all enum types in Cocoa
(such as ``NSComparisonResult``).
Using this it is now possible to annotate methods returning
such types, although it is not yet possible to type check
this.
For example:
.. sourcecode:: python
class MyObject(NSObject):
def compare_(self, other: NSObject) -> NSComparisonResult:
return NSOrderSame
The actual representation of enum types is provisional
and might change in the future.
* 440: Added :class:`typing.NewType` definitions to the
various framework bindings for all ``NS_STRING_ENUM``,
``NS_TYPED_ENUM`` and ``NS_TYPED_EXTENSIBLE_ENUM`` types in Cocoa.
* 432: Fix compatibility check when a class implements protocol ``NSObject``.
The following code used to fail the protocol implementation check:
.. sourcecode:: python
class AppDelegate( Cocoa.NSObject, protocols=[objc.protocolNamed("NSApplicationDelegate")]):
pass
The reason for this is that the type encodings for (at least) ``-[NSObject respondsToSelector:]``
in the Objective-C runtime doesn't match the type encoding in ``protocol(NSObject)`` (the
former returns ``char``, the latter ``bool``). The compatibility check now handles trivial
differences like this.
* 428: Class ``NSData`` now implements the API from :class:`bytes`. The methods that
return bytes in :class:`bytes` also return bytes in ``NSData``. This may change in a
future version.
Class ``NSMutableData`` now implements the API from :class:`bytearray` as far as this
doesn't conflict with the native API. In particular, ``NSMutableData.copy()`` returns
an immutable copy (instance of ``NSData``), use ``NSMutableData.mutableCopy()`` to
create a mutable copy.
.. note::
The implementation is mostly suitable for fairly small amounts of data as
the Cocoa value is first copied into a Python value.
* ``NSData([1,2,3])`` and ``NSMutableData([1,2,3])`` now work the same
as ``bytes([1,2,3])`` and ``bytearray([1,2,3])``.
* 334: Workaround for catetory on NSMutableArray that introduces a conflicting pop method
Some class in Cocoa can at times introduce an (undocumented) selector ``-pop``
on subclasses of ``NSArray``, which conflicts with a convenience method that
emulates :meth:`list.pop`. The version introduces a workaround for this by
adding the convenience method to all (statically known) subclasses of NSArray.
This is far from perfect, but fixes the problem for now.
* Fix memory manager API misuse
PyObjC's :class:`str` subclass used the python allocator API incorrectly,
causing an assertion failure when running tests with "``python3 -Xdev``",
as well as a hard crash due to using the API without holding the GIL.
* 445: Workaround for Python 3.11 support
Workaround for `BPO-46891 <https://bugs.python.org/issue46891 >`_, which causes
a hard crash in the PyObjC testsuite. With this workaround the tests for
pyobjc-core pass with python 3.11a5, but this does result into adding some
implementation internals to the ``__dict__`` of framework wrappers when using
Python 3.11
* Fix build error on macOS 10.9
* Fix :class:`str` implementation invariant in the :class:`objc.pyobjc_unicode`
subclass. With this fix the string consistency checks in debug builds of
CPython pass.
* Fix exception handling when passing a bytes object to a C function
with a byte buffer "inout" argument.
```
### 8.3
```
-----------
This release contains a lot of small fixes dueo to the continued improvement
of test coverage for the C code in pyobjc-core.
* Backward incompatible change:
``-[OC_PythonDictionary setObject:value forKey:[NSNull null]]`` now sets
key :data:`None` in the Python dictionary instead of ``NSNull.null()``.
This is for consistency with ``-[OC_PythonDictionary objectForKey:]`` and
other collection classes. Getting and setting key ``[NSNull null]`` now
actually works.
* Backward incompatible change:
``-[OC_PythonDictionary removeObjectForKey:]`` now raises ``NSInvalidArgumentException``
instead of Python's ``KeyError`` for missing keys. This matches the documented
behaviour of ``NSDictionary``.
* Backward incompatible change:
``-[Protocol descriptionForClassMethod:]`` now only accepts selector names
(such as ``b"description"``) as its argument, not instances of
:class:`objc.selector`. This matches the behaviour of other methods
with an argument of the C type ``SEL``.
* :func"`objc.namedSelector` and :func:`objc.typedSelector` now also work when
the decorated function is a :func:`classmethod`.
* Fix build problem on macOS 10.14 or earlier
* The Objective-C proxy for a python :class:`int` is now always ``OC_PythonNumber``,
in previous versions instances were proxied as ``NSNumber`` when the
value was in the range of an ``unsigned long long`` that's outside of the
range of a (signed) ``long long`` (that is, a value between
``2**63`` and ``2**64``).
* Two ``NSString*`` values in Objective-C are now proxied to the
same :class:`objc.pyobjc_unicode` instance when the two pointers are
equal in Objective-C.
That is, given ``NSString* value1`` and ``NSString* value2``
``value1 == value2`` in Objective-C can be replaced by
``value1 is value2`` in Python. In older versions of PyObjC
this invariant was not maintained, requiring more involved code to
check if two strings represent the same object.
This invariant was already maintained for other instances of other
Objective-C classes.
* The proxy for python's :class:`bytearray` (and other writable buffers) now
supports the ``mutableBytes`` method in Objective-C.
As a side effect of this ``OC_PythonData`` is now a sublcass of
``NSMutableData`` instead of ``NSData``.
* Fixed retrieving an :class:`bytearray` value from a Cocoa archive
In previous versions this resulted in garbage data.
* Instances of :class:`bytearray` can now be included in "secure" Cocoa archives
* Remove ``-[OC_PythonArray getObjects:inRange:]``, it is not part of the
regular ``NSArray`` interface and was never used.
* The proxy for python datetime objects was rewritten to be a lot simpler.
User visible changes:
* The new implementation is more correct, the old implementation truncated
timestamps at whole seconds.
* Calculating in Objective-C (such as calling ``-[NSDate dateByAddingTimeInterval:]``
will now always result in an ``NSDate`` value, not a Python value.
* The proxy code now calls the "timestamp" method instead of "strftime" during
conversion from Python to Objective-C.
* Adding :class:`datetime.datetime` and :class:`datetime.date` instances to an
archive now works, both for keyed and classic archives.
For the exact types :class:`datetime.datetime` and :class:`datetime.date` the encoding
is compatible with that of ``NSDate`` and supports ``NSSecureCoding`` as long as the
values are not timezone aware.
When communicating with pure Objective-C code any timezone information will be lost.
Note that both :class:`datetime.datetime` and :class:`datetime.date` are
represented as an ``NSDate`` in Objective-C land, even though this Objective-C has
semantics of the latter class don't fully match that of the Cocoa class.
* Fix python internal error when the "module_globals" argument to
:func:`objc.loadBundleFunctions` is not a :class:`dict`.
* Fix the result of :func:`inspect.signature` for :class:`objc.IMP`.
In previous versions this included the implicit "selector" argument that isn't used
by Python callers.
* Avoid crash when trying to load a "magic" cookie CoreFoundation value for a
type unknown to the PyObjC bridge.
* Removed ``-[OC_PythonObject pyObject]``.
The method is no longer used by PyObjC itself, and these proxy objects are considered
a private API that may change at any time.
* Removed ``+[OC_PythonObject classForUnarchiver]``
This method was present for compatibility with the ``NSObject`` interface, but isn't
actually part of Cocoa.
* ``-[OC_PythonObject methodSignatureForSelector:]`` and
``+[OC_PythonObject methodSignatureForSelector:]`` now return ``nil`` instead of
raising an exception when the queried selector does not exist. This matches
the behaviour of ``NSObject``.
* Fix the metadata in the bindings for DiscRecording, Intents, SceneKit, and libdispatch
to ensure that the ``__all__`` variable actually works.
* Eliminated usage of sscanf in pyobjc-core
A possible user visible change is that the use of sscanf
to parse an IPv4 address has been replaced by a call
to ``inet_pton()``, which may affect different representations
of an IPv4 address.
* ``OC_PythonSet`` now epxlictly calls set related methods instead
of using C-API functions like :func:`PySet_Clear`. This simplifies
the pyobjc-core code, and gives fewer problems with set subclasses.
* Fix the buffer size used to for "struct sockaddr" arguments
* Added ``objc._C_CFRange`` and ``objc._C_NSRange`` with the type
encodings of the C types ``CFRange`` and ``NSRange``.
* Functions and methods where the length of a C array argument is passed
in another argument (such as ``int function(int* buffer, size_t bufsize)``)
now also work when the argument with the size is a pointer to
a ``CFRange`` or a pointer to a ``char``.
* A :class:`memoryview` of an ``NSMutableData`` instance is now writable.
* Fix crash when trying to create an :class:`objc.informal_protocol` with
a sequence of selectors that contains a value that isn't an instance
of :class:`objc.selector`.
* 435: Fix build problem with Xcode 13.3
Xcode 13.3 introduces a new warning in ``-Wall``: ``-Wunused-but-set-variable``,
and this found some code quality issues with PyObjC.
```
### 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.
```
Links
- PyPI: https://pypi.org/project/pyobjc
- Changelog: https://pyup.io/changelogs/pyobjc/
- Repo: https://github.com/ronaldoussoren/pyobjc
This PR updates pyobjc from 8.1 to 8.4.
Changelog
### 8.4 ``` ----------- * .. note:: The bindings for the Message and ServerNotification frameworks, which were removed in macOS 10.9, will be removed in PyObjC 9. * Added bindings for ScreenCaptureKit (new in macOS 12.3) * Updated framework bindings for the macOS 12.3 SDK. Based on Xcode 13.3 beta 3 * Reverted a change in 8.3: It is once again not possible to use the "is" operator to check if two proxies for an NSString refer to the same Cocoa object. The change in 8.3 changed long standng behaviour for mutable strings and may have caused unintended problems. * 418: Added :class:`typing.NewType` definitions to the various framework bindings for all enum types in Cocoa (such as ``NSComparisonResult``). Using this it is now possible to annotate methods returning such types, although it is not yet possible to type check this. For example: .. sourcecode:: python class MyObject(NSObject): def compare_(self, other: NSObject) -> NSComparisonResult: return NSOrderSame The actual representation of enum types is provisional and might change in the future. * 440: Added :class:`typing.NewType` definitions to the various framework bindings for all ``NS_STRING_ENUM``, ``NS_TYPED_ENUM`` and ``NS_TYPED_EXTENSIBLE_ENUM`` types in Cocoa. * 432: Fix compatibility check when a class implements protocol ``NSObject``. The following code used to fail the protocol implementation check: .. sourcecode:: python class AppDelegate( Cocoa.NSObject, protocols=[objc.protocolNamed("NSApplicationDelegate")]): pass The reason for this is that the type encodings for (at least) ``-[NSObject respondsToSelector:]`` in the Objective-C runtime doesn't match the type encoding in ``protocol(NSObject)`` (the former returns ``char``, the latter ``bool``). The compatibility check now handles trivial differences like this. * 428: Class ``NSData`` now implements the API from :class:`bytes`. The methods that return bytes in :class:`bytes` also return bytes in ``NSData``. This may change in a future version. Class ``NSMutableData`` now implements the API from :class:`bytearray` as far as this doesn't conflict with the native API. In particular, ``NSMutableData.copy()`` returns an immutable copy (instance of ``NSData``), use ``NSMutableData.mutableCopy()`` to create a mutable copy. .. note:: The implementation is mostly suitable for fairly small amounts of data as the Cocoa value is first copied into a Python value. * ``NSData([1,2,3])`` and ``NSMutableData([1,2,3])`` now work the same as ``bytes([1,2,3])`` and ``bytearray([1,2,3])``. * 334: Workaround for catetory on NSMutableArray that introduces a conflicting pop method Some class in Cocoa can at times introduce an (undocumented) selector ``-pop`` on subclasses of ``NSArray``, which conflicts with a convenience method that emulates :meth:`list.pop`. The version introduces a workaround for this by adding the convenience method to all (statically known) subclasses of NSArray. This is far from perfect, but fixes the problem for now. * Fix memory manager API misuse PyObjC's :class:`str` subclass used the python allocator API incorrectly, causing an assertion failure when running tests with "``python3 -Xdev``", as well as a hard crash due to using the API without holding the GIL. * 445: Workaround for Python 3.11 support Workaround for `BPO-46891 <https://bugs.python.org/issue46891 >`_, which causes a hard crash in the PyObjC testsuite. With this workaround the tests for pyobjc-core pass with python 3.11a5, but this does result into adding some implementation internals to the ``__dict__`` of framework wrappers when using Python 3.11 * Fix build error on macOS 10.9 * Fix :class:`str` implementation invariant in the :class:`objc.pyobjc_unicode` subclass. With this fix the string consistency checks in debug builds of CPython pass. * Fix exception handling when passing a bytes object to a C function with a byte buffer "inout" argument. ``` ### 8.3 ``` ----------- This release contains a lot of small fixes dueo to the continued improvement of test coverage for the C code in pyobjc-core. * Backward incompatible change: ``-[OC_PythonDictionary setObject:value forKey:[NSNull null]]`` now sets key :data:`None` in the Python dictionary instead of ``NSNull.null()``. This is for consistency with ``-[OC_PythonDictionary objectForKey:]`` and other collection classes. Getting and setting key ``[NSNull null]`` now actually works. * Backward incompatible change: ``-[OC_PythonDictionary removeObjectForKey:]`` now raises ``NSInvalidArgumentException`` instead of Python's ``KeyError`` for missing keys. This matches the documented behaviour of ``NSDictionary``. * Backward incompatible change: ``-[Protocol descriptionForClassMethod:]`` now only accepts selector names (such as ``b"description"``) as its argument, not instances of :class:`objc.selector`. This matches the behaviour of other methods with an argument of the C type ``SEL``. * :func"`objc.namedSelector` and :func:`objc.typedSelector` now also work when the decorated function is a :func:`classmethod`. * Fix build problem on macOS 10.14 or earlier * The Objective-C proxy for a python :class:`int` is now always ``OC_PythonNumber``, in previous versions instances were proxied as ``NSNumber`` when the value was in the range of an ``unsigned long long`` that's outside of the range of a (signed) ``long long`` (that is, a value between ``2**63`` and ``2**64``). * Two ``NSString*`` values in Objective-C are now proxied to the same :class:`objc.pyobjc_unicode` instance when the two pointers are equal in Objective-C. That is, given ``NSString* value1`` and ``NSString* value2`` ``value1 == value2`` in Objective-C can be replaced by ``value1 is value2`` in Python. In older versions of PyObjC this invariant was not maintained, requiring more involved code to check if two strings represent the same object. This invariant was already maintained for other instances of other Objective-C classes. * The proxy for python's :class:`bytearray` (and other writable buffers) now supports the ``mutableBytes`` method in Objective-C. As a side effect of this ``OC_PythonData`` is now a sublcass of ``NSMutableData`` instead of ``NSData``. * Fixed retrieving an :class:`bytearray` value from a Cocoa archive In previous versions this resulted in garbage data. * Instances of :class:`bytearray` can now be included in "secure" Cocoa archives * Remove ``-[OC_PythonArray getObjects:inRange:]``, it is not part of the regular ``NSArray`` interface and was never used. * The proxy for python datetime objects was rewritten to be a lot simpler. User visible changes: * The new implementation is more correct, the old implementation truncated timestamps at whole seconds. * Calculating in Objective-C (such as calling ``-[NSDate dateByAddingTimeInterval:]`` will now always result in an ``NSDate`` value, not a Python value. * The proxy code now calls the "timestamp" method instead of "strftime" during conversion from Python to Objective-C. * Adding :class:`datetime.datetime` and :class:`datetime.date` instances to an archive now works, both for keyed and classic archives. For the exact types :class:`datetime.datetime` and :class:`datetime.date` the encoding is compatible with that of ``NSDate`` and supports ``NSSecureCoding`` as long as the values are not timezone aware. When communicating with pure Objective-C code any timezone information will be lost. Note that both :class:`datetime.datetime` and :class:`datetime.date` are represented as an ``NSDate`` in Objective-C land, even though this Objective-C has semantics of the latter class don't fully match that of the Cocoa class. * Fix python internal error when the "module_globals" argument to :func:`objc.loadBundleFunctions` is not a :class:`dict`. * Fix the result of :func:`inspect.signature` for :class:`objc.IMP`. In previous versions this included the implicit "selector" argument that isn't used by Python callers. * Avoid crash when trying to load a "magic" cookie CoreFoundation value for a type unknown to the PyObjC bridge. * Removed ``-[OC_PythonObject pyObject]``. The method is no longer used by PyObjC itself, and these proxy objects are considered a private API that may change at any time. * Removed ``+[OC_PythonObject classForUnarchiver]`` This method was present for compatibility with the ``NSObject`` interface, but isn't actually part of Cocoa. * ``-[OC_PythonObject methodSignatureForSelector:]`` and ``+[OC_PythonObject methodSignatureForSelector:]`` now return ``nil`` instead of raising an exception when the queried selector does not exist. This matches the behaviour of ``NSObject``. * Fix the metadata in the bindings for DiscRecording, Intents, SceneKit, and libdispatch to ensure that the ``__all__`` variable actually works. * Eliminated usage of sscanf in pyobjc-core A possible user visible change is that the use of sscanf to parse an IPv4 address has been replaced by a call to ``inet_pton()``, which may affect different representations of an IPv4 address. * ``OC_PythonSet`` now epxlictly calls set related methods instead of using C-API functions like :func:`PySet_Clear`. This simplifies the pyobjc-core code, and gives fewer problems with set subclasses. * Fix the buffer size used to for "struct sockaddr" arguments * Added ``objc._C_CFRange`` and ``objc._C_NSRange`` with the type encodings of the C types ``CFRange`` and ``NSRange``. * Functions and methods where the length of a C array argument is passed in another argument (such as ``int function(int* buffer, size_t bufsize)``) now also work when the argument with the size is a pointer to a ``CFRange`` or a pointer to a ``char``. * A :class:`memoryview` of an ``NSMutableData`` instance is now writable. * Fix crash when trying to create an :class:`objc.informal_protocol` with a sequence of selectors that contains a value that isn't an instance of :class:`objc.selector`. * 435: Fix build problem with Xcode 13.3 Xcode 13.3 introduces a new warning in ``-Wall``: ``-Wunused-but-set-variable``, and this found some code quality issues with PyObjC. ``` ### 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. ```Links
- PyPI: https://pypi.org/project/pyobjc - Changelog: https://pyup.io/changelogs/pyobjc/ - Repo: https://github.com/ronaldoussoren/pyobjc