pyobjc-framework-ServiceManagement 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_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/LICENSE.txt +1 -1
  2. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/Lib/ServiceManagement/_metadata.py +2 -2
  3. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/Lib/pyobjc_framework_ServiceManagement.egg-info/PKG-INFO +20 -8
  4. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/Lib/pyobjc_framework_ServiceManagement.egg-info/SOURCES.txt +4 -1
  5. pyobjc_framework_servicemanagement-11.1/Lib/pyobjc_framework_ServiceManagement.egg-info/pyobjc-build-info.txt +3 -0
  6. pyobjc_framework_servicemanagement-11.1/Lib/pyobjc_framework_ServiceManagement.egg-info/requires.txt +2 -0
  7. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/PKG-INFO +20 -8
  8. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/PyObjCTest/test_smappservice.py +4 -0
  9. pyobjc_framework_servicemanagement-11.1/metadata/raw/arm64-15.0.fwinfo +385 -0
  10. pyobjc_framework_servicemanagement-11.1/metadata/raw/x86_64-15.0.fwinfo +385 -0
  11. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/pyobjc_setup.py +73 -53
  12. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/setup.py +1 -1
  13. pyobjc_framework_servicemanagement-10.3.2/Lib/pyobjc_framework_ServiceManagement.egg-info/requires.txt +0 -2
  14. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/Lib/ServiceManagement/__init__.py +0 -0
  15. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/Lib/pyobjc_framework_ServiceManagement.egg-info/dependency_links.txt +0 -0
  16. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/Lib/pyobjc_framework_ServiceManagement.egg-info/not-zip-safe +0 -0
  17. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/Lib/pyobjc_framework_ServiceManagement.egg-info/top_level.txt +0 -0
  18. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/MANIFEST.in +0 -0
  19. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/PyObjCTest/__init__.py +0 -0
  20. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/PyObjCTest/test_servicemanagement.py +0 -0
  21. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/PyObjCTest/test_smerrors.py +0 -0
  22. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/PyObjCTest/test_smloginitem.py +0 -0
  23. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/README.txt +0 -0
  24. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/metadata/ServiceManagement.fwinfo +0 -0
  25. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/metadata/metadata.ini +0 -0
  26. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/metadata/raw/arm64-12.3.fwinfo +0 -0
  27. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/metadata/raw/arm64-13.0.fwinfo +0 -0
  28. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/metadata/raw/arm64-14.5.fwinfo +0 -0
  29. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/metadata/raw/x86_64-10.10.fwinfo +0 -0
  30. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/metadata/raw/x86_64-10.16.fwinfo +0 -0
  31. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/metadata/raw/x86_64-10.6.fwinfo +0 -0
  32. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/metadata/raw/x86_64-10.7.fwinfo +0 -0
  33. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/metadata/raw/x86_64-10.8.fwinfo +0 -0
  34. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/metadata/raw/x86_64-12.3.fwinfo +0 -0
  35. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/metadata/raw/x86_64-13.0.fwinfo +0 -0
  36. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/metadata/raw/x86_64-14.5.fwinfo +0 -0
  37. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/pyproject.toml +0 -0
  38. {pyobjc_framework_servicemanagement-10.3.2 → pyobjc_framework_servicemanagement-11.1}/setup.cfg +0 -0
@@ -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,6 @@
1
1
  # This file is generated by objective.metadata
2
2
  #
3
- # Last update: Sat May 18 09:36:49 2024
3
+ # Last update: Tue Jun 11 10:20:00 2024
4
4
  #
5
5
  # flake8: noqa
6
6
 
@@ -30,7 +30,7 @@ else:
30
30
 
31
31
 
32
32
  misc = {}
33
- constants = """$kSMDomainSystemLaunchd$kSMDomainUserLaunchd$kSMErrorDomainFramework$kSMErrorDomainIPC$kSMErrorDomainLaunchd$kSMInfoKeyAuthorizedClients$kSMInfoKeyPrivilegedExecutables$"""
33
+ constants = """$SMAppServiceErrorDomain$kSMDomainSystemLaunchd$kSMDomainUserLaunchd$kSMErrorDomainFramework$kSMErrorDomainIPC$kSMErrorDomainLaunchd$kSMInfoKeyAuthorizedClients$kSMInfoKeyPrivilegedExecutables$"""
34
34
  enums = """$SMAppServiceStatusEnabled@1$SMAppServiceStatusNotFound@3$SMAppServiceStatusNotRegistered@0$SMAppServiceStatusRequiresApproval@2$kSMErrorAlreadyRegistered@12$kSMErrorAuthorizationFailure@4$kSMErrorInternalFailure@2$kSMErrorInvalidPlist@10$kSMErrorInvalidSignature@3$kSMErrorJobMustBeEnabled@9$kSMErrorJobNotFound@6$kSMErrorJobPlistNotFound@8$kSMErrorLaunchDeniedByUser@11$kSMErrorServiceUnavailable@7$kSMErrorToolNotValid@5$"""
35
35
  misc.update({"SMAppServiceStatus": NewType("SMAppServiceStatus", int)})
36
36
  misc.update({})
@@ -1,38 +1,50 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: pyobjc-framework-ServiceManagement
3
- Version: 10.3.2
3
+ Version: 11.1
4
4
  Summary: Wrappers for the framework ServiceManagement 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,ServiceManagement
10
10
  Platform: MacOS X (>=10.6)
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
32
  License-File: LICENSE.txt
34
- Requires-Dist: pyobjc-core>=10.3.2
35
- Requires-Dist: pyobjc-framework-Cocoa>=10.3.2
33
+ Requires-Dist: pyobjc-core>=11.1
34
+ Requires-Dist: pyobjc-framework-Cocoa>=11.1
35
+ Dynamic: author
36
+ Dynamic: author-email
37
+ Dynamic: classifier
38
+ Dynamic: description
39
+ Dynamic: description-content-type
40
+ Dynamic: home-page
41
+ Dynamic: keywords
42
+ Dynamic: license
43
+ Dynamic: license-file
44
+ Dynamic: platform
45
+ Dynamic: requires-dist
46
+ Dynamic: requires-python
47
+ Dynamic: summary
36
48
  Project-URL: Documentation, https://pyobjc.readthedocs.io/en/latest/
37
49
  Project-URL: Issue tracker, https://github.com/ronaldoussoren/pyobjc/issues
38
50
  Project-URL: Repository, https://github.com/ronaldoussoren/pyobjc
@@ -10,6 +10,7 @@ Lib/pyobjc_framework_ServiceManagement.egg-info/PKG-INFO
10
10
  Lib/pyobjc_framework_ServiceManagement.egg-info/SOURCES.txt
11
11
  Lib/pyobjc_framework_ServiceManagement.egg-info/dependency_links.txt
12
12
  Lib/pyobjc_framework_ServiceManagement.egg-info/not-zip-safe
13
+ Lib/pyobjc_framework_ServiceManagement.egg-info/pyobjc-build-info.txt
13
14
  Lib/pyobjc_framework_ServiceManagement.egg-info/requires.txt
14
15
  Lib/pyobjc_framework_ServiceManagement.egg-info/top_level.txt
15
16
  PyObjCTest/__init__.py
@@ -22,6 +23,7 @@ metadata/metadata.ini
22
23
  metadata/raw/arm64-12.3.fwinfo
23
24
  metadata/raw/arm64-13.0.fwinfo
24
25
  metadata/raw/arm64-14.5.fwinfo
26
+ metadata/raw/arm64-15.0.fwinfo
25
27
  metadata/raw/x86_64-10.10.fwinfo
26
28
  metadata/raw/x86_64-10.16.fwinfo
27
29
  metadata/raw/x86_64-10.6.fwinfo
@@ -29,4 +31,5 @@ metadata/raw/x86_64-10.7.fwinfo
29
31
  metadata/raw/x86_64-10.8.fwinfo
30
32
  metadata/raw/x86_64-12.3.fwinfo
31
33
  metadata/raw/x86_64-13.0.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,38 +1,50 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: pyobjc-framework-ServiceManagement
3
- Version: 10.3.2
3
+ Version: 11.1
4
4
  Summary: Wrappers for the framework ServiceManagement 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,ServiceManagement
10
10
  Platform: MacOS X (>=10.6)
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
32
  License-File: LICENSE.txt
34
- Requires-Dist: pyobjc-core>=10.3.2
35
- Requires-Dist: pyobjc-framework-Cocoa>=10.3.2
33
+ Requires-Dist: pyobjc-core>=11.1
34
+ Requires-Dist: pyobjc-framework-Cocoa>=11.1
35
+ Dynamic: author
36
+ Dynamic: author-email
37
+ Dynamic: classifier
38
+ Dynamic: description
39
+ Dynamic: description-content-type
40
+ Dynamic: home-page
41
+ Dynamic: keywords
42
+ Dynamic: license
43
+ Dynamic: license-file
44
+ Dynamic: platform
45
+ Dynamic: requires-dist
46
+ Dynamic: requires-python
47
+ Dynamic: summary
36
48
 
37
49
 
38
50
  Wrappers for framework 'ServiceManagement' on macOS 10.6. This framework
@@ -10,6 +10,10 @@ class TestSMAppService(TestCase):
10
10
  self.assertEqual(ServiceManagement.SMAppServiceStatusRequiresApproval, 2)
11
11
  self.assertEqual(ServiceManagement.SMAppServiceStatusNotFound, 3)
12
12
 
13
+ @min_os_level("15.0")
14
+ def test_constants15_0(self):
15
+ self.assertIsInstance(ServiceManagement.SMAppServiceErrorDomain, str)
16
+
13
17
  @min_os_level("13.0")
14
18
  def test_methods13_0(self):
15
19
  self.assertResultIsBOOL(ServiceManagement.SMAppService.registerAndReturnError_)
@@ -0,0 +1,385 @@
1
+ // GENERATED FILE DO NOT EDIT
2
+ //
3
+ // This file was generated by objective.metadata
4
+ // Last update: Tue Jun 11 10:20:00 2024
5
+ {
6
+ "arch": "arm64",
7
+ "definitions": {
8
+ "aliases": {},
9
+ "called_definitions": {},
10
+ "cftypes": {},
11
+ "classes": {
12
+ "SMAppService": {
13
+ "categories": [],
14
+ "methods": [
15
+ {
16
+ "args": [
17
+ {
18
+ "typestr": "@",
19
+ "typestr_special": false
20
+ }
21
+ ],
22
+ "class_method": true,
23
+ "retval": {
24
+ "typestr": "@",
25
+ "typestr_special": false
26
+ },
27
+ "selector": "loginItemServiceWithIdentifier:",
28
+ "visibility": "public"
29
+ },
30
+ {
31
+ "args": [
32
+ {
33
+ "typestr": "@",
34
+ "typestr_special": false
35
+ }
36
+ ],
37
+ "class_method": true,
38
+ "retval": {
39
+ "typestr": "@",
40
+ "typestr_special": false
41
+ },
42
+ "selector": "agentServiceWithPlistName:",
43
+ "visibility": "public"
44
+ },
45
+ {
46
+ "args": [
47
+ {
48
+ "typestr": "@",
49
+ "typestr_special": false
50
+ }
51
+ ],
52
+ "class_method": true,
53
+ "retval": {
54
+ "typestr": "@",
55
+ "typestr_special": false
56
+ },
57
+ "selector": "daemonServiceWithPlistName:",
58
+ "visibility": "public"
59
+ },
60
+ {
61
+ "args": [
62
+ {
63
+ "type_modifier": "o",
64
+ "typestr": "^@",
65
+ "typestr_special": false
66
+ }
67
+ ],
68
+ "class_method": false,
69
+ "retval": {
70
+ "typestr": "Z",
71
+ "typestr_special": true
72
+ },
73
+ "selector": "registerAndReturnError:",
74
+ "visibility": "public"
75
+ },
76
+ {
77
+ "args": [
78
+ {
79
+ "type_modifier": "o",
80
+ "typestr": "^@",
81
+ "typestr_special": false
82
+ }
83
+ ],
84
+ "class_method": false,
85
+ "retval": {
86
+ "typestr": "Z",
87
+ "typestr_special": true
88
+ },
89
+ "selector": "unregisterAndReturnError:",
90
+ "visibility": "public"
91
+ },
92
+ {
93
+ "args": [
94
+ {
95
+ "callable": {
96
+ "arguments": {
97
+ "0": {
98
+ "type": "^v"
99
+ },
100
+ "1": {
101
+ "type": "@"
102
+ }
103
+ },
104
+ "retval": {
105
+ "type": "v"
106
+ }
107
+ },
108
+ "typestr": "@?",
109
+ "typestr_special": false
110
+ }
111
+ ],
112
+ "class_method": false,
113
+ "retval": {
114
+ "typestr": "v",
115
+ "typestr_special": false
116
+ },
117
+ "selector": "unregisterWithCompletionHandler:",
118
+ "visibility": "public"
119
+ },
120
+ {
121
+ "args": [
122
+ {
123
+ "typestr": "@",
124
+ "typestr_special": false
125
+ }
126
+ ],
127
+ "class_method": true,
128
+ "retval": {
129
+ "typestr": "q",
130
+ "typestr_special": false
131
+ },
132
+ "selector": "statusForLegacyURL:",
133
+ "visibility": "public"
134
+ },
135
+ {
136
+ "args": [],
137
+ "class_method": true,
138
+ "retval": {
139
+ "typestr": "v",
140
+ "typestr_special": false
141
+ },
142
+ "selector": "openSystemSettingsLoginItems",
143
+ "visibility": "public"
144
+ },
145
+ {
146
+ "args": [],
147
+ "class_method": true,
148
+ "retval": {
149
+ "typestr": "@",
150
+ "typestr_special": false
151
+ },
152
+ "selector": "mainAppService",
153
+ "visibility": "public"
154
+ },
155
+ {
156
+ "args": [],
157
+ "class_method": false,
158
+ "retval": {
159
+ "typestr": "q",
160
+ "typestr_special": false
161
+ },
162
+ "selector": "status",
163
+ "visibility": "public"
164
+ }
165
+ ],
166
+ "name": "SMAppService",
167
+ "properties": [
168
+ {
169
+ "attributes": [
170
+ "readonly"
171
+ ],
172
+ "name": "mainAppService",
173
+ "typestr": "@",
174
+ "typestr_special": false
175
+ },
176
+ {
177
+ "attributes": [
178
+ "readonly"
179
+ ],
180
+ "name": "status",
181
+ "typestr": "q",
182
+ "typestr_special": false
183
+ }
184
+ ],
185
+ "protocols": [],
186
+ "super": "NSObject"
187
+ }
188
+ },
189
+ "enum": {
190
+ "SMAppServiceStatusEnabled": 1,
191
+ "SMAppServiceStatusNotFound": 3,
192
+ "SMAppServiceStatusNotRegistered": 0,
193
+ "SMAppServiceStatusRequiresApproval": 2,
194
+ "kSMErrorAlreadyRegistered": 12,
195
+ "kSMErrorAuthorizationFailure": 4,
196
+ "kSMErrorInternalFailure": 2,
197
+ "kSMErrorInvalidPlist": 10,
198
+ "kSMErrorInvalidSignature": 3,
199
+ "kSMErrorJobMustBeEnabled": 9,
200
+ "kSMErrorJobNotFound": 6,
201
+ "kSMErrorJobPlistNotFound": 8,
202
+ "kSMErrorLaunchDeniedByUser": 11,
203
+ "kSMErrorServiceUnavailable": 7,
204
+ "kSMErrorToolNotValid": 5
205
+ },
206
+ "enum_type": {
207
+ "SMAppServiceStatus": {
208
+ "type": "q"
209
+ }
210
+ },
211
+ "expressions": {},
212
+ "externs": {
213
+ "SMAppServiceErrorDomain": {
214
+ "typestr": "@"
215
+ },
216
+ "kSMDomainSystemLaunchd": {
217
+ "typestr": "^{__CFString=}"
218
+ },
219
+ "kSMDomainUserLaunchd": {
220
+ "typestr": "^{__CFString=}"
221
+ },
222
+ "kSMErrorDomainFramework": {
223
+ "typestr": "^{__CFString=}"
224
+ },
225
+ "kSMErrorDomainIPC": {
226
+ "typestr": "^{__CFString=}"
227
+ },
228
+ "kSMErrorDomainLaunchd": {
229
+ "typestr": "^{__CFString=}"
230
+ }
231
+ },
232
+ "formal_protocols": {},
233
+ "func_macros": {},
234
+ "functions": {
235
+ "SMCopyAllJobDictionaries": {
236
+ "args": [
237
+ {
238
+ "name": "domain",
239
+ "typestr": "^{__CFString=}"
240
+ }
241
+ ],
242
+ "retval": {
243
+ "already_cfretained": true,
244
+ "typestr": "^{__CFArray=}"
245
+ }
246
+ },
247
+ "SMJobBless": {
248
+ "args": [
249
+ {
250
+ "name": "domain",
251
+ "typestr": "^{__CFString=}"
252
+ },
253
+ {
254
+ "name": "executableLabel",
255
+ "typestr": "^{__CFString=}"
256
+ },
257
+ {
258
+ "name": "auth",
259
+ "typestr": "^{AuthorizationOpaqueRef=}"
260
+ },
261
+ {
262
+ "already_cfretained": true,
263
+ "name": "outError",
264
+ "null_accepted": true,
265
+ "type_modifier": "o",
266
+ "typestr": "^^{__CFError=}"
267
+ }
268
+ ],
269
+ "retval": {
270
+ "typestr": "Z"
271
+ }
272
+ },
273
+ "SMJobCopyDictionary": {
274
+ "args": [
275
+ {
276
+ "name": "domain",
277
+ "typestr": "^{__CFString=}"
278
+ },
279
+ {
280
+ "name": "jobLabel",
281
+ "typestr": "^{__CFString=}"
282
+ }
283
+ ],
284
+ "retval": {
285
+ "already_cfretained": true,
286
+ "typestr": "^{__CFDictionary=}"
287
+ }
288
+ },
289
+ "SMJobRemove": {
290
+ "args": [
291
+ {
292
+ "name": "domain",
293
+ "typestr": "^{__CFString=}"
294
+ },
295
+ {
296
+ "name": "jobLabel",
297
+ "typestr": "^{__CFString=}"
298
+ },
299
+ {
300
+ "name": "auth",
301
+ "typestr": "^{AuthorizationOpaqueRef=}"
302
+ },
303
+ {
304
+ "name": "wait",
305
+ "typestr": "Z"
306
+ },
307
+ {
308
+ "already_cfretained": true,
309
+ "name": "outError",
310
+ "null_accepted": true,
311
+ "type_modifier": "o",
312
+ "typestr": "^^{__CFError=}"
313
+ }
314
+ ],
315
+ "retval": {
316
+ "typestr": "Z"
317
+ }
318
+ },
319
+ "SMJobSubmit": {
320
+ "args": [
321
+ {
322
+ "name": "domain",
323
+ "typestr": "^{__CFString=}"
324
+ },
325
+ {
326
+ "name": "job",
327
+ "typestr": "^{__CFDictionary=}"
328
+ },
329
+ {
330
+ "name": "auth",
331
+ "typestr": "^{AuthorizationOpaqueRef=}"
332
+ },
333
+ {
334
+ "already_cfretained": true,
335
+ "name": "outError",
336
+ "null_accepted": true,
337
+ "type_modifier": "o",
338
+ "typestr": "^^{__CFError=}"
339
+ }
340
+ ],
341
+ "retval": {
342
+ "typestr": "Z"
343
+ }
344
+ },
345
+ "SMLoginItemSetEnabled": {
346
+ "args": [
347
+ {
348
+ "name": "identifier",
349
+ "typestr": "^{__CFString=}"
350
+ },
351
+ {
352
+ "name": "enabled",
353
+ "typestr": "Z"
354
+ }
355
+ ],
356
+ "retval": {
357
+ "typestr": "Z"
358
+ }
359
+ }
360
+ },
361
+ "informal_protocols": {},
362
+ "literals": {
363
+ "kSMRightBlessPrivilegedHelper": {
364
+ "unicode": false,
365
+ "value": "com.apple.ServiceManagement.blesshelper"
366
+ },
367
+ "kSMRightModifySystemDaemons": {
368
+ "unicode": false,
369
+ "value": "com.apple.ServiceManagement.daemons.modify"
370
+ }
371
+ },
372
+ "structs": {},
373
+ "typedefs": {
374
+ "SMAppServiceStatus": "enum SMAppServiceStatus"
375
+ }
376
+ },
377
+ "framework": "ServiceManagement",
378
+ "headers": [
379
+ "SMAppService.h",
380
+ "SMErrors.h",
381
+ "SMLoginItem.h"
382
+ ],
383
+ "release": "10.16",
384
+ "sdk": "/Users/ronald/Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.0.sdk"
385
+ }
@@ -0,0 +1,385 @@
1
+ // GENERATED FILE DO NOT EDIT
2
+ //
3
+ // This file was generated by objective.metadata
4
+ // Last update: Tue Jun 11 10:19:58 2024
5
+ {
6
+ "arch": "x86_64",
7
+ "definitions": {
8
+ "aliases": {},
9
+ "called_definitions": {},
10
+ "cftypes": {},
11
+ "classes": {
12
+ "SMAppService": {
13
+ "categories": [],
14
+ "methods": [
15
+ {
16
+ "args": [
17
+ {
18
+ "typestr": "@",
19
+ "typestr_special": false
20
+ }
21
+ ],
22
+ "class_method": true,
23
+ "retval": {
24
+ "typestr": "@",
25
+ "typestr_special": false
26
+ },
27
+ "selector": "loginItemServiceWithIdentifier:",
28
+ "visibility": "public"
29
+ },
30
+ {
31
+ "args": [
32
+ {
33
+ "typestr": "@",
34
+ "typestr_special": false
35
+ }
36
+ ],
37
+ "class_method": true,
38
+ "retval": {
39
+ "typestr": "@",
40
+ "typestr_special": false
41
+ },
42
+ "selector": "agentServiceWithPlistName:",
43
+ "visibility": "public"
44
+ },
45
+ {
46
+ "args": [
47
+ {
48
+ "typestr": "@",
49
+ "typestr_special": false
50
+ }
51
+ ],
52
+ "class_method": true,
53
+ "retval": {
54
+ "typestr": "@",
55
+ "typestr_special": false
56
+ },
57
+ "selector": "daemonServiceWithPlistName:",
58
+ "visibility": "public"
59
+ },
60
+ {
61
+ "args": [
62
+ {
63
+ "type_modifier": "o",
64
+ "typestr": "^@",
65
+ "typestr_special": false
66
+ }
67
+ ],
68
+ "class_method": false,
69
+ "retval": {
70
+ "typestr": "Z",
71
+ "typestr_special": true
72
+ },
73
+ "selector": "registerAndReturnError:",
74
+ "visibility": "public"
75
+ },
76
+ {
77
+ "args": [
78
+ {
79
+ "type_modifier": "o",
80
+ "typestr": "^@",
81
+ "typestr_special": false
82
+ }
83
+ ],
84
+ "class_method": false,
85
+ "retval": {
86
+ "typestr": "Z",
87
+ "typestr_special": true
88
+ },
89
+ "selector": "unregisterAndReturnError:",
90
+ "visibility": "public"
91
+ },
92
+ {
93
+ "args": [
94
+ {
95
+ "callable": {
96
+ "arguments": {
97
+ "0": {
98
+ "type": "^v"
99
+ },
100
+ "1": {
101
+ "type": "@"
102
+ }
103
+ },
104
+ "retval": {
105
+ "type": "v"
106
+ }
107
+ },
108
+ "typestr": "@?",
109
+ "typestr_special": false
110
+ }
111
+ ],
112
+ "class_method": false,
113
+ "retval": {
114
+ "typestr": "v",
115
+ "typestr_special": false
116
+ },
117
+ "selector": "unregisterWithCompletionHandler:",
118
+ "visibility": "public"
119
+ },
120
+ {
121
+ "args": [
122
+ {
123
+ "typestr": "@",
124
+ "typestr_special": false
125
+ }
126
+ ],
127
+ "class_method": true,
128
+ "retval": {
129
+ "typestr": "q",
130
+ "typestr_special": false
131
+ },
132
+ "selector": "statusForLegacyURL:",
133
+ "visibility": "public"
134
+ },
135
+ {
136
+ "args": [],
137
+ "class_method": true,
138
+ "retval": {
139
+ "typestr": "v",
140
+ "typestr_special": false
141
+ },
142
+ "selector": "openSystemSettingsLoginItems",
143
+ "visibility": "public"
144
+ },
145
+ {
146
+ "args": [],
147
+ "class_method": true,
148
+ "retval": {
149
+ "typestr": "@",
150
+ "typestr_special": false
151
+ },
152
+ "selector": "mainAppService",
153
+ "visibility": "public"
154
+ },
155
+ {
156
+ "args": [],
157
+ "class_method": false,
158
+ "retval": {
159
+ "typestr": "q",
160
+ "typestr_special": false
161
+ },
162
+ "selector": "status",
163
+ "visibility": "public"
164
+ }
165
+ ],
166
+ "name": "SMAppService",
167
+ "properties": [
168
+ {
169
+ "attributes": [
170
+ "readonly"
171
+ ],
172
+ "name": "mainAppService",
173
+ "typestr": "@",
174
+ "typestr_special": false
175
+ },
176
+ {
177
+ "attributes": [
178
+ "readonly"
179
+ ],
180
+ "name": "status",
181
+ "typestr": "q",
182
+ "typestr_special": false
183
+ }
184
+ ],
185
+ "protocols": [],
186
+ "super": "NSObject"
187
+ }
188
+ },
189
+ "enum": {
190
+ "SMAppServiceStatusEnabled": 1,
191
+ "SMAppServiceStatusNotFound": 3,
192
+ "SMAppServiceStatusNotRegistered": 0,
193
+ "SMAppServiceStatusRequiresApproval": 2,
194
+ "kSMErrorAlreadyRegistered": 12,
195
+ "kSMErrorAuthorizationFailure": 4,
196
+ "kSMErrorInternalFailure": 2,
197
+ "kSMErrorInvalidPlist": 10,
198
+ "kSMErrorInvalidSignature": 3,
199
+ "kSMErrorJobMustBeEnabled": 9,
200
+ "kSMErrorJobNotFound": 6,
201
+ "kSMErrorJobPlistNotFound": 8,
202
+ "kSMErrorLaunchDeniedByUser": 11,
203
+ "kSMErrorServiceUnavailable": 7,
204
+ "kSMErrorToolNotValid": 5
205
+ },
206
+ "enum_type": {
207
+ "SMAppServiceStatus": {
208
+ "type": "q"
209
+ }
210
+ },
211
+ "expressions": {},
212
+ "externs": {
213
+ "SMAppServiceErrorDomain": {
214
+ "typestr": "@"
215
+ },
216
+ "kSMDomainSystemLaunchd": {
217
+ "typestr": "^{__CFString=}"
218
+ },
219
+ "kSMDomainUserLaunchd": {
220
+ "typestr": "^{__CFString=}"
221
+ },
222
+ "kSMErrorDomainFramework": {
223
+ "typestr": "^{__CFString=}"
224
+ },
225
+ "kSMErrorDomainIPC": {
226
+ "typestr": "^{__CFString=}"
227
+ },
228
+ "kSMErrorDomainLaunchd": {
229
+ "typestr": "^{__CFString=}"
230
+ }
231
+ },
232
+ "formal_protocols": {},
233
+ "func_macros": {},
234
+ "functions": {
235
+ "SMCopyAllJobDictionaries": {
236
+ "args": [
237
+ {
238
+ "name": "domain",
239
+ "typestr": "^{__CFString=}"
240
+ }
241
+ ],
242
+ "retval": {
243
+ "already_cfretained": true,
244
+ "typestr": "^{__CFArray=}"
245
+ }
246
+ },
247
+ "SMJobBless": {
248
+ "args": [
249
+ {
250
+ "name": "domain",
251
+ "typestr": "^{__CFString=}"
252
+ },
253
+ {
254
+ "name": "executableLabel",
255
+ "typestr": "^{__CFString=}"
256
+ },
257
+ {
258
+ "name": "auth",
259
+ "typestr": "^{AuthorizationOpaqueRef=}"
260
+ },
261
+ {
262
+ "already_cfretained": true,
263
+ "name": "outError",
264
+ "null_accepted": true,
265
+ "type_modifier": "o",
266
+ "typestr": "^^{__CFError=}"
267
+ }
268
+ ],
269
+ "retval": {
270
+ "typestr": "Z"
271
+ }
272
+ },
273
+ "SMJobCopyDictionary": {
274
+ "args": [
275
+ {
276
+ "name": "domain",
277
+ "typestr": "^{__CFString=}"
278
+ },
279
+ {
280
+ "name": "jobLabel",
281
+ "typestr": "^{__CFString=}"
282
+ }
283
+ ],
284
+ "retval": {
285
+ "already_cfretained": true,
286
+ "typestr": "^{__CFDictionary=}"
287
+ }
288
+ },
289
+ "SMJobRemove": {
290
+ "args": [
291
+ {
292
+ "name": "domain",
293
+ "typestr": "^{__CFString=}"
294
+ },
295
+ {
296
+ "name": "jobLabel",
297
+ "typestr": "^{__CFString=}"
298
+ },
299
+ {
300
+ "name": "auth",
301
+ "typestr": "^{AuthorizationOpaqueRef=}"
302
+ },
303
+ {
304
+ "name": "wait",
305
+ "typestr": "Z"
306
+ },
307
+ {
308
+ "already_cfretained": true,
309
+ "name": "outError",
310
+ "null_accepted": true,
311
+ "type_modifier": "o",
312
+ "typestr": "^^{__CFError=}"
313
+ }
314
+ ],
315
+ "retval": {
316
+ "typestr": "Z"
317
+ }
318
+ },
319
+ "SMJobSubmit": {
320
+ "args": [
321
+ {
322
+ "name": "domain",
323
+ "typestr": "^{__CFString=}"
324
+ },
325
+ {
326
+ "name": "job",
327
+ "typestr": "^{__CFDictionary=}"
328
+ },
329
+ {
330
+ "name": "auth",
331
+ "typestr": "^{AuthorizationOpaqueRef=}"
332
+ },
333
+ {
334
+ "already_cfretained": true,
335
+ "name": "outError",
336
+ "null_accepted": true,
337
+ "type_modifier": "o",
338
+ "typestr": "^^{__CFError=}"
339
+ }
340
+ ],
341
+ "retval": {
342
+ "typestr": "Z"
343
+ }
344
+ },
345
+ "SMLoginItemSetEnabled": {
346
+ "args": [
347
+ {
348
+ "name": "identifier",
349
+ "typestr": "^{__CFString=}"
350
+ },
351
+ {
352
+ "name": "enabled",
353
+ "typestr": "Z"
354
+ }
355
+ ],
356
+ "retval": {
357
+ "typestr": "Z"
358
+ }
359
+ }
360
+ },
361
+ "informal_protocols": {},
362
+ "literals": {
363
+ "kSMRightBlessPrivilegedHelper": {
364
+ "unicode": false,
365
+ "value": "com.apple.ServiceManagement.blesshelper"
366
+ },
367
+ "kSMRightModifySystemDaemons": {
368
+ "unicode": false,
369
+ "value": "com.apple.ServiceManagement.daemons.modify"
370
+ }
371
+ },
372
+ "structs": {},
373
+ "typedefs": {
374
+ "SMAppServiceStatus": "enum SMAppServiceStatus"
375
+ }
376
+ },
377
+ "framework": "ServiceManagement",
378
+ "headers": [
379
+ "SMAppService.h",
380
+ "SMErrors.h",
381
+ "SMLoginItem.h"
382
+ ],
383
+ "release": "10.16",
384
+ "sdk": "/Users/ronald/Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.0.sdk"
385
+ }
@@ -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
@@ -17,7 +17,7 @@ sys.path.insert(0, os.path.dirname(__file__))
17
17
 
18
18
  from pyobjc_setup import setup # noqa: E402
19
19
 
20
- VERSION = "10.3.2"
20
+ VERSION = "11.1"
21
21
 
22
22
  setup(
23
23
  name="pyobjc-framework-ServiceManagement",
@@ -1,2 +0,0 @@
1
- pyobjc-core>=10.3.2
2
- pyobjc-framework-Cocoa>=10.3.2