pyobjc-framework-IOBluetooth 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 (52) hide show
  1. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/Lib/IOBluetooth/_funcmacros.py +4 -4
  2. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/Lib/IOBluetooth/_metadata.py +12 -10
  3. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/Lib/pyobjc_framework_IOBluetooth.egg-info/PKG-INFO +5 -5
  4. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/Lib/pyobjc_framework_IOBluetooth.egg-info/SOURCES.txt +2 -5
  5. pyobjc_framework_iobluetooth-13.0/Lib/pyobjc_framework_IOBluetooth.egg-info/pyobjc-build-info.txt +3 -0
  6. pyobjc_framework_iobluetooth-13.0/Lib/pyobjc_framework_IOBluetooth.egg-info/requires.txt +2 -0
  7. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/Modules/_IOBluetooth.m +9 -2
  8. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/Modules/_IOBluetooth_protocols.m +8 -0
  9. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/Modules/pyobjc-api.h +18 -4
  10. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/Modules/pyobjc-compat.h +0 -18
  11. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/PKG-INFO +5 -5
  12. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/PyObjCTest/test_bluetooth.py +3 -2
  13. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/PyObjCTest/test_bluetoothassignednumbers.py +1 -1
  14. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/PyObjCTest/test_iobluetoothdevice.py +1 -1
  15. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/PyObjCTest/test_iobluetoothdeviceinquiry.py +1 -1
  16. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/PyObjCTest/test_iobluetoothdevicepair.py +1 -1
  17. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/PyObjCTest/test_iobluetoothhandsfree.py +20 -19
  18. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/PyObjCTest/test_iobluetoothhandsfreeaudiogateway.py +3 -1
  19. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/PyObjCTest/test_iobluetoothhandsfreedevice.py +1 -1
  20. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/PyObjCTest/test_iobluetoothl2capchannel.py +1 -1
  21. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/PyObjCTest/test_iobluetoothrfcommchannel.py +1 -1
  22. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/PyObjCTest/test_iobluetoothuserlib.py +21 -22
  23. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/PyObjCTest/test_obex.py +1 -2
  24. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/PyObjCTest/test_obexfiletransferservices.py +5 -4
  25. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/PyObjCTest/test_obexsession.py +1 -1
  26. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/metadata/IOBluetooth.fwinfo +34 -431
  27. pyobjc_framework_iobluetooth-12.2.1/metadata/raw/arm64-26.5.fwinfo → pyobjc_framework_iobluetooth-13.0/metadata/raw/arm64-27.fwinfo +19 -23
  28. pyobjc_framework_iobluetooth-12.2.1/metadata/raw/x86_64-26.5.fwinfo → pyobjc_framework_iobluetooth-13.0/metadata/raw/x86_64-27.fwinfo +19 -23
  29. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/pyobjc_setup.py +7 -7
  30. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/setup.py +1 -1
  31. pyobjc_framework_iobluetooth-12.2.1/Lib/pyobjc_framework_IOBluetooth.egg-info/pyobjc-build-info.txt +0 -3
  32. pyobjc_framework_iobluetooth-12.2.1/Lib/pyobjc_framework_IOBluetooth.egg-info/requires.txt +0 -2
  33. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/Lib/IOBluetooth/__init__.py +0 -0
  34. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/Lib/pyobjc_framework_IOBluetooth.egg-info/dependency_links.txt +0 -0
  35. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/Lib/pyobjc_framework_IOBluetooth.egg-info/not-zip-safe +0 -0
  36. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/Lib/pyobjc_framework_IOBluetooth.egg-info/top_level.txt +0 -0
  37. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/License.txt +0 -0
  38. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/MANIFEST.in +0 -0
  39. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/PyObjCTest/__init__.py +0 -0
  40. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/PyObjCTest/test_iobluetooth.py +0 -0
  41. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/PyObjCTest/test_iobluetoothhostcontroller.py +0 -0
  42. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/PyObjCTest/test_iobluetoothobexsession.py +0 -0
  43. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/PyObjCTest/test_iobluetoothobject.py +0 -0
  44. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/PyObjCTest/test_iobluetoothsdpdataelement.py +0 -0
  45. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/PyObjCTest/test_iobluetoothsdpservicerecord.py +0 -0
  46. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/PyObjCTest/test_iobluetoothsdpuuid.py +0 -0
  47. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/PyObjCTest/test_iobluetoothutilities.py +0 -0
  48. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/PyObjCTest/test_nsdictionaryobexextensions.py +0 -0
  49. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/PyObjCTest/test_obexbluetooth.py +0 -0
  50. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/metadata/metadata.ini +0 -0
  51. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/pyproject.toml +0 -0
  52. {pyobjc_framework_iobluetooth-12.2.1 → pyobjc_framework_iobluetooth-13.0}/setup.cfg +0 -0
@@ -103,8 +103,8 @@ def STRIP_RESPONSE_CODE_FINAL_BIT(RESPONSE_CODE):
103
103
 
104
104
  def IS_REQUEST_PDU(_pduID):
105
105
  global IOBluetooth
106
- if IOBluetooth is None:
107
- import IOBluetooth
106
+ if IOBluetooth is None: # pragma: no cover
107
+ import IOBluetooth # pragma: no cover
108
108
  return (
109
109
  (_pduID == IOBluetooth.kBluetoothSDPPDUIDServiceSearchRequest)
110
110
  or (_pduID == IOBluetooth.kBluetoothSDPPDUIDServiceAttributeRequest)
@@ -114,8 +114,8 @@ def IS_REQUEST_PDU(_pduID):
114
114
 
115
115
  def IS_RESPONSE_PDU(_pduID):
116
116
  global IOBluetooth
117
- if IOBluetooth is None:
118
- import IOBluetooth
117
+ if IOBluetooth is None: # pragma: no cover
118
+ import IOBluetooth # pragma: no cover
119
119
  return (
120
120
  (_pduID == IOBluetooth.kBluetoothSDPPDUIDErrorResponse)
121
121
  or (_pduID == IOBluetooth.kBluetoothSDPPDUIDServiceSearchResponse)
@@ -1,7 +1,5 @@
1
1
  # This file is generated by objective.metadata
2
2
  #
3
- # Last update: Thu May 28 22:05:19 2026
4
- #
5
3
  # flake8: noqa
6
4
 
7
5
  import objc, sys
@@ -1268,18 +1266,12 @@ functions = {
1268
1266
  "IOBluetoothOBEXSessionCreateWithIOBluetoothSDPServiceRecordRef": (
1269
1267
  b"i^{OpaqueIOBluetoothObjectRef=}^^{OpaqueOBEXSessionRef=}",
1270
1268
  "",
1271
- {
1272
- "retval": {"already_cfretained": True},
1273
- "arguments": {1: {"type_modifier": "o"}},
1274
- },
1269
+ {"arguments": {1: {"type_modifier": "o"}}},
1275
1270
  ),
1276
1271
  "IOBluetoothOBEXSessionCreateWithIOBluetoothDeviceRefAndChannelNumber": (
1277
1272
  b"i^{OpaqueIOBluetoothObjectRef=}C^^{OpaqueOBEXSessionRef=}",
1278
1273
  "",
1279
- {
1280
- "retval": {"already_cfretained": True},
1281
- "arguments": {2: {"type_modifier": "o"}},
1282
- },
1274
+ {"arguments": {2: {"type_modifier": "o"}}},
1283
1275
  ),
1284
1276
  "OBEXAddLengthHeader": (b"iI^{__CFDictionary=}",),
1285
1277
  "OBEXAddBodyHeader": (
@@ -2376,5 +2368,15 @@ protocols = {
2376
2368
  ),
2377
2369
  }
2378
2370
  expressions = {}
2371
+ formal_protocols = {
2372
+ "IOBluetoothDeviceAsyncCallbacks": "IOBluetoothDeviceAsyncCallbacks",
2373
+ "IOBluetoothDeviceInquiryDelegate": "IOBluetoothDeviceInquiryDelegate",
2374
+ "IOBluetoothDevicePairDelegate": "IOBluetoothDevicePairDelegate",
2375
+ "IOBluetoothHandsFreeAudioGatewayDelegate": "IOBluetoothHandsFreeAudioGatewayDelegate",
2376
+ "IOBluetoothHandsFreeDelegate": "IOBluetoothHandsFreeDelegate",
2377
+ "IOBluetoothHandsFreeDeviceDelegate": "IOBluetoothHandsFreeDeviceDelegate",
2378
+ "IOBluetoothL2CAPChannelDelegate": "IOBluetoothL2CAPChannelDelegate",
2379
+ "IOBluetoothRFCOMMChannelDelegate": "IOBluetoothRFCOMMChannelDelegate",
2380
+ }
2379
2381
 
2380
2382
  # END OF FILE
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyobjc-framework-IOBluetooth
3
- Version: 12.2.1
3
+ Version: 13.0
4
4
  Summary: Wrappers for the framework IOBluetooth 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
@@ -20,9 +20,7 @@ Modules/pyobjc-compat.h
20
20
  PyObjCTest/__init__.py
21
21
  PyObjCTest/test_bluetooth.py
22
22
  PyObjCTest/test_bluetoothassignednumbers.py
23
- PyObjCTest/test_iobLuetoothdeviceinquiry.py
24
23
  PyObjCTest/test_iobluetooth.py
25
- PyObjCTest/test_iobluetoothL2capchannel.py
26
24
  PyObjCTest/test_iobluetoothdevice.py
27
25
  PyObjCTest/test_iobluetoothdeviceinquiry.py
28
26
  PyObjCTest/test_iobluetoothdevicepair.py
@@ -35,7 +33,6 @@ PyObjCTest/test_iobluetoothobexsession.py
35
33
  PyObjCTest/test_iobluetoothobject.py
36
34
  PyObjCTest/test_iobluetoothrfcommchannel.py
37
35
  PyObjCTest/test_iobluetoothsdpdataelement.py
38
- PyObjCTest/test_iobluetoothsdpserviceRecord.py
39
36
  PyObjCTest/test_iobluetoothsdpservicerecord.py
40
37
  PyObjCTest/test_iobluetoothsdpuuid.py
41
38
  PyObjCTest/test_iobluetoothuserlib.py
@@ -47,5 +44,5 @@ PyObjCTest/test_obexfiletransferservices.py
47
44
  PyObjCTest/test_obexsession.py
48
45
  metadata/IOBluetooth.fwinfo
49
46
  metadata/metadata.ini
50
- metadata/raw/arm64-26.5.fwinfo
51
- metadata/raw/x86_64-26.5.fwinfo
47
+ metadata/raw/arm64-27.fwinfo
48
+ 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
@@ -2,6 +2,10 @@
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
  #import <Foundation/Foundation.h>
6
10
  #import <IOBluetooth/IOBluetooth.h>
7
11
 
@@ -10,6 +14,8 @@
10
14
  */
11
15
  #include "_IOBluetooth_protocols.m"
12
16
 
17
+ NS_ASSUME_NONNULL_BEGIN
18
+
13
19
  static PyMethodDef mod_methods[] = {
14
20
  {0, 0, 0, 0} /* sentinel */
15
21
  };
@@ -55,10 +61,11 @@ static struct PyModuleDef mod_module = {
55
61
  .m_free = NULL,
56
62
  };
57
63
 
58
- PyObject* PyInit__IOBluetooth(void);
64
+ PyObject* _Nullable PyInit__IOBluetooth(void);
59
65
 
60
- PyObject* __attribute__((__visibility__("default")))
66
+ PyObject* _Nullable __attribute__((__visibility__("default")))
61
67
  PyInit__IOBluetooth(void)
62
68
  {
63
69
  return PyModuleDef_Init(&mod_module);
64
70
  }
71
+ NS_ASSUME_NONNULL_END
@@ -1,3 +1,8 @@
1
+ // LCOV_EXCL_START
2
+ // This function is only present to ensure protocols are
3
+ // available at runtime.
4
+ NS_ASSUME_NONNULL_BEGIN
5
+
1
6
  static void __attribute__((__used__))
2
7
  use_protocols(void)
3
8
  {
@@ -19,3 +24,6 @@ use_protocols(void)
19
24
  p = PyObjC_IdToPython(@protocol(IOBluetoothRFCOMMChannelDelegate));
20
25
  Py_XDECREF(p);
21
26
  }
27
+
28
+ NS_ASSUME_NONNULL_END
29
+ // LCOV_EXCL_STOP
@@ -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-IOBluetooth
3
- Version: 12.2.1
3
+ Version: 13.0
4
4
  Summary: Wrappers for the framework IOBluetooth 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
@@ -4,7 +4,7 @@ import IOBluetooth
4
4
 
5
5
 
6
6
  class TestBluetooth(TestCase):
7
- def test_constants(self):
7
+ def test_enums(self):
8
8
  self.assertEqual(
9
9
  IOBluetooth.kBluetoothConnectionHandleSerialDeviceReserved, 0x0FFF
10
10
  )
@@ -700,6 +700,7 @@ class TestBluetooth(TestCase):
700
700
  IOBluetooth.BluetoothLESecurityManagerKeypressNotificationType
701
701
  )
702
702
 
703
+ self.assertIsEnumType(IOBluetooth.BluetoothAMPManagerCode)
703
704
  self.assertEqual(IOBluetooth.kBluetoothAMPManagerCodeReserved, 0x00)
704
705
  self.assertEqual(IOBluetooth.kBluetoothAMPManagerCodeAMPCommandReject, 0x01)
705
706
  self.assertEqual(IOBluetooth.kBluetoothAMPManagerCodeAMPDiscoverRequest, 0x02)
@@ -2434,7 +2435,7 @@ class TestBluetooth(TestCase):
2434
2435
  self.assertEqual(IOBluetooth.kInfoStringMaxLength, 35)
2435
2436
  self.assertEqual(IOBluetooth.kBluetoothHCIInquiryResultsMaxResults, 50)
2436
2437
 
2437
- def test_struct_tyeps(self):
2438
+ def test_structs(self):
2438
2439
  v = IOBluetooth.BluetoothDeviceAddress()
2439
2440
  self.assertIs(v.data, None)
2440
2441
 
@@ -4,7 +4,7 @@ import IOBluetooth
4
4
 
5
5
 
6
6
  class TestBluetoothAssignedNumbers(TestCase):
7
- def test_constants(self):
7
+ def test_enums(self):
8
8
  self.assertIsEnumType(IOBluetooth.BluetoothCompanyIdentifers)
9
9
  self.assertEqual(
10
10
  IOBluetooth.kBluetoothCompanyIdentiferEricssonTechnologyLicensing, 0
@@ -46,7 +46,7 @@ class TestIOBluetoothDevice(TestCase):
46
46
  )
47
47
 
48
48
  def test_protocols(self):
49
- self.assertProtocolExists("IOBluetoothDeviceAsyncCallbacks")
49
+ self.assertProtocolExists("IOBluetoothDeviceAsyncCallbacks", IOBluetooth)
50
50
 
51
51
  def test_protocol_methods(self):
52
52
  self.assertArgHasType(
@@ -17,7 +17,7 @@ class TestIOBluetoothDeviceInquiryHelper(IOBluetooth.NSObject):
17
17
 
18
18
  class TestIOBluetoothDeviceInquiry(TestCase):
19
19
  def test_protocols(self):
20
- self.assertProtocolExists("IOBluetoothDeviceInquiryDelegate")
20
+ self.assertProtocolExists("IOBluetoothDeviceInquiryDelegate", IOBluetooth)
21
21
 
22
22
  def test_protocol_methods(self):
23
23
  self.assertArgHasType(
@@ -20,7 +20,7 @@ class TestIOBluetoothDevicePairHelper(IOBluetooth.NSObject):
20
20
 
21
21
  class TestIOBluetoothDevicePair(TestCase):
22
22
  def test_protocols(self):
23
- self.assertProtocolExists("IOBluetoothDevicePairDelegate")
23
+ self.assertProtocolExists("IOBluetoothDevicePairDelegate", IOBluetooth)
24
24
 
25
25
  def test_protocol_methods(self):
26
26
  self.assertArgHasType(
@@ -4,7 +4,7 @@ import IOBluetooth
4
4
 
5
5
 
6
6
  class TestIOBluetoothHandsFree(TestCase):
7
- def test_constants(self):
7
+ def test_enums(self):
8
8
  self.assertIsEnumType(IOBluetooth.IOBluetoothHandsFreeDeviceFeatures)
9
9
  self.assertEqual(IOBluetooth.IOBluetoothHandsFreeDeviceFeatureNone, 0)
10
10
  self.assertEqual(
@@ -84,23 +84,6 @@ class TestIOBluetoothHandsFree(TestCase):
84
84
  self.assertEqual(IOBluetooth.IOBluetoothHandsFreeCodecIDmSBC, 0x02)
85
85
  self.assertEqual(IOBluetooth.IOBluetoothHandsFreeCodecIDAACELD, 0x80)
86
86
 
87
- self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeIndicatorService, str)
88
- self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeIndicatorCall, str)
89
- self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeIndicatorCallSetup, str)
90
- self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeIndicatorCallHeld, str)
91
- self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeIndicatorSignal, str)
92
- self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeIndicatorRoam, str)
93
- self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeIndicatorBattChg, str)
94
-
95
- self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeCallIndex, str)
96
- self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeCallDirection, str)
97
- self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeCallStatus, str)
98
- self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeCallMode, str)
99
- self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeCallMultiparty, str)
100
- self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeCallNumber, str)
101
- self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeCallType, str)
102
- self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeCallName, str)
103
-
104
87
  self.assertIsEnumType(IOBluetooth.IOBluetoothSMSMode)
105
88
  self.assertEqual(IOBluetooth.IOBluetoothSMSModePDU, 0)
106
89
  self.assertEqual(IOBluetooth.IOBluetoothSMSModeText, 1)
@@ -119,6 +102,24 @@ class TestIOBluetoothHandsFree(TestCase):
119
102
  self.assertEqual(IOBluetooth.IOBluetoothHandsFreePDUStatusStoSent, 3)
120
103
  self.assertEqual(IOBluetooth.IOBluetoothHandsFreePDUStatusAll, 4)
121
104
 
105
+ def test_constants(self):
106
+ self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeIndicatorService, str)
107
+ self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeIndicatorCall, str)
108
+ self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeIndicatorCallSetup, str)
109
+ self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeIndicatorCallHeld, str)
110
+ self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeIndicatorSignal, str)
111
+ self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeIndicatorRoam, str)
112
+ self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeIndicatorBattChg, str)
113
+
114
+ self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeCallIndex, str)
115
+ self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeCallDirection, str)
116
+ self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeCallStatus, str)
117
+ self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeCallMode, str)
118
+ self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeCallMultiparty, str)
119
+ self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeCallNumber, str)
120
+ self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeCallType, str)
121
+ self.assertIsInstance(IOBluetooth.IOBluetoothHandsFreeCallName, str)
122
+
122
123
  self.assertIsInstance(IOBluetooth.IOBluetoothPDUServicCenterAddress, str)
123
124
  self.assertIsInstance(IOBluetooth.IOBluetoothPDUServiceCenterAddressType, str)
124
125
  self.assertIsInstance(IOBluetooth.IOBluetoothPDUType, str)
@@ -130,7 +131,7 @@ class TestIOBluetoothHandsFree(TestCase):
130
131
  self.assertIsInstance(IOBluetooth.IOBluetoothPDUUserData, str)
131
132
 
132
133
  def test_protocols(self):
133
- self.assertProtocolExists("IOBluetoothHandsFreeDelegate")
134
+ self.assertProtocolExists("IOBluetoothHandsFreeDelegate", IOBluetooth)
134
135
 
135
136
  def test_methods(self):
136
137
  self.assertResultIsBOOL(IOBluetooth.IOBluetoothHandsFree.isInputMuted)
@@ -5,4 +5,6 @@ import IOBluetooth # noqa: F401
5
5
 
6
6
  class TestIOBluetoothHandsFreeAudioGateway(TestCase):
7
7
  def test_protocols(self):
8
- self.assertProtocolExists("IOBluetoothHandsFreeAudioGatewayDelegate")
8
+ self.assertProtocolExists(
9
+ "IOBluetoothHandsFreeAudioGatewayDelegate", IOBluetooth
10
+ )
@@ -5,4 +5,4 @@ import IOBluetooth # noqa: F401
5
5
 
6
6
  class TestIOBluetoothHandsFreeDevice(TestCase):
7
7
  def test_protocols(self):
8
- self.assertProtocolExists("IOBluetoothHandsFreeDeviceDelegate")
8
+ self.assertProtocolExists("IOBluetoothHandsFreeDeviceDelegate", IOBluetooth)
@@ -26,7 +26,7 @@ class TestIOBluetoothL2CAPChannel(TestCase):
26
26
  )
27
27
 
28
28
  def test_protocols(self):
29
- self.assertProtocolExists("IOBluetoothL2CAPChannelDelegate")
29
+ self.assertProtocolExists("IOBluetoothL2CAPChannelDelegate", IOBluetooth)
30
30
 
31
31
  def test_protocol_methods(self):
32
32
  self.assertArgHasType(
@@ -20,7 +20,7 @@ class TestIOBluetoothRFCOMMChannelHelper(IOBluetooth.NSObject):
20
20
 
21
21
  class TestIOBluetoothRFCOMMChannel(TestCase):
22
22
  def test_protocols(self):
23
- self.assertProtocolExists("IOBluetoothRFCOMMChannelDelegate")
23
+ self.assertProtocolExists("IOBluetoothRFCOMMChannelDelegate", IOBluetooth)
24
24
 
25
25
  def test_protocol_methods(self):
26
26
  self.assertArgHasType(
@@ -2,13 +2,33 @@ from PyObjCTools.TestSupport import TestCase
2
2
 
3
3
  import IOBluetooth
4
4
 
5
-
6
5
  IOBluetoothUserNotificationCallback = (
7
6
  b"v^v^{OpaqueIOBluetoothObjectRef=}^{OpaqueIOBluetoothObjectRef=}"
8
7
  )
9
8
 
10
9
 
11
10
  class TestIOBluetoothUserLib(TestCase):
11
+ def test_enums(self):
12
+ self.assertEqual(IOBluetooth.kIOBluetoothObjectIDNULL, 0)
13
+
14
+ self.assertIsEnumType(IOBluetooth.IOBluetoothDeviceSearchOptionsBits)
15
+ self.assertEqual(IOBluetooth.kSearchOptionsNone, 0)
16
+ self.assertEqual(IOBluetooth.kSearchOptionsAlwaysStartInquiry, 1 << 0)
17
+ self.assertEqual(IOBluetooth.kSearchOptionsDiscardCachedResults, 1 << 1)
18
+
19
+ self.assertIsEnumType(IOBluetooth.IOBluetoothDeviceSearchTypesBits)
20
+ self.assertEqual(IOBluetooth.kIOBluetoothDeviceSearchClassic, 1)
21
+ self.assertEqual(IOBluetooth.kIOBluetoothDeviceSearchLE, 2)
22
+
23
+ self.assertIsEnumType(IOBluetooth.IOBluetoothUserNotificationChannelDirection)
24
+ self.assertEqual(IOBluetooth.kIOBluetoothUserNotificationChannelDirectionAny, 0)
25
+ self.assertEqual(
26
+ IOBluetooth.kIOBluetoothUserNotificationChannelDirectionIncoming, 1
27
+ )
28
+ self.assertEqual(
29
+ IOBluetooth.kIOBluetoothUserNotificationChannelDirectionOutgoing, 2
30
+ )
31
+
12
32
  def test_types(self):
13
33
  self.assertIsOpaquePointer(IOBluetooth.IOBluetoothObjectRef)
14
34
  self.assertIs(
@@ -33,27 +53,6 @@ class TestIOBluetoothUserLib(TestCase):
33
53
  IOBluetooth.IOBluetoothUserNotificationRef, IOBluetooth.IOBluetoothObjectRef
34
54
  )
35
55
 
36
- def test_constants(self):
37
- self.assertEqual(IOBluetooth.kIOBluetoothObjectIDNULL, 0)
38
-
39
- self.assertIsEnumType(IOBluetooth.IOBluetoothDeviceSearchOptionsBits)
40
- self.assertEqual(IOBluetooth.kSearchOptionsNone, 0)
41
- self.assertEqual(IOBluetooth.kSearchOptionsAlwaysStartInquiry, 1 << 0)
42
- self.assertEqual(IOBluetooth.kSearchOptionsDiscardCachedResults, 1 << 1)
43
-
44
- self.assertIsEnumType(IOBluetooth.IOBluetoothDeviceSearchTypesBits)
45
- self.assertEqual(IOBluetooth.kIOBluetoothDeviceSearchClassic, 1)
46
- self.assertEqual(IOBluetooth.kIOBluetoothDeviceSearchLE, 2)
47
-
48
- self.assertIsEnumType(IOBluetooth.IOBluetoothUserNotificationChannelDirection)
49
- self.assertEqual(IOBluetooth.kIOBluetoothUserNotificationChannelDirectionAny, 0)
50
- self.assertEqual(
51
- IOBluetooth.kIOBluetoothUserNotificationChannelDirectionIncoming, 1
52
- )
53
- self.assertEqual(
54
- IOBluetooth.kIOBluetoothUserNotificationChannelDirectionOutgoing, 2
55
- )
56
-
57
56
  def test_structs(self):
58
57
  v = IOBluetooth.IOBluetoothDeviceSearchDeviceAttributes()
59
58
  self.assertEqual(v.address, IOBluetooth.BluetoothDeviceAddress())
@@ -8,9 +8,8 @@ OBEXSessionEventCallback = b"vn^v"
8
8
 
9
9
 
10
10
  class TestOBEX(TestCase):
11
- def test_constants(self):
11
+ def test_enums(self):
12
12
  self.assertIsEnumType(IOBluetooth.OBEXErrorCodes)
13
-
14
13
  self.assertEqual(IOBluetooth.kOBEXErrorRangeMin, -21850)
15
14
  self.assertEqual(IOBluetooth.kOBEXErrorRangeMax, -21899)
16
15
  self.assertEqual(IOBluetooth.kOBEXSuccess, 0)
@@ -4,6 +4,11 @@ import IOBluetooth
4
4
 
5
5
 
6
6
  class TestOBEXFileTransferServices(TestCase):
7
+ def test_enums(self):
8
+ self.assertIsEnumType(IOBluetooth.FTSFileType)
9
+ self.assertEqual(IOBluetooth.kFTSFileTypeFolder, 1)
10
+ self.assertEqual(IOBluetooth.kFTSFileTypeFile, 2)
11
+
7
12
  def test_constants(self):
8
13
  self.assertIsInstance(IOBluetooth.kFTSProgressBytesTransferredKey, str)
9
14
  self.assertIsInstance(IOBluetooth.kFTSProgressBytesTotalKey, str)
@@ -16,10 +21,6 @@ class TestOBEXFileTransferServices(TestCase):
16
21
  self.assertIsInstance(IOBluetooth.kFTSListingTypeKey, str)
17
22
  self.assertIsInstance(IOBluetooth.kFTSListingSizeKey, str)
18
23
 
19
- self.assertIsEnumType(IOBluetooth.FTSFileType)
20
- self.assertEqual(IOBluetooth.kFTSFileTypeFolder, 1)
21
- self.assertEqual(IOBluetooth.kFTSFileTypeFile, 2)
22
-
23
24
  def test_methods(self):
24
25
  self.assertResultIsBOOL(IOBluetooth.OBEXFileTransferServices.isBusy)
25
26
  self.assertResultIsBOOL(IOBluetooth.OBEXFileTransferServices.isConnected)
@@ -4,7 +4,7 @@ import IOBluetooth
4
4
 
5
5
 
6
6
  class TestOBEXSession(TestCase):
7
- def test_constants(self):
7
+ def test_enums(self):
8
8
  self.assertIsEnumType(IOBluetooth.OBEXTransportEventType)
9
9
  self.assertEqual(
10
10
  IOBluetooth.kOBEXTransportEventTypeDataReceived, fourcc(b"DatA")