pyobjc-framework-MediaToolbox 10.3.2__tar.gz → 11.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/Lib/MediaToolbox/_metadata.py +1 -1
  2. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/Lib/pyobjc_framework_MediaToolbox.egg-info/PKG-INFO +19 -8
  3. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/Lib/pyobjc_framework_MediaToolbox.egg-info/SOURCES.txt +4 -1
  4. pyobjc_framework_mediatoolbox-11.1/Lib/pyobjc_framework_MediaToolbox.egg-info/pyobjc-build-info.txt +3 -0
  5. pyobjc_framework_mediatoolbox-11.1/Lib/pyobjc_framework_MediaToolbox.egg-info/requires.txt +2 -0
  6. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/License.txt +1 -1
  7. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/Modules/_MediaToolbox.m +44 -14
  8. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/Modules/pyobjc-api.h +1 -1
  9. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/Modules/pyobjc-compat.h +175 -7
  10. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/PKG-INFO +19 -8
  11. pyobjc_framework_mediatoolbox-11.1/PyObjCTest/__init__.py +1 -0
  12. pyobjc_framework_mediatoolbox-11.1/metadata/raw/arm64-15.0.fwinfo +165 -0
  13. pyobjc_framework_mediatoolbox-11.1/metadata/raw/x86_64-15.0.fwinfo +165 -0
  14. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/pyobjc_setup.py +73 -53
  15. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/setup.py +1 -3
  16. pyobjc_framework_mediatoolbox-10.3.2/Lib/pyobjc_framework_MediaToolbox.egg-info/requires.txt +0 -2
  17. pyobjc_framework_mediatoolbox-10.3.2/PyObjCTest/__init__.py +0 -1
  18. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/Examples/ProcessingTap/summary.txt +0 -0
  19. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/Examples/ProcessingTap/tap.py +0 -0
  20. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/Lib/MediaToolbox/__init__.py +0 -0
  21. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/Lib/pyobjc_framework_MediaToolbox.egg-info/dependency_links.txt +0 -0
  22. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/Lib/pyobjc_framework_MediaToolbox.egg-info/not-zip-safe +0 -0
  23. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/Lib/pyobjc_framework_MediaToolbox.egg-info/top_level.txt +0 -0
  24. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/MANIFEST.in +0 -0
  25. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/PyObjCTest/test_mediatoolbox.py +0 -0
  26. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/PyObjCTest/test_mtaudioprocessingtap.py +0 -0
  27. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/PyObjCTest/test_mtformatnames.py +0 -0
  28. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/PyObjCTest/test_mtprofessionalvideoworkflow.py +0 -0
  29. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/metadata/MediaToolbox.fwinfo +0 -0
  30. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/metadata/metadata.ini +0 -0
  31. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/metadata/raw/arm64-12.3.fwinfo +0 -0
  32. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/metadata/raw/arm64-14.5.fwinfo +0 -0
  33. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/metadata/raw/x86_64-10.13.fwinfo +0 -0
  34. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/metadata/raw/x86_64-10.16.fwinfo +0 -0
  35. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/metadata/raw/x86_64-12.3.fwinfo +0 -0
  36. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/metadata/raw/x86_64-14.5.fwinfo +0 -0
  37. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/pyproject.toml +0 -0
  38. {pyobjc_framework_mediatoolbox-10.3.2 → pyobjc_framework_mediatoolbox-11.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  # This file is generated by objective.metadata
2
2
  #
3
- # Last update: Sat May 18 09:31:55 2024
3
+ # Last update: Tue Jun 11 10:14:32 2024
4
4
  #
5
5
  # flake8: noqa
6
6
 
@@ -1,37 +1,48 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: pyobjc-framework-MediaToolbox
3
- Version: 10.3.2
3
+ Version: 11.1
4
4
  Summary: Wrappers for the framework MediaToolbox on macOS
5
5
  Home-page: https://github.com/ronaldoussoren/pyobjc
6
6
  Author: Ronald Oussoren
7
7
  Author-email: pyobjc-dev@lists.sourceforge.net
8
- License: MIT License
8
+ License: MIT
9
9
  Keywords: PyObjC,MediaToolbox
10
10
  Platform: MacOS X (>=10.9)
11
11
  Classifier: Development Status :: 5 - Production/Stable
12
12
  Classifier: Environment :: Console
13
13
  Classifier: Environment :: MacOS X :: Cocoa
14
14
  Classifier: Intended Audience :: Developers
15
- Classifier: License :: OSI Approved :: MIT License
16
15
  Classifier: Natural Language :: English
17
16
  Classifier: Operating System :: MacOS :: MacOS X
18
17
  Classifier: Programming Language :: Python
19
18
  Classifier: Programming Language :: Python :: 3
20
19
  Classifier: Programming Language :: Python :: 3 :: Only
21
- Classifier: Programming Language :: Python :: 3.8
22
20
  Classifier: Programming Language :: Python :: 3.9
23
21
  Classifier: Programming Language :: Python :: 3.10
24
22
  Classifier: Programming Language :: Python :: 3.11
25
23
  Classifier: Programming Language :: Python :: 3.12
26
24
  Classifier: Programming Language :: Python :: 3.13
25
+ Classifier: Programming Language :: Python :: 3.14
27
26
  Classifier: Programming Language :: Python :: Implementation :: CPython
28
27
  Classifier: Programming Language :: Objective C
29
28
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
30
29
  Classifier: Topic :: Software Development :: User Interfaces
31
- Requires-Python: >=3.8
30
+ Requires-Python: >=3.9
32
31
  Description-Content-Type: text/x-rst; charset=UTF-8
33
- Requires-Dist: pyobjc-core>=10.3.2
34
- Requires-Dist: pyobjc-framework-Cocoa>=10.3.2
32
+ Requires-Dist: pyobjc-core>=11.1
33
+ Requires-Dist: pyobjc-framework-Cocoa>=11.1
34
+ Dynamic: author
35
+ Dynamic: author-email
36
+ Dynamic: classifier
37
+ Dynamic: description
38
+ Dynamic: description-content-type
39
+ Dynamic: home-page
40
+ Dynamic: keywords
41
+ Dynamic: license
42
+ Dynamic: platform
43
+ Dynamic: requires-dist
44
+ Dynamic: requires-python
45
+ Dynamic: summary
35
46
  Project-URL: Documentation, https://pyobjc.readthedocs.io/en/latest/
36
47
  Project-URL: Issue tracker, https://github.com/ronaldoussoren/pyobjc/issues
37
48
  Project-URL: Repository, https://github.com/ronaldoussoren/pyobjc
@@ -11,6 +11,7 @@ Lib/pyobjc_framework_MediaToolbox.egg-info/PKG-INFO
11
11
  Lib/pyobjc_framework_MediaToolbox.egg-info/SOURCES.txt
12
12
  Lib/pyobjc_framework_MediaToolbox.egg-info/dependency_links.txt
13
13
  Lib/pyobjc_framework_MediaToolbox.egg-info/not-zip-safe
14
+ Lib/pyobjc_framework_MediaToolbox.egg-info/pyobjc-build-info.txt
14
15
  Lib/pyobjc_framework_MediaToolbox.egg-info/requires.txt
15
16
  Lib/pyobjc_framework_MediaToolbox.egg-info/top_level.txt
16
17
  Modules/_MediaToolbox.m
@@ -26,7 +27,9 @@ metadata/MediaToolbox.fwinfo
26
27
  metadata/metadata.ini
27
28
  metadata/raw/arm64-12.3.fwinfo
28
29
  metadata/raw/arm64-14.5.fwinfo
30
+ metadata/raw/arm64-15.0.fwinfo
29
31
  metadata/raw/x86_64-10.13.fwinfo
30
32
  metadata/raw/x86_64-10.16.fwinfo
31
33
  metadata/raw/x86_64-12.3.fwinfo
32
- metadata/raw/x86_64-14.5.fwinfo
34
+ metadata/raw/x86_64-14.5.fwinfo
35
+ metadata/raw/x86_64-15.0.fwinfo
@@ -0,0 +1,3 @@
1
+ macOS 15.5 (24F74)
2
+ Apple clang version 17.0.0 (clang-1700.0.13.5)
3
+ SDK: macOS 15.5
@@ -0,0 +1,2 @@
1
+ pyobjc-core>=11.1
2
+ pyobjc-framework-Cocoa>=11.1
@@ -1,7 +1,7 @@
1
1
  (This is the MIT license, note that libffi-src is a separate product with its own license)
2
2
 
3
3
  Copyright 2002, 2003 - Bill Bumgarner, Ronald Oussoren, Steve Majewski, Lele Gaifax, et.al.
4
- Copyright 2003-2024 - Ronald Oussoren
4
+ Copyright 2003-2025 - Ronald Oussoren
5
5
 
6
6
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
7
7
 
@@ -1,6 +1,3 @@
1
- #ifndef PyObjC_GIL_DISABLED
2
- #define Py_LIMITED_API 0x03060000
3
- #endif
4
1
  #define PY_SSIZE_T_CLEAN
5
2
  #include "Python.h"
6
3
  #include "pyobjc-api.h"
@@ -391,21 +388,54 @@ static PyMethodDef mod_methods[] = {
391
388
  {NULL} /* Sentinel */
392
389
  };
393
390
 
391
+ static int mod_exec_module(PyObject* m)
392
+ {
393
+ return 0;
394
+ }
395
+
396
+ static struct PyModuleDef_Slot mod_slots[] = {
397
+ {
398
+ .slot = Py_mod_exec,
399
+ .value = (void*)mod_exec_module
400
+ },
401
+ #if PY_VERSION_HEX >= 0x030c0000
402
+ {
403
+ /* This extension does not use the CPython API other than initializing
404
+ * the module, hence is safe with subinterpreters and per-interpreter
405
+ * GILs
406
+ */
407
+ .slot = Py_mod_multiple_interpreters,
408
+ .value = Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED,
409
+ },
410
+ #endif
411
+ #if PY_VERSION_HEX >= 0x030d0000
412
+ {
413
+ /* The code in this extension should be safe to use without the GIL */
414
+ .slot = Py_mod_gil,
415
+ .value = Py_MOD_GIL_NOT_USED,
416
+ },
417
+ #endif
418
+ { /* Sentinel */
419
+ .slot = 0,
420
+ .value = 0
421
+ }
422
+ };
423
+
394
424
  static struct PyModuleDef mod_module = {
395
- PyModuleDef_HEAD_INIT, "_MediaToolbox", NULL, 0, mod_methods, NULL, NULL, NULL, NULL};
425
+ .m_base = PyModuleDef_HEAD_INIT,
426
+ .m_name = "_MediaToolbox",
427
+ .m_doc = NULL,
428
+ .m_size = 0,
429
+ .m_methods = mod_methods,
430
+ .m_slots = mod_slots,
431
+ .m_traverse = NULL,
432
+ .m_clear = NULL,
433
+ .m_free = NULL,
434
+ };
396
435
 
397
436
  PyObject* PyInit__MediaToolbox(void);
398
437
 
399
438
  PyObject* __attribute__((__visibility__("default"))) PyInit__MediaToolbox(void)
400
439
  {
401
- PyObject* m;
402
- m = PyModule_Create(&mod_module);
403
- if (!m) {
404
- return NULL;
405
- }
406
-
407
- if (PyObjC_ImportAPI(m) == -1)
408
- return NULL;
409
-
410
- return m;
440
+ return PyModuleDef_Init(&mod_module);
411
441
  }
@@ -83,7 +83,7 @@ struct pyobjc_api {
83
83
  PyObject* _Nullable (*_Nonnull unsupported_method_caller)(
84
84
  PyObject* _Nonnull, PyObject* _Nonnull, PyObject* _Nonnull const* _Nonnull,
85
85
  size_t);
86
- void (*_Nonnull err_python_to_objc_gil)(PyGILState_STATE* _Nonnull state);
86
+ void (*_Nonnull err_python_to_objc_gil)(PyGILState_STATE* _Nonnull state) __attribute__((__noreturn__));
87
87
  int (*_Nonnull simplify_sig)(const char* signature, char* buf, size_t buflen);
88
88
  void (*_Nonnull free_c_array)(int, Py_buffer*);
89
89
  int (*_Nonnull py_to_c_array)(BOOL, BOOL, const char* _Nonnull, PyObject* _Nonnull,
@@ -11,6 +11,12 @@
11
11
 
12
12
  NS_ASSUME_NONNULL_BEGIN
13
13
 
14
+ #ifdef USE_STATIC_ANALYZER
15
+ #define CLANG_SUPPRESS [[clang::suppress]]
16
+ #else
17
+ #define CLANG_SUPPRESS
18
+ #endif
19
+
14
20
  /*
15
21
  *
16
22
  * Start of compiler definitions
@@ -153,10 +159,6 @@ extern PyObject* _Nullable PyObject_VectorcallMethod(
153
159
 
154
160
  extern int PyObjC_Cmp(PyObject* o1, PyObject* o2, int* result);
155
161
 
156
- extern PyObject* _Nullable PyObjCBytes_InternFromString(const char* v);
157
- extern PyObject* _Nullable PyObjCBytes_InternFromStringAndSize(const char* v,
158
- Py_ssize_t l);
159
-
160
162
  /*
161
163
  * A micro optimization: when using Python 3.3 or later it
162
164
  * is possible to access a 'char*' with an ASCII representation
@@ -177,7 +179,7 @@ extern const char* _Nullable PyObjC_Unicode_Fast_Bytes(PyObject* object);
177
179
 
178
180
  static inline PyObject* _Nullable* _Nonnull PyTuple_ITEMS(PyObject* tuple)
179
181
  {
180
- return &PyTuple_GET_ITEM(tuple, 0);
182
+ return &PyTuple_GET_ITEM(tuple, 0); // LCOV_BR_EXCL_LINE
181
183
  }
182
184
 
183
185
  /* This is a crude hack to disable a otherwise useful warning in the context of
@@ -196,7 +198,7 @@ _PyObjCTuple_SetItem(PyObject* tuple, Py_ssize_t idx, PyObject* _Nullable value)
196
198
  static inline PyObject*
197
199
  _PyObjCTuple_GetItem(PyObject* tuple, Py_ssize_t idx)
198
200
  {
199
- return PyTuple_GET_ITEM(tuple, idx);
201
+ return PyTuple_GET_ITEM(tuple, idx); // LCOV_BR_EXCL_LINE
200
202
  }
201
203
  #undef PyTuple_GET_ITEM
202
204
  #define PyTuple_GET_ITEM(a, b) _PyObjCTuple_GetItem(a, b)
@@ -238,7 +240,173 @@ _PyObjCTuple_GetItem(PyObject* tuple, Py_ssize_t idx)
238
240
  PyGILState_Release(_GILState); \
239
241
  } while (0)
240
242
 
241
- extern PyObject* _Nullable PyObjC_get_tp_dict(PyTypeObject* _Nonnull tp);
243
+ #if PY_VERSION_HEX < 0x030a0000
244
+
245
+ static inline PyObject* Py_NewRef(PyObject* o)
246
+ {
247
+ Py_INCREF(o);
248
+ return o;
249
+ }
250
+
251
+ static inline PyObject* Py_XNewRef(PyObject* o)
252
+ {
253
+ Py_XINCREF(o);
254
+ return o;
255
+ }
256
+
257
+ #endif /* PY_VERSION_HEX < 0x030a0000 */
258
+
259
+ #if PY_VERSION_HEX < 0x030d0000
260
+ #define Py_BEGIN_CRITICAL_SECTION(value) { (void)(value);
261
+ #define Py_END_CRITICAL_SECTION() }
262
+ #define Py_EXIT_CRITICAL_SECTION() ((void)0)
263
+
264
+ #define Py_BEGIN_CRITICAL_SECTION2(value1, value2) { (void)(value1); (void)(value2);
265
+ #define Py_END_CRITICAL_SECTION2() }
266
+ #define Py_EXIT_CRITICAL_SECTION2() ((void)0)
267
+
268
+ #define PyObjC_ATOMIC
269
+
270
+ #else
271
+
272
+ #ifdef Py_GIL_DISABLED
273
+ #define Py_EXIT_CRITICAL_SECTION() PyCriticalSection_End(&_py_cs)
274
+ #define Py_EXIT_CRITICAL_SECTION2() PyCriticalSection2_End(&_py_cs2)
275
+ #define PyObjC_ATOMIC _Atomic
276
+ #else
277
+ #define Py_EXIT_CRITICAL_SECTION() ((void)0)
278
+ #define Py_EXIT_CRITICAL_SECTION2() ((void)0)
279
+ #define PyObjC_ATOMIC
280
+ #endif
281
+
282
+ #endif
283
+
284
+ #if PY_VERSION_HEX < 0x030d0000
285
+ static inline int PyDict_GetItemRef(PyObject *p, PyObject *key, PyObject * _Nonnull* _Nullable result)
286
+ {
287
+ *result = PyDict_GetItemWithError(p, key);
288
+ if (*result == NULL) {
289
+ if (PyErr_Occurred()) {
290
+ return -1;
291
+ } else {
292
+ return 0;
293
+ }
294
+ } else {
295
+ Py_INCREF(*result);
296
+ return 1;
297
+ }
298
+ }
299
+
300
+ static inline PyObject* _Nullable PyList_GetItemRef(PyObject* l, Py_ssize_t i)
301
+ {
302
+ PyObject* result = PyList_GetItem(l, i);
303
+ Py_XINCREF(result);
304
+ return result;
305
+ }
306
+ #endif
307
+
308
+ #if PY_VERSION_HEX < 0x030c0000
309
+ static inline PyObject* PyType_GetDict(PyTypeObject* type)
310
+ {
311
+ PyObject* result = type->tp_dict;
312
+ Py_INCREF(result);
313
+ return result;
314
+ }
315
+ #endif
316
+
317
+ #if PY_VERSION_HEX >= 0x030c0000 && PY_VERSION_HEX < 0x030e0000
318
+ /*
319
+ * These are available in 3.14 and above, the definitions below
320
+ * mirror the private implementation in 3.13.
321
+ */
322
+ static inline int PyUnstable_Object_IsUniquelyReferenced(PyObject* ob)
323
+ {
324
+ #ifdef Py_GIL_DISABLED
325
+ return (_Py_IsOwnedByCurrentThread(ob) &&
326
+ _Py_atomic_load_uint32_relaxed(&ob->ob_ref_local) == 1 &&
327
+ _Py_atomic_load_ssize_relaxed(&ob->ob_ref_shared) == 0);
328
+ #else
329
+ return Py_REFCNT(ob) == 1;
330
+ #endif
331
+ }
332
+
333
+ static inline void
334
+ PyUnstable_EnableTryIncRef(PyObject* op __attribute__((__unused__)))
335
+ {
336
+ #ifdef Py_GIL_DISABLED
337
+ for (;;) {
338
+ Py_ssize_t shared = _Py_atomic_load_ssize_relaxed(&op->ob_ref_shared);
339
+ if ((shared & _Py_REF_SHARED_FLAG_MASK) != 0) {
340
+ // Nothing to do if it's in WEAKREFS, QUEUED, or MERGED states.
341
+ return;
342
+ }
343
+ if (_Py_atomic_compare_exchange_ssize(
344
+ &op->ob_ref_shared, &shared, shared | _Py_REF_MAYBE_WEAKREF)) {
345
+ return;
346
+ }
347
+ }
348
+ #endif
349
+ }
350
+
351
+ #ifdef Py_GIL_DISABLED
352
+ static inline int
353
+ _Py_TryIncrefFast(PyObject *op) {
354
+ uint32_t local = _Py_atomic_load_uint32_relaxed(&op->ob_ref_local);
355
+ local += 1;
356
+ if (local == 0) {
357
+ // immortal
358
+ return 1;
359
+ }
360
+ if (_Py_IsOwnedByCurrentThread(op)) {
361
+ _Py_INCREF_STAT_INC();
362
+ _Py_atomic_store_uint32_relaxed(&op->ob_ref_local, local);
363
+ #ifdef Py_REF_DEBUG
364
+ _Py_IncRefTotal(_PyThreadState_GET());
365
+ #endif
366
+ return 1;
367
+ }
368
+ return 0;
369
+ }
370
+
371
+ static inline int
372
+ _Py_TryIncRefShared(PyObject *op)
373
+ {
374
+ Py_ssize_t shared = _Py_atomic_load_ssize_relaxed(&op->ob_ref_shared);
375
+ for (;;) {
376
+ // If the shared refcount is zero and the object is either merged
377
+ // or may not have weak references, then we cannot incref it.
378
+ if (shared == 0 || shared == _Py_REF_MERGED) {
379
+ return 0;
380
+ }
381
+
382
+ if (_Py_atomic_compare_exchange_ssize(
383
+ &op->ob_ref_shared,
384
+ &shared,
385
+ shared + (1 << _Py_REF_SHARED_SHIFT))) {
386
+ #ifdef Py_REF_DEBUG
387
+ _Py_IncRefTotal(_PyThreadState_GET());
388
+ #endif
389
+ _Py_INCREF_STAT_INC();
390
+ return 1;
391
+ }
392
+ }
393
+ }
394
+ #endif
395
+
396
+ static inline int
397
+ PyUnstable_TryIncRef(PyObject *op __attribute__((__unused__)))
398
+ {
399
+ #ifdef Py_GIL_DISABLED
400
+ return _Py_TryIncrefFast(op) || _Py_TryIncRefShared(op);
401
+ #else
402
+ if (Py_REFCNT(op) > 0) {
403
+ Py_INCREF(op);
404
+ return 1;
405
+ }
406
+ return 0;
407
+ #endif
408
+ }
409
+ #endif
242
410
 
243
411
  NS_ASSUME_NONNULL_END
244
412
 
@@ -1,37 +1,48 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: pyobjc-framework-MediaToolbox
3
- Version: 10.3.2
3
+ Version: 11.1
4
4
  Summary: Wrappers for the framework MediaToolbox on macOS
5
5
  Home-page: https://github.com/ronaldoussoren/pyobjc
6
6
  Author: Ronald Oussoren
7
7
  Author-email: pyobjc-dev@lists.sourceforge.net
8
- License: MIT License
8
+ License: MIT
9
9
  Keywords: PyObjC,MediaToolbox
10
10
  Platform: MacOS X (>=10.9)
11
11
  Classifier: Development Status :: 5 - Production/Stable
12
12
  Classifier: Environment :: Console
13
13
  Classifier: Environment :: MacOS X :: Cocoa
14
14
  Classifier: Intended Audience :: Developers
15
- Classifier: License :: OSI Approved :: MIT License
16
15
  Classifier: Natural Language :: English
17
16
  Classifier: Operating System :: MacOS :: MacOS X
18
17
  Classifier: Programming Language :: Python
19
18
  Classifier: Programming Language :: Python :: 3
20
19
  Classifier: Programming Language :: Python :: 3 :: Only
21
- Classifier: Programming Language :: Python :: 3.8
22
20
  Classifier: Programming Language :: Python :: 3.9
23
21
  Classifier: Programming Language :: Python :: 3.10
24
22
  Classifier: Programming Language :: Python :: 3.11
25
23
  Classifier: Programming Language :: Python :: 3.12
26
24
  Classifier: Programming Language :: Python :: 3.13
25
+ Classifier: Programming Language :: Python :: 3.14
27
26
  Classifier: Programming Language :: Python :: Implementation :: CPython
28
27
  Classifier: Programming Language :: Objective C
29
28
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
30
29
  Classifier: Topic :: Software Development :: User Interfaces
31
- Requires-Python: >=3.8
30
+ Requires-Python: >=3.9
32
31
  Description-Content-Type: text/x-rst; charset=UTF-8
33
- Requires-Dist: pyobjc-core>=10.3.2
34
- Requires-Dist: pyobjc-framework-Cocoa>=10.3.2
32
+ Requires-Dist: pyobjc-core>=11.1
33
+ Requires-Dist: pyobjc-framework-Cocoa>=11.1
34
+ Dynamic: author
35
+ Dynamic: author-email
36
+ Dynamic: classifier
37
+ Dynamic: description
38
+ Dynamic: description-content-type
39
+ Dynamic: home-page
40
+ Dynamic: keywords
41
+ Dynamic: license
42
+ Dynamic: platform
43
+ Dynamic: requires-dist
44
+ Dynamic: requires-python
45
+ Dynamic: summary
35
46
 
36
47
 
37
48
  Wrappers for the "MediaToolbox" framework on macOS.
@@ -0,0 +1 @@
1
+ """testsuite"""
@@ -0,0 +1,165 @@
1
+ // GENERATED FILE DO NOT EDIT
2
+ //
3
+ // This file was generated by objective.metadata
4
+ // Last update: Tue Jun 11 10:14:32 2024
5
+ {
6
+ "arch": "arm64",
7
+ "definitions": {
8
+ "aliases": {},
9
+ "called_definitions": {},
10
+ "cftypes": {},
11
+ "classes": {},
12
+ "enum": {
13
+ "kMTAudioProcessingTapCallbacksVersion_0": 0,
14
+ "kMTAudioProcessingTapCreationFlag_PostEffects": 2,
15
+ "kMTAudioProcessingTapCreationFlag_PreEffects": 1,
16
+ "kMTAudioProcessingTapFlag_EndOfStream": 512,
17
+ "kMTAudioProcessingTapFlag_StartOfStream": 256
18
+ },
19
+ "enum_type": {},
20
+ "expressions": {},
21
+ "externs": {},
22
+ "formal_protocols": {},
23
+ "func_macros": {},
24
+ "functions": {
25
+ "MTAudioProcessingTapCreate": {
26
+ "args": [
27
+ {
28
+ "name": "allocator",
29
+ "typestr": "^{__CFAllocator=}"
30
+ },
31
+ {
32
+ "name": "callbacks",
33
+ "typestr": "^{MTAudioProcessingTapCallbacks=i^v^?^?^?^?^?}"
34
+ },
35
+ {
36
+ "name": "flags",
37
+ "typestr": "I"
38
+ },
39
+ {
40
+ "name": "tapOut",
41
+ "typestr": "^^{opaqueMTAudioProcessingTap=}"
42
+ }
43
+ ],
44
+ "retval": {
45
+ "already_cfretained": true,
46
+ "typestr": "i"
47
+ }
48
+ },
49
+ "MTAudioProcessingTapGetSourceAudio": {
50
+ "args": [
51
+ {
52
+ "name": "tap",
53
+ "typestr": "^{opaqueMTAudioProcessingTap=}"
54
+ },
55
+ {
56
+ "name": "numberFrames",
57
+ "typestr": "q"
58
+ },
59
+ {
60
+ "name": "bufferListInOut",
61
+ "typestr": "^{AudioBufferList=I[1{AudioBuffer=II^v}]}"
62
+ },
63
+ {
64
+ "name": "flagsOut",
65
+ "typestr": "^I"
66
+ },
67
+ {
68
+ "name": "timeRangeOut",
69
+ "typestr": "^{CMTimeRange={CMTime=qiIq}{CMTime=qiIq}}"
70
+ },
71
+ {
72
+ "name": "numberFramesOut",
73
+ "typestr": "^q"
74
+ }
75
+ ],
76
+ "retval": {
77
+ "typestr": "i"
78
+ }
79
+ },
80
+ "MTAudioProcessingTapGetStorage": {
81
+ "args": [
82
+ {
83
+ "name": "tap",
84
+ "typestr": "^{opaqueMTAudioProcessingTap=}"
85
+ }
86
+ ],
87
+ "retval": {
88
+ "typestr": "^v"
89
+ }
90
+ },
91
+ "MTAudioProcessingTapGetTypeID": {
92
+ "args": [
93
+ {
94
+ "name": null,
95
+ "typestr": "v"
96
+ }
97
+ ],
98
+ "retval": {
99
+ "typestr": "Q"
100
+ }
101
+ },
102
+ "MTCopyLocalizedNameForMediaSubType": {
103
+ "args": [
104
+ {
105
+ "name": "mediaType",
106
+ "typestr": "I"
107
+ },
108
+ {
109
+ "name": "mediaSubType",
110
+ "typestr": "I"
111
+ }
112
+ ],
113
+ "retval": {
114
+ "already_cfretained": true,
115
+ "typestr": "^{__CFString=}"
116
+ }
117
+ },
118
+ "MTCopyLocalizedNameForMediaType": {
119
+ "args": [
120
+ {
121
+ "name": "mediaType",
122
+ "typestr": "I"
123
+ }
124
+ ],
125
+ "retval": {
126
+ "already_cfretained": true,
127
+ "typestr": "^{__CFString=}"
128
+ }
129
+ },
130
+ "MTRegisterProfessionalVideoWorkflowFormatReaders": {
131
+ "args": [
132
+ {
133
+ "name": null,
134
+ "typestr": "v"
135
+ }
136
+ ],
137
+ "retval": {
138
+ "typestr": "v"
139
+ }
140
+ }
141
+ },
142
+ "informal_protocols": {},
143
+ "literals": {},
144
+ "structs": {},
145
+ "typedefs": {
146
+ "MTAudioProcessingTapCallbacks": "struct MTAudioProcessingTapCallbacks",
147
+ "MTAudioProcessingTapCreationFlags": "uint32_t",
148
+ "MTAudioProcessingTapFinalizeCallback": "void (*)(MTAudioProcessingTapRef _Nonnull)",
149
+ "MTAudioProcessingTapFlags": "uint32_t",
150
+ "MTAudioProcessingTapInitCallback": "void (*)(MTAudioProcessingTapRef _Nonnull, void * _Nullable, void * _Nullable * _Nonnull)",
151
+ "MTAudioProcessingTapPrepareCallback": "void (*)(MTAudioProcessingTapRef _Nonnull, CMItemCount, const AudioStreamBasicDescription * _Nonnull)",
152
+ "MTAudioProcessingTapProcessCallback": "void (*)(MTAudioProcessingTapRef _Nonnull, CMItemCount, MTAudioProcessingTapFlags, AudioBufferList * _Nonnull, CMItemCount * _Nonnull, MTAudioProcessingTapFlags * _Nonnull)",
153
+ "MTAudioProcessingTapRef": "const struct opaqueMTAudioProcessingTap *",
154
+ "MTAudioProcessingTapUnprepareCallback": "void (*)(MTAudioProcessingTapRef _Nonnull)"
155
+ }
156
+ },
157
+ "framework": "MediaToolbox",
158
+ "headers": [
159
+ "MTAudioProcessingTap.h",
160
+ "MTFormatNames.h",
161
+ "MTProfessionalVideoWorkflow.h"
162
+ ],
163
+ "release": "10.16",
164
+ "sdk": "/Users/ronald/Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.0.sdk"
165
+ }
@@ -0,0 +1,165 @@
1
+ // GENERATED FILE DO NOT EDIT
2
+ //
3
+ // This file was generated by objective.metadata
4
+ // Last update: Tue Jun 11 10:14:29 2024
5
+ {
6
+ "arch": "x86_64",
7
+ "definitions": {
8
+ "aliases": {},
9
+ "called_definitions": {},
10
+ "cftypes": {},
11
+ "classes": {},
12
+ "enum": {
13
+ "kMTAudioProcessingTapCallbacksVersion_0": 0,
14
+ "kMTAudioProcessingTapCreationFlag_PostEffects": 2,
15
+ "kMTAudioProcessingTapCreationFlag_PreEffects": 1,
16
+ "kMTAudioProcessingTapFlag_EndOfStream": 512,
17
+ "kMTAudioProcessingTapFlag_StartOfStream": 256
18
+ },
19
+ "enum_type": {},
20
+ "expressions": {},
21
+ "externs": {},
22
+ "formal_protocols": {},
23
+ "func_macros": {},
24
+ "functions": {
25
+ "MTAudioProcessingTapCreate": {
26
+ "args": [
27
+ {
28
+ "name": "allocator",
29
+ "typestr": "^{__CFAllocator=}"
30
+ },
31
+ {
32
+ "name": "callbacks",
33
+ "typestr": "^{MTAudioProcessingTapCallbacks=i^v^?^?^?^?^?}"
34
+ },
35
+ {
36
+ "name": "flags",
37
+ "typestr": "I"
38
+ },
39
+ {
40
+ "name": "tapOut",
41
+ "typestr": "^^{opaqueMTAudioProcessingTap=}"
42
+ }
43
+ ],
44
+ "retval": {
45
+ "already_cfretained": true,
46
+ "typestr": "i"
47
+ }
48
+ },
49
+ "MTAudioProcessingTapGetSourceAudio": {
50
+ "args": [
51
+ {
52
+ "name": "tap",
53
+ "typestr": "^{opaqueMTAudioProcessingTap=}"
54
+ },
55
+ {
56
+ "name": "numberFrames",
57
+ "typestr": "q"
58
+ },
59
+ {
60
+ "name": "bufferListInOut",
61
+ "typestr": "^{AudioBufferList=I[1{AudioBuffer=II^v}]}"
62
+ },
63
+ {
64
+ "name": "flagsOut",
65
+ "typestr": "^I"
66
+ },
67
+ {
68
+ "name": "timeRangeOut",
69
+ "typestr": "^{CMTimeRange={CMTime=qiIq}{CMTime=qiIq}}"
70
+ },
71
+ {
72
+ "name": "numberFramesOut",
73
+ "typestr": "^q"
74
+ }
75
+ ],
76
+ "retval": {
77
+ "typestr": "i"
78
+ }
79
+ },
80
+ "MTAudioProcessingTapGetStorage": {
81
+ "args": [
82
+ {
83
+ "name": "tap",
84
+ "typestr": "^{opaqueMTAudioProcessingTap=}"
85
+ }
86
+ ],
87
+ "retval": {
88
+ "typestr": "^v"
89
+ }
90
+ },
91
+ "MTAudioProcessingTapGetTypeID": {
92
+ "args": [
93
+ {
94
+ "name": null,
95
+ "typestr": "v"
96
+ }
97
+ ],
98
+ "retval": {
99
+ "typestr": "Q"
100
+ }
101
+ },
102
+ "MTCopyLocalizedNameForMediaSubType": {
103
+ "args": [
104
+ {
105
+ "name": "mediaType",
106
+ "typestr": "I"
107
+ },
108
+ {
109
+ "name": "mediaSubType",
110
+ "typestr": "I"
111
+ }
112
+ ],
113
+ "retval": {
114
+ "already_cfretained": true,
115
+ "typestr": "^{__CFString=}"
116
+ }
117
+ },
118
+ "MTCopyLocalizedNameForMediaType": {
119
+ "args": [
120
+ {
121
+ "name": "mediaType",
122
+ "typestr": "I"
123
+ }
124
+ ],
125
+ "retval": {
126
+ "already_cfretained": true,
127
+ "typestr": "^{__CFString=}"
128
+ }
129
+ },
130
+ "MTRegisterProfessionalVideoWorkflowFormatReaders": {
131
+ "args": [
132
+ {
133
+ "name": null,
134
+ "typestr": "v"
135
+ }
136
+ ],
137
+ "retval": {
138
+ "typestr": "v"
139
+ }
140
+ }
141
+ },
142
+ "informal_protocols": {},
143
+ "literals": {},
144
+ "structs": {},
145
+ "typedefs": {
146
+ "MTAudioProcessingTapCallbacks": "struct MTAudioProcessingTapCallbacks",
147
+ "MTAudioProcessingTapCreationFlags": "uint32_t",
148
+ "MTAudioProcessingTapFinalizeCallback": "void (*)(MTAudioProcessingTapRef _Nonnull)",
149
+ "MTAudioProcessingTapFlags": "uint32_t",
150
+ "MTAudioProcessingTapInitCallback": "void (*)(MTAudioProcessingTapRef _Nonnull, void * _Nullable, void * _Nullable * _Nonnull)",
151
+ "MTAudioProcessingTapPrepareCallback": "void (*)(MTAudioProcessingTapRef _Nonnull, CMItemCount, const AudioStreamBasicDescription * _Nonnull)",
152
+ "MTAudioProcessingTapProcessCallback": "void (*)(MTAudioProcessingTapRef _Nonnull, CMItemCount, MTAudioProcessingTapFlags, AudioBufferList * _Nonnull, CMItemCount * _Nonnull, MTAudioProcessingTapFlags * _Nonnull)",
153
+ "MTAudioProcessingTapRef": "const struct opaqueMTAudioProcessingTap *",
154
+ "MTAudioProcessingTapUnprepareCallback": "void (*)(MTAudioProcessingTapRef _Nonnull)"
155
+ }
156
+ },
157
+ "framework": "MediaToolbox",
158
+ "headers": [
159
+ "MTAudioProcessingTap.h",
160
+ "MTFormatNames.h",
161
+ "MTProfessionalVideoWorkflow.h"
162
+ ],
163
+ "release": "10.16",
164
+ "sdk": "/Users/ronald/Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.0.sdk"
165
+ }
@@ -11,15 +11,15 @@ To change this file:
11
11
 
12
12
  __all__ = ("setup", "Extension", "Command")
13
13
 
14
+ import importlib
14
15
  import os
15
- import pkg_resources
16
16
  import plistlib
17
17
  import re
18
18
  import shlex
19
- import shutil
20
19
  import subprocess
21
20
  import sys
22
21
  import tempfile
22
+ import textwrap
23
23
  import time
24
24
  import unittest
25
25
  from fnmatch import fnmatch
@@ -60,6 +60,7 @@ REPO_NAME = "pyobjc"
60
60
  class oc_egg_info(egg_info.egg_info):
61
61
  def run(self):
62
62
  egg_info.egg_info.run(self)
63
+ self.write_build_info()
63
64
 
64
65
  path = os.path.join(self.egg_info, "PKG-INFO")
65
66
  with open(path) as fp:
@@ -84,6 +85,45 @@ class oc_egg_info(egg_info.egg_info):
84
85
  fp.write(middle)
85
86
  fp.write(last)
86
87
 
88
+ def write_build_info(self):
89
+ macos_version = subprocess.check_output(
90
+ ["sw_vers", "-productversion"], text=True
91
+ ).strip()
92
+ macos_build = subprocess.check_output(
93
+ ["sw_vers", "-buildversion"], text=True
94
+ ).strip()
95
+ clang_version = (
96
+ subprocess.check_output(["clang", "--version"], text=True)
97
+ .splitlines()[0]
98
+ .strip()
99
+ )
100
+
101
+ sdk_root = get_sdk()
102
+ if sdk_root is None:
103
+ sdk_root = subprocess.check_output(
104
+ ["xcrun", "-sdk", "macosx", "--show-sdk-path"], text=True
105
+ ).strip()
106
+ sdk_info = os.path.join(sdk_root, "SDKSettings.plist")
107
+ if os.path.exists(sdk_info):
108
+ pl = plistlib.load(open(sdk_info, "rb"))
109
+ sdk_version = pl["DisplayName"]
110
+ else:
111
+ sdk_version = os.path.basename(sdk_root)
112
+
113
+ build_info = textwrap.dedent(
114
+ f"""\
115
+ macOS {macos_version} ({macos_build})
116
+ {clang_version}
117
+ SDK: {sdk_version}
118
+ """
119
+ )
120
+
121
+ self.write_file(
122
+ "pyobjc-build-info.txt",
123
+ os.path.join(self.egg_info, "pyobjc-build-info.txt"),
124
+ build_info,
125
+ )
126
+
87
127
 
88
128
  class oc_test(Command):
89
129
  description = "run test suite"
@@ -97,10 +137,6 @@ class oc_test(Command):
97
137
  self.verbosity = int(self.verbosity)
98
138
 
99
139
  def cleanup_environment(self):
100
- from pkg_resources import add_activation_listener
101
-
102
- add_activation_listener(lambda dist: dist.activate())
103
-
104
140
  ei_cmd = self.get_finalized_command("egg_info")
105
141
  egg_name = ei_cmd.egg_name.replace("-", "_")
106
142
 
@@ -114,12 +150,9 @@ class oc_test(Command):
114
150
  log.info(f"removing installed {dirname!r} from sys.path before testing")
115
151
  sys.path.remove(dirname)
116
152
 
117
- pkg_resources.working_set.__init__()
153
+ importlib.invalidate_caches()
118
154
 
119
155
  def add_project_to_sys_path(self):
120
- from pkg_resources import normalize_path, add_activation_listener
121
- from pkg_resources import working_set, require
122
-
123
156
  self.reinitialize_command("egg_info")
124
157
  self.run_command("egg_info")
125
158
  self.reinitialize_command("build_ext", inplace=1)
@@ -132,20 +165,16 @@ class oc_test(Command):
132
165
  del sys.modules["PyObjCTools"]
133
166
 
134
167
  ei_cmd = self.get_finalized_command("egg_info")
135
- sys.path.insert(0, normalize_path(ei_cmd.egg_base))
168
+ sys.path.insert(0, os.path.abspath(ei_cmd.egg_base))
136
169
  sys.path.insert(1, os.path.dirname(__file__))
137
170
 
138
- add_activation_listener(lambda dist: dist.activate())
139
- working_set.__init__()
140
- require(f"{ei_cmd.egg_name}=={ei_cmd.egg_version}")
171
+ importlib.invalidate_caches()
141
172
 
142
173
  def remove_from_sys_path(self):
143
- from pkg_resources import working_set
144
-
145
174
  sys.path[:] = self.__old_path
146
175
  sys.modules.clear()
147
176
  sys.modules.update(self.__old_modules)
148
- working_set.__init__()
177
+ importlib.invalidate_caches()
149
178
 
150
179
  def run(self):
151
180
  self.cleanup_environment()
@@ -154,7 +183,6 @@ class oc_test(Command):
154
183
  import warnings
155
184
 
156
185
  warnings.simplefilter("error")
157
- warnings.filterwarnings("ignore", message=".*GIL.*", category=RuntimeWarning)
158
186
 
159
187
  try:
160
188
  time_before = time.time()
@@ -195,18 +223,17 @@ Development Status :: 5 - Production/Stable
195
223
  Environment :: Console
196
224
  Environment :: MacOS X :: Cocoa
197
225
  Intended Audience :: Developers
198
- License :: OSI Approved :: MIT License
199
226
  Natural Language :: English
200
227
  Operating System :: MacOS :: MacOS X
201
228
  Programming Language :: Python
202
229
  Programming Language :: Python :: 3
203
230
  Programming Language :: Python :: 3 :: Only
204
- Programming Language :: Python :: 3.8
205
231
  Programming Language :: Python :: 3.9
206
232
  Programming Language :: Python :: 3.10
207
233
  Programming Language :: Python :: 3.11
208
234
  Programming Language :: Python :: 3.12
209
235
  Programming Language :: Python :: 3.13
236
+ Programming Language :: Python :: 3.14
210
237
  Programming Language :: Python :: Implementation :: CPython
211
238
  Programming Language :: Objective C
212
239
  Topic :: Software Development :: Libraries :: Python Modules
@@ -410,28 +437,7 @@ class pyobjc_build_ext(build_ext.build_ext):
410
437
  # in 2.3 and later the headers are in the egg,
411
438
  # before that we ship a copy.
412
439
  if os.path.exists("Modules") and not os.path.isfile("Modules/pyobjc-api.h"):
413
- (dist,) = pkg_resources.require("pyobjc-core")
414
-
415
- include_root = os.path.join(self.build_temp, "pyobjc-include")
416
- if os.path.exists(include_root):
417
- shutil.rmtree(include_root)
418
-
419
- os.makedirs(include_root)
420
- if dist.has_metadata("include"):
421
- for fn in dist.metadata_listdir("include"):
422
- data = dist.get_metadata(f"include/{fn}")
423
- fp = open(os.path.join(include_root, fn), "w")
424
- try:
425
- fp.write(data)
426
- finally:
427
- fp.close()
428
-
429
- else:
430
- raise SystemExit("pyobjc-core egg-info does not include header files")
431
-
432
- for e in self.extensions:
433
- if include_root not in e.include_dirs:
434
- e.include_dirs.append(include_root)
440
+ raise DistutilsError("pyobjc-api.h not included")
435
441
 
436
442
  # Run the actual build
437
443
  build_ext.build_ext.run(self)
@@ -512,8 +518,6 @@ def Extension(*args, **kwds):
512
518
 
513
519
  if get_config_var("Py_GIL_DISABLED"):
514
520
  cflags.append("-DPyObjC_GIL_DISABLED")
515
- if "py_limited_api" in kwds:
516
- del kwds["py_limited_api"]
517
521
 
518
522
  if "extra_compile_args" in kwds:
519
523
  kwds["extra_compile_args"] = kwds["extra_compile_args"] + cflags
@@ -532,8 +536,15 @@ def _sort_key(version):
532
536
  return tuple(int(x) for x in version.split("."))
533
537
 
534
538
 
535
- def setup(min_os_level=None, max_os_level=None, cmdclass=None, **kwds):
539
+ def setup(
540
+ min_os_level=None,
541
+ max_os_level=None,
542
+ cmdclass=None,
543
+ options={}, # noqa: M511, B006
544
+ **kwds,
545
+ ):
536
546
  k = kwds.copy()
547
+ options = options.copy()
537
548
 
538
549
  os_level = get_sdk_level()
539
550
  if os_level is None:
@@ -605,11 +616,7 @@ def setup(min_os_level=None, max_os_level=None, cmdclass=None, **kwds):
605
616
 
606
617
  if "ext_modules" not in k:
607
618
  # No extension modules, can build universal wheel
608
- k["options"] = {"bdist_wheel": {"universal": 1}}
609
-
610
- if "options" in k and "bdist_wheel" in k["options"]:
611
- if get_config_var("Py_GIL_DISABLED"):
612
- del k["options"]["bdist_wheel"]
619
+ options.update({"bdist_wheel": {"universal": 1}})
613
620
 
614
621
  plat_name = "MacOS X"
615
622
  plat_versions = []
@@ -651,6 +658,12 @@ def setup(min_os_level=None, max_os_level=None, cmdclass=None, **kwds):
651
658
  )
652
659
  k["long_description_content_type"] = "text/x-rst; charset=UTF-8"
653
660
 
661
+ if "bdist_wheel" in options:
662
+ # Python 3.13 does not support the limited ABI for C extensions
663
+ # when using a free threaded build.
664
+ if get_config_var("Py_GIL_DISABLED"):
665
+ del options["bdist_wheel"]
666
+
654
667
  _setup(
655
668
  cmdclass=cmdclass,
656
669
  author="Ronald Oussoren",
@@ -660,12 +673,12 @@ def setup(min_os_level=None, max_os_level=None, cmdclass=None, **kwds):
660
673
  package_dir={"": "Lib", "PyObjCTest": "PyObjCTest"},
661
674
  dependency_links=[],
662
675
  package_data={"": ["*.bridgesupport"]},
663
- test_suite="PyObjCTest",
664
676
  zip_safe=False,
665
- license="MIT License",
677
+ license="MIT",
666
678
  classifiers=CLASSIFIERS,
667
- python_requires=">=3.8",
679
+ python_requires=">=3.9",
668
680
  keywords=["PyObjC"] + [p for p in k["packages"] if p not in ("PyObjCTools",)],
681
+ options=options,
669
682
  **k,
670
683
  )
671
684
 
@@ -688,22 +701,28 @@ def importExternalTestCases(pathPattern="test_*.py", root=".", package=None):
688
701
  """
689
702
  Import all unittests in the PyObjC tree starting at 'root'
690
703
  """
704
+
691
705
  testFiles = recursiveGlob(root, pathPattern)
692
706
  testModules = [x[len(root) + 1 : -3].replace("/", ".") for x in testFiles]
693
707
  if package is not None:
694
708
  testModules = [(package + "." + m) for m in testModules]
709
+
695
710
  suites = []
711
+
696
712
  for modName in testModules:
697
713
  try:
698
714
  module = __import__(modName)
699
715
  except ImportError as msg:
700
716
  print(f"SKIP {modName}: {msg}")
701
717
  continue
718
+
702
719
  if "." in modName:
703
720
  for elem in modName.split(".")[1:]:
704
721
  module = getattr(module, elem)
722
+
705
723
  s = unittest.defaultTestLoader.loadTestsFromModule(module)
706
724
  suites.append(s)
725
+
707
726
  return unittest.TestSuite(suites)
708
727
 
709
728
 
@@ -714,4 +733,5 @@ def makeTestSuite():
714
733
  plain_suite = importExternalTestCases(
715
734
  "test_*.py", os.path.join(gTopdir, "PyObjCTest"), package="PyObjCTest"
716
735
  )
736
+
717
737
  return plain_suite
@@ -15,7 +15,7 @@ sys.path.insert(0, os.path.dirname(__file__))
15
15
 
16
16
  from pyobjc_setup import Extension, setup # noqa: E402
17
17
 
18
- VERSION = "10.3.2"
18
+ VERSION = "11.1"
19
19
 
20
20
  setup(
21
21
  name="pyobjc-framework-MediaToolbox",
@@ -27,11 +27,9 @@ setup(
27
27
  "MediaToolbox._MediaToolbox",
28
28
  ["Modules/_MediaToolbox.m"],
29
29
  extra_link_args=["-framework", "MediaToolbox"],
30
- py_limited_api=True,
31
30
  )
32
31
  ],
33
32
  version=VERSION,
34
33
  install_requires=["pyobjc-core>=" + VERSION, "pyobjc-framework-Cocoa>=" + VERSION],
35
34
  long_description=__doc__,
36
- options={"bdist_wheel": {"py_limited_api": "cp36"}},
37
35
  )
@@ -1,2 +0,0 @@
1
- pyobjc-core>=10.3.2
2
- pyobjc-framework-Cocoa>=10.3.2
@@ -1 +0,0 @@
1
- """ testsuite """