pythonnative 0.39.0__tar.gz → 0.40.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 (483) hide show
  1. pythonnative-0.40.0/MANIFEST.in +11 -0
  2. {pythonnative-0.39.0/src/pythonnative.egg-info → pythonnative-0.40.0}/PKG-INFO +1 -1
  3. {pythonnative-0.39.0 → pythonnative-0.40.0}/pyproject.toml +10 -3
  4. pythonnative-0.40.0/setup.py +19 -0
  5. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/__init__.py +2 -3
  6. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/animated.py +44 -20
  7. pythonnative-0.40.0/src/pythonnative/animation_graph.py +78 -0
  8. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/bootstrap.py +7 -6
  9. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/bridge/__init__.py +58 -69
  10. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/bridge/android.py +2 -2
  11. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/bridge/codec.py +6 -0
  12. pythonnative-0.40.0/src/pythonnative/bridge/commits.py +114 -0
  13. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/bridge/fake.py +20 -13
  14. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/bridge/ios.py +5 -5
  15. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/bridge/web.py +25 -66
  16. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/cli/pn.py +31 -1
  17. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/component.py +17 -1
  18. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/components/__init__.py +6 -1
  19. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/components/_base.py +3 -0
  20. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/components/controls.py +9 -6
  21. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/components/lists.py +121 -145
  22. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/components/text.py +3 -3
  23. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/devclient.py +5 -5
  24. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/devserver/server.py +8 -2
  25. pythonnative-0.40.0/src/pythonnative/devserver/static/animation_graph.js +82 -0
  26. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/devserver/static/bridge.js +0 -8
  27. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/devserver/static/host.js +4 -29
  28. pythonnative-0.40.0/src/pythonnative/devserver/static/layout.js +85 -0
  29. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/devserver/static/renderer.js +128 -171
  30. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/devserver/static/shell.js +4 -2
  31. pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/LICENSE +21 -0
  32. pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/binaries/yoga-wasm-base64-esm.js +75 -0
  33. pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/src/generated/YGEnums.d.ts +189 -0
  34. pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/src/generated/YGEnums.js +211 -0
  35. pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/src/generated/YGEnums.js.map +1 -0
  36. pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/src/index.d.ts +12 -0
  37. pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/src/index.js +16 -0
  38. pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/src/index.js.map +1 -0
  39. pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/src/load.d.ts +11 -0
  40. pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/src/load.js +17 -0
  41. pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/src/load.js.map +1 -0
  42. pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/src/wrapAssembly.d.ts +155 -0
  43. pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/src/wrapAssembly.js +125 -0
  44. pythonnative-0.40.0/src/pythonnative/devserver/static/yoga/src/wrapAssembly.js.map +1 -0
  45. pythonnative-0.40.0/src/pythonnative/equality.py +19 -0
  46. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/events.py +17 -1
  47. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/gestures.py +27 -5
  48. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/hooks.py +75 -53
  49. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/hosts/base.py +13 -73
  50. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/hosts/native.py +20 -56
  51. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/hot_reload.py +23 -8
  52. pythonnative-0.40.0/src/pythonnative/layout.py +328 -0
  53. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/build.gradle +4 -0
  54. pythonnative-0.40.0/src/pythonnative/native/android/gradle.properties +3 -0
  55. pythonnative-0.40.0/src/pythonnative/native/android/settings.gradle +12 -0
  56. pythonnative-0.40.0/src/pythonnative/native/android/src/main/cpp/CMakeLists.txt +9 -0
  57. pythonnative-0.40.0/src/pythonnative/native/android/src/main/cpp/yoga_jni.cpp +52 -0
  58. pythonnative-0.40.0/src/pythonnative/native/android/src/main/java/com/pythonnative/generated/NativeModules.kt +5 -0
  59. pythonnative-0.40.0/src/pythonnative/native/android/src/main/java/com/pythonnative/generated/NativeProps.kt +3705 -0
  60. pythonnative-0.40.0/src/pythonnative/native/android/src/main/java/com/pythonnative/generated/PNContracts.kt +129 -0
  61. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/PNBridge.kt +61 -14
  62. pythonnative-0.40.0/src/pythonnative/native/android/src/main/java/com/pythonnative/runtime/animation/AnimationGraph.kt +108 -0
  63. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/animation/PNAnimator.kt +11 -3
  64. pythonnative-0.40.0/src/pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/CommitState.kt +106 -0
  65. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/bridge/MainThread.kt +8 -0
  66. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/bridge/TransactionApplier.kt +3 -1
  67. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/BuiltinComponents.kt +2 -0
  68. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/ButtonManager.kt +0 -1
  69. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/DatePickerManager.kt +2 -2
  70. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/ImageManager.kt +6 -0
  71. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/PickerManager.kt +0 -1
  72. pythonnative-0.40.0/src/pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ScreenStackManager.kt +110 -0
  73. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/TextInputManager.kt +6 -1
  74. pythonnative-0.40.0/src/pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/VirtualListManager.kt +159 -0
  75. pythonnative-0.40.0/src/pythonnative/native/android/src/main/java/com/pythonnative/runtime/layout/NativeLayout.kt +145 -0
  76. pythonnative-0.40.0/src/pythonnative/native/android/src/main/java/com/pythonnative/runtime/layout/YogaNode.kt +29 -0
  77. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/modules/HostModule.kt +5 -41
  78. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/modules/NativeModule.kt +26 -3
  79. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/screens/PNScreenFragment.kt +7 -7
  80. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/test/java/com/pythonnative/runtime/PromiseTest.kt +14 -0
  81. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Package.swift +2 -0
  82. pythonnative-0.40.0/src/pythonnative/native/ios/Sources/PythonNativeKit/Animation/PNAnimationGraph.swift +199 -0
  83. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Animation/PNAnimator.swift +11 -0
  84. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Bridge/PNBridge.swift +81 -17
  85. pythonnative-0.40.0/src/pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNCommit.swift +104 -0
  86. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Bridge/PNRegistry.swift +2 -0
  87. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Bridge/PNTransaction.swift +5 -4
  88. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNButtonManagers.swift +3 -2
  89. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNControlManagers.swift +7 -7
  90. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNImageManager.swift +1 -0
  91. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNPressableManager.swift +2 -2
  92. pythonnative-0.40.0/src/pythonnative/native/ios/Sources/PythonNativeKit/Components/PNScreenStackManager.swift +107 -0
  93. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNTextInputManager.swift +9 -1
  94. pythonnative-0.40.0/src/pythonnative/native/ios/Sources/PythonNativeKit/Components/PNVirtualListManager.swift +155 -0
  95. pythonnative-0.40.0/src/pythonnative/native/ios/Sources/PythonNativeKit/Generated/NativeModules.swift +1 -0
  96. pythonnative-0.40.0/src/pythonnative/native/ios/Sources/PythonNativeKit/Generated/NativeProps.swift +3775 -0
  97. pythonnative-0.40.0/src/pythonnative/native/ios/Sources/PythonNativeKit/Generated/PNContracts.swift +46 -0
  98. pythonnative-0.40.0/src/pythonnative/native/ios/Sources/PythonNativeKit/Layout/PNLayout.swift +173 -0
  99. pythonnative-0.40.0/src/pythonnative/native/ios/Sources/PythonNativeKit/Modules/HostModule.swift +80 -0
  100. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Modules/PNNativeModule.swift +44 -1
  101. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Screens/PNViewController.swift +4 -2
  102. pythonnative-0.40.0/src/pythonnative/native/ios/Tests/PythonNativeKitTests/PNAnimationGraphTests.swift +26 -0
  103. pythonnative-0.40.0/src/pythonnative/native/ios/Tests/PythonNativeKitTests/PNCommitTests.swift +86 -0
  104. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Tests/PythonNativeKitTests/PNManagerTests.swift +8 -6
  105. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Tests/PythonNativeKitTests/PNModuleTests.swift +13 -0
  106. pythonnative-0.40.0/src/pythonnative/native/yoga/LICENSE +21 -0
  107. pythonnative-0.40.0/src/pythonnative/native/yoga/Package.swift +9 -0
  108. pythonnative-0.40.0/src/pythonnative/native/yoga/VENDORED.md +2 -0
  109. pythonnative-0.40.0/src/pythonnative/native/yoga/include/PNStyle.h +10 -0
  110. pythonnative-0.40.0/src/pythonnative/native/yoga/include/module.modulemap +5 -0
  111. pythonnative-0.40.0/src/pythonnative/native/yoga/include/yoga/YGConfig.h +158 -0
  112. pythonnative-0.40.0/src/pythonnative/native/yoga/include/yoga/YGEnums.h +142 -0
  113. pythonnative-0.40.0/src/pythonnative/native/yoga/include/yoga/YGMacros.h +99 -0
  114. pythonnative-0.40.0/src/pythonnative/native/yoga/include/yoga/YGNode.h +304 -0
  115. pythonnative-0.40.0/src/pythonnative/native/yoga/include/yoga/YGNodeLayout.h +35 -0
  116. pythonnative-0.40.0/src/pythonnative/native/yoga/include/yoga/YGNodeStyle.h +130 -0
  117. pythonnative-0.40.0/src/pythonnative/native/yoga/include/yoga/YGPixelGrid.h +29 -0
  118. pythonnative-0.40.0/src/pythonnative/native/yoga/include/yoga/YGValue.h +84 -0
  119. pythonnative-0.40.0/src/pythonnative/native/yoga/include/yoga/Yoga.h +21 -0
  120. pythonnative-0.40.0/src/pythonnative/native/yoga/python.cpp +16 -0
  121. pythonnative-0.40.0/src/pythonnative/native/yoga/style.cpp +272 -0
  122. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/CMakeLists.txt +41 -0
  123. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGConfig.cpp +92 -0
  124. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGConfig.h +158 -0
  125. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGEnums.cpp +262 -0
  126. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGEnums.h +142 -0
  127. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGMacros.h +99 -0
  128. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGNode.cpp +366 -0
  129. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGNode.h +304 -0
  130. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGNodeLayout.cpp +92 -0
  131. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGNodeLayout.h +35 -0
  132. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGNodeStyle.cpp +405 -0
  133. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGNodeStyle.h +130 -0
  134. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGPixelGrid.cpp +22 -0
  135. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGPixelGrid.h +29 -0
  136. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGValue.cpp +20 -0
  137. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/YGValue.h +84 -0
  138. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/Yoga.h +21 -0
  139. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/AbsoluteLayout.cpp +563 -0
  140. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/AbsoluteLayout.h +41 -0
  141. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/Align.h +72 -0
  142. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/Baseline.cpp +78 -0
  143. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/Baseline.h +21 -0
  144. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/BoundAxis.h +79 -0
  145. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/Cache.cpp +121 -0
  146. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/Cache.h +30 -0
  147. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/CalculateLayout.cpp +2428 -0
  148. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/CalculateLayout.h +38 -0
  149. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/FlexDirection.h +120 -0
  150. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/FlexLine.cpp +124 -0
  151. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/FlexLine.h +75 -0
  152. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/PixelGrid.cpp +132 -0
  153. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/PixelGrid.h +29 -0
  154. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/SizingMode.h +73 -0
  155. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/algorithm/TrailingPosition.h +44 -0
  156. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/config/Config.cpp +135 -0
  157. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/config/Config.h +92 -0
  158. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/debug/AssertFatal.cpp +53 -0
  159. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/debug/AssertFatal.h +29 -0
  160. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/debug/Log.cpp +107 -0
  161. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/debug/Log.h +34 -0
  162. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/Align.h +47 -0
  163. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/BoxSizing.h +40 -0
  164. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/Dimension.h +40 -0
  165. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/Direction.h +41 -0
  166. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/Display.h +41 -0
  167. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/Edge.h +47 -0
  168. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/Errata.h +41 -0
  169. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/ExperimentalFeature.h +39 -0
  170. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/FlexDirection.h +42 -0
  171. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/Gutter.h +41 -0
  172. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/Justify.h +44 -0
  173. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/LogLevel.h +44 -0
  174. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/MeasureMode.h +41 -0
  175. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/NodeType.h +40 -0
  176. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/Overflow.h +41 -0
  177. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/PhysicalEdge.h +21 -0
  178. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/PositionType.h +41 -0
  179. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/Unit.h +42 -0
  180. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/Wrap.h +41 -0
  181. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/enums/YogaEnums.h +85 -0
  182. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/event/event.cpp +87 -0
  183. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/event/event.h +130 -0
  184. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/module.modulemap +21 -0
  185. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/node/CachedMeasurement.h +53 -0
  186. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/node/LayoutResults.cpp +48 -0
  187. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/node/LayoutResults.h +122 -0
  188. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/node/LayoutableChildren.h +148 -0
  189. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/node/Node.cpp +443 -0
  190. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/node/Node.h +337 -0
  191. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/numeric/Comparison.h +81 -0
  192. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/numeric/FloatOptional.h +93 -0
  193. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/style/SmallValueBuffer.h +133 -0
  194. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/style/Style.h +757 -0
  195. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/style/StyleLength.h +107 -0
  196. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/style/StyleValueHandle.h +98 -0
  197. pythonnative-0.40.0/src/pythonnative/native/yoga/yoga/style/StyleValuePool.h +127 -0
  198. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/registry.py +14 -1
  199. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_views/bridge_backend.py +94 -82
  200. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/navigation/handle.py +3 -36
  201. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/navigation/navigators.py +28 -6
  202. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/preview.py +12 -27
  203. pythonnative-0.40.0/src/pythonnative/profiling.py +101 -0
  204. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/project/android.py +7 -2
  205. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/project/builder.py +87 -3
  206. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/project/config.py +2 -2
  207. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/project/deps.py +20 -4
  208. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/project/fingerprint.py +1 -0
  209. pythonnative-0.40.0/src/pythonnative/project/lockfile.py +100 -0
  210. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/project/plugins.py +155 -2
  211. pythonnative-0.40.0/src/pythonnative/query.py +153 -0
  212. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/reconciler/boundaries.py +10 -0
  213. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/reconciler/core.py +103 -91
  214. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/reconciler/layout_pass.py +36 -2
  215. pythonnative-0.40.0/src/pythonnative/refresh.py +55 -0
  216. pythonnative-0.40.0/src/pythonnative/runtime.py +306 -0
  217. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/sdk/__init__.py +7 -0
  218. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/sdk/_components.py +19 -0
  219. pythonnative-0.40.0/src/pythonnative/sdk/builtins.py +91 -0
  220. pythonnative-0.40.0/src/pythonnative/sdk/codegen.py +149 -0
  221. pythonnative-0.40.0/src/pythonnative/sdk/module_codegen.py +184 -0
  222. pythonnative-0.40.0/src/pythonnative/sdk/schema.py +224 -0
  223. pythonnative-0.40.0/src/pythonnative/sdk/templates/contracts.kt +46 -0
  224. pythonnative-0.40.0/src/pythonnative/sdk/templates/contracts.swift +46 -0
  225. pythonnative-0.40.0/src/pythonnative/suspense.py +183 -0
  226. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/testing/backend.py +1 -1
  227. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/testing/harness.py +7 -29
  228. {pythonnative-0.39.0 → pythonnative-0.40.0/src/pythonnative.egg-info}/PKG-INFO +1 -1
  229. pythonnative-0.40.0/src/pythonnative.egg-info/SOURCES.txt +468 -0
  230. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_bridge.py +44 -54
  231. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_cli.py +26 -0
  232. pythonnative-0.40.0/tests/test_codegen.py +26 -0
  233. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_components.py +2 -2
  234. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_hot_reload.py +45 -0
  235. pythonnative-0.40.0/tests/test_inbox.py +85 -0
  236. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_layout.py +29 -23
  237. pythonnative-0.40.0/tests/test_native_lists.py +86 -0
  238. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_navigation.py +19 -31
  239. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_runtime.py +5 -5
  240. pythonnative-0.40.0/tests/test_runtime_contracts.py +297 -0
  241. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_suspense.py +8 -106
  242. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_web_transport.py +40 -9
  243. pythonnative-0.39.0/src/pythonnative/images.py +0 -198
  244. pythonnative-0.39.0/src/pythonnative/layout.py +0 -1603
  245. pythonnative-0.39.0/src/pythonnative/runtime.py +0 -512
  246. pythonnative-0.39.0/src/pythonnative/suspense.py +0 -413
  247. pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/components/VirtualListManager.kt +0 -179
  248. pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/screens/Navigator.kt +0 -116
  249. pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/views/PNVirtualListView.java +0 -169
  250. pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNVirtualListManager.swift +0 -257
  251. pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Modules/HostModule.swift +0 -157
  252. pythonnative-0.39.0/src/pythonnative/virtual_rows.py +0 -127
  253. pythonnative-0.39.0/src/pythonnative.egg-info/SOURCES.txt +0 -326
  254. pythonnative-0.39.0/tests/test_images.py +0 -145
  255. pythonnative-0.39.0/tests/test_native_lists.py +0 -330
  256. {pythonnative-0.39.0 → pythonnative-0.40.0}/LICENSE +0 -0
  257. {pythonnative-0.39.0 → pythonnative-0.40.0}/README.md +0 -0
  258. {pythonnative-0.39.0 → pythonnative-0.40.0}/setup.cfg +0 -0
  259. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/_ios_log.py +0 -0
  260. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/alerts.py +0 -0
  261. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/appearance.py +0 -0
  262. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/cli/__init__.py +0 -0
  263. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/components/layout.py +0 -0
  264. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/components/media.py +0 -0
  265. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/components/overlays.py +0 -0
  266. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/components/pressable.py +0 -0
  267. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/components/structural.py +0 -0
  268. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/devserver/__init__.py +0 -0
  269. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/devserver/static/colors.js +0 -0
  270. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/devserver/static/index.html +0 -0
  271. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/devserver/static/preview.css +0 -0
  272. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/devserver/watcher.py +0 -0
  273. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/devserver/ws.py +0 -0
  274. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/diagnostics.py +0 -0
  275. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/element.py +0 -0
  276. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/hosts/__init__.py +0 -0
  277. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/mutations.py +0 -0
  278. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/AndroidManifest.xml +0 -0
  279. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/PythonHost.kt +0 -0
  280. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/animation/AnimationSpecs.kt +0 -0
  281. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/bridge/JsonUtil.kt +0 -0
  282. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/bridge/PNLog.kt +0 -0
  283. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/bridge/PNRegistry.kt +0 -0
  284. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/bridge/PNTransaction.kt +0 -0
  285. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/bridge/ViewRegistry.kt +0 -0
  286. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/ComponentManager.kt +0 -0
  287. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/ContainerManagers.kt +0 -0
  288. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/ControlManagers.kt +0 -0
  289. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/ImageLoader.kt +0 -0
  290. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/ModalManager.kt +0 -0
  291. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/PNColor.kt +0 -0
  292. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/PortalManager.kt +0 -0
  293. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/PressableManager.kt +0 -0
  294. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/ScrollViewManager.kt +0 -0
  295. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/SegmentedControlManager.kt +0 -0
  296. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/StatusBarManager.kt +0 -0
  297. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/TabBarManager.kt +0 -0
  298. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/TextManager.kt +0 -0
  299. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/ViewStyler.kt +0 -0
  300. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/components/WebViewManager.kt +0 -0
  301. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/gestures/GestureArbiter.kt +0 -0
  302. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/gestures/GestureCoordinator.kt +0 -0
  303. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/gestures/GestureRecognizers.kt +0 -0
  304. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/modules/BuiltinModules.kt +0 -0
  305. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/modules/DeviceModules.kt +0 -0
  306. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/modules/MediaModules.kt +0 -0
  307. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/modules/NotificationsModule.kt +0 -0
  308. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/modules/PermissionsModule.kt +0 -0
  309. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/modules/StorageModules.kt +0 -0
  310. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/modules/SystemModules.kt +0 -0
  311. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/plugins/GeneratedPlugins.kt +0 -0
  312. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/screens/ScreenRegistry.kt +0 -0
  313. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/views/PNAccessibilityDelegate.kt +0 -0
  314. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/views/PNBorderDrawable.kt +0 -0
  315. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/views/PNEditText.kt +0 -0
  316. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/main/java/com/pythonnative/runtime/views/PNFrameLayout.kt +0 -0
  317. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/test/java/com/pythonnative/runtime/AnimationSpecsTest.kt +0 -0
  318. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/test/java/com/pythonnative/runtime/GestureArbiterTest.kt +0 -0
  319. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/test/java/com/pythonnative/runtime/PNColorTest.kt +0 -0
  320. {pythonnative-0.39.0/src/pythonnative/templates/android_template/pythonnative → pythonnative-0.40.0/src/pythonnative/native/android}/src/test/java/com/pythonnative/runtime/PNTransactionTest.kt +0 -0
  321. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Bridge/PNViewRegistry.swift +0 -0
  322. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNColor.swift +0 -0
  323. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNComponentManager.swift +0 -0
  324. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNContainerView.swift +0 -0
  325. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNOverlayManagers.swift +0 -0
  326. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNScrollViewManager.swift +0 -0
  327. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNTabBarManager.swift +0 -0
  328. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNTextManager.swift +0 -0
  329. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNTransform.swift +0 -0
  330. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNViewManager.swift +0 -0
  331. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNViewState.swift +0 -0
  332. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNViewStyler.swift +0 -0
  333. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Components/PNWebViewManager.swift +0 -0
  334. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Gestures/PNGestureCoordinator.swift +0 -0
  335. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Modules/AlertModule.swift +0 -0
  336. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Modules/LifecycleModules.swift +0 -0
  337. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Modules/MediaModules.swift +0 -0
  338. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Modules/PermissionModules.swift +0 -0
  339. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Modules/SystemModules.swift +0 -0
  340. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Plugins/PNPluginRegistration.swift +0 -0
  341. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Screens/PNScreenRegistry.swift +0 -0
  342. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Support/PNCompat.swift +0 -0
  343. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Support/PNJSON.swift +0 -0
  344. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Support/PNLog.swift +0 -0
  345. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Sources/PythonNativeKit/Support/PNWindow.swift +0 -0
  346. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Tests/PythonNativeKitTests/PNColorTests.swift +0 -0
  347. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Tests/PythonNativeKitTests/PNGestureTests.swift +0 -0
  348. {pythonnative-0.39.0/src/pythonnative/templates/ios_template/PythonNativeKit → pythonnative-0.40.0/src/pythonnative/native/ios}/Tests/PythonNativeKitTests/PNTransactionTests.swift +0 -0
  349. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/__init__.py +0 -0
  350. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/app_state.py +0 -0
  351. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/battery.py +0 -0
  352. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/biometrics.py +0 -0
  353. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/camera.py +0 -0
  354. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/clipboard.py +0 -0
  355. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/fallback.py +0 -0
  356. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/file_system.py +0 -0
  357. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/haptics.py +0 -0
  358. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/linking.py +0 -0
  359. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/location.py +0 -0
  360. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/net_info.py +0 -0
  361. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/notifications.py +0 -0
  362. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/permissions.py +0 -0
  363. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/secure_store.py +0 -0
  364. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_modules/share.py +0 -0
  365. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_views/__init__.py +0 -0
  366. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/native_views/base.py +0 -0
  367. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/navigation/__init__.py +0 -0
  368. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/navigation/container.py +0 -0
  369. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/navigation/hooks.py +0 -0
  370. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/navigation/host.py +0 -0
  371. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/navigation/linking.py +0 -0
  372. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/navigation/screen.py +0 -0
  373. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/navigation/state.py +0 -0
  374. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/net.py +0 -0
  375. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/platform.py +0 -0
  376. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/platform_metrics.py +0 -0
  377. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/project/__init__.py +0 -0
  378. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/project/devices.py +0 -0
  379. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/project/doctor.py +0 -0
  380. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/project/icons.py +0 -0
  381. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/project/ios.py +0 -0
  382. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/project/permissions.py +0 -0
  383. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/project/runtime_assets.py +0 -0
  384. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/py.typed +0 -0
  385. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/reconciler/__init__.py +0 -0
  386. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/reconciler/children.py +0 -0
  387. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/reconciler/vnode.py +0 -0
  388. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/scheduler.py +0 -0
  389. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/storage.py +0 -0
  390. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/style.py +0 -0
  391. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/build.gradle +0 -0
  392. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/proguard-rules.pro +0 -0
  393. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/androidTest/java/com/pythonnative/android_template/ExampleInstrumentedTest.kt +0 -0
  394. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/debug/AndroidManifest.xml +0 -0
  395. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/AndroidManifest.xml +0 -0
  396. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt +0 -0
  397. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/ScreenFragment.kt +0 -0
  398. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/drawable/ic_launcher_background.xml +0 -0
  399. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +0 -0
  400. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/layout/activity_main.xml +0 -0
  401. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +0 -0
  402. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +0 -0
  403. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher.webp +0 -0
  404. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp +0 -0
  405. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher.webp +0 -0
  406. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp +0 -0
  407. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher.webp +0 -0
  408. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp +0 -0
  409. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp +0 -0
  410. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp +0 -0
  411. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp +0 -0
  412. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp +0 -0
  413. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/navigation/nav_graph.xml +0 -0
  414. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/values/colors.xml +0 -0
  415. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/values/strings.xml +0 -0
  416. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/values/themes.xml +0 -0
  417. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/values-night/themes.xml +0 -0
  418. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/xml/backup_rules.xml +0 -0
  419. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/main/res/xml/data_extraction_rules.xml +0 -0
  420. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/app/src/test/java/com/pythonnative/android_template/ExampleUnitTest.kt +0 -0
  421. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/build.gradle +0 -0
  422. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.jar +0 -0
  423. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.properties +0 -0
  424. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/gradle.properties +0 -0
  425. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/gradlew +0 -0
  426. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/gradlew.bat +0 -0
  427. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/android_template/settings.gradle +0 -0
  428. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_template/AppDelegate.swift +0 -0
  429. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_template/Assets.xcassets/AccentColor.colorset/Contents.json +0 -0
  430. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_template/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -0
  431. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_template/Assets.xcassets/Contents.json +0 -0
  432. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_template/Base.lproj/LaunchScreen.storyboard +0 -0
  433. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_template/BridgingHeader.h +0 -0
  434. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_template/Info.plist +0 -0
  435. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_template/PythonRuntime.swift +0 -0
  436. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_template/SceneDelegate.swift +0 -0
  437. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_template/ViewController.swift +0 -0
  438. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_template.xcodeproj/project.pbxproj +0 -0
  439. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_template.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -0
  440. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_templateTests/ios_templateTests.swift +0 -0
  441. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITests.swift +0 -0
  442. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITestsLaunchTests.swift +0 -0
  443. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/testing/__init__.py +0 -0
  444. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative/utils.py +0 -0
  445. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative.egg-info/dependency_links.txt +0 -0
  446. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative.egg-info/entry_points.txt +0 -0
  447. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative.egg-info/requires.txt +0 -0
  448. {pythonnative-0.39.0 → pythonnative-0.40.0}/src/pythonnative.egg-info/top_level.txt +0 -0
  449. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_alert.py +0 -0
  450. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_animated.py +0 -0
  451. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_animated_graph.py +0 -0
  452. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_appearance.py +0 -0
  453. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_async_hooks.py +0 -0
  454. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_core_semantics.py +0 -0
  455. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_devclient.py +0 -0
  456. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_devserver.py +0 -0
  457. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_devserver_ws.py +0 -0
  458. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_element.py +0 -0
  459. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_events.py +0 -0
  460. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_extended_components.py +0 -0
  461. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_gesture_composition.py +0 -0
  462. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_gestures.py +0 -0
  463. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_hooks.py +0 -0
  464. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_hosts.py +0 -0
  465. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_incremental_render.py +0 -0
  466. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_interaction_props.py +0 -0
  467. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_ios_log.py +0 -0
  468. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_metric_hooks.py +0 -0
  469. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_mutations.py +0 -0
  470. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_native_modules.py +0 -0
  471. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_native_views.py +0 -0
  472. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_net.py +0 -0
  473. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_new_components.py +0 -0
  474. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_platform.py +0 -0
  475. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_platform_metrics.py +0 -0
  476. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_reconciler.py +0 -0
  477. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_ref.py +0 -0
  478. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_sdk.py +0 -0
  479. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_smoke.py +0 -0
  480. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_storage.py +0 -0
  481. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_style.py +0 -0
  482. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_transitions.py +0 -0
  483. {pythonnative-0.39.0 → pythonnative-0.40.0}/tests/test_utils.py +0 -0
@@ -0,0 +1,11 @@
1
+ global-exclude *.pyc *.pyo .DS_Store
2
+ recursive-exclude src/pythonnative/native .build/* .gradle/* .cxx/* build/* .swiftpm/* .kotlin/*
3
+ prune src/pythonnative/native/android/build
4
+ prune src/pythonnative/native/android/.gradle
5
+ prune src/pythonnative/native/android/.cxx
6
+ prune src/pythonnative/native/ios/.build
7
+ prune src/pythonnative/native/ios/.swiftpm
8
+ prune src/pythonnative/native/yoga/.build
9
+ prune src/pythonnative/templates/android_template/app/build
10
+ prune src/pythonnative/templates/android_template/.gradle
11
+ prune src/pythonnative/templates/ios_template/build
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pythonnative
3
- Version: 0.39.0
3
+ Version: 0.40.0
4
4
  Summary: Cross-platform native UI toolkit for Android and iOS
5
5
  Author: Owen Carey
6
6
  License: MIT License
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pythonnative"
7
- version = "0.39.0"
7
+ version = "0.40.0"
8
8
  description = "Cross-platform native UI toolkit for Android and iOS"
9
9
  authors = [
10
10
  { name = "Owen Carey" }
@@ -93,8 +93,15 @@ license-files = ["LICENSE*"]
93
93
  [tool.setuptools.package-data]
94
94
  pythonnative = [
95
95
  "py.typed",
96
- "templates/**",
97
- "devserver/static/*",
96
+ "templates/**", "native/**", "sdk/templates/**",
97
+ "devserver/static/**",
98
+ ]
99
+
100
+ [tool.setuptools.exclude-package-data]
101
+ pythonnative = [
102
+ "**/build/**", "**/.build/**", "**/.gradle/**",
103
+ "**/.cxx/**", "**/.swiftpm/**", "**/.kotlin/**",
104
+ "**/__pycache__/**", "**/.DS_Store",
98
105
  ]
99
106
 
100
107
  [tool.ruff]
@@ -0,0 +1,19 @@
1
+ """Build the host Yoga binding; mobile hosts compile the vendored core."""
2
+
3
+ import os
4
+ from pathlib import Path
5
+
6
+ from setuptools import Extension, setup
7
+
8
+ root = Path("src/pythonnative/native/yoga")
9
+ setup(
10
+ ext_modules=[
11
+ Extension(
12
+ "pythonnative._yoga",
13
+ sources=[str(root / "python.cpp"), *map(str, sorted((root / "yoga").rglob("*.cpp")))],
14
+ include_dirs=[str(root)],
15
+ language="c++",
16
+ extra_compile_args=["/std:c++20"] if os.name == "nt" else ["-std=c++20"],
17
+ )
18
+ ]
19
+ )
@@ -62,9 +62,9 @@ Example:
62
62
  ```
63
63
  """
64
64
 
65
- __version__ = "0.39.0"
65
+ __version__ = "0.40.0"
66
66
 
67
- from . import appearance, diagnostics, gestures, images, runtime, sdk
67
+ from . import appearance, diagnostics, gestures, runtime, sdk
68
68
  from .alerts import Alert
69
69
  from .animated import Animated, AnimatedValue, use_animated_value
70
70
  from .component import Component, component, memo
@@ -348,7 +348,6 @@ __all__ = [
348
348
  # Appearance
349
349
  "appearance",
350
350
  # Image pipeline
351
- "images",
352
351
  # Animation
353
352
  "Animated",
354
353
  "AnimatedValue",
@@ -85,7 +85,7 @@ import weakref
85
85
  from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple
86
86
 
87
87
  from .element import Element
88
- from .hooks import use_effect, use_ref
88
+ from .hooks import Ref, use_effect, use_ref
89
89
  from .runtime import resolve_future
90
90
  from .style import StyleProp, resolve_style
91
91
 
@@ -243,12 +243,17 @@ class AnimatedNode:
243
243
  except Exception:
244
244
  pass
245
245
 
246
+ from .animation_graph import install
247
+
248
+ install(self)
249
+
246
250
  def _detach() -> None:
247
251
  with self._lock:
248
252
  try:
249
253
  self._attachments.remove(binding)
250
254
  except ValueError:
251
255
  pass
256
+ install(self, detached_tag=tag)
252
257
 
253
258
  return _detach
254
259
 
@@ -404,6 +409,12 @@ class AnimatedValue(AnimatedNode):
404
409
  def set_value(self, new_value: float) -> None:
405
410
  """Set the value immediately, pushing to native views and listeners."""
406
411
  self._apply(float(new_value), push_native=True)
412
+ from .animation_graph import install
413
+
414
+ graph = install(self)
415
+ if graph and graph["bindings"]:
416
+ backend = _backend()
417
+ backend.set_animated_property(graph["bindings"][0][0], f"_pn_graph:{id(self)}", float(new_value))
407
418
 
408
419
  def _apply(self, new_value: float, push_native: bool) -> None:
409
420
  with self._lock:
@@ -695,7 +706,12 @@ class AnimatedEvent:
695
706
  if raw is None:
696
707
  continue
697
708
  try:
698
- node.set_value(float(raw))
709
+ if getattr(_backend(), "install_animation_graph", None) is not None:
710
+ # Native already evaluated the graph at the input timestamp.
711
+ # Python observes the sample without echoing an older frame.
712
+ node._value = float(raw)
713
+ else:
714
+ node.set_value(float(raw))
699
715
  except (TypeError, ValueError):
700
716
  continue
701
717
  if self._listener is not None:
@@ -1041,21 +1057,21 @@ def _start_native(value: AnimatedValue, spec: Dict[str, Any]) -> Optional[_Nativ
1041
1057
  animation; otherwise rolls back any accepted targets and returns
1042
1058
  ``None`` so the caller falls back to the Python ticker.
1043
1059
  """
1044
- targets = value.attachments()
1045
- if not targets:
1046
- return None
1047
- if value.has_listeners():
1048
- # Python listeners want per-frame values; only the ticker
1049
- # provides those.
1050
- return None
1051
- if value._has_dependents():
1052
- # Derived nodes (interpolations, arithmetic) need per-frame
1053
- # Python evaluation to keep their own attachments in sync.
1054
- return None
1055
1060
  try:
1056
1061
  backend = _backend()
1057
1062
  except Exception:
1058
1063
  return None
1064
+ from .animation_graph import install
1065
+
1066
+ graph = install(value)
1067
+ if graph and graph["bindings"]:
1068
+ targets = [(graph["bindings"][0][0], f"_pn_graph:{id(value)}")]
1069
+ else:
1070
+ targets = value.attachments()
1071
+ if value._has_dependents():
1072
+ return None
1073
+ if not targets or value.has_listeners():
1074
+ return None
1059
1075
 
1060
1076
  group = _NativeAnimationGroup(value, _projected_final_value(spec))
1061
1077
  accepted: List[Tuple[int, int]] = [] # (anim_id, tag)
@@ -1368,24 +1384,32 @@ def _make_animated_factory(
1368
1384
  plain_style, bindings = _resolve_style_with_values(style)
1369
1385
 
1370
1386
  ref = use_ref(None)
1387
+ attached: Ref[List[Callable[[], None]]] = use_ref([])
1371
1388
 
1372
- def _attach_bindings() -> Callable[[], None]:
1389
+ def _attach_bindings() -> None:
1373
1390
  tag = ref._pn_tag
1374
1391
  if tag is None:
1375
- return lambda: None
1392
+ return
1393
+ # Derived nodes can be rebuilt on every render. Install their new
1394
+ # bindings before releasing the old ones so a running native graph
1395
+ # never temporarily loses every owner.
1376
1396
  detachers = [value.attach(tag, _animated_prop_name(prop)) for prop, value in bindings.items()]
1397
+ previous = attached.current
1398
+ attached.current = detachers
1399
+ for detach in previous:
1400
+ detach()
1377
1401
 
1402
+ def _unmount_bindings() -> Callable[[], None]:
1378
1403
  def _cleanup() -> None:
1379
- for fn in detachers:
1380
- try:
1381
- fn()
1382
- except Exception:
1383
- pass
1404
+ for detach in attached.current:
1405
+ detach()
1406
+ attached.current = []
1384
1407
 
1385
1408
  return _cleanup
1386
1409
 
1387
1410
  # Re-attach whenever the binding set changes identity.
1388
1411
  use_effect(_attach_bindings, [tuple(sorted((k, id(v)) for k, v in bindings.items()))])
1412
+ use_effect(_unmount_bindings, [])
1389
1413
 
1390
1414
  if element_type == "Text":
1391
1415
  text = children[0] if children else kwargs.pop("text", "")
@@ -0,0 +1,78 @@
1
+ """Portable animation expressions evaluated by the native UI thread."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+
8
+ def serialize(root: Any) -> dict[str, Any]:
9
+ """Serialize one connected animation graph in dependency order."""
10
+ from .animated import AnimatedInterpolation, AnimatedNode, AnimatedValue, _AnimatedDiffClamp, _AnimatedOperation
11
+
12
+ connected: dict[int, Any] = {}
13
+
14
+ def discover(node: Any) -> None:
15
+ if not isinstance(node, AnimatedNode) or id(node) in connected:
16
+ return
17
+ connected[id(node)] = node
18
+ for child in list(node._children):
19
+ discover(child)
20
+ for parent in getattr(node, "_parents", [getattr(node, "_parent", None)]):
21
+ discover(parent)
22
+
23
+ discover(root)
24
+ encoded: dict[int, dict[str, Any]] = {}
25
+
26
+ def encode(node: Any) -> Any:
27
+ if not isinstance(node, AnimatedNode):
28
+ return {"constant": float(node)}
29
+ identity = id(node)
30
+ if identity not in encoded:
31
+ definition: dict[str, Any] = {"id": identity}
32
+ if isinstance(node, AnimatedValue):
33
+ definition.update(kind="value", value=node.value)
34
+ elif isinstance(node, AnimatedInterpolation):
35
+ definition.update(
36
+ kind="interpolate",
37
+ inputs=[encode(node._parent)],
38
+ ranges=node._inputs,
39
+ outputs=node._outputs,
40
+ color=node._kind == "color",
41
+ left=node._left,
42
+ right=node._right,
43
+ )
44
+ elif isinstance(node, _AnimatedOperation):
45
+ definition.update(kind=node._op, inputs=[encode(parent) for parent in node._parents])
46
+ elif isinstance(node, _AnimatedDiffClamp):
47
+ definition.update(
48
+ kind="diff_clamp",
49
+ inputs=[encode(node._parent)],
50
+ minimum=node._min,
51
+ maximum=node._max,
52
+ previous=node._last_input,
53
+ value=node.value,
54
+ )
55
+ else:
56
+ raise TypeError(f"Unsupported animated node {type(node).__name__}")
57
+ encoded[identity] = definition
58
+ return {"node": identity}
59
+
60
+ for node in connected.values():
61
+ encode(node)
62
+ bindings = [[tag, prop, id(node)] for node in connected.values() for tag, prop in node.attachments()]
63
+ return {"id": min(connected), "nodes": list(encoded.values()), "bindings": bindings}
64
+
65
+
66
+ def install(node: Any, *, detached_tag: int | None = None) -> dict[str, Any] | None:
67
+ """Synchronize native graph ownership when a binding is attached or removed."""
68
+ from .animated import _backend
69
+
70
+ backend = _backend()
71
+ handler = getattr(backend, "install_animation_graph", None)
72
+ if handler is None:
73
+ return None
74
+ graph = serialize(node)
75
+ tag = graph["bindings"][0][0] if graph["bindings"] else detached_tag
76
+ if tag is not None:
77
+ handler(tag, graph)
78
+ return graph
@@ -37,7 +37,7 @@ def start(dev: bool = False, strict: bool = False) -> Dict[str, Any]:
37
37
  error screen with the full traceback.
38
38
 
39
39
  Returns:
40
- A status dict (``{"protocol": 1, "platform": "ios"}``) that the
40
+ A status dict (``{"protocol": 2, "platform": "ios"}``) that the
41
41
  template logs. Unless ``strict`` is set this never raises:
42
42
  failures are printed and reported in the dict under
43
43
  ``"error"``.
@@ -57,6 +57,12 @@ def start(dev: bool = False, strict: bool = False) -> Dict[str, Any]:
57
57
  _ios_log.install()
58
58
  except Exception:
59
59
  pass
60
+ from .runtime import start as start_runtime
61
+
62
+ start_runtime()
63
+ from .sdk.schema import load_bundled_contracts
64
+
65
+ load_bundled_contracts()
60
66
  from . import bridge
61
67
 
62
68
  status_["protocol"] = bridge.handshake()
@@ -65,11 +71,6 @@ def start(dev: bool = False, strict: bool = False) -> Dict[str, Any]:
65
71
  from . import diagnostics
66
72
 
67
73
  diagnostics.set_dev_mode(True)
68
- # Create the guest loop now so the first pump request has a
69
- # loop to drive and effects can schedule work during mount.
70
- from .runtime import get_loop
71
-
72
- get_loop()
73
74
  # Import the view backend eagerly: on a slow device the first
74
75
  # commit shouldn't also pay for importing the reconciler.
75
76
  from .native_views import get_registry
@@ -19,8 +19,7 @@ tests that want to exercise the bridge itself install a
19
19
  from __future__ import annotations
20
20
 
21
21
  import threading
22
- from collections import deque
23
- from typing import Any, Callable, Deque, Dict, Optional, Protocol, Tuple
22
+ from typing import Callable, Optional, Protocol, Tuple
24
23
 
25
24
  from . import codec
26
25
 
@@ -31,11 +30,11 @@ __all__ = [
31
30
  "has_transport",
32
31
  "handshake",
33
32
  "native_callback",
34
- "post_to_main",
35
33
  "set_transport",
36
34
  ]
37
35
 
38
- PROTOCOL_VERSION = 1
36
+ from .commits import PROTOCOL_VERSION
37
+
39
38
  """Bridge protocol version this Python package speaks."""
40
39
 
41
40
 
@@ -47,7 +46,7 @@ class Transport(Protocol):
47
46
  def protocol_version(self) -> int:
48
47
  """Return the protocol version compiled into the native library."""
49
48
 
50
- def apply(self, transaction_json: str) -> None:
49
+ def apply(self, transaction_json: str) -> str:
51
50
  """Apply one serialized transaction (a JSON array of ops)."""
52
51
 
53
52
  def measure(self, tag: int, max_width: float, max_height: float) -> Tuple[float, float]:
@@ -154,58 +153,29 @@ def handshake() -> int:
154
153
  f"expects v{PROTOCOL_VERSION}. Re-run 'pn build' so the staged template matches the "
155
154
  "installed pythonnative package."
156
155
  )
156
+ if getattr(get_transport(), "name", "") in {"ios", "android"}:
157
+ from ..sdk.schema import fingerprint
158
+
159
+ reply = codec.loads(get_transport().call("Runtime", "capabilities", codec.dumps({"id": 0, "args": {}})))
160
+ capabilities = reply.get("value", {}) if isinstance(reply, dict) else {}
161
+ if capabilities.get("schema") != fingerprint() or capabilities.get("yoga") != "3.2.1":
162
+ raise RuntimeError("Native component contracts changed. Rebuild the app with 'pn run'.")
157
163
  return version
158
164
 
159
165
 
160
166
  # ======================================================================
161
- # Main-queue posting
167
+ # native -> Python
162
168
  # ======================================================================
163
- #
164
- # The asyncio guest loop and ``call_on_main_thread`` need a way to run
165
- # a callable on the platform main thread's next turn. Native provides
166
- # it: ``Host.post()`` schedules ``callback("pump")``, which drains this
167
- # queue. Keeping the queue in Python means one native crossing per
168
- # batch of callables rather than one per callable.
169
-
170
- _main_queue: Deque[Callable[[], None]] = deque()
171
- _main_queue_lock = threading.Lock()
172
- _pump_requested = False
173
-
174
-
175
- def post_to_main(fn: Callable[[], None]) -> None:
176
- """Queue ``fn`` for the next main-thread turn (never runs inline)."""
177
- global _pump_requested
178
- with _main_queue_lock:
179
- _main_queue.append(fn)
180
- if _pump_requested:
181
- return
182
- _pump_requested = True
183
- try:
184
- get_transport().call("Host", "post", codec.dumps({"call_id": 0, "args": {}}))
185
- except Exception as exc:
186
- with _main_queue_lock:
187
- _pump_requested = False
188
- print(f"[pn.bridge] Host.post failed; running {len(_main_queue)} queued callable(s) inline: {exc!r}")
189
- _drain_main_queue()
190
-
191
-
192
- def _drain_main_queue() -> None:
193
- global _pump_requested
194
- while True:
195
- with _main_queue_lock:
196
- if not _main_queue:
197
- _pump_requested = False
198
- return
199
- fn = _main_queue.popleft()
200
- try:
201
- fn()
202
- except Exception as exc:
203
- print(f"[pn.bridge] main-thread callable raised: {exc!r}")
204
169
 
205
170
 
206
- # ======================================================================
207
- # native -> Python
208
- # ======================================================================
171
+ # Callback threads coalesce continuous input before the application loop drains.
172
+ _continuous: dict[tuple[int, str], list[str]] = {}
173
+
174
+
175
+ def _deliver_continuous(tag: int, name: str, slot: list[str]) -> None:
176
+ if _continuous.get((tag, name)) is slot:
177
+ _continuous.pop((tag, name), None)
178
+ native_callback("event", tag, name, slot[0])
209
179
 
210
180
 
211
181
  def native_callback(kind: str, tag: int, name: str, payload: str) -> Optional[str]:
@@ -225,7 +195,31 @@ def native_callback(kind: str, tag: int, name: str, payload: str) -> Optional[st
225
195
  ``diagnostics`` so nothing propagates into UIKit or the
226
196
  Android looper.
227
197
  """
198
+ from ..runtime import _on_loop_thread, get_loop
199
+
200
+ loop = get_loop()
201
+ if loop.is_running() and not _on_loop_thread(loop):
202
+ if kind == "event" and name in {"on_scroll", "on_selection_change", "on_gesture_update"}:
203
+ key = (tag, name)
204
+ slot = _continuous.get(key)
205
+ if slot is None:
206
+ slot = [payload]
207
+ _continuous[key] = slot
208
+ loop.call_soon_threadsafe(_deliver_continuous, tag, name, slot)
209
+ else:
210
+ slot[0] = payload
211
+ else:
212
+ _continuous.clear()
213
+ loop.call_soon_threadsafe(native_callback, kind, tag, name, payload)
214
+ return None
228
215
  try:
216
+ if kind == "layout":
217
+ from ..native_views import get_registry
218
+
219
+ backend = get_registry()
220
+ if backend.on_layout is not None:
221
+ backend.on_layout(codec.loads(payload))
222
+ return None
229
223
  if kind == "event":
230
224
  return _on_event(int(tag), name, payload)
231
225
  if kind == "module":
@@ -243,9 +237,6 @@ def native_callback(kind: str, tag: int, name: str, payload: str) -> Optional[st
243
237
  data = codec.loads(payload) or {}
244
238
  native_animation_completed(int(data.get("id", 0)), bool(data.get("finished", True)))
245
239
  return None
246
- if kind == "pump":
247
- _drain_main_queue()
248
- return None
249
240
  print(f"[pn.bridge] unknown callback kind {kind!r}")
250
241
  except Exception as exc:
251
242
  from .. import diagnostics
@@ -261,6 +252,14 @@ def _on_event(tag: int, name: str, payload: str) -> Optional[str]:
261
252
  from ..events import get_event_registry
262
253
 
263
254
  args = codec.loads(payload)
255
+ from ..native_views import get_registry
256
+
257
+ backend = get_registry()
258
+ accept = getattr(backend, "accept_event", None)
259
+ if accept is not None:
260
+ if not accept(tag, name, args):
261
+ return None
262
+ args = args["args"]
264
263
  if args is None:
265
264
  args = []
266
265
  elif not isinstance(args, list):
@@ -276,7 +275,7 @@ def _on_event(tag: int, name: str, payload: str) -> Optional[str]:
276
275
  return None if result is None else codec.dumps(codec.to_jsonable(result))
277
276
  return None
278
277
  try:
279
- result = callback(*args)
278
+ result = get_event_registry().invoke(tag, name, *args)
280
279
  except Exception as exc:
281
280
  from .. import diagnostics
282
281
 
@@ -285,7 +284,9 @@ def _on_event(tag: int, name: str, payload: str) -> Optional[str]:
285
284
 
286
285
  traceback.print_exc()
287
286
  return None
288
- if result is None:
287
+ import inspect
288
+
289
+ if result is None or inspect.isawaitable(result):
289
290
  return None
290
291
  try:
291
292
  return codec.dumps(codec.to_jsonable(result))
@@ -294,20 +295,8 @@ def _on_event(tag: int, name: str, payload: str) -> Optional[str]:
294
295
 
295
296
 
296
297
  def _reset_for_tests() -> None:
297
- """Drop the transport and any queued main-thread work (test isolation)."""
298
- global _transport, _explicit, _pump_requested
298
+ """Drop the transport for test isolation."""
299
+ global _transport, _explicit
299
300
  with _transport_lock:
300
301
  _transport = None
301
302
  _explicit = False
302
- with _main_queue_lock:
303
- _main_queue.clear()
304
- _pump_requested = False
305
-
306
-
307
- def transport_state() -> Dict[str, Any]:
308
- """Diagnostics snapshot (used by ``pn doctor`` and tests)."""
309
- return {
310
- "transport": None if _transport is None else _transport.name,
311
- "protocol_version": PROTOCOL_VERSION,
312
- "queued_main_callables": len(_main_queue),
313
- }
@@ -39,9 +39,9 @@ class AndroidTransport:
39
39
  """Return the protocol version compiled into the native library."""
40
40
  return int(self._bridge.protocolVersion())
41
41
 
42
- def apply(self, transaction_json: str) -> None:
42
+ def apply(self, transaction_json: str) -> str:
43
43
  """Apply one serialized transaction (a JSON array of ops)."""
44
- self._bridge.apply(transaction_json)
44
+ return str(self._bridge.apply(transaction_json))
45
45
 
46
46
  def measure(self, tag: int, max_width: float, max_height: float) -> Tuple[float, float]:
47
47
  """Return the intrinsic ``(width, height)`` of the view ``tag`` under the constraints."""
@@ -88,6 +88,12 @@ def split_props(props: Dict[str, Any]) -> Tuple[Dict[str, Any], Dict[str, Any]]:
88
88
  python: Dict[str, Any] = {}
89
89
  for key, value in props.items():
90
90
  if callable(value) and not isinstance(value, type):
91
+ from ..animated import AnimatedEvent
92
+
93
+ if isinstance(value, AnimatedEvent):
94
+ wire.setdefault("_pn_animated_events", {})[key] = {
95
+ name: id(node) for name, node in value._bindings.items()
96
+ }
91
97
  python[key] = value
92
98
  continue
93
99
  try:
@@ -0,0 +1,114 @@
1
+ """Versioned commit validation and surface ownership.
2
+
3
+ A commit is validated in full before it changes a native tree. Revisions are
4
+ strictly consecutive within an application and surface. A failed native mount
5
+ poisons that surface until the host explicitly resets and remounts it.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import copy
11
+ import math
12
+ from dataclasses import dataclass, field
13
+ from typing import Any
14
+
15
+ PROTOCOL_VERSION = 2
16
+
17
+
18
+ class CommitError(RuntimeError):
19
+ """A malformed, stale, or failed native transaction."""
20
+
21
+
22
+ @dataclass
23
+ class ViewState:
24
+ """Wire-visible view state used to validate a whole transaction."""
25
+
26
+ type_name: str
27
+ props: dict[str, Any]
28
+ parent: int | None = None
29
+ children: list[int] = field(default_factory=list)
30
+
31
+
32
+ @dataclass
33
+ class CommitState:
34
+ """Committed revision and structural state for one native surface."""
35
+
36
+ application: str = ""
37
+ surface: int = 0
38
+ revision: int = 0
39
+ views: dict[int, ViewState] = field(default_factory=dict)
40
+
41
+ def prepare(self, envelope: Any) -> CommitState:
42
+ """Validate without mutating this state and return the candidate state."""
43
+ if not isinstance(envelope, dict) or envelope.get("version") != PROTOCOL_VERSION:
44
+ raise CommitError("Expected a protocol v2 commit envelope; rebuild the native client")
45
+ application, surface, revision = (envelope.get(k) for k in ("application", "surface", "revision"))
46
+ if not isinstance(application, str) or not application or type(surface) is not int or surface <= 0:
47
+ raise CommitError("Invalid application or surface identity")
48
+ if self.application and (application, surface) != (self.application, self.surface):
49
+ raise CommitError("Commit belongs to another application or surface")
50
+ if type(revision) is not int or revision != self.revision + 1:
51
+ raise CommitError(f"Expected revision {self.revision + 1}, received {revision!r}")
52
+ ops = envelope.get("ops")
53
+ if not isinstance(ops, list):
54
+ raise CommitError("Commit ops must be a list")
55
+ result = CommitState(application, surface, revision, copy.deepcopy(self.views))
56
+ for index, op in enumerate(ops):
57
+ try:
58
+ result._validate_op(op)
59
+ except (KeyError, TypeError, ValueError, IndexError) as exc:
60
+ raise CommitError(f"Invalid op {index}: {exc}") from exc
61
+ return result
62
+
63
+ def _validate_op(self, op: Any) -> None:
64
+ if not isinstance(op, list) or len(op) < 2:
65
+ raise ValueError("Expected an operation array")
66
+ code, tag = op[:2]
67
+ lengths = {"c": 4, "u": 3, "i": 4, "d": 2, "f": 6}
68
+ if code not in lengths or len(op) != lengths[code] or type(tag) is not int or tag <= 0:
69
+ raise ValueError("Invalid opcode, arity, or tag")
70
+ if code == "c":
71
+ if tag in self.views or not isinstance(op[2], str) or not op[2] or not isinstance(op[3], dict):
72
+ raise ValueError("Invalid or duplicate create")
73
+ self.views[tag] = ViewState(op[2], dict(op[3]))
74
+ return
75
+ view = self.views[tag]
76
+ if code == "u":
77
+ if not isinstance(op[2], dict):
78
+ raise ValueError("Update requires a property mapping")
79
+ for name, value in op[2].items():
80
+ if value is None:
81
+ view.props.pop(name, None)
82
+ else:
83
+ view.props[name] = value
84
+ elif code == "i":
85
+ child_tag, index = op[2:]
86
+ if type(child_tag) is not int or type(index) is not int or index < 0:
87
+ raise ValueError("Invalid child or insertion index")
88
+ child = self.views[child_tag]
89
+ ancestor: int | None = tag
90
+ while ancestor is not None:
91
+ if ancestor == child_tag:
92
+ raise ValueError("Insertion creates a cycle")
93
+ ancestor = self.views[ancestor].parent
94
+ if child.parent is not None:
95
+ self.views[child.parent].children.remove(child_tag)
96
+ if index > len(view.children):
97
+ raise ValueError("Insertion index exceeds child count")
98
+ view.children.insert(index, child_tag)
99
+ child.parent = tag
100
+ elif code == "d":
101
+ if view.children:
102
+ raise ValueError("Destroy children before their parent")
103
+ if view.parent is not None:
104
+ self.views[view.parent].children.remove(tag)
105
+ del self.views[tag]
106
+ elif code == "f":
107
+ if any(type(n) not in (float, int) or not math.isfinite(n) for n in op[2:]):
108
+ raise ValueError("Frame values must be finite numbers")
109
+ if op[4] < 0 or op[5] < 0:
110
+ raise ValueError("Frame sizes must be nonnegative")
111
+
112
+ def acknowledgement(self) -> dict[str, Any]:
113
+ """Identify the exact revision native successfully mounted."""
114
+ return {"ok": True, "application": self.application, "surface": self.surface, "revision": self.revision}