pyobjc-framework-SceneKit 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 (60) hide show
  1. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/Lib/SceneKit/__init__.py +1 -1
  2. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/Lib/SceneKit/_metadata.py +27 -7
  3. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/Lib/pyobjc_framework_SceneKit.egg-info/PKG-INFO +6 -6
  4. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/Lib/pyobjc_framework_SceneKit.egg-info/SOURCES.txt +2 -2
  5. pyobjc_framework_scenekit-13.0/Lib/pyobjc_framework_SceneKit.egg-info/pyobjc-build-info.txt +3 -0
  6. pyobjc_framework_scenekit-13.0/Lib/pyobjc_framework_SceneKit.egg-info/requires.txt +3 -0
  7. pyobjc_framework_scenekit-13.0/Modules/_SceneKit.m +70 -0
  8. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/Modules/_SceneKit_inlines.m +13 -4
  9. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/Modules/_SceneKit_protocols.m +7 -5
  10. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/Modules/pyobjc-api.h +18 -4
  11. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/Modules/pyobjc-compat.h +0 -18
  12. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PKG-INFO +6 -6
  13. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scenekittypes.py +23 -24
  14. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scnaction.py +10 -9
  15. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scnanimation.py +5 -7
  16. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scnaudiosource.py +1 -1
  17. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scnboundingvolume.py +3 -3
  18. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scncamera.py +7 -11
  19. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scncameracontroller.py +4 -6
  20. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scnconstraint.py +5 -7
  21. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scngeometry.py +12 -13
  22. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scnhittest.py +6 -7
  23. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scnjavascript.py +1 -1
  24. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scnlight.py +22 -24
  25. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scnmaterial.py +24 -27
  26. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scnmaterialproperty.py +2 -4
  27. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scnmorpher.py +2 -4
  28. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scnnode.py +14 -15
  29. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scnparametricgeometry.py +2 -4
  30. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scnparticlesystem.py +34 -35
  31. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scnphysicsbody.py +5 -7
  32. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scnphysicsfield.py +2 -4
  33. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scnphysicsshape.py +1 -1
  34. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scnphysicsworld.py +3 -3
  35. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scnreferencenode.py +2 -4
  36. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scnscene.py +6 -10
  37. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scnscenerenderer.py +34 -33
  38. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scnscenesource.py +18 -18
  39. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scnshadable.py +24 -26
  40. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scntechnique.py +3 -3
  41. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scntransaction.py +2 -3
  42. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scnview.py +24 -25
  43. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/metadata/SceneKit.fwinfo +0 -337
  44. pyobjc_framework_scenekit-12.2.1/metadata/raw/arm64-26.5.fwinfo → pyobjc_framework_scenekit-13.0/metadata/raw/arm64-27.fwinfo +8 -9
  45. pyobjc_framework_scenekit-12.2.1/metadata/raw/x86_64-26.5.fwinfo → pyobjc_framework_scenekit-13.0/metadata/raw/x86_64-27.fwinfo +8 -9
  46. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/pyobjc_setup.py +7 -7
  47. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/setup.py +1 -1
  48. pyobjc_framework_scenekit-12.2.1/Lib/pyobjc_framework_SceneKit.egg-info/pyobjc-build-info.txt +0 -3
  49. pyobjc_framework_scenekit-12.2.1/Lib/pyobjc_framework_SceneKit.egg-info/requires.txt +0 -3
  50. pyobjc_framework_scenekit-12.2.1/Modules/_SceneKit.m +0 -168
  51. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/Lib/pyobjc_framework_SceneKit.egg-info/dependency_links.txt +0 -0
  52. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/Lib/pyobjc_framework_SceneKit.egg-info/not-zip-safe +0 -0
  53. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/Lib/pyobjc_framework_SceneKit.egg-info/top_level.txt +0 -0
  54. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/License.txt +0 -0
  55. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/MANIFEST.in +0 -0
  56. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/__init__.py +0 -0
  57. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/PyObjCTest/test_scenekit.py +0 -0
  58. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/metadata/metadata.ini +0 -0
  59. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/pyproject.toml +0 -0
  60. {pyobjc_framework_scenekit-12.2.1 → pyobjc_framework_scenekit-13.0}/setup.cfg +0 -0
@@ -43,7 +43,7 @@ def _setup():
43
43
 
44
44
  try:
45
45
  mod.SCNMatrix4Identity
46
- except AttributeError:
46
+ except AttributeError: # pragma: no cover
47
47
  # Two "inline" functions that use a symbol that is available on 10.10 or later,
48
48
  # avoid crashes by removing the inline function wrappers when that symbol
49
49
  # is not available.
@@ -1,7 +1,5 @@
1
1
  # This file is generated by objective.metadata
2
2
  #
3
- # Last update: Fri May 29 08:18:54 2026
4
- #
5
3
  # flake8: noqa
6
4
 
7
5
  import objc, sys
@@ -114,17 +112,18 @@ functions = {
114
112
  "SCNMatrix4EqualToMatrix4": (
115
113
  b"B{CATransform3D=dddddddddddddddd}{CATransform3D=dddddddddddddddd}",
116
114
  ),
117
- "SCNMatrix4Mult": (
118
- b"{CATransform3D=dddddddddddddddd}{CATransform3D=dddddddddddddddd}{CATransform3D=dddddddddddddddd}",
119
- ),
115
+ "SCNMatrix4MakeTranslation": (b"{CATransform3D=dddddddddddddddd}ddd",),
116
+ "SCNMatrix4FromMat4": (b"{CATransform3D=dddddddddddddddd}{simd_float4x4=[4<4f>]}",),
120
117
  "SCNMatrix4Scale": (
121
118
  b"{CATransform3D=dddddddddddddddd}{CATransform3D=dddddddddddddddd}ddd",
122
119
  ),
123
120
  "SCNMatrix4MakeRotation": (b"{CATransform3D=dddddddddddddddd}dddd",),
121
+ "SCNVector4FromGLKVector4": (b"{SCNVector4=dddd}[4f]",),
124
122
  "SCNExportJavaScriptModule": (b"v@",),
123
+ "SCNVector4ToFloat4": (b"<4f>{SCNVector4=dddd}",),
125
124
  "SCNVector3EqualToVector3": (b"B{SCNVector3=ddd}{SCNVector3=ddd}",),
126
125
  "SCNMatrix4ToGLKMatrix4": (b"[16f]{CATransform3D=dddddddddddddddd}",),
127
- "SCNVector4FromGLKVector4": (b"{SCNVector4=dddd}[4f]",),
126
+ "SCNMatrix4ToMat4": (b"{simd_float4x4=[4<4f>]}{CATransform3D=dddddddddddddddd}",),
128
127
  "SCNVector3ToGLKVector3": (b"[3f]{SCNVector3=ddd}",),
129
128
  "SCNMatrix4MakeScale": (b"{CATransform3D=dddddddddddddddd}ddd",),
130
129
  "SCNMatrix4FromGLKMatrix4": (b"{CATransform3D=dddddddddddddddd}[16f]",),
@@ -138,9 +137,12 @@ functions = {
138
137
  ),
139
138
  "SCNVector4EqualToVector4": (b"B{SCNVector4=dddd}{SCNVector4=dddd}",),
140
139
  "SCNVector3Make": (b"{SCNVector3=ddd}ddd",),
140
+ "SCNVector4FromFloat4": (b"{SCNVector4=dddd}<4f>",),
141
141
  "SCNVector3FromGLKVector3": (b"{SCNVector3=ddd}[3f]",),
142
142
  "SCNVector3FromFloat3": (b"{SCNVector3=ddd}<3f>",),
143
- "SCNMatrix4MakeTranslation": (b"{CATransform3D=dddddddddddddddd}ddd",),
143
+ "SCNMatrix4Mult": (
144
+ b"{CATransform3D=dddddddddddddddd}{CATransform3D=dddddddddddddddd}{CATransform3D=dddddddddddddddd}",
145
+ ),
144
146
  "SCNMatrix4Translate": (
145
147
  b"{CATransform3D=dddddddddddddddd}{CATransform3D=dddddddddddddddd}ddd",
146
148
  ),
@@ -2306,5 +2308,23 @@ objc.registerNewKeywords(
2306
2308
  "tubeWithInnerRadius_outerRadius_height_",
2307
2309
  )
2308
2310
  expressions = {}
2311
+ formal_protocols = {
2312
+ "SCNActionable": "SCNActionable",
2313
+ "SCNAnimatable": "SCNAnimatable",
2314
+ "SCNAnimation": "SCNAnimation",
2315
+ "SCNAvoidOccluderConstraintDelegate": "SCNAvoidOccluderConstraintDelegate",
2316
+ "SCNBoundingVolume": "SCNBoundingVolume",
2317
+ "SCNBufferStream": "SCNBufferStream",
2318
+ "SCNCameraControlConfiguration": "SCNCameraControlConfiguration",
2319
+ "SCNCameraControllerDelegate": "SCNCameraControllerDelegate",
2320
+ "SCNNodeRendererDelegate": "SCNNodeRendererDelegate",
2321
+ "SCNPhysicsContactDelegate": "SCNPhysicsContactDelegate",
2322
+ "SCNProgramDelegate": "SCNProgramDelegate",
2323
+ "SCNSceneExportDelegate": "SCNSceneExportDelegate",
2324
+ "SCNSceneRenderer": "SCNSceneRenderer",
2325
+ "SCNSceneRendererDelegate": "SCNSceneRendererDelegate",
2326
+ "SCNShadable": "SCNShadable",
2327
+ "SCNTechniqueSupport": "SCNTechniqueSupport",
2328
+ }
2309
2329
 
2310
2330
  # END OF FILE
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyobjc-framework-SceneKit
3
- Version: 12.2.1
3
+ Version: 13.0
4
4
  Summary: Wrappers for the framework SceneKit on macOS
5
5
  Home-page: https://github.com/ronaldoussoren/pyobjc
6
6
  Author: Ronald Oussoren
@@ -17,22 +17,22 @@ 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
35
- Requires-Dist: pyobjc-framework-Quartz>=12.2.1
33
+ Requires-Dist: pyobjc-core>=13.0
34
+ Requires-Dist: pyobjc-framework-Cocoa>=13.0
35
+ Requires-Dist: pyobjc-framework-Quartz>=13.0
36
36
  Dynamic: author
37
37
  Dynamic: author-email
38
38
  Dynamic: classifier
@@ -51,5 +51,5 @@ PyObjCTest/test_scntransaction.py
51
51
  PyObjCTest/test_scnview.py
52
52
  metadata/SceneKit.fwinfo
53
53
  metadata/metadata.ini
54
- metadata/raw/arm64-26.5.fwinfo
55
- metadata/raw/x86_64-26.5.fwinfo
54
+ metadata/raw/arm64-27.fwinfo
55
+ 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,3 @@
1
+ pyobjc-core>=13.0
2
+ pyobjc-framework-Cocoa>=13.0
3
+ pyobjc-framework-Quartz>=13.0
@@ -0,0 +1,70 @@
1
+ #define PY_SSIZE_T_CLEAN
2
+ #include "Python.h"
3
+ #include "pyobjc-api.h"
4
+
5
+ #ifdef USE_STATIC_ANALYZER
6
+ #include "../../pyobjc-core/Modules/objc/python-api-used.h"
7
+ #endif
8
+
9
+ #import <SceneKit/SceneKit.h>
10
+
11
+ /* We include the source code here instead of
12
+ * using the linker due to limitations in pyobjc-api.h
13
+ */
14
+ #include "_SceneKit_protocols.m"
15
+
16
+ NS_ASSUME_NONNULL_BEGIN
17
+
18
+ static PyMethodDef mod_methods[] = {
19
+ {0, 0, 0, 0} /* sentinel */
20
+ };
21
+
22
+ static int
23
+ mod_exec_module(PyObject* m)
24
+ {
25
+ return 0;
26
+ }
27
+
28
+ static struct PyModuleDef_Slot mod_slots[] = {
29
+ {.slot = Py_mod_exec, .value = (void*)mod_exec_module},
30
+ #if PY_VERSION_HEX >= 0x030c0000
31
+ {
32
+ /* This extension does not use the CPython API other than initializing
33
+ * the module, hence is safe with subinterpreters and per-interpreter
34
+ * GILs
35
+ */
36
+ .slot = Py_mod_multiple_interpreters,
37
+ .value = Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED,
38
+ },
39
+ #endif
40
+ #if PY_VERSION_HEX >= 0x030d0000
41
+ {
42
+ /* The code in this extension should be safe to use without the GIL */
43
+ .slot = Py_mod_gil,
44
+ .value = Py_MOD_GIL_NOT_USED,
45
+ },
46
+ #endif
47
+ {/* Sentinel */
48
+ .slot = 0,
49
+ .value = 0}};
50
+
51
+ static struct PyModuleDef mod_module = {
52
+ .m_base = PyModuleDef_HEAD_INIT,
53
+ .m_name = "_SceneKit",
54
+ .m_doc = NULL,
55
+ .m_size = 0,
56
+ .m_methods = mod_methods,
57
+ .m_slots = mod_slots,
58
+ .m_traverse = NULL,
59
+ .m_clear = NULL,
60
+ .m_free = NULL,
61
+ };
62
+
63
+ PyObject* _Nullable PyInit__SceneKit(void);
64
+
65
+ PyObject* _Nullable __attribute__((__visibility__("default")))
66
+ PyInit__SceneKit(void)
67
+ {
68
+ return PyModuleDef_Init(&mod_module);
69
+ }
70
+ NS_ASSUME_NONNULL_END
@@ -1,8 +1,15 @@
1
1
  #define PY_SSIZE_T_CLEAN
2
2
  #include "Python.h"
3
3
  #include "pyobjc-api.h"
4
+
5
+ #ifdef USE_STATIC_ANALYZER
6
+ #include "../../pyobjc-core/Modules/objc/python-api-used.h"
7
+ #endif
8
+
4
9
  #import <SceneKit/SceneKit.h>
5
10
 
11
+ NS_ASSUME_NONNULL_BEGIN
12
+
6
13
  /*
7
14
  * The definitions below can cause warnings when using
8
15
  * -Wunguarded-availability, but those warnings are harmless
@@ -43,8 +50,9 @@ static PyMethodDef mod_methods[] = {
43
50
  static int
44
51
  mod_exec_module(PyObject* m)
45
52
  {
46
- if (PyModule_AddObject(m, "_inline_list_", PyObjC_CreateInlineTab(function_map)) < 0)
47
- return -1;
53
+ if (PyModule_AddObject(m, "_inline_list_", PyObjC_CreateInlineTab(function_map))
54
+ == -1) // LCOV_BR_EXCL_LINE
55
+ return -1; // LCOV_EXCL_LINE
48
56
 
49
57
  return 0;
50
58
  }
@@ -84,10 +92,11 @@ static struct PyModuleDef mod_module = {
84
92
  .m_free = NULL,
85
93
  };
86
94
 
87
- PyObject* PyInit__inlines(void);
95
+ PyObject* _Nullable PyInit__inlines(void);
88
96
 
89
- PyObject* __attribute__((__visibility__("default")))
97
+ PyObject* _Nullable __attribute__((__visibility__("default")))
90
98
  PyInit__inlines(void)
91
99
  {
92
100
  return PyModuleDef_Init(&mod_module);
93
101
  }
102
+ NS_ASSUME_NONNULL_END
@@ -1,8 +1,7 @@
1
- /*
2
- * This file is generated by objective.metadata
3
- *
4
- * Last update: Tue May 26 22:53:41 2015
5
- */
1
+ // LCOV_EXCL_START
2
+ // This function is only present to ensure protocols are
3
+ // available at runtime.
4
+ NS_ASSUME_NONNULL_BEGIN
6
5
 
7
6
  static void __attribute__((__used__))
8
7
  use_protocols(void)
@@ -47,3 +46,6 @@ use_protocols(void)
47
46
  Py_XDECREF(p);
48
47
  #endif
49
48
  }
49
+
50
+ NS_ASSUME_NONNULL_END
51
+ // 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-SceneKit
3
- Version: 12.2.1
3
+ Version: 13.0
4
4
  Summary: Wrappers for the framework SceneKit on macOS
5
5
  Home-page: https://github.com/ronaldoussoren/pyobjc
6
6
  Author: Ronald Oussoren
@@ -17,22 +17,22 @@ 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
35
- Requires-Dist: pyobjc-framework-Quartz>=12.2.1
33
+ Requires-Dist: pyobjc-core>=13.0
34
+ Requires-Dist: pyobjc-framework-Cocoa>=13.0
35
+ Requires-Dist: pyobjc-framework-Quartz>=13.0
36
36
  Dynamic: author
37
37
  Dynamic: author-email
38
38
  Dynamic: classifier
@@ -12,11 +12,25 @@ import SceneKit
12
12
 
13
13
 
14
14
  class TestSceneKitTypes(TestCase):
15
- def test_enum_types(self):
15
+ def test_enums(self):
16
+ # Unnamed enum:
17
+ self.assertEqual(SceneKit.SCNProgramCompilationError, 1)
18
+
16
19
  self.assertIsEnumType(SceneKit.SCNActionTimingMode)
20
+ self.assertEqual(SceneKit.SCNActionTimingModeLinear, 0)
21
+ self.assertEqual(SceneKit.SCNActionTimingModeEaseIn, 1)
22
+ self.assertEqual(SceneKit.SCNActionTimingModeEaseOut, 2)
23
+ self.assertEqual(SceneKit.SCNActionTimingModeEaseInEaseOut, 3)
24
+
17
25
  self.assertIsEnumType(SceneKit.SCNColorMask)
26
+ self.assertEqual(SceneKit.SCNColorMaskNone, 0)
27
+ self.assertEqual(SceneKit.SCNColorMaskRed, 0x1 << 3)
28
+ self.assertEqual(SceneKit.SCNColorMaskGreen, 0x1 << 2)
29
+ self.assertEqual(SceneKit.SCNColorMaskBlue, 0x1 << 1)
30
+ self.assertEqual(SceneKit.SCNColorMaskAlpha, 0x1 << 0)
31
+ self.assertEqual(SceneKit.SCNColorMaskAll, 0xF)
18
32
 
19
- def testStructs(self):
33
+ def test_structs(self):
20
34
  v = SceneKit.SCNVector3()
21
35
  self.assertIsInstance(v.x, float)
22
36
  self.assertIsInstance(v.y, float)
@@ -33,34 +47,19 @@ class TestSceneKitTypes(TestCase):
33
47
  self.assertTrue(SceneKit.SCNQuaternion is SceneKit.SCNVector4)
34
48
  self.assertTrue(SceneKit.SCNMatrix4 is SceneKit.CATransform3D)
35
49
 
36
- def testConstants(self):
37
- self.assertEqual(SceneKit.SCNProgramCompilationError, 1)
38
-
39
- self.assertEqual(SceneKit.SCNActionTimingModeLinear, 0)
40
- self.assertEqual(SceneKit.SCNActionTimingModeEaseIn, 1)
41
- self.assertEqual(SceneKit.SCNActionTimingModeEaseOut, 2)
42
- self.assertEqual(SceneKit.SCNActionTimingModeEaseInEaseOut, 3)
43
-
44
- self.assertEqual(SceneKit.SCNColorMaskNone, 0)
45
- self.assertEqual(SceneKit.SCNColorMaskRed, 0x1 << 3)
46
- self.assertEqual(SceneKit.SCNColorMaskGreen, 0x1 << 2)
47
- self.assertEqual(SceneKit.SCNColorMaskBlue, 0x1 << 1)
48
- self.assertEqual(SceneKit.SCNColorMaskAlpha, 0x1 << 0)
49
- self.assertEqual(SceneKit.SCNColorMaskAll, 0xF)
50
-
51
50
  @expectedFailureIf(os_release().rsplit(".", 1)[0] == "10.10")
52
51
  @min_os_level("10.10")
53
- def testConstantsFail10_10(self):
52
+ def test_constants_fail10_10(self):
54
53
  self.assertIsInstance(SceneKit.SCNErrorDomain, str)
55
54
 
56
55
  @min_os_level("10.10")
57
- def testConstants10_10(self):
56
+ def test_constants10_10(self):
58
57
  self.assertIsInstance(SceneKit.SCNMatrix4Identity, SceneKit.SCNMatrix4)
59
58
  self.assertIsInstance(SceneKit.SCNVector3Zero, SceneKit.SCNVector3)
60
59
  self.assertIsInstance(SceneKit.SCNVector4Zero, SceneKit.SCNVector4)
61
60
 
62
61
  @min_os_level("10.10")
63
- def testFunctions(self):
62
+ def test_functions(self):
64
63
  self.assertResultHasType(SceneKit.SCNVector3EqualToVector3, objc._C_BOOL)
65
64
  self.assertResultHasType(SceneKit.SCNVector4EqualToVector4, objc._C_BOOL)
66
65
 
@@ -92,14 +91,14 @@ class TestSceneKitTypes(TestCase):
92
91
  w = SceneKit.SCNMatrix4Translate(v, 6, 7, 8)
93
92
  self.assertIsInstance(w, SceneKit.SCNMatrix4)
94
93
 
95
- def testFunctions_unsupported(self):
94
+ def test_functions_unsupported(self):
96
95
  # XXX
97
96
  SceneKit.SCNVector3FromGLKVector3
98
97
  SceneKit.SCNVector3ToGLKVector3
99
98
  SceneKit.SCNVector4FromGLKVector4
100
99
  SceneKit.SCNVector4ToGLKVector4
101
100
 
102
- def test_inlineFunctions(self):
101
+ def test_inline_functions(self):
103
102
  v = SceneKit.SCNVector3ToFloat3(SceneKit.SCNVector3())
104
103
  self.assertIsInstance(v, simd.vector_float3)
105
104
 
@@ -119,7 +118,7 @@ class TestSceneKitTypes(TestCase):
119
118
  self.assertIsInstance(v, SceneKit.SCNMatrix4)
120
119
 
121
120
  @min_os_level("10.10")
122
- def testFunctions10_10(self):
121
+ def test_functions10_10(self):
123
122
  v = SceneKit.SCNMatrix4MakeRotation(1, 2, 3, 4)
124
123
  self.assertIsInstance(v, SceneKit.SCNMatrix4)
125
124
 
@@ -140,7 +139,7 @@ class TestSceneKitTypes(TestCase):
140
139
 
141
140
  @min_os_level("10.10")
142
141
  @expectedFailure
143
- def testFunctions10_10_unsup(self):
142
+ def test_functions10_10_unsup(self):
144
143
  # vector types
145
144
  SceneKit.SCNMatrix4ToGLKMatrix4
146
145
  SceneKit.SCNMatrix4FromGLKMatrix4
@@ -26,11 +26,7 @@ class TestSCNAction(TestCase):
26
26
  self.assertEqual(SceneKit.SCNActionTimingModeEaseInEaseOut, 3)
27
27
 
28
28
  @min_os_level("10.10")
29
- def testProtocols(self):
30
- self.assertProtocolExists("SCNActionable")
31
-
32
- @min_os_level("10.10")
33
- def testMethods(self):
29
+ def test_methods(self):
34
30
  self.assertResultIsBlock(
35
31
  SceneKit.SCNAction.timingFunction, SCNActionTimingFunction
36
32
  )
@@ -48,12 +44,17 @@ class TestSCNAction(TestCase):
48
44
  b"v@" + objc._C_CGFloat,
49
45
  )
50
46
 
47
+ @min_os_level("10.11")
48
+ def test_methods10_11(self):
49
+ self.assertArgIsBOOL(SceneKit.SCNAction.playAudioSource_waitForCompletion_, 1)
50
+
51
+ @min_os_level("10.10")
52
+ def test_protocols(self):
53
+ self.assertProtocolExists("SCNActionable", SceneKit)
54
+
55
+ def test_protocol_methods(self):
51
56
  self.assertArgIsBlock(TestSCNActionHelper.runAction_completionHandler_, 1, b"v")
52
57
  self.assertArgIsBlock(
53
58
  TestSCNActionHelper.runAction_forKey_completionHandler_, 2, b"v"
54
59
  )
55
60
  self.assertResultIsBOOL(TestSCNActionHelper.hasActions)
56
-
57
- @min_os_level("10.11")
58
- def testMethods10_11(self):
59
- self.assertArgIsBOOL(SceneKit.SCNAction.playAudioSource_waitForCompletion_, 1)
@@ -28,11 +28,11 @@ class TestSCNAnimationHelper(SceneKit.NSObject):
28
28
 
29
29
  class TestSCNAnimation(TestCase):
30
30
  @min_os_level("10.10")
31
- def testProtocols(self):
32
- self.assertProtocolExists("SCNAnimatable")
31
+ def test_protocols(self):
32
+ self.assertProtocolExists("SCNAnimatable", SceneKit)
33
33
 
34
34
  @min_os_level("10.10")
35
- def testProtocolMethods(self):
35
+ def test_protocol_methods(self):
36
36
  self.assertResultIsBOOL(TestSCNAnimationHelper.isAnimationForKeyPaused_)
37
37
  self.assertArgHasType(
38
38
  TestSCNAnimationHelper.removeAnimationForKey_fadeOutDuration_,
@@ -64,12 +64,10 @@ class TestSCNAnimation(TestCase):
64
64
  objc._C_CGFloat,
65
65
  )
66
66
 
67
- def testMethods(self):
67
+ def test_methods(self):
68
68
  self.assertArgIsBOOL(SceneKit.CAAnimation.setUsesSceneTimeBase_, 0)
69
69
  self.assertResultIsBOOL(SceneKit.CAAnimation.usesSceneTimeBase)
70
70
 
71
- @min_os_level("10.9")
72
- def testMethods10_9(self):
73
71
  self.assertArgIsBlock(
74
72
  SceneKit.SCNAnimationEvent.animationEventWithKeyTime_block_,
75
73
  1,
@@ -77,7 +75,7 @@ class TestSCNAnimation(TestCase):
77
75
  )
78
76
 
79
77
  @min_os_level("10.13")
80
- def testMethods10_13(self):
78
+ def test_methods10_13(self):
81
79
  self.assertResultIsBOOL(SceneKit.SCNAnimation.isRemovedOnCompletion)
82
80
  self.assertArgIsBOOL(SceneKit.SCNAnimation.setRemovedOnCompletion_, 0)
83
81
  self.assertResultIsBOOL(SceneKit.SCNAnimation.isAppliedOnCompletion)
@@ -5,7 +5,7 @@ import SceneKit
5
5
 
6
6
  class TestSCNAudioSource(TestCase):
7
7
  @min_os_level("10.11")
8
- def testMethods10_11(self):
8
+ def test_methods10_11(self):
9
9
  self.assertResultIsBOOL(SceneKit.SCNAudioSource.isPositional)
10
10
  self.assertArgIsBOOL(SceneKit.SCNAudioSource.setPositional_, 0)
11
11
 
@@ -17,10 +17,10 @@ class TestSCNBoundingVolumeHelper(SceneKit.NSObject):
17
17
 
18
18
 
19
19
  class TestSCNBoundingVolume(TestCase):
20
- def testProtocols(self):
21
- self.assertProtocolExists("SCNBoundingVolume")
20
+ def test_protocols(self):
21
+ self.assertProtocolExists("SCNBoundingVolume", SceneKit)
22
22
 
23
- def testProtocolMethods(self):
23
+ def test_protocol_methods(self):
24
24
  self.assertResultIsBOOL(TestSCNBoundingVolumeHelper.getBoundingBoxMin_max_)
25
25
  self.assertArgHasType(
26
26
  TestSCNBoundingVolumeHelper.getBoundingBoxMin_max_,
@@ -4,20 +4,20 @@ import SceneKit
4
4
 
5
5
 
6
6
  class TestSCNCamera(TestCase):
7
- def test_enum_types(self):
7
+ def test_enums(self):
8
8
  self.assertIsEnumType(SceneKit.SCNCameraProjectionDirection)
9
+ self.assertEqual(SceneKit.SCNCameraProjectionDirectionVertical, 0)
10
+ self.assertEqual(SceneKit.SCNCameraProjectionDirectionHorizontal, 1)
9
11
 
10
- def testMethods(self):
12
+ def test_methods(self):
11
13
  self.assertResultIsBOOL(SceneKit.SCNCamera.usesOrthographicProjection)
12
14
  self.assertArgIsBOOL(SceneKit.SCNCamera.setUsesOrthographicProjection_, 0)
13
15
 
14
- @min_os_level("10.9")
15
- def testMethods10_9(self):
16
16
  self.assertResultIsBOOL(SceneKit.SCNCamera.automaticallyAdjustsZRange)
17
17
  self.assertArgIsBOOL(SceneKit.SCNCamera.setAutomaticallyAdjustsZRange_, 0)
18
18
 
19
19
  @min_os_level("10.12")
20
- def testMethods10_12(self):
20
+ def test_methods10_12(self):
21
21
  self.assertResultIsBOOL(SceneKit.SCNCamera.wantsHDR)
22
22
  self.assertArgIsBOOL(SceneKit.SCNCamera.setWantsHDR_, 0)
23
23
 
@@ -25,15 +25,11 @@ class TestSCNCamera(TestCase):
25
25
  self.assertArgIsBOOL(SceneKit.SCNCamera.setWantsExposureAdaptation_, 0)
26
26
 
27
27
  @min_os_level("10.13")
28
- def testMethods10_13(self):
28
+ def test_methods10_13(self):
29
29
  self.assertResultIsBOOL(SceneKit.SCNCamera.wantsDepthOfField)
30
30
  self.assertArgIsBOOL(SceneKit.SCNCamera.setWantsDepthOfField_, 0)
31
31
 
32
32
  @min_os_level("10.15")
33
- def testMethods10_15(self):
33
+ def test_methods10_15(self):
34
34
  self.assertResultIsBOOL(SceneKit.SCNCamera.grainIsColored)
35
35
  self.assertArgIsBOOL(SceneKit.SCNCamera.setGrainIsColored_, 0)
36
-
37
- def testConstants(self):
38
- self.assertEqual(SceneKit.SCNCameraProjectionDirectionVertical, 0)
39
- self.assertEqual(SceneKit.SCNCameraProjectionDirectionHorizontal, 1)
@@ -4,10 +4,8 @@ import SceneKit
4
4
 
5
5
 
6
6
  class TestSCNCameraController(TestCase):
7
- def test_enum_types(self):
7
+ def test_enums(self):
8
8
  self.assertIsEnumType(SceneKit.SCNInteractionMode)
9
-
10
- def testConstants(self):
11
9
  self.assertEqual(SceneKit.SCNInteractionModeFly, 0)
12
10
  self.assertEqual(SceneKit.SCNInteractionModeOrbitTurntable, 1)
13
11
  self.assertEqual(SceneKit.SCNInteractionModeOrbitAngleMapping, 2)
@@ -17,11 +15,11 @@ class TestSCNCameraController(TestCase):
17
15
  self.assertEqual(SceneKit.SCNInteractionModeTruck, 6)
18
16
 
19
17
  @min_sdk_level("10.13")
20
- def testProtocols(self):
21
- self.assertProtocolExists("SCNCameraControllerDelegate")
18
+ def test_protocols(self):
19
+ self.assertProtocolExists("SCNCameraControllerDelegate", SceneKit)
22
20
 
23
21
  @min_os_level("10.13")
24
- def testMethods(self):
22
+ def test_methods(self):
25
23
  self.assertResultIsBOOL(SceneKit.SCNCameraController.automaticTarget)
26
24
  self.assertArgIsBOOL(SceneKit.SCNCameraController.setAutomaticTarget_, 0)
27
25
  self.assertResultIsBOOL(SceneKit.SCNCameraController.inertiaEnabled)