pyobjc-dev Mailing List for PyObjC
Brought to you by:
ronaldoussoren
You can subscribe to this list here.
2000 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(9) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2001 |
Jan
(1) |
Feb
(2) |
Mar
(3) |
Apr
(30) |
May
(18) |
Jun
|
Jul
(4) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2002 |
Jan
(7) |
Feb
(2) |
Mar
(1) |
Apr
|
May
|
Jun
(3) |
Jul
(13) |
Aug
|
Sep
(23) |
Oct
(180) |
Nov
(291) |
Dec
(95) |
2003 |
Jan
(338) |
Feb
(352) |
Mar
(97) |
Apr
(46) |
May
(226) |
Jun
(184) |
Jul
(145) |
Aug
(141) |
Sep
(69) |
Oct
(161) |
Nov
(96) |
Dec
(90) |
2004 |
Jan
(66) |
Feb
(87) |
Mar
(98) |
Apr
(132) |
May
(115) |
Jun
(68) |
Jul
(150) |
Aug
(92) |
Sep
(59) |
Oct
(52) |
Nov
(17) |
Dec
(75) |
2005 |
Jan
(84) |
Feb
(191) |
Mar
(133) |
Apr
(114) |
May
(158) |
Jun
(185) |
Jul
(62) |
Aug
(28) |
Sep
(36) |
Oct
(88) |
Nov
(65) |
Dec
(43) |
2006 |
Jan
(85) |
Feb
(62) |
Mar
(92) |
Apr
(75) |
May
(68) |
Jun
(101) |
Jul
(73) |
Aug
(37) |
Sep
(91) |
Oct
(65) |
Nov
(30) |
Dec
(39) |
2007 |
Jan
(24) |
Feb
(28) |
Mar
(10) |
Apr
(2) |
May
(18) |
Jun
(16) |
Jul
(21) |
Aug
(6) |
Sep
(30) |
Oct
(31) |
Nov
(153) |
Dec
(31) |
2008 |
Jan
(63) |
Feb
(70) |
Mar
(47) |
Apr
(24) |
May
(59) |
Jun
(22) |
Jul
(12) |
Aug
(7) |
Sep
(14) |
Oct
(26) |
Nov
(5) |
Dec
(5) |
2009 |
Jan
(10) |
Feb
(41) |
Mar
(70) |
Apr
(88) |
May
(49) |
Jun
(62) |
Jul
(34) |
Aug
(15) |
Sep
(55) |
Oct
(40) |
Nov
(67) |
Dec
(21) |
2010 |
Jan
(60) |
Feb
(17) |
Mar
(26) |
Apr
(26) |
May
(29) |
Jun
(4) |
Jul
(21) |
Aug
(21) |
Sep
(10) |
Oct
(12) |
Nov
(3) |
Dec
(19) |
2011 |
Jan
(3) |
Feb
(13) |
Mar
(8) |
Apr
(8) |
May
(17) |
Jun
(20) |
Jul
(21) |
Aug
(7) |
Sep
|
Oct
|
Nov
(9) |
Dec
(11) |
2012 |
Jan
(3) |
Feb
|
Mar
|
Apr
(5) |
May
(4) |
Jun
(14) |
Jul
(5) |
Aug
(2) |
Sep
(15) |
Oct
(2) |
Nov
(23) |
Dec
(1) |
2013 |
Jan
(8) |
Feb
(1) |
Mar
|
Apr
|
May
(5) |
Jun
(1) |
Jul
(5) |
Aug
(4) |
Sep
|
Oct
(12) |
Nov
(10) |
Dec
(3) |
2014 |
Jan
(7) |
Feb
(14) |
Mar
(2) |
Apr
|
May
(2) |
Jun
(11) |
Jul
(10) |
Aug
(4) |
Sep
|
Oct
(8) |
Nov
(1) |
Dec
(2) |
2015 |
Jan
(9) |
Feb
(7) |
Mar
(1) |
Apr
|
May
(7) |
Jun
|
Jul
(5) |
Aug
(6) |
Sep
|
Oct
(1) |
Nov
(4) |
Dec
|
2016 |
Jan
(1) |
Feb
(1) |
Mar
(4) |
Apr
(2) |
May
(1) |
Jun
|
Jul
(6) |
Aug
(8) |
Sep
(21) |
Oct
(17) |
Nov
|
Dec
(36) |
2017 |
Jan
(6) |
Feb
(2) |
Mar
(4) |
Apr
(2) |
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
(1) |
Oct
|
Nov
(1) |
Dec
(6) |
2018 |
Jan
(2) |
Feb
(3) |
Mar
(3) |
Apr
(14) |
May
(2) |
Jun
(2) |
Jul
(4) |
Aug
(3) |
Sep
(6) |
Oct
(16) |
Nov
(1) |
Dec
(6) |
2019 |
Jan
(3) |
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
|
Jul
(2) |
Aug
|
Sep
|
Oct
(6) |
Nov
|
Dec
|
2020 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
(2) |
Jun
(1) |
Jul
(7) |
Aug
(1) |
Sep
(1) |
Oct
|
Nov
(2) |
Dec
(1) |
2021 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
|
Jun
(2) |
Jul
|
Aug
(5) |
Sep
(1) |
Oct
|
Nov
(1) |
Dec
|
2023 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
|
Sep
(2) |
Oct
|
Nov
|
Dec
|
From: Ronald O. <ron...@ma...> - 2023-09-24 09:45:29
|
Hi, I’ve tagged PyObjC 10.0 and am in the process of uploading to PyPI. The major change in this version is support for macOS Sonoma, just in time for the release of that version of macOS. Some other changes: * The lazy loading machinery no longer uses “objc.ObjCLazyModule” * Python 3.7 is no longer supported * objc.simd was restructured, hopefully without impact on user code See the full changelog of https://pyobjc.readthedocs.io/en/latest/changelog.html for a detailed list of changes. Ronald — Twitter / micro.blog: @ronaldoussoren Mastodon: @ro...@bl.... Blog: https://blog.ronaldoussoren.net/ |
From: Zachery B. <zb...@za...> - 2023-09-22 14:36:03
|
Hi, friends! Long time no. Just getting back into PyObjC after years in the wasteland. Wanted to check in and see if there are any tutorials or resources for working with recent Xcode? I have no idea if my existing PyObjC apps even build anymore. I should try those out. They'd need to be updated to Python 3. Is the norm still: - build the UI in Xcode - provide implementation in python using the transparent naming adaptation - py2app or the like - profit Cheers, Zac |
From: Ronald O. <ron...@ma...> - 2023-04-03 16:52:19
|
PyObjC 9.1 is one of the rare times that I'm publishing explicit beta releases. PyObjC 9.1b1 is available on PyPI ("pip install pyobjc-9.1b1"). This release contains the usual SDK updates (macOS 13.3) and minor bugfixes, but more importantly it contains some major changes to pyobjc-core. Because of this I kindly request that you test this beta release and let me know about any problems. First of all the code that transforms class attributes, and in particular translates Python functions to “objc.selector" objects, was rewritten from C to Python. This change should be transparant for users, other than some error cases and intentation changes: 1. The new code is smarter about recognizing if a method is intended to be used as an Objetive-C selector and will not translate multi-word PEP8 compatable names (e.g. "my_,method"). This reduces the need to use the python_selector decorator. 2. Coroutings (async methods, iterators) are no longer translated to a selector 3. The new code will translate *all* callables, which may lead to needing to use the python_method decorator in some cases (e.g. when using a builtin function as a class attribute) 4. It is now possible to use varargs in a selector method when the implied number or arguments can be represented. Furthermore the “python_method" and “informal_protocol" classes are now implemented in Python instead of Objective-C. Those should have no user-visible changes in behaviour. Lastly a number of classes are now created using “PyType_FromSpec" instead of using static “PyTypeObject" definitions. That results in minor change in behaviour when using Python 3.9 or earlier: In those versions it is not possible to make these classes immutable. Don't rely on this behaviour. As always the full changelog can be seen at <https://pyobjc.readthedocs.io/en/latest/changelog.html>. Ronald — Twitter / micro.blog: @ronaldoussoren Mastodon: @ro...@bl.... Blog: https://blog.ronaldoussoren.net/ |
From: Ronald O. <ron...@ma...> - 2021-11-11 13:41:18
|
A new macOS release means a new major release of PyObjC. I'm happy to announce that PyObjC 8 is available on PyPI with full support for macOS 12, including APIs introduced in that release. I've also been working on performance and code quality of the core bridge. There are significant speedups of the core bridge in PyObjC 8.0, and I have more ideas to reduce the performance difference between regular Python methods and calling Objective-C APIs. The release is a bit later than I would have liked, in part because I've been worrying about the covid-19 situation in Holland. Because of that I've spend some more time away from the computer. A full change log is included below. Backward incompatible changes In PyObjC 7 and earlier it was possible to leave out "output" arguments when calling a method with a Python implementation: 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: 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. GH-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. 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 objc.python_method to mark this as a python-only function. Upcoming incompatible changes The module PyObjCTools.Signals is deprecated and will be removed in PyObjC 9. objc.initFrameworkWrapper and 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 objc.function, objc.WeakRef, objc.selector, objc.IMP, objc.python_method. This reduces the interpreter overhead for calling instances of these objects. Implement Py_TPFLAGS_METHOD_DESCRIPTOR for objc.selector, 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, objc.IMP and objc.selector for simpler callables. "Simpler" methods are those with a small number of plain arguments, although the definition of what's simple will evolve over time. Generic Implementation Quality GH-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. GH-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. GH-374: Use pyupgrade to modernize the code base This is enforced by a pre-commit hook. GH-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) GH-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: def create_integers(count: int) -> NSArray[int]: return NSArray[int].arrayWithArray_([i for i in range(count)]) This requires typing stubs for framework bindings to be really useful, and those do not yet exist. Other changes and bugfixes GH-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. GH-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. GH-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. GH-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. GH-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 PyType_FromSpec. The objc.FSRef.from_path and 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 objc.objc_object now raises TypeError instead of objc.InternalError. User code should always inherit from a Cocoa class. GH-354: Add an option to install all framework bindings, including those not relevant for the current platform. To use this: $ pip install 'pyobjc[allbindings]' Ronald — Twitter / micro.blog: @ronaldoussoren Blog: https://blog.ronaldoussoren.net/ |
From: Ronald O. <ron...@ma...> - 2021-09-19 09:38:21
|
I've spend some more time on py2app over the last week or so, in between relaxing while being away from work. That results in a larger release for py2app than I've done in a long while. The most important changes are support for Python 3.10 and (finally!) bundling package metadata ("dist-info" directories). The latter should fix issues with code that uses pkg_resources and looks for distribution information such as entry points. As always: Py2app is supposed to be a "DWIM" tool, please file issues when you need to adjust the bundled application, either through py2app options or (especially) manually. And a public service announcement: Don't use the "argv_emulator" option with GUI applications. That option tends to cause options with GUI eventloops, and most GUI libraries have better options to handle "file-open" events. I expect to work less on py2app in the coming weeks, the current plan is to continue working on PyObjC during my last week of from work. The current repository is up-to-date w.r.t. support for the upcoming macOS Monterey, and I hope to land land some interesting other improvements during the week... The full changelog: Stub executables were recompiled on macOS 11 This means support for light mode/dark mode should now work out of the box. The old stub executables are still used when detecting that Tkinter is used with an old build of Tk. Issue 1: Include ".egg-info" and ".dist-info" information in the bundled application This fixes any python package that uses pkg_resources to look for specific distributions. py2app.filters.not_stdlib_filter now knows about Python's "venv" Issue 368: Add recipe detect_dunder_file This recipe will ensure that a Python package is stored outside of site-packages.zip when a module in that package uses the __file__ variable. This variable is most commonly used to load resources stored in the package (instead of the newer importlib.resources and pkg_resources libraries). Issue 339: Add recipe for pydantic The recipe is needed because pydantic uses Cython to compile all sources (including the package __init__) and therefore hides imports from the dependency analyzer. Issue 338: Add "imageio_ffmpeg" to autopackages PR367: Add recipes for pandas, pylsp, and zmq PR367: Add docutils and pylint to autopackages PR by Ryan Clary (mrclary on GitHub) Issue 344: Invocation of codesign on the whole bundle sometimes fails Py2app will now try this a number of times before giving up. This is at best a workaround for and doesn't completely fix the problem. Issue 370: py2app now works with Python 3.10 Python 3.10 no longer exports a (private) symbol used by the py2app stub executable. Switched to a public API to accomplish the same task where available. Issue 110: Add recipe for SQLAlchemy The recipe includes all dialects and connectors, including implicit dependencies, because SQLAlchemy uses __import__ to load dependencies. Issue 328: Add recipe for gcloud Issue 195: Add USER_BASE, getuserbase() and getusersitepackages() to py2app's version of site.py. Issue 184: Add recipe for 'ssl' This recipe is only used for Python 3.4 or later and ensures that the CA bundle used by Python's ssl module is included in the app bundle and OpenSSL is configured to look for that bundle in the application bundle. Issue 371: change default error message on launch problems The default error message shown when the application cannot be launched is now slightly more useful and refers the py2app debug page <https://py2app.readthedocs.io/en/latest/debugging.html>. Issue 345, 169: Adjust qt5 and qt6 recipes for non-PyPI installations The qt5 and qt6 recipes now should work when the Qt installation prefix is outside of the PyQt package, for example when PyQt was installed through homebrew. I've tested this for PyQt5 and made the same change to the PyQt6 recipe, although I haven't tested that change. — Twitter / micro.blog: @ronaldoussoren Blog: https://blog.ronaldoussoren.net/ |
From: Ronald O. <ron...@ma...> - 2021-08-25 08:21:41
|
> On 25 Aug 2021, at 09:01, Durgaprasad Kelkar <dur...@gm...> wrote: > > Thanks Ronald. > I was using Python 2.7.18. Don’t. Python 2.7 is no longer support by the python developers, and is also no longer support by up-to-date releases of PyObjC. Any fix for these problem won’t end up in a version of PyObjC that works with Python 2.7. > After changing protocol_ext.m for Python2 and adding "{"use_protocol", use_protocol, METH_VARARGS, NULL}," in mod_methods I could use Protocol and attach to NSXPCInterface. > > Now I am having another issue with "NSXPCConnection". > ValueError: NSInvalidArgumentException - [NSXPCConnection sendInvocation]: Block was not compiled using a compiler that inserts type information about arguments. (doSomething:withReply:) > > I could connect to the Security extension from my Objc C code. But from pyobjc sendInvocation fails. XCode and Xcode command line tools are installed on the machine. That’s annoying. I’ll have to investigate further. I don’t know when I’ll get around to doing that though, the first step is to create a complete example project with an extension. Only then I can start debugging this end to end, hopefully including a fix (although that’s far from sure given the issue with defining protocols). It might be possible to use lower-level APIs to communicate with the extension, but that’s not something I’ve ever looked into. Ronald > > > On Tue, Aug 24, 2021 at 12:22 PM Ronald Oussoren <ron...@ma... <mailto:ron...@ma...>> wrote: > > >> On 23 Aug 2021, at 10:06, Durgaprasad Kelkar <dur...@gm... <mailto:dur...@gm...>> wrote: >> >> Hi Ronald, >> Thanks a lot for quick response. >> I don’t have any experience of writing C extension. I have started learning the same. >> I found some blogs explaining this. They are writing .c files and then compiling with python setup.py install >> >> I can’t find any help to compile with Xcode clang compiler. >> Can you please help me out. Any pointers or examples would be helpful. > > I’ve added a complete extension to the documentation (https://pyobjc.readthedocs.io/en/latest/notes/using-nsxpcinterface.html <https://pyobjc.readthedocs.io/en/latest/notes/using-nsxpcinterface.html>). > > Use “python setup.py install” to build and install the C extension. This should work when either Xcode or the Xcode command line tools are installed. > > The example assumes that you only need definition in the core Cocoa frameworks (Foundation, AppKit), you may have to adjust the includes and link flags if you need definitions from other frameworks. > > Ronald > >> >> >> On Sat, 21 Aug 2021 at 3:33 PM, Ronald Oussoren <ron...@ma... <mailto:ron...@ma...>> wrote: >> Sadly enough the issue is not fixed and cannot be fixed. I’ve described the workaround in <https://pyobjc.readthedocs.io/en/latest/notes/using-nsxpcinterface.html <https://pyobjc.readthedocs.io/en/latest/notes/using-nsxpcinterface.html>>, that description assumes you know how to write C extensions. >> >> I’ve closed the the issue at GitHub (https://github.com/ronaldoussoren/pyobjc/issues/256 <https://github.com/ronaldoussoren/pyobjc/issues/256>) as wontfix because there are no public APIs that can be used to register the “extended method signature” information needed by NSXPCInterface. I have filed an issue with Apple about this, but have little hope that this will accomplish anything. And even if my request is granted this would end up in macOS 13 at the earliest. >> >> Ronald >> >>> On 20 Aug 2021, at 11:43, Durgaprasad Kelkar <dur...@gm... <mailto:dur...@gm...>> wrote: >>> >> >>> I am working on NSXPCConnection in Pyobjc. >>> I could not create NSXPCInterface with a protocol. >>> I referred https://stackoverflow.com/questions/52284089/is-it-possible-to-use-pyobjc-with-a-privilved-xpc-helper-tool-and-xpcinterface-a <https://stackoverflow.com/questions/52284089/is-it-possible-to-use-pyobjc-with-a-privilved-xpc-helper-tool-and-xpcinterface-a>. >>> Links given in the answers are not working. >>> Can you give latest links or code snippet for the same. >>> >>> Does issue https://bitbucket.org/ronaldoussoren/pyobjc/issues/256/enable-using-xpcinterface-with-protocols <https://bitbucket.org/ronaldoussoren/pyobjc/issues/256/enable-using-xpcinterface-with-protocols>. is fixed. >>> >>> Any help around this would be helpful. >> >>> _______________________________________________ >>> Pyobjc-dev mailing list >>> Pyo...@li... <mailto:Pyo...@li...> >>> https://lists.sourceforge.net/lists/listinfo/pyobjc-dev <https://lists.sourceforge.net/lists/listinfo/pyobjc-dev> >> >> >> — >> >> Twitter / micro.blog: @ronaldoussoren >> Blog: https://blog.ronaldoussoren.net/ <https://blog.ronaldoussoren.net/> > > — > > Twitter / micro.blog: @ronaldoussoren > Blog: https://blog.ronaldoussoren.net/ <https://blog.ronaldoussoren.net/> > <TestProtocol.zip> — Twitter / micro.blog: @ronaldoussoren Blog: https://blog.ronaldoussoren.net/ |
From: Ronald O. <ron...@ma...> - 2021-08-24 06:52:21
|
> On 23 Aug 2021, at 10:06, Durgaprasad Kelkar <dur...@gm...> wrote: > > Hi Ronald, > Thanks a lot for quick response. > I don’t have any experience of writing C extension. I have started learning the same. > I found some blogs explaining this. They are writing .c files and then compiling with python setup.py install > > I can’t find any help to compile with Xcode clang compiler. > Can you please help me out. Any pointers or examples would be helpful. I’ve added a complete extension to the documentation (https://pyobjc.readthedocs.io/en/latest/notes/using-nsxpcinterface.html <https://pyobjc.readthedocs.io/en/latest/notes/using-nsxpcinterface.html>). Use “python setup.py install” to build and install the C extension. This should work when either Xcode or the Xcode command line tools are installed. The example assumes that you only need definition in the core Cocoa frameworks (Foundation, AppKit), you may have to adjust the includes and link flags if you need definitions from other frameworks. Ronald > > > On Sat, 21 Aug 2021 at 3:33 PM, Ronald Oussoren <ron...@ma... <mailto:ron...@ma...>> wrote: > Sadly enough the issue is not fixed and cannot be fixed. I’ve described the workaround in <https://pyobjc.readthedocs.io/en/latest/notes/using-nsxpcinterface.html <https://pyobjc.readthedocs.io/en/latest/notes/using-nsxpcinterface.html>>, that description assumes you know how to write C extensions. > > I’ve closed the the issue at GitHub (https://github.com/ronaldoussoren/pyobjc/issues/256 <https://github.com/ronaldoussoren/pyobjc/issues/256>) as wontfix because there are no public APIs that can be used to register the “extended method signature” information needed by NSXPCInterface. I have filed an issue with Apple about this, but have little hope that this will accomplish anything. And even if my request is granted this would end up in macOS 13 at the earliest. > > Ronald > >> On 20 Aug 2021, at 11:43, Durgaprasad Kelkar <dur...@gm... <mailto:dur...@gm...>> wrote: >> > >> I am working on NSXPCConnection in Pyobjc. >> I could not create NSXPCInterface with a protocol. >> I referred https://stackoverflow.com/questions/52284089/is-it-possible-to-use-pyobjc-with-a-privilved-xpc-helper-tool-and-xpcinterface-a <https://stackoverflow.com/questions/52284089/is-it-possible-to-use-pyobjc-with-a-privilved-xpc-helper-tool-and-xpcinterface-a>. >> Links given in the answers are not working. >> Can you give latest links or code snippet for the same. >> >> Does issue https://bitbucket.org/ronaldoussoren/pyobjc/issues/256/enable-using-xpcinterface-with-protocols <https://bitbucket.org/ronaldoussoren/pyobjc/issues/256/enable-using-xpcinterface-with-protocols>. is fixed. >> >> Any help around this would be helpful. > >> _______________________________________________ >> Pyobjc-dev mailing list >> Pyo...@li... <mailto:Pyo...@li...> >> https://lists.sourceforge.net/lists/listinfo/pyobjc-dev <https://lists.sourceforge.net/lists/listinfo/pyobjc-dev> > > > — > > Twitter / micro.blog: @ronaldoussoren > Blog: https://blog.ronaldoussoren.net/ <https://blog.ronaldoussoren.net/> — Twitter / micro.blog: @ronaldoussoren Blog: https://blog.ronaldoussoren.net/ |
From: Durgaprasad K. <dur...@gm...> - 2021-08-23 08:06:41
|
Hi Ronald, Thanks a lot for quick response. I don’t have any experience of writing C extension. I have started learning the same. I found some blogs explaining this. They are writing .c files and then compiling with python setup.py install I can’t find any help to compile with Xcode clang compiler. Can you please help me out. Any pointers or examples would be helpful. On Sat, 21 Aug 2021 at 3:33 PM, Ronald Oussoren <ron...@ma...> wrote: > Sadly enough the issue is not fixed and cannot be fixed. I’ve described > the workaround in < > https://pyobjc.readthedocs.io/en/latest/notes/using-nsxpcinterface.html>, > that description assumes you know how to write C extensions. > > I’ve closed the the issue at GitHub ( > https://github.com/ronaldoussoren/pyobjc/issues/256) as wontfix because > there are no public APIs that can be used to register the “extended method > signature” information needed by NSXPCInterface. I have filed an issue > with Apple about this, but have little hope that this will accomplish > anything. And even if my request is granted this would end up in macOS 13 > at the earliest. > > Ronald > > On 20 Aug 2021, at 11:43, Durgaprasad Kelkar <dur...@gm...> wrote: > > I am working on NSXPCConnection in Pyobjc. > I could not create NSXPCInterface with a protocol. > I referred > https://stackoverflow.com/questions/52284089/is-it-possible-to-use-pyobjc-with-a-privilved-xpc-helper-tool-and-xpcinterface-a > . > Links given in the answers are not working. > Can you give latest links or code snippet for the same. > > Does issue > https://bitbucket.org/ronaldoussoren/pyobjc/issues/256/enable-using-xpcinterface-with-protocols. > is fixed. > > Any help around this would be helpful. > > _______________________________________________ > Pyobjc-dev mailing list > Pyo...@li... > https://lists.sourceforge.net/lists/listinfo/pyobjc-dev > > > — > > Twitter / micro.blog: @ronaldoussoren > Blog: https://blog.ronaldoussoren.net/ > > |
From: Ronald O. <ron...@ma...> - 2021-08-21 10:03:13
|
Sadly enough the issue is not fixed and cannot be fixed. I’ve described the workaround in <https://pyobjc.readthedocs.io/en/latest/notes/using-nsxpcinterface.html <https://pyobjc.readthedocs.io/en/latest/notes/using-nsxpcinterface.html>>, that description assumes you know how to write C extensions. I’ve closed the the issue at GitHub (https://github.com/ronaldoussoren/pyobjc/issues/256 <https://github.com/ronaldoussoren/pyobjc/issues/256>) as wontfix because there are no public APIs that can be used to register the “extended method signature” information needed by NSXPCInterface. I have filed an issue with Apple about this, but have little hope that this will accomplish anything. And even if my request is granted this would end up in macOS 13 at the earliest. Ronald > On 20 Aug 2021, at 11:43, Durgaprasad Kelkar <dur...@gm...> wrote: > > I am working on NSXPCConnection in Pyobjc. > I could not create NSXPCInterface with a protocol. > I referred https://stackoverflow.com/questions/52284089/is-it-possible-to-use-pyobjc-with-a-privilved-xpc-helper-tool-and-xpcinterface-a <https://stackoverflow.com/questions/52284089/is-it-possible-to-use-pyobjc-with-a-privilved-xpc-helper-tool-and-xpcinterface-a>. > Links given in the answers are not working. > Can you give latest links or code snippet for the same. > > Does issue https://bitbucket.org/ronaldoussoren/pyobjc/issues/256/enable-using-xpcinterface-with-protocols <https://bitbucket.org/ronaldoussoren/pyobjc/issues/256/enable-using-xpcinterface-with-protocols>. is fixed. > > Any help around this would be helpful. > _______________________________________________ > Pyobjc-dev mailing list > Pyo...@li... > https://lists.sourceforge.net/lists/listinfo/pyobjc-dev — Twitter / micro.blog: @ronaldoussoren Blog: https://blog.ronaldoussoren.net/ |
From: Durgaprasad K. <dur...@gm...> - 2021-08-20 09:43:52
|
I am working on NSXPCConnection in Pyobjc. I could not create NSXPCInterface with a protocol. I referred https://stackoverflow.com/questions/52284089/is-it-possible-to-use-pyobjc-with-a-privilved-xpc-helper-tool-and-xpcinterface-a . Links given in the answers are not working. Can you give latest links or code snippet for the same. Does issue https://bitbucket.org/ronaldoussoren/pyobjc/issues/256/enable-using-xpcinterface-with-protocols. is fixed. Any help around this would be helpful. |
From: Ronald O. <ron...@ma...> - 2021-06-18 13:09:37
|
> On 18 Jun 2021, at 14:10, Liu Aubrey <ld...@ou...> wrote: > > Dear teams: > I am confused by this error:ValueError: depythonifying 'charptr', got ‘str’ for few days and cannot find the reason. > My pyobjc version is 7.3, macOS version is 10.15.7 and the objective-c function is below > > // Function to read Test Device Register > -(BOOL) readRegisterAtAddress:(NSUInteger)address > withLength:(NSUInteger)length > data:(uint8_t *)data > error:(NSError **)error; Is this an API in one of the frameworks from Apple? If it is not you’ll have to register some metadata to use this API because the method interface is too complicated to handle unaided. Something like this should work (replace ‘ClassName’ by the name of the actual class): import objc objc.registerMetaDataForSelector(b'ClassName', b'readRegisterAtAddress:withLength:data:error:’, { 'retval': { 'type’: objc._C_NSBOOL }, 'arguments': { 4: { 'type_modifier’: objc._C_OUT, 'c_array_length_in_arg': 3 }, 5: { 'type_modifier’: objc._C_OUT } } } ) This tells PyObjC that: * The return value is a boolean, otherwise the return value will be a small integer * The 4th argument is an output argument and is a buffer whose size is in the 3rd argument * The 5th argument is a pass-by-reference output argument Note that counting includes implicit arguments for the Objective-C selector, therefore the first “real” argument has offset 2. Usage of the API: ok, data, error = device.device.readRegisterAtAddress_withLength_data_(0x1c, 4, None, None) Ronald > > I used it in this way > data = '\x00'*4 > device.device.readRegisterAtAddress_withLength_data_error_(0x1c, 4, data, None) > Can you help me to solve this issue. > Thank you very much. > > Aubrey.Liu > > 发自我的iPhone > _______________________________________________ > Pyobjc-dev mailing list > Pyo...@li... > https://lists.sourceforge.net/lists/listinfo/pyobjc-dev — Twitter / micro.blog: @ronaldoussoren Blog: https://blog.ronaldoussoren.net/ |
From: Liu A. <ld...@ou...> - 2021-06-18 12:10:33
|
Dear teams: I am confused by this error:ValueError: depythonifying 'charptr', got ‘str’ for few days and cannot find the reason. My pyobjc version is 7.3, macOS version is 10.15.7 and the objective-c function is below // Function to read Test Device Register -(BOOL) readRegisterAtAddress:(NSUInteger)address withLength:(NSUInteger)length data:(uint8_t *)data error:(NSError **)error; I used it in this way data = '\x00'*4 device.device.readRegisterAtAddress_withLength_data_error_(0x1c, 4, data, None) Can you help me to solve this issue. Thank you very much. Aubrey.Liu 发自我的iPhone |
From: Ronald O. <ron...@ma...> - 2021-01-02 09:36:41
|
Hi, Py2app 0.23 is on PyPI. There are two noteworthy changes: * Support building “Universal 2” applications when using a “universal2” build of Python * Proces “@loader_path” in shared libraries, which should improve building apps based on wheels on PyPI that were build with the “delocate” tool Ronald — Twitter / micro.blog: @ronaldoussoren Blog: https://blog.ronaldoussoren.net/ |
From: Ronald O. <ron...@ma...> - 2020-12-30 12:08:31
|
Hi, I’ve uploaded PyObjC 7.1 to PyPI. The most important change is support for API’s introduced in macOS 11.1. Other than that there was a change to make it easier to build with the Command Line Tools instead of Xcode (for those not using the binary wheels). Ronald — Twitter / micro.blog: @ronaldoussoren Blog: https://blog.ronaldoussoren.net/ |
From: Ronald O. <ron...@ma...> - 2020-11-30 20:20:02
|
I’ve uploaded PyObjC 7.0.1 to PyPI, because the 7.0 release didn’t build on platforms other than Big Sur :-( Ronald — Twitter / micro.blog: @ronaldoussoren Blog: https://blog.ronaldoussoren.net/ |
From: Ronald O. <ron...@ma...> - 2020-11-30 10:22:55
|
Finally.... A bit later than I had expected I've uploaded PyObjC 7.0 to PyPI. This release includes support for new APIs introduced in macOS 11 (Big Sur), as well as support for arm64. The binary wheels on PyPI are only for x86_64 for now, I'll add "universal2" wheels once I've resolved some issues with the packaging ecosystem. The release was cut from the branch "pyobjc-7-branch". Because of this the website has not been updated. Changelog Added support for arm64 (aka "Apple Silicon") Existing framework bindings were updated for the macOS 11.0 SDK Added bindings for the following frameworks: Accessibility (introduced in macOS 11.0) AppTrackingTransparency (introduced in macOS 11.0) CallKit (introduced in macOS 11.0) ClassKit (introduced in macOS 11.0) KernelManagement (introduced in macOS 11.0) MetalPerformanceShaders (introduced in macOS 10.13) MetalPerformanceShadersGraph (introduced in macOS 11.0) MLCompute (introduced in macOS 11.0) PassKit (introduced in macOS 11.0) ReplayKit (introduced in macOS 11.0) ScreenTime (introduced in macOS 11.0) UniformTypeIdentifiers (introduced in macOS 11.0) UserNotificationsUI (introduced in macOS 11.0) Virtualization (introduced in macOS 11.0) Dropped the bindings to the QTKit framework. This framework was removed in macOS 10.15. Dropped the bindings for the XgridFoundation framework. This framework was removed in macOS 10.8. This version drops support for 32-bit executables, both the core bridge and the framework wrappers only support 64-bit executables going forward PyObjC is now always build with the system libffi. issue 301: pyobjc-framework-Metal build failed on macOS mojave Python 3.10 support: Don't assume the result of PyREFCNT, PySIZE and Py_TYPE are an lvalue. Python 3.10 support: Completely phase out use of old buffer API, which will be removed in Python 3.10. As a side effect of this a number of extensions that used the limited ABI once again use the regular ABI. Removed remnants of support for i386, ppc and ppc64 from pyobjc-core. Added type to manage Py_buffer lifetimes to the internal API in pyobjc-core, to be used by framework wrappers. Add objc._C_BYREF. This definition was missing, but isn't used in modern ObjC code. PR 323: Remove leading slashes from detected SDK patch to avoid miscalculating the version. Patch by GitHub user linuxfood. PR 322: Avoid None error in PyObjCTools.AppHelper. Patch by github user mintho PR 321: Fix typo in documentation. Patch by github user russeldavis A personal note The changelog is fairly long, but shorter than I had hoped after WWDC. I've had a hard time to find the energy to spent a lot of time on PyObjC in the current state of the world. I've been working from home since March, and even now video meetings are pretty draining. It also doesn't help that my main hobby away from the computer is a full contact sport that's on hold for most of that time without a clear indication on when that will change (and when I'll feel comfortable with this). On a more positive note: A different distraction from my own projects is working on CPython again, in particular working with Ned Deily and Lawrence D'Anna on supporting arm64 and "Universal 2" to CPython. The first visible result of that is an experimental "Univeral 2" build of the upcoming Python 3.9.1 release. Ronald — Twitter / micro.blog: @ronaldoussoren Blog: https://blog.ronaldoussoren.net/ |
From: Ronald O. <ron...@ma...> - 2020-09-16 09:20:48
|
Hi, I’ve uploaded py2app 0.22 to PyPI. This contains a small number of bug fixes, most important of which was an problem when deploying to macOS 10.9 or 10.10. * #300: Add support for ARM64 and Universal 2 binaries NOTE: Support is highly experimental, these stubs have not been tested yet. * #299: Fix build error when building with the copy of Python 3 shipped with Xcode. * #281: Generated bundle doesn't work on macOS 10.9 and 10.10. Ronald — Twitter / micro.blog: @ronaldoussoren Blog: https://blog.ronaldoussoren.net/ |
From: SourceForge.net <no...@so...> - 2020-08-17 21:52:52
|
***************************************************************** Please confirm your subscription to pyobjc-dev. ***************************************************************** Thank you for your interest in the pyobjc-dev mailing list. We just need you to confirm that you made this request by clicking on the link below: https://sourceforge.net/projects/pyobjc/lists/confirm?hash=a0891d9f-4347-4158-ad11-98a790131193 By confirming your subscription, you are agreeing to the Terms of Service and the Privacy Policy: https://slashdotmedia.com/terms-of-use/ https://slashdotmedia.com/privacy-statement/ If you received this e-mail in error, feel free to simply delete it. Our apologies. ------------------------------------------------------------ Why do I need to confirm? ------------------------------------------------------------ If you're anything like us, it's probably safe to say that you hate spam. To ensure that you, and only you, requested updates, we ask that you confirm each subscription. ***************************************************************** This e-mail was intended for: pyo...@li... Privacy policy: https://slashdotmedia.com/privacy-statement/ PO BOX 2452, La Jolla, CA 92038 |
From: Ronald O. <ron...@me...> - 2020-07-27 13:53:54
|
There’s an underscore at the end of the selector in the code below, that should be a colon. Could you file an issue on GitHub about this? That helps me to not forget to work on a better fix, and will give you an update when I do so. Ronald — Twitter / micro.blog: @ronaldoussoren Blog: https://blog.ronaldoussoren.net/ > On 27 Jul 2020, at 11:49, Eric Falconnier <er...@ze...> wrote: > > Hi, > > Thank you for your answer. > > I have tried to change the metadata using the following code block: > > import objc > objc.registerMetaDataForSelector( > b"NSURLCredential", > b"credentialWithIdentity:certificates:persistence_", > {'arguments': { > 2: {'null_accepted': False, 'type': b'@'}, > 3: {'_template': True, 'type': b'@'}, > 4: {'_template': True, 'type': b'Q'}, > 'classmethod': True, > 'hidden': False, > 'retval': {'_template': True, 'type': b'@'}} > } > ) > > but I didn't manage to make it work. The metadata for the method do not change. > > I do not really know when to call registerMetaDataForSelector, if I have to import the NSURLCredential class after calling it or before. > > Again, thank you for your time. > > -- > Éric > > >> On 25. Jul 2020, at 17:21, Ronald Oussoren <ron...@me...> wrote: >> >> What should work as a workaround: use registerMetaDataFor to change the type for argument 2 to “@“. >> > |
From: Eric F. <er...@ze...> - 2020-07-27 10:43:31
|
Hi, Thank you for your answer. I have tried to change the metadata using the following code block: import objc objc.registerMetaDataForSelector( b"NSURLCredential", b"credentialWithIdentity:certificates:persistence_", {'arguments': { 2: {'null_accepted': False, 'type': b'@'}, 3: {'_template': True, 'type': b'@'}, 4: {'_template': True, 'type': b'Q'}, 'classmethod': True, 'hidden': False, 'retval': {'_template': True, 'type': b'@'}} } ) but I didn't manage to make it work. The metadata for the method do not change. I do not really know when to call registerMetaDataForSelector, if I have to import the NSURLCredential class after calling it or before. Again, thank you for your time. -- Éric > On 25. Jul 2020, at 17:21, Ronald Oussoren <ron...@me...> wrote: > > What should work as a workaround: use registerMetaDataFor to change the type for argument 2 to “@“. > |
From: Marc V. O. <ma...@pr...> - 2020-07-26 18:21:39
|
great progress! Thanks for all the work > On Jul 25, 2020, at 4:47 PM, Ronald Oussoren via Pyobjc-dev <pyo...@li...> wrote: > > Hi, > > I’ve been working on PyObjC 7 in the week before EuroPython as well as today (the first day of sprints), and have made a lot of progress. > > The framework bindings are currently fully up to date with the latest macOS 11 beta (beta 3), with tests passing on macOS 10.9 as well as macOS 11 on both Intel and ARM64 systems. > > The development branch is in a better shape than it is ever been at EuroPython, even with the port to Apple Silicon. > > With some luck this means PyObjC 7 will be a big update. I have big plans every year, and this time I might have enough time to implement them :-) > > Ronald > — > > Twitter / micro.blog: @ronaldoussoren > Blog: https://blog.ronaldoussoren.net/ <https://blog.ronaldoussoren.net/> > _______________________________________________ > Pyobjc-dev mailing list > Pyo...@li... > https://lists.sourceforge.net/lists/listinfo/pyobjc-dev |
From: Ronald O. <ron...@me...> - 2020-07-25 20:47:34
|
Hi, I’ve been working on PyObjC 7 in the week before EuroPython as well as today (the first day of sprints), and have made a lot of progress. The framework bindings are currently fully up to date with the latest macOS 11 beta (beta 3), with tests passing on macOS 10.9 as well as macOS 11 on both Intel and ARM64 systems. The development branch is in a better shape than it is ever been at EuroPython, even with the port to Apple Silicon. With some luck this means PyObjC 7 will be a big update. I have big plans every year, and this time I might have enough time to implement them :-) Ronald — Twitter / micro.blog: @ronaldoussoren Blog: https://blog.ronaldoussoren.net/ |
From: Ronald O. <ron...@me...> - 2020-07-25 15:21:58
|
> On 25 Jul 2020, at 12:16, Eric Falconnier <er...@ze...> wrote: > > Hi, > > I am trying to use the following class method: > > NSCredential credentialWithIdentity:certificates:persistence: > https://developer.apple.com/documentation/foundation/nsurlcredential/1428192-credentialwithidentity > > (Python3.6 in a virtualenv on macos 10.15 with PyObjc v6.2.2) > > Metadata: > > {'arguments': ({'_template': True, 'type': b'@'}, > {'_template': True, 'type': b':'}, > {'null_accepted': True, 'type': b'^{__SecIdentity=}'}, > {'_template': True, 'type': b'@'}, > {'_template': True, 'type': b'Q'}), > 'classmethod': True, > 'hidden': False, > 'retval': {'_template': True, 'type': b'@'}} > > I get a SecIdentity object from a previous SecItemCopyMatching call. > > When I pass it to this method, i get the following error: > > depythonifying 'pointer', got 'SecIdentityRef' > > How could I fix this issue? Do I need to pass the SecIdentity as a different kind of argument? Is it possible to change the metadata with registerMetaDataForSelector ? I need to look into this, I seem to have missed something when creating the bindings. The security bindings are currently created by hand, my tooling for generating the metadata has problems with processing the security headers. What should work as a workaround: use registerMetaDataFor to change the type for argument 2 to “@“. Ronald — Twitter / micro.blog: @ronaldoussoren Blog: https://blog.ronaldoussoren.net/ <https://blog.ronaldoussoren.net/> > > Thanks, > > -- > Éric > > > > _______________________________________________ > Pyobjc-dev mailing list > Pyo...@li... > https://lists.sourceforge.net/lists/listinfo/pyobjc-dev |
From: Eric F. <er...@ze...> - 2020-07-25 11:24:46
|
Hi, I am trying to use the following class method: NSCredential credentialWithIdentity:certificates:persistence: https://developer.apple.com/documentation/foundation/nsurlcredential/1428192-credentialwithidentity (Python3.6 in a virtualenv on macos 10.15 with PyObjc v6.2.2) Metadata: {'arguments': ({'_template': True, 'type': b'@'}, {'_template': True, 'type': b':'}, {'null_accepted': True, 'type': b'^{__SecIdentity=}'}, {'_template': True, 'type': b'@'}, {'_template': True, 'type': b'Q'}), 'classmethod': True, 'hidden': False, 'retval': {'_template': True, 'type': b'@'}} I get a SecIdentity object from a previous SecItemCopyMatching call. When I pass it to this method, i get the following error: depythonifying 'pointer', got 'SecIdentityRef' How could I fix this issue? Do I need to pass the SecIdentity as a different kind of argument? Is it possible to change the metadata with registerMetaDataForSelector ? Thanks, -- Éric |
From: Ronald O. <ron...@ma...> - 2020-07-08 20:21:11
|
Hi, I’ve uploaded PyObjC 6.2.2 to PyPI. The changelog for this release: #311 <https://github.com/ronaldoussoren/pyobjc/issues/311>: Build for the Metal bindings failed on macOS 10.14 #309 <https://github.com/ronaldoussoren/pyobjc/issues/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 As an aside: I’m working on full support for macOS 11, as well as Apple Silicon. The development branch for the core bridge already passes its tests on Apple Silicon hardware, and updating the framework bindings for macOS is going slightly faster than expected. With some luck there will be a prerelease of PyObjC 7 after EuroPython. Ronald — Twitter / micro.blog: @ronaldoussoren Blog: https://blog.ronaldoussoren.net/ |