pyobjc-framework-libxpc 12.2.1__tar.gz → 13.0__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 (35) hide show
  1. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/Lib/pyobjc_framework_libxpc.egg-info/PKG-INFO +5 -5
  2. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/Lib/pyobjc_framework_libxpc.egg-info/SOURCES.txt +2 -2
  3. pyobjc_framework_libxpc-13.0/Lib/pyobjc_framework_libxpc.egg-info/pyobjc-build-info.txt +3 -0
  4. pyobjc_framework_libxpc-13.0/Lib/pyobjc_framework_libxpc.egg-info/requires.txt +2 -0
  5. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/Lib/xpc/_metadata.py +29 -3
  6. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/Modules/_xpc.m +158 -110
  7. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/Modules/pyobjc-api.h +18 -4
  8. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/Modules/pyobjc-compat.h +0 -18
  9. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/PKG-INFO +5 -5
  10. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/PyObjCTest/test_activity.py +10 -10
  11. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/PyObjCTest/test_session.py +1 -1
  12. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/PyObjCTest/test_xpc.py +56 -8
  13. pyobjc_framework_libxpc-12.2.1/metadata/raw/arm64-26.5.fwinfo → pyobjc_framework_libxpc-13.0/metadata/raw/arm64-27.fwinfo +12 -7
  14. pyobjc_framework_libxpc-12.2.1/metadata/raw/x86_64-26.5.fwinfo → pyobjc_framework_libxpc-13.0/metadata/raw/x86_64-27.fwinfo +12 -7
  15. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/metadata/xpc.fwinfo +8 -27
  16. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/pyobjc_setup.py +7 -7
  17. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/setup.py +1 -1
  18. pyobjc_framework_libxpc-12.2.1/Lib/pyobjc_framework_libxpc.egg-info/pyobjc-build-info.txt +0 -3
  19. pyobjc_framework_libxpc-12.2.1/Lib/pyobjc_framework_libxpc.egg-info/requires.txt +0 -2
  20. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/Lib/pyobjc_framework_libxpc.egg-info/dependency_links.txt +0 -0
  21. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/Lib/pyobjc_framework_libxpc.egg-info/not-zip-safe +0 -0
  22. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/Lib/pyobjc_framework_libxpc.egg-info/top_level.txt +0 -0
  23. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/Lib/xpc/__init__.py +0 -0
  24. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/License.txt +0 -0
  25. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/MANIFEST.in +0 -0
  26. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/PyObjCTest/__init__.py +0 -0
  27. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/PyObjCTest/test_connection.py +0 -0
  28. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/PyObjCTest/test_debug.py +0 -0
  29. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/PyObjCTest/test_endpoint.py +0 -0
  30. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/PyObjCTest/test_listener.py +0 -0
  31. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/PyObjCTest/test_peer_requirement.py +0 -0
  32. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/PyObjCTest/test_rich_error.py +0 -0
  33. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/metadata/metadata.ini +0 -0
  34. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/pyproject.toml +0 -0
  35. {pyobjc_framework_libxpc-12.2.1 → pyobjc_framework_libxpc-13.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyobjc-framework-libxpc
3
- Version: 12.2.1
3
+ Version: 13.0
4
4
  Summary: Wrappers for xpc on macOS
5
5
  Home-page: https://github.com/ronaldoussoren/pyobjc
6
6
  Author: Ronald Oussoren
@@ -17,21 +17,21 @@ Classifier: Operating System :: MacOS :: MacOS X
17
17
  Classifier: Programming Language :: Python
18
18
  Classifier: Programming Language :: Python :: 3
19
19
  Classifier: Programming Language :: Python :: 3 :: Only
20
- Classifier: Programming Language :: Python :: 3.10
21
20
  Classifier: Programming Language :: Python :: 3.11
22
21
  Classifier: Programming Language :: Python :: 3.12
23
22
  Classifier: Programming Language :: Python :: 3.13
24
23
  Classifier: Programming Language :: Python :: 3.14
25
24
  Classifier: Programming Language :: Python :: 3.15
25
+ Classifier: Programming Language :: Python :: 3.16
26
26
  Classifier: Programming Language :: Python :: Implementation :: CPython
27
27
  Classifier: Programming Language :: Python :: Free Threading :: 3 - Stable
28
28
  Classifier: Programming Language :: Objective C
29
29
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
30
30
  Classifier: Topic :: Software Development :: User Interfaces
31
- Requires-Python: >=3.10
31
+ Requires-Python: >=3.11
32
32
  Description-Content-Type: text/x-rst; charset=UTF-8
33
- Requires-Dist: pyobjc-core>=12.2.1
34
- Requires-Dist: pyobjc-framework-Cocoa>=12.2.1
33
+ Requires-Dist: pyobjc-core>=13.0
34
+ Requires-Dist: pyobjc-framework-Cocoa>=13.0
35
35
  Dynamic: author
36
36
  Dynamic: author-email
37
37
  Dynamic: classifier
@@ -27,5 +27,5 @@ PyObjCTest/test_session.py
27
27
  PyObjCTest/test_xpc.py
28
28
  metadata/metadata.ini
29
29
  metadata/xpc.fwinfo
30
- metadata/raw/arm64-26.5.fwinfo
31
- metadata/raw/x86_64-26.5.fwinfo
30
+ metadata/raw/arm64-27.fwinfo
31
+ metadata/raw/x86_64-27.fwinfo
@@ -0,0 +1,3 @@
1
+ macOS 27.2 (26B123)
2
+ Apple clang version 21.0.0 (clang-2100.4.1.1)
3
+ SDK: macOS 27.2
@@ -0,0 +1,2 @@
1
+ pyobjc-core>=13.0
2
+ pyobjc-framework-Cocoa>=13.0
@@ -1,7 +1,5 @@
1
1
  # This file is generated by objective.metadata
2
2
  #
3
- # Last update: Sun May 24 12:01:16 2026
4
- #
5
3
  # flake8: noqa
6
4
 
7
5
  import objc, sys
@@ -213,7 +211,26 @@ functions = {
213
211
  "",
214
212
  {"retval": {"c_array_delimited_by_null": True}},
215
213
  ),
214
+ "xpc_dictionary_create": (
215
+ b"@^^t^^tQ",
216
+ "",
217
+ {
218
+ "retval": {"already_retained": True},
219
+ "arguments": {
220
+ 0: {"type_modifier": "n", "c_array_length_in_arg": 2},
221
+ 1: {"type_modifier": "n", "c_array_length_in_arg": 2},
222
+ },
223
+ },
224
+ ),
216
225
  "_xpc_object_validate": (b"v@",),
226
+ "xpc_string_create_with_format_and_arguments": (
227
+ b"@^t^v",
228
+ "",
229
+ {
230
+ "arguments": {0: {"c_array_delimited_by_null": True, "type_modifier": "n"}},
231
+ "suggestion": "Use 'xpc.xpc_string_create_with_format' instead.",
232
+ },
233
+ ),
217
234
  "xpc_dictionary_create_empty": (b"@", "", {"retval": {"already_retained": True}}),
218
235
  "xpc_array_apply": (
219
236
  b"B@@?",
@@ -566,7 +583,7 @@ functions = {
566
583
  "",
567
584
  {
568
585
  "retval": {"already_retained": True},
569
- "arguments": {0: {"type_modifier": "n", "c_array_length_in_arg": 1}},
586
+ "arguments": {0: {"c_array_length_in_arg": 1, "type_modifier": "n"}},
570
587
  },
571
588
  ),
572
589
  "xpc_main": (
@@ -765,10 +782,19 @@ aliases = {
765
782
  "XPC_TESTNORETURN": "XPC_NORETURN",
766
783
  "XPC_RETURNS_RETAINED": "OS_OBJECT_RETURNS_RETAINED",
767
784
  "XPC_TESTEXPORT": "XPC_NOEXPORT",
785
+ "XPC_CONST": "const",
768
786
  "XPC_NONNULL_ARRAY": "_Nonnull",
769
787
  "XPC_ERROR_KEY_DESCRIPTION": "_xpc_error_key_description",
788
+ "XPC_TESTCONST": "XPC_CONST",
789
+ "XPC_ABORTLIKE": "__abortlike",
770
790
  "XPC_EVENT_KEY_NAME": "_xpc_event_key_name",
771
791
  }
772
792
  expressions = {}
793
+ formal_protocols = {
794
+ "OS_xpc_listener": "OS_xpc_listener",
795
+ "OS_xpc_object": "OS_xpc_object",
796
+ "OS_xpc_peer_requirement": "OS_xpc_peer_requirement",
797
+ "OS_xpc_session": "OS_xpc_session",
798
+ }
773
799
 
774
800
  # END OF FILE
@@ -2,46 +2,60 @@
2
2
  #include "Python.h"
3
3
  #include "pyobjc-api.h"
4
4
 
5
+ #ifdef USE_STATIC_ANALYZER
6
+ #include "../../pyobjc-core/Modules/objc/python-api-used.h"
7
+ #endif
8
+
5
9
  #include <xpc/xpc.h>
6
10
 
7
- static PyObject*
8
- mod_xpc_dictionary_create(PyObject* mod __attribute__((__unused__)), PyObject* args)
11
+ NS_ASSUME_NONNULL_BEGIN
12
+
13
+ static PyObject* _Nullable mod_xpc_dictionary_create(
14
+ PyObject* meth __attribute__((__unused__)), PyObject* _Nonnull const* _Nonnull args,
15
+ size_t nargs)
9
16
  {
10
- PyObject* keys;
11
- PyObject* values;
12
- Py_ssize_t nitems;
17
+ PyObject* keys;
18
+ PyObject* values;
19
+ size_t nitems;
20
+
21
+ if (PyObjC_CheckArgCount(meth, 3, 3, nargs) == -1) {
22
+ return NULL;
23
+ }
13
24
 
14
- if (!PyArg_ParseTuple(args, "OOn", &keys, &values, &nitems)) {
25
+ if (PyObjC_PythonToObjC(@encode(size_t), args[2], &nitems) == -1) {
15
26
  return NULL;
16
27
  }
17
28
 
18
- keys = PySequence_Tuple(keys);
29
+ keys = PySequence_Tuple(args[0]);
19
30
  if (keys == NULL) {
20
31
  return NULL;
21
32
  }
22
- values = PySequence_Tuple(values);
33
+ values = PySequence_Tuple(args[1]);
23
34
  if (values == NULL) {
24
35
  Py_DECREF(keys);
25
36
  return NULL;
26
37
  }
27
38
 
28
- if (PyTuple_Size(keys) != nitems) {
39
+ assert(PyTuple_Check(keys));
40
+ assert(PyTuple_Check(values));
41
+
42
+ if ((size_t)PyTuple_GET_SIZE(keys) != nitems) {
29
43
  Py_DECREF(keys);
30
44
  Py_DECREF(values);
31
- PyErr_Format(PyExc_ValueError, "Expecting keys sequence of exactly %ld items",
32
- nitems);
45
+ PyErr_Format(PyExc_ValueError,
46
+ "Expecting sequence of exactly %ld items for 'keys'", nitems);
33
47
  return NULL;
34
48
  }
35
49
 
36
- if (PyTuple_Size(values) != nitems) {
50
+ if ((size_t)PyTuple_GET_SIZE(values) != nitems) {
37
51
  Py_DECREF(keys);
38
52
  Py_DECREF(values);
39
- PyErr_Format(PyExc_ValueError, "Expecting values sequence of exactly %ld items",
40
- nitems);
53
+ PyErr_Format(PyExc_ValueError,
54
+ "Expecting sequence of exactly %ld items for 'values'", nitems);
41
55
  return NULL;
42
56
  }
43
57
 
44
- for (Py_ssize_t i = 0; i < nitems; i++) {
58
+ for (size_t i = 0; i < nitems; i++) {
45
59
  if (!PyBytes_Check(PyTuple_GET_ITEM(keys, i))) {
46
60
  PyErr_SetString(PyExc_TypeError, "Keys should be sequence of bytes");
47
61
  Py_DECREF(keys);
@@ -51,22 +65,26 @@ mod_xpc_dictionary_create(PyObject* mod __attribute__((__unused__)), PyObject* a
51
65
  }
52
66
 
53
67
  const char** key_array = PyMem_Malloc(sizeof(char*) * nitems);
54
- if (key_array == NULL) {
68
+ if (key_array == NULL) { // LCOV_BR_EXCL_LINE
69
+ // LCOV_EXCL_START
55
70
  Py_DECREF(keys);
56
71
  Py_DECREF(values);
57
72
  PyErr_NoMemory();
58
73
  return NULL;
74
+ // LCOV_EXCL_STOP
59
75
  }
60
76
  id* value_array = PyMem_Malloc(sizeof(id) * nitems);
61
- if (value_array == NULL) {
77
+ if (value_array == NULL) { // LCOV_BR_EXCL_LINE
78
+ // LCOV_EXCL_START
62
79
  Py_DECREF(keys);
63
80
  Py_DECREF(values);
64
81
  PyMem_Free(key_array);
65
82
  PyErr_NoMemory();
66
83
  return NULL;
84
+ // LCOV_EXCL_STOP
67
85
  }
68
86
 
69
- for (Py_ssize_t i = 0; i < nitems; i++) {
87
+ for (size_t i = 0; i < nitems; i++) {
70
88
  key_array[i] = PyBytes_AsString(PyTuple_GET_ITEM(keys, i));
71
89
  if (depythonify_python_object(PyTuple_GET_ITEM(values, i), value_array + i)
72
90
  == -1) {
@@ -74,6 +92,7 @@ mod_xpc_dictionary_create(PyObject* mod __attribute__((__unused__)), PyObject* a
74
92
  Py_DECREF(values);
75
93
  PyMem_Free(key_array);
76
94
  PyMem_Free(value_array);
95
+ return NULL;
77
96
  }
78
97
  }
79
98
 
@@ -89,11 +108,6 @@ mod_xpc_dictionary_create(PyObject* mod __attribute__((__unused__)), PyObject* a
89
108
  }
90
109
 
91
110
  static PyMethodDef mod_methods[] = {
92
- {.ml_name = "xpc_dictionary_create",
93
- .ml_meth = (PyCFunction)mod_xpc_dictionary_create,
94
- .ml_flags = METH_VARARGS,
95
- .ml_doc = "xpc_dictionary_create(keys, values, nitem, /)" CLINIC_SEP},
96
-
97
111
  {0, 0, 0, 0} /* sentinel */
98
112
  };
99
113
 
@@ -104,14 +118,13 @@ add_constant(PyObject* m, const char* name, char* typestr, const void* value)
104
118
  int r;
105
119
 
106
120
  v = PyObjC_ObjCToPython(typestr, (void*)value);
107
- if (v == NULL) {
108
- return -1;
121
+ if (v == NULL) { // LCOV_BR_EXCL_LINE
122
+ return -1; // LCOV_EXCL_LINE
109
123
  }
110
124
 
111
125
  r = PyModule_AddObject(m, name, v);
112
- if (r == -1) {
113
- Py_DECREF(v);
114
- }
126
+ if (r == -1) // LCOV_BR_EXCL_LINE
127
+ Py_DECREF(v); // LCOV_EXCL_LINE
115
128
 
116
129
  return r;
117
130
  }
@@ -123,14 +136,13 @@ add_bytes_constant(PyObject* m, const char* name, const char* value)
123
136
  int r;
124
137
 
125
138
  v = PyBytes_FromString(value);
126
- if (v == NULL) {
127
- return -1;
139
+ if (v == NULL) { // LCOV_BR_EXCL_LINE
140
+ return -1; // LCOV_EXCL_LINE
128
141
  }
129
142
 
130
143
  r = PyModule_AddObject(m, name, v);
131
- if (r == -1) {
132
- Py_DECREF(v);
133
- }
144
+ if (r == -1) // LCOV_BR_EXCL_LINE
145
+ Py_DECREF(v); // LCOV_EXCL_LINE
134
146
 
135
147
  return r;
136
148
  }
@@ -180,163 +192,198 @@ static struct int64_constants {
180
192
  static int
181
193
  mod_exec_module(PyObject* module)
182
194
  {
183
- if (PyObjC_ImportAPI(module) == -1)
184
- return -1;
195
+ if (PyObjC_ImportAPI(module) == -1) // LCOV_BR_EXCL_LINE
196
+ return -1; // LCOV_EXCL_LINE
197
+
198
+ if (PyObjCRegister_FunctionCaller( // LCOV_BR_EXCL_LINE
199
+ xpc_dictionary_create, mod_xpc_dictionary_create)
200
+ == -1) { // LCOV_BR_EXCL_LINE
201
+ return -1; // LCOV_EXCL_LINE
202
+ }
185
203
 
186
204
  /*
187
205
  * Register a number of struct pointer types that are actually Objective-C objects
188
206
  */
189
- if (PyObjCPointerWrapper_RegisterID("xpc_activity_t", "^{_xpc_activity_s=}") < 0)
190
- goto error;
191
-
192
- if (PyObjCPointerWrapper_RegisterID("xpc_object_t", "^{_xpc_object_s=}") < 0)
193
- goto error;
194
- if (PyObjCPointerWrapper_RegisterID("xpc_type_t", "^{_xpc_type_s=}") < 0)
195
- goto error;
196
- if (PyObjCPointerWrapper_RegisterID("xpc_connection_t", "^{_xpc_connection_s=}") < 0)
197
- goto error;
198
- if (PyObjCPointerWrapper_RegisterID("xpc_endpoint", "^{_xpc_endpoint_s=}") < 0)
199
- goto error;
207
+ if (PyObjCPointerWrapper_RegisterID("xpc_activity_t", "^{_xpc_activity_s=}")
208
+ < 0) // LCOV_BR_EXCL_LINE
209
+ goto error; // LCOV_EXCL_LINE
210
+
211
+ if (PyObjCPointerWrapper_RegisterID("xpc_object_t", "^{_xpc_object_s=}")
212
+ < 0) // LCOV_BR_EXCL_LINE
213
+ goto error; // LCOV_EXCL_LINE
214
+ if (PyObjCPointerWrapper_RegisterID("xpc_type_t", "^{_xpc_type_s=}")
215
+ < 0) // LCOV_BR_EXCL_LINE
216
+ goto error; // LCOV_EXCL_LINE
217
+ if (PyObjCPointerWrapper_RegisterID("xpc_connection_t", "^{_xpc_connection_s=}")
218
+ < 0) // LCOV_BR_EXCL_LINE
219
+ goto error; // LCOV_EXCL_LINE
220
+ if (PyObjCPointerWrapper_RegisterID("xpc_endpoint", "^{_xpc_endpoint_s=}")
221
+ < 0) // LCOV_BR_EXCL_LINE
222
+ goto error; // LCOV_EXCL_LINE
200
223
 
201
224
  for (struct bytes_constants* cur = BYTES_CONSTANTS; cur->name != NULL; cur++) {
202
- if (cur->value == NULL)
203
- continue;
204
- if (add_bytes_constant(module, cur->name, *(cur->value)) != 0)
205
- goto error;
225
+ if (cur->value == NULL) // LCOV_BR_EXCL_LINE
226
+ continue; // LCOV_EXCL_LINE
227
+ if (add_bytes_constant(module, cur->name, *(cur->value))
228
+ != 0) // LCOV_BR_EXCL_LINE
229
+ goto error; // LCOV_EXCL_LINE
206
230
  }
207
231
 
208
232
  for (struct int64_constants* cur = INT64_CONSTANTS; cur->name != NULL; cur++) {
209
- if (cur->value == NULL)
210
- continue;
233
+ if (cur->value == NULL) // LCOV_BR_EXCL_LINE
234
+ continue; // LCOV_EXCL_LINE
211
235
  PyObject* v = PyLong_FromLong(*(cur->value));
212
- if (v == NULL)
213
- goto error;
236
+ if (v == NULL) // LCOV_BR_EXCL_LINE
237
+ goto error; // LCOV_EXCL_LINE
214
238
 
215
- if (PyModule_AddObject(module, cur->name, v) == -1) {
239
+ if (PyModule_AddObject(module, cur->name, v) == -1) { // LCOV_BR_EXCL_LINE
240
+ // LCOV_EXCL_START
216
241
  Py_DECREF(v);
217
242
  goto error;
243
+ // LCOV_EXCL_STOP
218
244
  }
219
245
  }
220
246
 
221
247
  id v = (id)XPC_TYPE_ACTIVITY;
222
- if (add_constant(module, "XPC_TYPE_ACTIVITY", @encode(id), &v) != 0)
223
- goto error;
248
+ if (add_constant(module, "XPC_TYPE_ACTIVITY", @encode(id), &v)
249
+ != 0) // LCOV_BR_EXCL_LINE
250
+ goto error; // LCOV_EXCL_LINE
224
251
 
225
252
  v = (id)XPC_ACTIVITY_CHECK_IN;
226
- if (add_constant(module, "XPC_ACTIVITY_CHECK_IN", @encode(id), &v) != 0)
227
- goto error;
253
+ if (add_constant(module, "XPC_ACTIVITY_CHECK_IN", @encode(id), &v)
254
+ != 0) // LCOV_BR_EXCL_LINE
255
+ goto error; // LCOV_EXCL_LINE
228
256
 
229
257
  v = (id)XPC_TYPE_ENDPOINT;
230
- if (add_constant(module, "XPC_TYPE_ENDPOINT", @encode(id), &v) != 0)
231
- goto error;
258
+ if (add_constant(module, "XPC_TYPE_ENDPOINT", @encode(id), &v)
259
+ != 0) // LCOV_BR_EXCL_LINE
260
+ goto error; // LCOV_EXCL_LINE
232
261
 
233
262
  xpc_object_t d;
234
263
 
235
264
  d = XPC_ERROR_CONNECTION_INTERRUPTED;
236
265
  if (add_constant(module, "XPC_ERROR_CONNECTION_INTERRUPTED", @encode(xpc_object_t),
237
266
  &d)
238
- != 0)
239
- goto error;
267
+ != 0) // LCOV_BR_EXCL_LINE
268
+ goto error; // LCOV_EXCL_LINE
240
269
 
241
270
  d = XPC_ERROR_CONNECTION_INVALID;
242
271
  if (add_constant(module, "XPC_ERROR_CONNECTION_INVALID", @encode(xpc_object_t), &d)
243
- != 0)
244
- goto error;
272
+ != 0) // LCOV_BR_EXCL_LINE
273
+ goto error; // LCOV_EXCL_LINE
245
274
 
246
275
  d = XPC_ERROR_TERMINATION_IMMINENT;
247
276
  if (add_constant(module, "XPC_ERROR_TERMINATION_IMMINENT", @encode(xpc_object_t), &d)
248
- != 0)
249
- goto error;
277
+ != 0) // LCOV_BR_EXCL_LINE
278
+ goto error; // LCOV_EXCL_LINE
250
279
 
251
280
  #if PyObjC_BUILD_RELEASE >= 1200
252
- if (__builtin_available(macOS 12.0, *)) {
281
+ if (__builtin_available(macOS 12.0, *)) { // LCOV_BR_EXCL_LINE
253
282
  d = XPC_ERROR_PEER_CODE_SIGNING_REQUIREMENT;
254
283
  if (add_constant(module, "XPC_ERROR_PEER_CODE_SIGNING_REQUIREMENT",
255
284
  @encode(xpc_object_t), &d)
256
- != 0)
257
- goto error;
285
+ != 0) // LCOV_BR_EXCL_LINE
286
+ goto error; // LCOV_EXCL_LINE
258
287
  }
259
288
  #endif /* PyObjC_BUILD_RELEASE >= 1200 */
260
289
 
261
290
  xpc_type_t t;
262
291
  t = XPC_TYPE_NULL;
263
- if (add_constant(module, "XPC_TYPE_NULL", @encode(xpc_type_t), &t) != 0)
264
- goto error;
292
+ if (add_constant(module, "XPC_TYPE_NULL", @encode(xpc_type_t), &t)
293
+ != 0) // LCOV_BR_EXCL_LINE
294
+ goto error; // LCOV_EXCL_LINE
265
295
 
266
296
  t = XPC_TYPE_BOOL;
267
- if (add_constant(module, "XPC_TYPE_BOOL", @encode(xpc_type_t), &t) != 0)
268
- goto error;
297
+ if (add_constant(module, "XPC_TYPE_BOOL", @encode(xpc_type_t), &t)
298
+ != 0) // LCOV_BR_EXCL_LINE
299
+ goto error; // LCOV_EXCL_LINE
269
300
 
270
301
  t = XPC_TYPE_INT64;
271
- if (add_constant(module, "XPC_TYPE_INT64", @encode(xpc_type_t), &t) != 0)
272
- goto error;
302
+ if (add_constant(module, "XPC_TYPE_INT64", @encode(xpc_type_t), &t)
303
+ != 0) // LCOV_BR_EXCL_LINE
304
+ goto error; // LCOV_EXCL_LINE
273
305
 
274
306
  t = XPC_TYPE_UINT64;
275
- if (add_constant(module, "XPC_TYPE_UINT64", @encode(xpc_type_t), &t) != 0)
276
- goto error;
307
+ if (add_constant(module, "XPC_TYPE_UINT64", @encode(xpc_type_t), &t)
308
+ != 0) // LCOV_BR_EXCL_LINE
309
+ goto error; // LCOV_EXCL_LINE
277
310
 
278
311
  t = XPC_TYPE_DOUBLE;
279
- if (add_constant(module, "XPC_TYPE_DOUBLE", @encode(xpc_type_t), &t) != 0)
280
- goto error;
312
+ if (add_constant(module, "XPC_TYPE_DOUBLE", @encode(xpc_type_t), &t)
313
+ != 0) // LCOV_BR_EXCL_LINE
314
+ goto error; // LCOV_EXCL_LINE
281
315
 
282
316
  t = XPC_TYPE_DATE;
283
- if (add_constant(module, "XPC_TYPE_DATE", @encode(xpc_type_t), &t) != 0)
284
- goto error;
317
+ if (add_constant(module, "XPC_TYPE_DATE", @encode(xpc_type_t), &t)
318
+ != 0) // LCOV_BR_EXCL_LINE
319
+ goto error; // LCOV_EXCL_LINE
285
320
 
286
321
  t = XPC_TYPE_DATA;
287
- if (add_constant(module, "XPC_TYPE_DATA", @encode(xpc_type_t), &t) != 0)
288
- goto error;
322
+ if (add_constant(module, "XPC_TYPE_DATA", @encode(xpc_type_t), &t)
323
+ != 0) // LCOV_BR_EXCL_LINE
324
+ goto error; // LCOV_EXCL_LINE
289
325
 
290
326
  t = XPC_TYPE_STRING;
291
- if (add_constant(module, "XPC_TYPE_STRING", @encode(xpc_type_t), &t) != 0)
292
- goto error;
327
+ if (add_constant(module, "XPC_TYPE_STRING", @encode(xpc_type_t), &t)
328
+ != 0) // LCOV_BR_EXCL_LINE
329
+ goto error; // LCOV_EXCL_LINE
293
330
 
294
331
  t = XPC_TYPE_UUID;
295
- if (add_constant(module, "XPC_TYPE_UUID", @encode(xpc_type_t), &t) != 0)
296
- goto error;
332
+ if (add_constant(module, "XPC_TYPE_UUID", @encode(xpc_type_t), &t)
333
+ != 0) // LCOV_BR_EXCL_LINE
334
+ goto error; // LCOV_EXCL_LINE
297
335
 
298
336
  t = XPC_TYPE_FD;
299
- if (add_constant(module, "XPC_TYPE_FD", @encode(xpc_type_t), &t) != 0)
300
- goto error;
337
+ if (add_constant(module, "XPC_TYPE_FD", @encode(xpc_type_t), &t)
338
+ != 0) // LCOV_BR_EXCL_LINE
339
+ goto error; // LCOV_EXCL_LINE
301
340
 
302
341
  t = XPC_TYPE_SHMEM;
303
- if (add_constant(module, "XPC_TYPE_SHMEM", @encode(xpc_type_t), &t) != 0)
304
- goto error;
342
+ if (add_constant(module, "XPC_TYPE_SHMEM", @encode(xpc_type_t), &t)
343
+ != 0) // LCOV_BR_EXCL_LINE
344
+ goto error; // LCOV_EXCL_LINE
305
345
 
306
346
  t = XPC_TYPE_ARRAY;
307
- if (add_constant(module, "XPC_TYPE_ARRAY", @encode(xpc_type_t), &t) != 0)
308
- goto error;
347
+ if (add_constant(module, "XPC_TYPE_ARRAY", @encode(xpc_type_t), &t)
348
+ != 0) // LCOV_BR_EXCL_LINE
349
+ goto error; // LCOV_EXCL_LINE
309
350
 
310
351
  t = XPC_TYPE_DICTIONARY;
311
- if (add_constant(module, "XPC_TYPE_DICTIONARY", @encode(xpc_type_t), &t) != 0)
312
- goto error;
352
+ if (add_constant(module, "XPC_TYPE_DICTIONARY", @encode(xpc_type_t), &t)
353
+ != 0) // LCOV_BR_EXCL_LINE
354
+ goto error; // LCOV_EXCL_LINE
313
355
 
314
356
  t = XPC_TYPE_ERROR;
315
- if (add_constant(module, "XPC_TYPE_ERROR", @encode(xpc_type_t), &t) != 0)
316
- goto error;
357
+ if (add_constant(module, "XPC_TYPE_ERROR", @encode(xpc_type_t), &t)
358
+ != 0) // LCOV_BR_EXCL_LINE
359
+ goto error; // LCOV_EXCL_LINE
317
360
 
318
361
  #if PyObjC_BUILD_RELEASE >= 1300
319
362
  t = XPC_TYPE_SESSION;
320
- if (add_constant(module, "XPC_TYPE_SESSION", @encode(xpc_type_t), &t) != 0)
321
- goto error;
363
+ if (add_constant(module, "XPC_TYPE_SESSION", @encode(xpc_type_t), &t)
364
+ != 0) // LCOV_BR_EXCL_LINE
365
+ goto error; // LCOV_EXCL_LINE
322
366
 
323
367
  t = XPC_TYPE_RICH_ERROR;
324
- if (add_constant(module, "XPC_TYPE_RICH_ERROR", @encode(xpc_type_t), &t) != 0)
325
- goto error;
326
- #endif /* PyObjC_BUILD_RELEASE >= 1300 */
368
+ if (add_constant(module, "XPC_TYPE_RICH_ERROR", @encode(xpc_type_t), &t)
369
+ != 0) // LCOV_BR_EXCL_LINE
370
+ goto error; // LCOV_EXCL_LINE
371
+ #endif /* PyObjC_BUILD_RELEASE >= 1300 */
327
372
 
328
373
  xpc_object_t b = XPC_BOOL_TRUE;
329
- if (add_constant(module, "XPC_BOOL_TRUE", @encode(xpc_object_t), &b) != 0)
330
- goto error;
374
+ if (add_constant(module, "XPC_BOOL_TRUE", @encode(xpc_object_t), &b)
375
+ != 0) // LCOV_BR_EXCL_LINE
376
+ goto error; // LCOV_EXCL_LINE
331
377
 
332
378
  b = XPC_BOOL_FALSE;
333
- if (add_constant(module, "XPC_BOOL_FALSE", @encode(xpc_object_t), &b) != 0)
334
- goto error;
379
+ if (add_constant(module, "XPC_BOOL_FALSE", @encode(xpc_object_t), &b)
380
+ != 0) // LCOV_BR_EXCL_LINE
381
+ goto error; // LCOV_EXCL_LINE
335
382
 
336
383
  return 0;
337
384
 
338
385
  error:
339
- return -1;
386
+ return -1; // LCOV_EXCL_LINE
340
387
  }
341
388
 
342
389
  static struct PyModuleDef_Slot mod_slots[] = {
@@ -371,10 +418,11 @@ static struct PyModuleDef mod_module = {
371
418
  .m_free = NULL,
372
419
  };
373
420
 
374
- PyObject* PyInit__xpc(void);
421
+ PyObject* _Nullable PyInit__xpc(void);
375
422
 
376
- PyObject* __attribute__((__visibility__("default")))
423
+ PyObject* _Nullable __attribute__((__visibility__("default")))
377
424
  PyInit__xpc(void)
378
425
  {
379
426
  return PyModuleDef_Init(&mod_module);
380
427
  }
428
+ NS_ASSUME_NONNULL_END
@@ -60,6 +60,11 @@ typedef int(RegisterMethodMappingFunctionType)(
60
60
  PyObject* _Nonnull const* _Nonnull, size_t),
61
61
  IMP _Nullable (*_Nonnull)(PyObject* _Nonnull, PyObject* _Nonnull));
62
62
 
63
+ #ifndef PyObjC_FUNCTION_CALL_H
64
+ typedef PyObject* _Nullable (*PyObjC_FunctionCallFunc)(
65
+ PyObject* meth, PyObject* _Nonnull const* _Nonnull args, size_t nargs);
66
+ #endif
67
+
63
68
  struct pyobjc_api {
64
69
  int api_version; /* API version */
65
70
  size_t struct_len; /* Length of this struct */
@@ -117,6 +122,9 @@ struct pyobjc_api {
117
122
 
118
123
  PyObject* _Nullable (*_Nonnull createopaquepointertype)(const char*, const char*,
119
124
  const char*);
125
+ int (*_Nonnull register_functioncaller)(void*, PyObjC_FunctionCallFunc);
126
+ PyObject* _Nullable (*_Nonnull create_registered_struct)(
127
+ const char*, Py_ssize_t, const char* _Nonnull* _Nullable, Py_ssize_t*);
120
128
  };
121
129
 
122
130
  #ifndef PYOBJC_BUILD
@@ -159,6 +167,8 @@ static struct pyobjc_api* PyObjC_API;
159
167
  #define PyObjC_CheckArgCount (PyObjC_API->checkargcount)
160
168
  #define PyObjC_CheckNoKwnames (PyObjC_API->checknokwnames)
161
169
  #define PyObjCCreateOpaquePointerType (PyObjC_API->createopaquepointertype)
170
+ #define PyObjCRegister_FunctionCaller (PyObjC_API->register_functioncaller)
171
+ #define PyObjC_CreateRegisteredStruct (PyObjC_API->create_registered_struct)
162
172
 
163
173
  typedef void (*PyObjC_Function_Pointer)(void);
164
174
  typedef struct PyObjC_function_map {
@@ -178,21 +188,25 @@ static inline int
178
188
  PyObjC_ImportAPI(PyObject* calling_module)
179
189
  {
180
190
  PyObjC_API = (struct pyobjc_api*)PyCapsule_Import("objc." PYOBJC_API_NAME, 0);
181
- if (PyObjC_API == NULL) {
182
- return -1;
191
+ if (PyObjC_API == NULL) { // LCOV_BR_EXCL_LINE
192
+ return -1; // LCOV_EXCL_LINE
183
193
  }
184
- if (PyObjC_API->api_version != PYOBJC_API_VERSION) {
194
+ if (PyObjC_API->api_version != PYOBJC_API_VERSION) { // LCOV_BR_EXCL_LINE
195
+ // LCOV_EXCL_START
185
196
  PyErr_Format(PyExc_RuntimeError,
186
197
  "Wrong version of PyObjC C API (got %d, expected %d)",
187
198
  (int)PyObjC_API->api_version, (int)PYOBJC_API_VERSION);
188
199
  return -1;
200
+ // LCOV_EXCL_STOP
189
201
  }
190
202
 
191
- if (PyObjC_API->struct_len < PyObjC_EXPECTED_STRUCT_SIZE) {
203
+ if (PyObjC_API->struct_len < PyObjC_EXPECTED_STRUCT_SIZE) { // LCOV_EXCL_LINE
204
+ // LCOV_EXCL_START
192
205
  PyErr_Format(PyExc_RuntimeError,
193
206
  "Wrong struct-size of PyObjC C API (got %d, expected %d)",
194
207
  (int)PyObjC_API->struct_len, (int)sizeof(struct pyobjc_api));
195
208
  return -1;
209
+ // LCOV_EXCL_STOP
196
210
  }
197
211
 
198
212
  /* Current pyobjc implementation doesn't allow deregistering
@@ -167,24 +167,6 @@ _PyObjCTuple_GetItem(PyObject* tuple, Py_ssize_t idx)
167
167
  PyGILState_Release(_GILState); \
168
168
  } while (0)
169
169
 
170
- #if PY_VERSION_HEX < 0x030a0000
171
-
172
- static inline PyObject*
173
- Py_NewRef(PyObject* o)
174
- {
175
- Py_INCREF(o);
176
- return o;
177
- }
178
-
179
- static inline PyObject*
180
- Py_XNewRef(PyObject* o)
181
- {
182
- Py_XINCREF(o);
183
- return o;
184
- }
185
-
186
- #endif /* PY_VERSION_HEX < 0x030a0000 */
187
-
188
170
  #if PY_VERSION_HEX < 0x030d0000
189
171
  #define Py_BEGIN_CRITICAL_SECTION(value) \
190
172
  { \
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyobjc-framework-libxpc
3
- Version: 12.2.1
3
+ Version: 13.0
4
4
  Summary: Wrappers for xpc on macOS
5
5
  Home-page: https://github.com/ronaldoussoren/pyobjc
6
6
  Author: Ronald Oussoren
@@ -17,21 +17,21 @@ Classifier: Operating System :: MacOS :: MacOS X
17
17
  Classifier: Programming Language :: Python
18
18
  Classifier: Programming Language :: Python :: 3
19
19
  Classifier: Programming Language :: Python :: 3 :: Only
20
- Classifier: Programming Language :: Python :: 3.10
21
20
  Classifier: Programming Language :: Python :: 3.11
22
21
  Classifier: Programming Language :: Python :: 3.12
23
22
  Classifier: Programming Language :: Python :: 3.13
24
23
  Classifier: Programming Language :: Python :: 3.14
25
24
  Classifier: Programming Language :: Python :: 3.15
25
+ Classifier: Programming Language :: Python :: 3.16
26
26
  Classifier: Programming Language :: Python :: Implementation :: CPython
27
27
  Classifier: Programming Language :: Python :: Free Threading :: 3 - Stable
28
28
  Classifier: Programming Language :: Objective C
29
29
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
30
30
  Classifier: Topic :: Software Development :: User Interfaces
31
- Requires-Python: >=3.10
31
+ Requires-Python: >=3.11
32
32
  Description-Content-Type: text/x-rst; charset=UTF-8
33
- Requires-Dist: pyobjc-core>=12.2.1
34
- Requires-Dist: pyobjc-framework-Cocoa>=12.2.1
33
+ Requires-Dist: pyobjc-core>=13.0
34
+ Requires-Dist: pyobjc-framework-Cocoa>=13.0
35
35
  Dynamic: author
36
36
  Dynamic: author-email
37
37
  Dynamic: classifier
@@ -7,8 +7,16 @@ xpc_activity_handler_t = b"v@"
7
7
 
8
8
 
9
9
  class TestActivity(TestCase):
10
- @min_os_level("10.9")
11
- def test_constants10_9(self):
10
+ def test_enums(self):
11
+ self.assertIsEnumType(xpc.xpc_activity_state_t)
12
+ self.assertEqual(xpc.XPC_ACTIVITY_STATE_CHECK_IN, 0)
13
+ self.assertEqual(xpc.XPC_ACTIVITY_STATE_WAIT, 1)
14
+ self.assertEqual(xpc.XPC_ACTIVITY_STATE_RUN, 2)
15
+ self.assertEqual(xpc.XPC_ACTIVITY_STATE_DEFER, 3)
16
+ self.assertEqual(xpc.XPC_ACTIVITY_STATE_CONTINUE, 4)
17
+ self.assertEqual(xpc.XPC_ACTIVITY_STATE_DONE, 5)
18
+
19
+ def test_constants(self):
12
20
  self.assertIsInstance(xpc.XPC_ACTIVITY_INTERVAL, bytes)
13
21
  self.assertIsInstance(xpc.XPC_ACTIVITY_REPEATING, bytes)
14
22
  self.assertIsInstance(xpc.XPC_ACTIVITY_DELAY, bytes)
@@ -33,14 +41,6 @@ class TestActivity(TestCase):
33
41
 
34
42
  self.assertIsInstance(xpc.XPC_ACTIVITY_CHECK_IN, objc.objc_object)
35
43
 
36
- self.assertIsEnumType(xpc.xpc_activity_state_t)
37
- self.assertEqual(xpc.XPC_ACTIVITY_STATE_CHECK_IN, 0)
38
- self.assertEqual(xpc.XPC_ACTIVITY_STATE_WAIT, 1)
39
- self.assertEqual(xpc.XPC_ACTIVITY_STATE_RUN, 2)
40
- self.assertEqual(xpc.XPC_ACTIVITY_STATE_DEFER, 3)
41
- self.assertEqual(xpc.XPC_ACTIVITY_STATE_CONTINUE, 4)
42
- self.assertEqual(xpc.XPC_ACTIVITY_STATE_DONE, 5)
43
-
44
44
  @min_os_level("12.0")
45
45
  def test_constants12_0(self):
46
46
  self.assertIsInstance(xpc.XPC_ACTIVITY_PREVENT_DEVICE_SLEEP, bytes)
@@ -8,7 +8,7 @@ xpc_session_reply_handler_t = b"v@@"
8
8
 
9
9
 
10
10
  class TestSession(TestCase):
11
- def test_constants(self):
11
+ def test_enums(self):
12
12
  self.assertIsEnumType(xpc.xpc_session_create_flags_t)
13
13
  self.assertEqual(xpc.XPC_SESSION_CREATE_NONE, 0)
14
14
  self.assertEqual(xpc.XPC_SESSION_CREATE_INACTIVE, 1 << 0)
@@ -1,4 +1,4 @@
1
- from PyObjCTools.TestSupport import TestCase, min_os_level
1
+ from PyObjCTools.TestSupport import TestCase, min_os_level, NoObjCClass
2
2
 
3
3
  import xpc
4
4
  import objc
@@ -10,7 +10,7 @@ xpc_handler_t = b"v@"
10
10
 
11
11
 
12
12
  class TestXPC(TestCase):
13
- def test_metadata_sane(self):
13
+ def test_callable_metadata_is_sane(self):
14
14
  to_exclude = set()
15
15
  for class_name in (
16
16
  "XPC_TYPE_ACTIVITY",
@@ -134,7 +134,15 @@ class TestXPC(TestCase):
134
134
  self.assertArgIsNullTerminated(xpc.xpc_string_create_with_format, 0)
135
135
  self.assertArgIsPrintf(xpc.xpc_string_create_with_format, 0)
136
136
 
137
- self.assertNotHasAttr(xpc, "xpc_string_create_with_format_and_arguments")
137
+ with self.assertRaisesRegex(
138
+ TypeError, "Use 'xpc.xpc_string_create_with_format' instead."
139
+ ):
140
+ xpc.xpc_string_create_with_format_and_arguments("foo", [])
141
+
142
+ self.assertArgIsIn(xpc.xpc_string_create_with_format_and_arguments, 0)
143
+ self.assertArgIsNullTerminated(
144
+ xpc.xpc_string_create_with_format_and_arguments, 0
145
+ )
138
146
 
139
147
  xpc.xpc_string_get_length
140
148
 
@@ -205,11 +213,51 @@ class TestXPC(TestCase):
205
213
  self.assertResultIsRetained(xpc.xpc_array_create_connection)
206
214
 
207
215
  # Manual binding:
208
- # self.assertResultIsRetained(xpc.xpc_dictionary_create)
209
- # self.assertArgIsIn(xpc.xpc_dictionary_create, 0)
210
- # self.assertArgSizeInArg(xpc.xpc_dictionary_create, 0, 2)
211
- # self.assertArgIsIn(xpc.xpc_dictionary_create, 1)
212
- # self.assertArgSizeInArg(xpc.xpc_dictionary_create, 1, 2)
216
+ self.assertResultIsRetained(xpc.xpc_dictionary_create)
217
+ self.assertArgIsIn(xpc.xpc_dictionary_create, 0)
218
+ self.assertArgSizeInArg(xpc.xpc_dictionary_create, 0, 2)
219
+ self.assertArgIsIn(xpc.xpc_dictionary_create, 1)
220
+ self.assertArgSizeInArg(xpc.xpc_dictionary_create, 1, 2)
221
+
222
+ with self.assertRaisesRegex(TypeError, "expected 3 arguments, got 0"):
223
+ xpc.xpc_dictionary_create()
224
+
225
+ with self.assertRaisesRegex(TypeError, "'int' object is not iterable"):
226
+ xpc.xpc_dictionary_create(42, [xpc.XPC_BOOL_TRUE, xpc.XPC_BOOL_FALSE], 2)
227
+
228
+ with self.assertRaisesRegex(TypeError, "'int' object is not iterable"):
229
+ xpc.xpc_dictionary_create([b"key1", b"key2"], 42, 2)
230
+
231
+ with self.assertRaisesRegex(
232
+ ValueError, "depythonifying 'unsigned long long', got 'type'"
233
+ ):
234
+ xpc.xpc_dictionary_create(
235
+ [b"key1", b"key2"], [xpc.XPC_BOOL_TRUE, xpc.XPC_BOOL_FALSE], object
236
+ )
237
+
238
+ with self.assertRaisesRegex(
239
+ ValueError, "Expecting sequence of exactly 9 items for"
240
+ ):
241
+ value = xpc.xpc_dictionary_create(
242
+ [b"key1", b"key2"], [xpc.XPC_BOOL_TRUE, xpc.XPC_BOOL_FALSE], 9
243
+ )
244
+
245
+ with self.assertRaisesRegex(
246
+ ValueError, "Expecting sequence of exactly 2 items for"
247
+ ):
248
+ value = xpc.xpc_dictionary_create(
249
+ [b"key1", b"key2"], [xpc.XPC_BOOL_TRUE], 2
250
+ )
251
+
252
+ with self.assertRaisesRegex(TypeError, "Keys should be sequence of bytes"):
253
+ value = xpc.xpc_dictionary_create(
254
+ ["key1", "key2"], [xpc.XPC_BOOL_TRUE, xpc.XPC_BOOL_FALSE], 2
255
+ )
256
+
257
+ with self.assertRaisesRegex(TypeError, "Cannot proxy"):
258
+ value = xpc.xpc_dictionary_create(
259
+ [b"key1", b"key2"], [NoObjCClass(), xpc.XPC_BOOL_FALSE], 2
260
+ )
213
261
 
214
262
  value = xpc.xpc_dictionary_create(
215
263
  [b"key1", b"key2"], [xpc.XPC_BOOL_TRUE, xpc.XPC_BOOL_FALSE], 2
@@ -1,15 +1,17 @@
1
1
  // GENERATED FILE DO NOT EDIT
2
2
  //
3
3
  // This file was generated by objective.metadata
4
- // Last update: Sun May 24 12:01:16 2026
5
4
  {
6
5
  "arch": "arm64",
7
6
  "definitions": {
8
7
  "aliases": {
8
+ "XPC_ABORTLIKE": "__abortlike",
9
+ "XPC_CONST": "const",
9
10
  "XPC_ERROR_KEY_DESCRIPTION": "_xpc_error_key_description",
10
11
  "XPC_EVENT_KEY_NAME": "_xpc_event_key_name",
11
12
  "XPC_NONNULL_ARRAY": "_Nonnull",
12
13
  "XPC_RETURNS_RETAINED": "OS_OBJECT_RETURNS_RETAINED",
14
+ "XPC_TESTCONST": "XPC_CONST",
13
15
  "XPC_TESTEXPORT": "XPC_NOEXPORT",
14
16
  "XPC_TESTNORETURN": "XPC_NORETURN"
15
17
  },
@@ -362,11 +364,14 @@
362
364
  "XPC_BRIDGEREF_BEGIN_WITH_REF": "def XPC_BRIDGEREF_BEGIN_WITH_REF(xo): return (xo)",
363
365
  "XPC_BRIDGEREF_END": "def XPC_BRIDGEREF_END(xo): return (xo)",
364
366
  "XPC_BRIDGEREF_MIDDLE": "def XPC_BRIDGEREF_MIDDLE(xo): return (xo)",
365
- "XPC_DEPRECATED": "def XPC_DEPRECATED(m): return __attribute__((deprecated(m)))",
366
- "XPC_PRINTF": "def XPC_PRINTF(m, n): return __attribute__((format(printf, m, n)))",
367
- "XPC_SWIFT_NAME": "def XPC_SWIFT_NAME(_name): return __attribute__((swift_name(_name)))",
367
+ "XPC_CONCAT": "def XPC_CONCAT(_A, _B): return XPC_CONCAT_(_A, _B)",
368
+ "XPC_CONCAT_": "def XPC_CONCAT_(_A, _B): return _A ## _B",
369
+ "XPC_DEPRECATED": "def XPC_DEPRECATED(_M): return XPC_ATTRIBUTE(deprecated, _M)",
370
+ "XPC_PRINTF": "def XPC_PRINTF(_M, _N): return XPC_ATTRIBUTE(format, printf, _M, _N)",
371
+ "XPC_RETURNS_ALIGNED": "def XPC_RETURNS_ALIGNED(_N): return XPC_ATTRIBUTE(assume_aligned, _N)",
372
+ "XPC_SWIFT_NAME": "def XPC_SWIFT_NAME(_Name): return XPC_ATTRIBUTE(swift_name, _Name)",
368
373
  "XPC_SWIFT_UNAVAILABLE": "def XPC_SWIFT_UNAVAILABLE(msg): return __swift_unavailable(msg)",
369
- "XPC_UNAVAILABLE": "def XPC_UNAVAILABLE(m): return __attribute__((unavailable(m)))",
374
+ "XPC_UNAVAILABLE": "def XPC_UNAVAILABLE(m): return XPC_ATTRIBUTE(unavailable, m)",
370
375
  "XPC_UNSAFE_FORGE_SINGLE": "def XPC_UNSAFE_FORGE_SINGLE(_type, _ptr): return ((_type)(_ptr))",
371
376
  "XPC_UNSAFE_FORGE_SIZED_BY": "def XPC_UNSAFE_FORGE_SIZED_BY(_type, _ptr, _size): return ((_type)(_ptr))",
372
377
  "_xpc_unreachable": "def _xpc_unreachable(): return __builtin_unreachable()"
@@ -3364,6 +3369,6 @@
3364
3369
  "rich_error.h",
3365
3370
  "session.h"
3366
3371
  ],
3367
- "release": "26.5",
3368
- "sdk": "/Users/ronald/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX26.5.sdk"
3372
+ "release": "macOS 27.2",
3373
+ "sdk": "Xcode 27.2 (27B5038i)/MacOSX27.sdk"
3369
3374
  }
@@ -1,15 +1,17 @@
1
1
  // GENERATED FILE DO NOT EDIT
2
2
  //
3
3
  // This file was generated by objective.metadata
4
- // Last update: Sun May 24 12:01:14 2026
5
4
  {
6
5
  "arch": "x86_64",
7
6
  "definitions": {
8
7
  "aliases": {
8
+ "XPC_ABORTLIKE": "__abortlike",
9
+ "XPC_CONST": "const",
9
10
  "XPC_ERROR_KEY_DESCRIPTION": "_xpc_error_key_description",
10
11
  "XPC_EVENT_KEY_NAME": "_xpc_event_key_name",
11
12
  "XPC_NONNULL_ARRAY": "_Nonnull",
12
13
  "XPC_RETURNS_RETAINED": "OS_OBJECT_RETURNS_RETAINED",
14
+ "XPC_TESTCONST": "XPC_CONST",
13
15
  "XPC_TESTEXPORT": "XPC_NOEXPORT",
14
16
  "XPC_TESTNORETURN": "XPC_NORETURN"
15
17
  },
@@ -362,11 +364,14 @@
362
364
  "XPC_BRIDGEREF_BEGIN_WITH_REF": "def XPC_BRIDGEREF_BEGIN_WITH_REF(xo): return (xo)",
363
365
  "XPC_BRIDGEREF_END": "def XPC_BRIDGEREF_END(xo): return (xo)",
364
366
  "XPC_BRIDGEREF_MIDDLE": "def XPC_BRIDGEREF_MIDDLE(xo): return (xo)",
365
- "XPC_DEPRECATED": "def XPC_DEPRECATED(m): return __attribute__((deprecated(m)))",
366
- "XPC_PRINTF": "def XPC_PRINTF(m, n): return __attribute__((format(printf, m, n)))",
367
- "XPC_SWIFT_NAME": "def XPC_SWIFT_NAME(_name): return __attribute__((swift_name(_name)))",
367
+ "XPC_CONCAT": "def XPC_CONCAT(_A, _B): return XPC_CONCAT_(_A, _B)",
368
+ "XPC_CONCAT_": "def XPC_CONCAT_(_A, _B): return _A ## _B",
369
+ "XPC_DEPRECATED": "def XPC_DEPRECATED(_M): return XPC_ATTRIBUTE(deprecated, _M)",
370
+ "XPC_PRINTF": "def XPC_PRINTF(_M, _N): return XPC_ATTRIBUTE(format, printf, _M, _N)",
371
+ "XPC_RETURNS_ALIGNED": "def XPC_RETURNS_ALIGNED(_N): return XPC_ATTRIBUTE(assume_aligned, _N)",
372
+ "XPC_SWIFT_NAME": "def XPC_SWIFT_NAME(_Name): return XPC_ATTRIBUTE(swift_name, _Name)",
368
373
  "XPC_SWIFT_UNAVAILABLE": "def XPC_SWIFT_UNAVAILABLE(msg): return __swift_unavailable(msg)",
369
- "XPC_UNAVAILABLE": "def XPC_UNAVAILABLE(m): return __attribute__((unavailable(m)))",
374
+ "XPC_UNAVAILABLE": "def XPC_UNAVAILABLE(m): return XPC_ATTRIBUTE(unavailable, m)",
370
375
  "XPC_UNSAFE_FORGE_SINGLE": "def XPC_UNSAFE_FORGE_SINGLE(_type, _ptr): return ((_type)(_ptr))",
371
376
  "XPC_UNSAFE_FORGE_SIZED_BY": "def XPC_UNSAFE_FORGE_SIZED_BY(_type, _ptr, _size): return ((_type)(_ptr))",
372
377
  "_xpc_unreachable": "def _xpc_unreachable(): return __builtin_unreachable()"
@@ -3364,6 +3369,6 @@
3364
3369
  "rich_error.h",
3365
3370
  "session.h"
3366
3371
  ],
3367
- "release": "26.5",
3368
- "sdk": "/Users/ronald/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX26.5.sdk"
3372
+ "release": "macOS 27.2",
3373
+ "sdk": "Xcode 27.2 (27B5038i)/MacOSX27.sdk"
3369
3374
  }
@@ -2,8 +2,6 @@
2
2
  // for information on how to update this file.
3
3
  {
4
4
  "definitions": {
5
- "classes": {},
6
- "formal_protocols": {},
7
5
  "typed_enum": {
8
6
  "xpc_activity_state_t": { "type": "q" },
9
7
  "xpc_session_create_flags_t": { "type": "q" }
@@ -277,17 +275,9 @@
277
275
  },
278
276
  "retval": { "already_retained": true }
279
277
  },
280
- "xpc_connection_get_context": {
281
- "retval": {}
282
- },
283
278
  "xpc_connection_get_name": {
284
279
  "retval": { "type_override": "^t", "c_array_delimited_by_null": true }
285
280
  },
286
- "xpc_connection_set_context": {
287
- "args": {
288
- "1": {}
289
- }
290
- },
291
281
  "xpc_connection_set_finalizer_f": {
292
282
  "args": {
293
283
  "1": {
@@ -331,7 +321,7 @@
331
321
  },
332
322
  "xpc_data_create": {
333
323
  "args": {
334
- "0": { "type_modifier": "n", "type_override": "^v", "c_array_length_in_arg": 1}
324
+ "0": { "type_modifier": "n", "c_array_length_in_arg": 1}
335
325
  },
336
326
  "retval": {
337
327
  "already_retained": true
@@ -354,10 +344,9 @@
354
344
  "retval": { "type_override": "^t", "c_array_delimited_by_null": true }
355
345
  },
356
346
  "xpc_dictionary_create": {
357
- "ignore": true,
358
347
  "args": {
359
- "0": { "c_array_length_in_arg": 2, "type_modifier": "n" },
360
- "1": { "c_array_length_in_arg": 2, "type_modifier": "n" }
348
+ "0": { "c_array_length_in_arg": 2, "type_modifier": "n", "type_override": "^^t" },
349
+ "1": { "c_array_length_in_arg": 2, "type_modifier": "n", "type_override": "^^t" }
361
350
  },
362
351
  "retval": { "already_retained": true }
363
352
  },
@@ -489,9 +478,6 @@
489
478
  "1": { "type_override": "^t", "type_modifier": "n", "c_array_delimited_by_null": true }
490
479
  }
491
480
  },
492
- "xpc_get_type": {
493
- "retval": {}
494
- },
495
481
  "xpc_main": {
496
482
  "args": {
497
483
  "0": {
@@ -623,14 +609,13 @@
623
609
  "args": {
624
610
  "0": { "type_override": "^t", "type_modifier": "n", "c_array_delimited_by_null": true, "printf_format": true }
625
611
  },
626
- "retval": { "already_retained": true },
627
- "variadic": true
612
+ "retval": { "already_retained": true }
628
613
  },
629
614
  "xpc_string_create_with_format_and_arguments": {
630
- "ignore": true,
615
+ "suggestion": "Use 'xpc.xpc_string_create_with_format' instead.",
631
616
  "args": {
632
- "0": {},
633
- "1": {}
617
+ "0": { "type_override": "^t", "type_modifier": "n", "c_array_delimited_by_null": true },
618
+ "1": { "type_override": "^v" }
634
619
  }
635
620
  },
636
621
  "xpc_string_get_string_ptr": {
@@ -640,9 +625,6 @@
640
625
  "retval": { "type_override": "^t", "c_array_delimited_by_null": true }
641
626
  },
642
627
  "xpc_type_get_name": {
643
- "args": {
644
- "0": {}
645
- },
646
628
  "retval": { "type_override": "^t", "c_array_delimited_by_null": true }
647
629
  },
648
630
  "xpc_uuid_get_bytes": {
@@ -651,7 +633,6 @@
651
633
  "xpc_connection_copy_invalidation_reason": {
652
634
  "retval": { "type_override": "^t", "c_array_delimited_by_null": true }
653
635
  }
654
- },
655
- "informal_protocols": {}
636
+ }
656
637
  }
657
638
  }
@@ -110,13 +110,11 @@ class oc_egg_info(egg_info.egg_info):
110
110
  else:
111
111
  sdk_version = os.path.basename(sdk_root)
112
112
 
113
- build_info = textwrap.dedent(
114
- f"""\
113
+ build_info = textwrap.dedent(f"""\
115
114
  macOS {macos_version} ({macos_build})
116
115
  {clang_version}
117
116
  SDK: {sdk_version}
118
- """
119
- )
117
+ """)
120
118
 
121
119
  self.write_file(
122
120
  "pyobjc-build-info.txt",
@@ -204,7 +202,7 @@ class oc_test(Command):
204
202
  "errors": len(result.errors),
205
203
  "xfails": len(getattr(result, "expectedFailures", [])),
206
204
  "xpass": len(getattr(result, "unexpectedSuccesses", [])),
207
- "skip=": len(getattr(result, "skipped", [])),
205
+ "skip": len(getattr(result, "skipped", [])),
208
206
  "testSeconds": (time_after - time_before),
209
207
  }
210
208
  print(f"SUMMARY: {summary}")
@@ -228,12 +226,12 @@ Operating System :: MacOS :: MacOS X
228
226
  Programming Language :: Python
229
227
  Programming Language :: Python :: 3
230
228
  Programming Language :: Python :: 3 :: Only
231
- Programming Language :: Python :: 3.10
232
229
  Programming Language :: Python :: 3.11
233
230
  Programming Language :: Python :: 3.12
234
231
  Programming Language :: Python :: 3.13
235
232
  Programming Language :: Python :: 3.14
236
233
  Programming Language :: Python :: 3.15
234
+ Programming Language :: Python :: 3.16
237
235
  Programming Language :: Python :: Implementation :: CPython
238
236
  Programming Language :: Python :: Free Threading :: 3 - Stable
239
237
  Programming Language :: Objective C
@@ -499,6 +497,8 @@ def Extension(*args, **kwds):
499
497
  "-DPyObjC_BUILD_RELEASE=%02d%02d"
500
498
  % (tuple(map(int, version.split(".")[:2])))
501
499
  )
500
+ ldflags.append("-isysroot")
501
+ ldflags.append(data)
502
502
  else:
503
503
  cflags.append(
504
504
  "-DPyObjC_BUILD_RELEASE=%02d%02d"
@@ -677,7 +677,7 @@ def setup(
677
677
  zip_safe=False,
678
678
  license="MIT",
679
679
  classifiers=CLASSIFIERS,
680
- python_requires=">=3.10",
680
+ python_requires=">=3.11",
681
681
  keywords=["PyObjC"] + [p for p in k["packages"] if p not in ("PyObjCTools",)],
682
682
  options=options,
683
683
  **k,
@@ -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 = "12.2.1"
18
+ VERSION = "13.0"
19
19
 
20
20
  setup(
21
21
  name="pyobjc-framework-libxpc",
@@ -1,3 +0,0 @@
1
- macOS 26.5 (25F71)
2
- Apple clang version 21.0.0 (clang-2100.1.1.101)
3
- SDK: macOS 26.5
@@ -1,2 +0,0 @@
1
- pyobjc-core>=12.2.1
2
- pyobjc-framework-Cocoa>=12.2.1