pythonnative 0.40.0__cp313-cp313-win_amd64.whl

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 (418) hide show
  1. pythonnative/__init__.py +411 -0
  2. pythonnative/_ios_log.py +92 -0
  3. pythonnative/_yoga.cp313-win_amd64.pyd +0 -0
  4. pythonnative/alerts.py +236 -0
  5. pythonnative/animated.py +1687 -0
  6. pythonnative/animation_graph.py +78 -0
  7. pythonnative/appearance.py +124 -0
  8. pythonnative/bootstrap.py +100 -0
  9. pythonnative/bridge/__init__.py +302 -0
  10. pythonnative/bridge/android.py +78 -0
  11. pythonnative/bridge/codec.py +170 -0
  12. pythonnative/bridge/commits.py +114 -0
  13. pythonnative/bridge/fake.py +243 -0
  14. pythonnative/bridge/ios.py +138 -0
  15. pythonnative/bridge/web.py +489 -0
  16. pythonnative/cli/__init__.py +7 -0
  17. pythonnative/cli/pn.py +1214 -0
  18. pythonnative/component.py +271 -0
  19. pythonnative/components/__init__.py +111 -0
  20. pythonnative/components/_base.py +166 -0
  21. pythonnative/components/controls.py +521 -0
  22. pythonnative/components/layout.py +518 -0
  23. pythonnative/components/lists.py +785 -0
  24. pythonnative/components/media.py +204 -0
  25. pythonnative/components/overlays.py +107 -0
  26. pythonnative/components/pressable.py +252 -0
  27. pythonnative/components/structural.py +167 -0
  28. pythonnative/components/text.py +291 -0
  29. pythonnative/devclient.py +824 -0
  30. pythonnative/devserver/__init__.py +34 -0
  31. pythonnative/devserver/server.py +718 -0
  32. pythonnative/devserver/static/animation_graph.js +82 -0
  33. pythonnative/devserver/static/bridge.js +147 -0
  34. pythonnative/devserver/static/colors.js +70 -0
  35. pythonnative/devserver/static/host.js +552 -0
  36. pythonnative/devserver/static/index.html +60 -0
  37. pythonnative/devserver/static/layout.js +85 -0
  38. pythonnative/devserver/static/preview.css +415 -0
  39. pythonnative/devserver/static/renderer.js +1994 -0
  40. pythonnative/devserver/static/shell.js +345 -0
  41. pythonnative/devserver/static/yoga/LICENSE +21 -0
  42. pythonnative/devserver/static/yoga/binaries/yoga-wasm-base64-esm.js +75 -0
  43. pythonnative/devserver/static/yoga/src/generated/YGEnums.d.ts +189 -0
  44. pythonnative/devserver/static/yoga/src/generated/YGEnums.js +211 -0
  45. pythonnative/devserver/static/yoga/src/generated/YGEnums.js.map +1 -0
  46. pythonnative/devserver/static/yoga/src/index.d.ts +12 -0
  47. pythonnative/devserver/static/yoga/src/index.js +16 -0
  48. pythonnative/devserver/static/yoga/src/index.js.map +1 -0
  49. pythonnative/devserver/static/yoga/src/load.d.ts +11 -0
  50. pythonnative/devserver/static/yoga/src/load.js +17 -0
  51. pythonnative/devserver/static/yoga/src/load.js.map +1 -0
  52. pythonnative/devserver/static/yoga/src/wrapAssembly.d.ts +155 -0
  53. pythonnative/devserver/static/yoga/src/wrapAssembly.js +125 -0
  54. pythonnative/devserver/static/yoga/src/wrapAssembly.js.map +1 -0
  55. pythonnative/devserver/watcher.py +267 -0
  56. pythonnative/devserver/ws.py +421 -0
  57. pythonnative/diagnostics.py +241 -0
  58. pythonnative/element.py +159 -0
  59. pythonnative/equality.py +19 -0
  60. pythonnative/events.py +231 -0
  61. pythonnative/gestures.py +1333 -0
  62. pythonnative/hooks.py +1621 -0
  63. pythonnative/hosts/__init__.py +63 -0
  64. pythonnative/hosts/base.py +596 -0
  65. pythonnative/hosts/native.py +302 -0
  66. pythonnative/hot_reload.py +585 -0
  67. pythonnative/layout.py +328 -0
  68. pythonnative/mutations.py +142 -0
  69. pythonnative/native/android/build.gradle +52 -0
  70. pythonnative/native/android/gradle.properties +3 -0
  71. pythonnative/native/android/settings.gradle +12 -0
  72. pythonnative/native/android/src/main/AndroidManifest.xml +11 -0
  73. pythonnative/native/android/src/main/cpp/CMakeLists.txt +9 -0
  74. pythonnative/native/android/src/main/cpp/yoga_jni.cpp +52 -0
  75. pythonnative/native/android/src/main/java/com/pythonnative/generated/NativeModules.kt +5 -0
  76. pythonnative/native/android/src/main/java/com/pythonnative/generated/NativeProps.kt +3705 -0
  77. pythonnative/native/android/src/main/java/com/pythonnative/generated/PNContracts.kt +129 -0
  78. pythonnative/native/android/src/main/java/com/pythonnative/runtime/PNBridge.kt +261 -0
  79. pythonnative/native/android/src/main/java/com/pythonnative/runtime/PythonHost.kt +20 -0
  80. pythonnative/native/android/src/main/java/com/pythonnative/runtime/animation/AnimationGraph.kt +108 -0
  81. pythonnative/native/android/src/main/java/com/pythonnative/runtime/animation/AnimationSpecs.kt +141 -0
  82. pythonnative/native/android/src/main/java/com/pythonnative/runtime/animation/PNAnimator.kt +257 -0
  83. pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/CommitState.kt +106 -0
  84. pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/JsonUtil.kt +175 -0
  85. pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/MainThread.kt +40 -0
  86. pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/PNLog.kt +33 -0
  87. pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/PNRegistry.kt +82 -0
  88. pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/PNTransaction.kt +80 -0
  89. pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/TransactionApplier.kt +117 -0
  90. pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/ViewRegistry.kt +74 -0
  91. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/BuiltinComponents.kt +37 -0
  92. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ButtonManager.kt +32 -0
  93. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ComponentManager.kt +213 -0
  94. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ContainerManagers.kt +69 -0
  95. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ControlManagers.kt +186 -0
  96. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/DatePickerManager.kt +123 -0
  97. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ImageLoader.kt +141 -0
  98. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ImageManager.kt +162 -0
  99. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ModalManager.kt +134 -0
  100. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/PNColor.kt +201 -0
  101. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/PickerManager.kt +86 -0
  102. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/PortalManager.kt +55 -0
  103. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/PressableManager.kt +122 -0
  104. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ScreenStackManager.kt +110 -0
  105. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ScrollViewManager.kt +214 -0
  106. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/SegmentedControlManager.kt +113 -0
  107. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/StatusBarManager.kt +52 -0
  108. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/TabBarManager.kt +131 -0
  109. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/TextInputManager.kt +250 -0
  110. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/TextManager.kt +233 -0
  111. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ViewStyler.kt +355 -0
  112. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/VirtualListManager.kt +159 -0
  113. pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/WebViewManager.kt +149 -0
  114. pythonnative/native/android/src/main/java/com/pythonnative/runtime/gestures/GestureArbiter.kt +233 -0
  115. pythonnative/native/android/src/main/java/com/pythonnative/runtime/gestures/GestureCoordinator.kt +127 -0
  116. pythonnative/native/android/src/main/java/com/pythonnative/runtime/gestures/GestureRecognizers.kt +527 -0
  117. pythonnative/native/android/src/main/java/com/pythonnative/runtime/layout/NativeLayout.kt +145 -0
  118. pythonnative/native/android/src/main/java/com/pythonnative/runtime/layout/YogaNode.kt +29 -0
  119. pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/BuiltinModules.kt +73 -0
  120. pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/DeviceModules.kt +316 -0
  121. pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/HostModule.kt +61 -0
  122. pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/MediaModules.kt +200 -0
  123. pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/NativeModule.kt +158 -0
  124. pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/NotificationsModule.kt +100 -0
  125. pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/PermissionsModule.kt +99 -0
  126. pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/StorageModules.kt +89 -0
  127. pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/SystemModules.kt +178 -0
  128. pythonnative/native/android/src/main/java/com/pythonnative/runtime/plugins/GeneratedPlugins.kt +16 -0
  129. pythonnative/native/android/src/main/java/com/pythonnative/runtime/screens/PNScreenFragment.kt +188 -0
  130. pythonnative/native/android/src/main/java/com/pythonnative/runtime/screens/ScreenRegistry.kt +80 -0
  131. pythonnative/native/android/src/main/java/com/pythonnative/runtime/views/PNAccessibilityDelegate.kt +48 -0
  132. pythonnative/native/android/src/main/java/com/pythonnative/runtime/views/PNBorderDrawable.kt +76 -0
  133. pythonnative/native/android/src/main/java/com/pythonnative/runtime/views/PNEditText.kt +18 -0
  134. pythonnative/native/android/src/main/java/com/pythonnative/runtime/views/PNFrameLayout.kt +49 -0
  135. pythonnative/native/android/src/test/java/com/pythonnative/runtime/AnimationSpecsTest.kt +75 -0
  136. pythonnative/native/android/src/test/java/com/pythonnative/runtime/GestureArbiterTest.kt +197 -0
  137. pythonnative/native/android/src/test/java/com/pythonnative/runtime/PNColorTest.kt +47 -0
  138. pythonnative/native/android/src/test/java/com/pythonnative/runtime/PNTransactionTest.kt +78 -0
  139. pythonnative/native/android/src/test/java/com/pythonnative/runtime/PromiseTest.kt +89 -0
  140. pythonnative/native/ios/Package.swift +23 -0
  141. pythonnative/native/ios/Sources/PythonNativeKit/Animation/PNAnimationGraph.swift +199 -0
  142. pythonnative/native/ios/Sources/PythonNativeKit/Animation/PNAnimator.swift +312 -0
  143. pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNBridge.swift +255 -0
  144. pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNCommit.swift +104 -0
  145. pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNRegistry.swift +142 -0
  146. pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNTransaction.swift +166 -0
  147. pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNViewRegistry.swift +53 -0
  148. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNButtonManagers.swift +207 -0
  149. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNColor.swift +173 -0
  150. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNComponentManager.swift +183 -0
  151. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNContainerView.swift +56 -0
  152. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNControlManagers.swift +281 -0
  153. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNImageManager.swift +222 -0
  154. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNOverlayManagers.swift +243 -0
  155. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNPressableManager.swift +114 -0
  156. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNScreenStackManager.swift +107 -0
  157. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNScrollViewManager.swift +197 -0
  158. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNTabBarManager.swift +106 -0
  159. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNTextInputManager.swift +297 -0
  160. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNTextManager.swift +230 -0
  161. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNTransform.swift +82 -0
  162. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNViewManager.swift +86 -0
  163. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNViewState.swift +87 -0
  164. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNViewStyler.swift +340 -0
  165. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNVirtualListManager.swift +155 -0
  166. pythonnative/native/ios/Sources/PythonNativeKit/Components/PNWebViewManager.swift +124 -0
  167. pythonnative/native/ios/Sources/PythonNativeKit/Generated/NativeModules.swift +1 -0
  168. pythonnative/native/ios/Sources/PythonNativeKit/Generated/NativeProps.swift +3775 -0
  169. pythonnative/native/ios/Sources/PythonNativeKit/Generated/PNContracts.swift +46 -0
  170. pythonnative/native/ios/Sources/PythonNativeKit/Gestures/PNGestureCoordinator.swift +260 -0
  171. pythonnative/native/ios/Sources/PythonNativeKit/Layout/PNLayout.swift +173 -0
  172. pythonnative/native/ios/Sources/PythonNativeKit/Modules/AlertModule.swift +92 -0
  173. pythonnative/native/ios/Sources/PythonNativeKit/Modules/HostModule.swift +80 -0
  174. pythonnative/native/ios/Sources/PythonNativeKit/Modules/LifecycleModules.swift +174 -0
  175. pythonnative/native/ios/Sources/PythonNativeKit/Modules/MediaModules.swift +177 -0
  176. pythonnative/native/ios/Sources/PythonNativeKit/Modules/PNNativeModule.swift +168 -0
  177. pythonnative/native/ios/Sources/PythonNativeKit/Modules/PermissionModules.swift +266 -0
  178. pythonnative/native/ios/Sources/PythonNativeKit/Modules/SystemModules.swift +251 -0
  179. pythonnative/native/ios/Sources/PythonNativeKit/Plugins/PNPluginRegistration.swift +8 -0
  180. pythonnative/native/ios/Sources/PythonNativeKit/Screens/PNScreenRegistry.swift +46 -0
  181. pythonnative/native/ios/Sources/PythonNativeKit/Screens/PNViewController.swift +237 -0
  182. pythonnative/native/ios/Sources/PythonNativeKit/Support/PNCompat.swift +46 -0
  183. pythonnative/native/ios/Sources/PythonNativeKit/Support/PNJSON.swift +173 -0
  184. pythonnative/native/ios/Sources/PythonNativeKit/Support/PNLog.swift +47 -0
  185. pythonnative/native/ios/Sources/PythonNativeKit/Support/PNWindow.swift +51 -0
  186. pythonnative/native/ios/Tests/PythonNativeKitTests/PNAnimationGraphTests.swift +26 -0
  187. pythonnative/native/ios/Tests/PythonNativeKitTests/PNColorTests.swift +50 -0
  188. pythonnative/native/ios/Tests/PythonNativeKitTests/PNCommitTests.swift +86 -0
  189. pythonnative/native/ios/Tests/PythonNativeKitTests/PNGestureTests.swift +101 -0
  190. pythonnative/native/ios/Tests/PythonNativeKitTests/PNManagerTests.swift +126 -0
  191. pythonnative/native/ios/Tests/PythonNativeKitTests/PNModuleTests.swift +111 -0
  192. pythonnative/native/ios/Tests/PythonNativeKitTests/PNTransactionTests.swift +91 -0
  193. pythonnative/native/yoga/LICENSE +21 -0
  194. pythonnative/native/yoga/Package.swift +9 -0
  195. pythonnative/native/yoga/VENDORED.md +2 -0
  196. pythonnative/native/yoga/include/PNStyle.h +10 -0
  197. pythonnative/native/yoga/include/module.modulemap +5 -0
  198. pythonnative/native/yoga/include/yoga/YGConfig.h +158 -0
  199. pythonnative/native/yoga/include/yoga/YGEnums.h +142 -0
  200. pythonnative/native/yoga/include/yoga/YGMacros.h +99 -0
  201. pythonnative/native/yoga/include/yoga/YGNode.h +304 -0
  202. pythonnative/native/yoga/include/yoga/YGNodeLayout.h +35 -0
  203. pythonnative/native/yoga/include/yoga/YGNodeStyle.h +130 -0
  204. pythonnative/native/yoga/include/yoga/YGPixelGrid.h +29 -0
  205. pythonnative/native/yoga/include/yoga/YGValue.h +84 -0
  206. pythonnative/native/yoga/include/yoga/Yoga.h +21 -0
  207. pythonnative/native/yoga/python.cpp +16 -0
  208. pythonnative/native/yoga/style.cpp +272 -0
  209. pythonnative/native/yoga/yoga/CMakeLists.txt +41 -0
  210. pythonnative/native/yoga/yoga/YGConfig.cpp +92 -0
  211. pythonnative/native/yoga/yoga/YGConfig.h +158 -0
  212. pythonnative/native/yoga/yoga/YGEnums.cpp +262 -0
  213. pythonnative/native/yoga/yoga/YGEnums.h +142 -0
  214. pythonnative/native/yoga/yoga/YGMacros.h +99 -0
  215. pythonnative/native/yoga/yoga/YGNode.cpp +366 -0
  216. pythonnative/native/yoga/yoga/YGNode.h +304 -0
  217. pythonnative/native/yoga/yoga/YGNodeLayout.cpp +92 -0
  218. pythonnative/native/yoga/yoga/YGNodeLayout.h +35 -0
  219. pythonnative/native/yoga/yoga/YGNodeStyle.cpp +405 -0
  220. pythonnative/native/yoga/yoga/YGNodeStyle.h +130 -0
  221. pythonnative/native/yoga/yoga/YGPixelGrid.cpp +22 -0
  222. pythonnative/native/yoga/yoga/YGPixelGrid.h +29 -0
  223. pythonnative/native/yoga/yoga/YGValue.cpp +20 -0
  224. pythonnative/native/yoga/yoga/YGValue.h +84 -0
  225. pythonnative/native/yoga/yoga/Yoga.h +21 -0
  226. pythonnative/native/yoga/yoga/algorithm/AbsoluteLayout.cpp +563 -0
  227. pythonnative/native/yoga/yoga/algorithm/AbsoluteLayout.h +41 -0
  228. pythonnative/native/yoga/yoga/algorithm/Align.h +72 -0
  229. pythonnative/native/yoga/yoga/algorithm/Baseline.cpp +78 -0
  230. pythonnative/native/yoga/yoga/algorithm/Baseline.h +21 -0
  231. pythonnative/native/yoga/yoga/algorithm/BoundAxis.h +79 -0
  232. pythonnative/native/yoga/yoga/algorithm/Cache.cpp +121 -0
  233. pythonnative/native/yoga/yoga/algorithm/Cache.h +30 -0
  234. pythonnative/native/yoga/yoga/algorithm/CalculateLayout.cpp +2428 -0
  235. pythonnative/native/yoga/yoga/algorithm/CalculateLayout.h +38 -0
  236. pythonnative/native/yoga/yoga/algorithm/FlexDirection.h +120 -0
  237. pythonnative/native/yoga/yoga/algorithm/FlexLine.cpp +124 -0
  238. pythonnative/native/yoga/yoga/algorithm/FlexLine.h +75 -0
  239. pythonnative/native/yoga/yoga/algorithm/PixelGrid.cpp +132 -0
  240. pythonnative/native/yoga/yoga/algorithm/PixelGrid.h +29 -0
  241. pythonnative/native/yoga/yoga/algorithm/SizingMode.h +73 -0
  242. pythonnative/native/yoga/yoga/algorithm/TrailingPosition.h +44 -0
  243. pythonnative/native/yoga/yoga/config/Config.cpp +135 -0
  244. pythonnative/native/yoga/yoga/config/Config.h +92 -0
  245. pythonnative/native/yoga/yoga/debug/AssertFatal.cpp +53 -0
  246. pythonnative/native/yoga/yoga/debug/AssertFatal.h +29 -0
  247. pythonnative/native/yoga/yoga/debug/Log.cpp +107 -0
  248. pythonnative/native/yoga/yoga/debug/Log.h +34 -0
  249. pythonnative/native/yoga/yoga/enums/Align.h +47 -0
  250. pythonnative/native/yoga/yoga/enums/BoxSizing.h +40 -0
  251. pythonnative/native/yoga/yoga/enums/Dimension.h +40 -0
  252. pythonnative/native/yoga/yoga/enums/Direction.h +41 -0
  253. pythonnative/native/yoga/yoga/enums/Display.h +41 -0
  254. pythonnative/native/yoga/yoga/enums/Edge.h +47 -0
  255. pythonnative/native/yoga/yoga/enums/Errata.h +41 -0
  256. pythonnative/native/yoga/yoga/enums/ExperimentalFeature.h +39 -0
  257. pythonnative/native/yoga/yoga/enums/FlexDirection.h +42 -0
  258. pythonnative/native/yoga/yoga/enums/Gutter.h +41 -0
  259. pythonnative/native/yoga/yoga/enums/Justify.h +44 -0
  260. pythonnative/native/yoga/yoga/enums/LogLevel.h +44 -0
  261. pythonnative/native/yoga/yoga/enums/MeasureMode.h +41 -0
  262. pythonnative/native/yoga/yoga/enums/NodeType.h +40 -0
  263. pythonnative/native/yoga/yoga/enums/Overflow.h +41 -0
  264. pythonnative/native/yoga/yoga/enums/PhysicalEdge.h +21 -0
  265. pythonnative/native/yoga/yoga/enums/PositionType.h +41 -0
  266. pythonnative/native/yoga/yoga/enums/Unit.h +42 -0
  267. pythonnative/native/yoga/yoga/enums/Wrap.h +41 -0
  268. pythonnative/native/yoga/yoga/enums/YogaEnums.h +85 -0
  269. pythonnative/native/yoga/yoga/event/event.cpp +87 -0
  270. pythonnative/native/yoga/yoga/event/event.h +130 -0
  271. pythonnative/native/yoga/yoga/module.modulemap +21 -0
  272. pythonnative/native/yoga/yoga/node/CachedMeasurement.h +53 -0
  273. pythonnative/native/yoga/yoga/node/LayoutResults.cpp +48 -0
  274. pythonnative/native/yoga/yoga/node/LayoutResults.h +122 -0
  275. pythonnative/native/yoga/yoga/node/LayoutableChildren.h +148 -0
  276. pythonnative/native/yoga/yoga/node/Node.cpp +443 -0
  277. pythonnative/native/yoga/yoga/node/Node.h +337 -0
  278. pythonnative/native/yoga/yoga/numeric/Comparison.h +81 -0
  279. pythonnative/native/yoga/yoga/numeric/FloatOptional.h +93 -0
  280. pythonnative/native/yoga/yoga/style/SmallValueBuffer.h +133 -0
  281. pythonnative/native/yoga/yoga/style/Style.h +757 -0
  282. pythonnative/native/yoga/yoga/style/StyleLength.h +107 -0
  283. pythonnative/native/yoga/yoga/style/StyleValueHandle.h +98 -0
  284. pythonnative/native/yoga/yoga/style/StyleValuePool.h +127 -0
  285. pythonnative/native_modules/__init__.py +124 -0
  286. pythonnative/native_modules/app_state.py +99 -0
  287. pythonnative/native_modules/battery.py +75 -0
  288. pythonnative/native_modules/biometrics.py +42 -0
  289. pythonnative/native_modules/camera.py +65 -0
  290. pythonnative/native_modules/clipboard.py +46 -0
  291. pythonnative/native_modules/fallback.py +324 -0
  292. pythonnative/native_modules/file_system.py +145 -0
  293. pythonnative/native_modules/haptics.py +75 -0
  294. pythonnative/native_modules/linking.py +123 -0
  295. pythonnative/native_modules/location.py +75 -0
  296. pythonnative/native_modules/net_info.py +112 -0
  297. pythonnative/native_modules/notifications.py +129 -0
  298. pythonnative/native_modules/permissions.py +108 -0
  299. pythonnative/native_modules/registry.py +526 -0
  300. pythonnative/native_modules/secure_store.py +52 -0
  301. pythonnative/native_modules/share.py +51 -0
  302. pythonnative/native_views/__init__.py +375 -0
  303. pythonnative/native_views/base.py +316 -0
  304. pythonnative/native_views/bridge_backend.py +277 -0
  305. pythonnative/navigation/__init__.py +103 -0
  306. pythonnative/navigation/container.py +154 -0
  307. pythonnative/navigation/handle.py +540 -0
  308. pythonnative/navigation/hooks.py +133 -0
  309. pythonnative/navigation/host.py +58 -0
  310. pythonnative/navigation/linking.py +200 -0
  311. pythonnative/navigation/navigators.py +659 -0
  312. pythonnative/navigation/screen.py +149 -0
  313. pythonnative/navigation/state.py +269 -0
  314. pythonnative/net.py +248 -0
  315. pythonnative/platform.py +166 -0
  316. pythonnative/platform_metrics.py +252 -0
  317. pythonnative/preview.py +287 -0
  318. pythonnative/profiling.py +101 -0
  319. pythonnative/project/__init__.py +68 -0
  320. pythonnative/project/android.py +557 -0
  321. pythonnative/project/builder.py +817 -0
  322. pythonnative/project/config.py +773 -0
  323. pythonnative/project/deps.py +719 -0
  324. pythonnative/project/devices.py +304 -0
  325. pythonnative/project/doctor.py +283 -0
  326. pythonnative/project/fingerprint.py +171 -0
  327. pythonnative/project/icons.py +247 -0
  328. pythonnative/project/ios.py +325 -0
  329. pythonnative/project/lockfile.py +100 -0
  330. pythonnative/project/permissions.py +361 -0
  331. pythonnative/project/plugins.py +519 -0
  332. pythonnative/project/runtime_assets.py +183 -0
  333. pythonnative/py.typed +0 -0
  334. pythonnative/query.py +153 -0
  335. pythonnative/reconciler/__init__.py +29 -0
  336. pythonnative/reconciler/boundaries.py +375 -0
  337. pythonnative/reconciler/children.py +88 -0
  338. pythonnative/reconciler/core.py +1165 -0
  339. pythonnative/reconciler/layout_pass.py +393 -0
  340. pythonnative/reconciler/vnode.py +266 -0
  341. pythonnative/refresh.py +55 -0
  342. pythonnative/runtime.py +306 -0
  343. pythonnative/scheduler.py +159 -0
  344. pythonnative/sdk/__init__.py +153 -0
  345. pythonnative/sdk/_components.py +427 -0
  346. pythonnative/sdk/builtins.py +91 -0
  347. pythonnative/sdk/codegen.py +149 -0
  348. pythonnative/sdk/module_codegen.py +184 -0
  349. pythonnative/sdk/schema.py +224 -0
  350. pythonnative/sdk/templates/contracts.kt +46 -0
  351. pythonnative/sdk/templates/contracts.swift +46 -0
  352. pythonnative/storage.py +184 -0
  353. pythonnative/style.py +841 -0
  354. pythonnative/suspense.py +183 -0
  355. pythonnative/templates/android_template/app/build.gradle +75 -0
  356. pythonnative/templates/android_template/app/proguard-rules.pro +21 -0
  357. pythonnative/templates/android_template/app/src/androidTest/java/com/pythonnative/android_template/ExampleInstrumentedTest.kt +24 -0
  358. pythonnative/templates/android_template/app/src/debug/AndroidManifest.xml +7 -0
  359. pythonnative/templates/android_template/app/src/main/AndroidManifest.xml +32 -0
  360. pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt +130 -0
  361. pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/ScreenFragment.kt +13 -0
  362. pythonnative/templates/android_template/app/src/main/res/drawable/ic_launcher_background.xml +170 -0
  363. pythonnative/templates/android_template/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +30 -0
  364. pythonnative/templates/android_template/app/src/main/res/layout/activity_main.xml +10 -0
  365. pythonnative/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +6 -0
  366. pythonnative/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +6 -0
  367. pythonnative/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher.webp +0 -0
  368. pythonnative/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp +0 -0
  369. pythonnative/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher.webp +0 -0
  370. pythonnative/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp +0 -0
  371. pythonnative/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher.webp +0 -0
  372. pythonnative/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp +0 -0
  373. pythonnative/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp +0 -0
  374. pythonnative/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp +0 -0
  375. pythonnative/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp +0 -0
  376. pythonnative/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp +0 -0
  377. pythonnative/templates/android_template/app/src/main/res/navigation/nav_graph.xml +22 -0
  378. pythonnative/templates/android_template/app/src/main/res/values/colors.xml +5 -0
  379. pythonnative/templates/android_template/app/src/main/res/values/strings.xml +5 -0
  380. pythonnative/templates/android_template/app/src/main/res/values/themes.xml +9 -0
  381. pythonnative/templates/android_template/app/src/main/res/values-night/themes.xml +7 -0
  382. pythonnative/templates/android_template/app/src/main/res/xml/backup_rules.xml +13 -0
  383. pythonnative/templates/android_template/app/src/main/res/xml/data_extraction_rules.xml +19 -0
  384. pythonnative/templates/android_template/app/src/test/java/com/pythonnative/android_template/ExampleUnitTest.kt +17 -0
  385. pythonnative/templates/android_template/build.gradle +10 -0
  386. pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.jar +0 -0
  387. pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.properties +6 -0
  388. pythonnative/templates/android_template/gradle.properties +23 -0
  389. pythonnative/templates/android_template/gradlew +185 -0
  390. pythonnative/templates/android_template/gradlew.bat +89 -0
  391. pythonnative/templates/android_template/settings.gradle +17 -0
  392. pythonnative/templates/ios_template/ios_template/AppDelegate.swift +51 -0
  393. pythonnative/templates/ios_template/ios_template/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  394. pythonnative/templates/ios_template/ios_template/Assets.xcassets/AppIcon.appiconset/Contents.json +13 -0
  395. pythonnative/templates/ios_template/ios_template/Assets.xcassets/Contents.json +6 -0
  396. pythonnative/templates/ios_template/ios_template/Base.lproj/LaunchScreen.storyboard +25 -0
  397. pythonnative/templates/ios_template/ios_template/BridgingHeader.h +14 -0
  398. pythonnative/templates/ios_template/ios_template/Info.plist +28 -0
  399. pythonnative/templates/ios_template/ios_template/PythonRuntime.swift +390 -0
  400. pythonnative/templates/ios_template/ios_template/SceneDelegate.swift +61 -0
  401. pythonnative/templates/ios_template/ios_template/ViewController.swift +23 -0
  402. pythonnative/templates/ios_template/ios_template.xcodeproj/project.pbxproj +745 -0
  403. pythonnative/templates/ios_template/ios_template.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  404. pythonnative/templates/ios_template/ios_templateTests/ios_templateTests.swift +36 -0
  405. pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITests.swift +41 -0
  406. pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITestsLaunchTests.swift +32 -0
  407. pythonnative/testing/__init__.py +53 -0
  408. pythonnative/testing/backend.py +276 -0
  409. pythonnative/testing/harness.py +369 -0
  410. pythonnative/utils.py +145 -0
  411. pythonnative-0.40.0.dist-info/DELVEWHEEL +2 -0
  412. pythonnative-0.40.0.dist-info/METADATA +150 -0
  413. pythonnative-0.40.0.dist-info/RECORD +418 -0
  414. pythonnative-0.40.0.dist-info/WHEEL +5 -0
  415. pythonnative-0.40.0.dist-info/entry_points.txt +2 -0
  416. pythonnative-0.40.0.dist-info/licenses/LICENSE +21 -0
  417. pythonnative-0.40.0.dist-info/top_level.txt +1 -0
  418. pythonnative.libs/msvcp140-a4c2229bdc2a2a630acdc095b4d86008.dll +0 -0
@@ -0,0 +1,107 @@
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #pragma once
9
+
10
+ #include <yoga/enums/Unit.h>
11
+ #include <yoga/numeric/FloatOptional.h>
12
+
13
+ namespace facebook::yoga {
14
+
15
+ /**
16
+ * Style::Length represents a CSS Value which may be one of:
17
+ * 1. Undefined
18
+ * 2. A keyword (e.g. auto)
19
+ * 3. A CSS <length-percentage> value:
20
+ * a. <length> value (e.g. 10px)
21
+ * b. <percentage> value of a reference <length>
22
+ * 4. (soon) A math function which returns a <length-percentage> value
23
+ *
24
+ * References:
25
+ * 1. https://www.w3.org/TR/css-values-4/#lengths
26
+ * 2. https://www.w3.org/TR/css-values-4/#percentage-value
27
+ * 3. https://www.w3.org/TR/css-values-4/#mixed-percentages
28
+ * 4. https://www.w3.org/TR/css-values-4/#math
29
+ */
30
+ class StyleLength {
31
+ public:
32
+ constexpr StyleLength() = default;
33
+
34
+ constexpr static StyleLength points(float value) {
35
+ return yoga::isUndefined(value) || yoga::isinf(value)
36
+ ? undefined()
37
+ : StyleLength{FloatOptional{value}, Unit::Point};
38
+ }
39
+
40
+ constexpr static StyleLength percent(float value) {
41
+ return yoga::isUndefined(value) || yoga::isinf(value)
42
+ ? undefined()
43
+ : StyleLength{FloatOptional{value}, Unit::Percent};
44
+ }
45
+
46
+ constexpr static StyleLength ofAuto() {
47
+ return StyleLength{{}, Unit::Auto};
48
+ }
49
+
50
+ constexpr static StyleLength undefined() {
51
+ return StyleLength{{}, Unit::Undefined};
52
+ }
53
+
54
+ constexpr bool isAuto() const {
55
+ return unit_ == Unit::Auto;
56
+ }
57
+
58
+ constexpr bool isUndefined() const {
59
+ return unit_ == Unit::Undefined;
60
+ }
61
+
62
+ constexpr bool isDefined() const {
63
+ return !isUndefined();
64
+ }
65
+
66
+ constexpr FloatOptional value() const {
67
+ return value_;
68
+ }
69
+
70
+ constexpr Unit unit() const {
71
+ return unit_;
72
+ }
73
+
74
+ constexpr FloatOptional resolve(float referenceLength) {
75
+ switch (unit_) {
76
+ case Unit::Point:
77
+ return value_;
78
+ case Unit::Percent:
79
+ return FloatOptional{value_.unwrap() * referenceLength * 0.01f};
80
+ default:
81
+ return FloatOptional{};
82
+ }
83
+ }
84
+
85
+ explicit constexpr operator YGValue() const {
86
+ return YGValue{value_.unwrap(), unscopedEnum(unit_)};
87
+ }
88
+
89
+ constexpr bool operator==(const StyleLength& rhs) const {
90
+ return value_ == rhs.value_ && unit_ == rhs.unit_;
91
+ }
92
+
93
+ private:
94
+ // We intentionally do not allow direct construction using value and unit, to
95
+ // avoid invalid, or redundant combinations.
96
+ constexpr StyleLength(FloatOptional value, Unit unit)
97
+ : value_(value), unit_(unit) {}
98
+
99
+ FloatOptional value_{};
100
+ Unit unit_{Unit::Undefined};
101
+ };
102
+
103
+ inline bool inexactEquals(const StyleLength& a, const StyleLength& b) {
104
+ return a.unit() == b.unit() && inexactEquals(a.value(), b.value());
105
+ }
106
+
107
+ } // namespace facebook::yoga
@@ -0,0 +1,98 @@
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #pragma once
9
+
10
+ #include <cstdint>
11
+
12
+ #include <yoga/Yoga.h>
13
+
14
+ #include <yoga/numeric/FloatOptional.h>
15
+ #include <yoga/style/SmallValueBuffer.h>
16
+ #include <yoga/style/StyleLength.h>
17
+
18
+ namespace facebook::yoga {
19
+
20
+ #pragma pack(push)
21
+ #pragma pack(1)
22
+
23
+ /**
24
+ * StyleValueHandle is a small (16-bit) handle to a length or number in a style.
25
+ * The value may be embedded directly in the handle if simple, or the handle may
26
+ * instead point to an index within a StyleValuePool.
27
+ *
28
+ * To read or write a value from a StyleValueHandle, use
29
+ * `StyleValuePool::store()`, and `StyleValuePool::getLength()`/
30
+ * `StyleValuePool::getNumber()`.
31
+ */
32
+ class StyleValueHandle {
33
+ public:
34
+ static constexpr StyleValueHandle ofAuto() {
35
+ StyleValueHandle handle;
36
+ handle.setType(Type::Auto);
37
+ return handle;
38
+ }
39
+
40
+ constexpr bool isUndefined() const {
41
+ return type() == Type::Undefined;
42
+ }
43
+
44
+ constexpr bool isDefined() const {
45
+ return !isUndefined();
46
+ }
47
+
48
+ constexpr bool isAuto() const {
49
+ return type() == Type::Auto;
50
+ }
51
+
52
+ private:
53
+ friend class StyleValuePool;
54
+
55
+ static constexpr uint16_t kHandleTypeMask = 0b0000'0000'0000'0111;
56
+ static constexpr uint16_t kHandleIndexedMask = 0b0000'0000'0000'1000;
57
+ static constexpr uint16_t kHandleValueMask = 0b1111'1111'1111'0000;
58
+
59
+ enum class Type : uint8_t {
60
+ Undefined,
61
+ Point,
62
+ Percent,
63
+ Number,
64
+ Auto,
65
+ };
66
+
67
+ constexpr Type type() const {
68
+ return static_cast<Type>(repr_ & kHandleTypeMask);
69
+ }
70
+
71
+ constexpr void setType(Type handleType) {
72
+ repr_ &= (~kHandleTypeMask);
73
+ repr_ |= static_cast<uint8_t>(handleType);
74
+ }
75
+
76
+ constexpr uint16_t value() const {
77
+ return repr_ >> 4;
78
+ }
79
+
80
+ constexpr void setValue(uint16_t value) {
81
+ repr_ &= (~kHandleValueMask);
82
+ repr_ |= (value << 4);
83
+ }
84
+
85
+ constexpr bool isValueIndexed() const {
86
+ return (repr_ & kHandleIndexedMask) != 0;
87
+ }
88
+
89
+ constexpr void setValueIsIndexed() {
90
+ repr_ |= kHandleIndexedMask;
91
+ }
92
+
93
+ uint16_t repr_{0};
94
+ };
95
+
96
+ #pragma pack(pop)
97
+
98
+ } // namespace facebook::yoga
@@ -0,0 +1,127 @@
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #pragma once
9
+
10
+ #include <cassert>
11
+ #include <cstdint>
12
+
13
+ #include <yoga/numeric/FloatOptional.h>
14
+ #include <yoga/style/SmallValueBuffer.h>
15
+ #include <yoga/style/StyleLength.h>
16
+ #include <yoga/style/StyleValueHandle.h>
17
+
18
+ namespace facebook::yoga {
19
+
20
+ /**
21
+ * StyleValuePool allows compact storage for a sparse collection of assigned
22
+ * lengths and numbers. Values are referred to using StyleValueHandle. In most
23
+ * cases StyleValueHandle can embed the value directly, but if not, the value is
24
+ * stored within a buffer provided by the pool. The pool contains a fixed number
25
+ * of inline slots before falling back to heap allocating additional slots.
26
+ */
27
+ class StyleValuePool {
28
+ public:
29
+ void store(StyleValueHandle& handle, StyleLength length) {
30
+ if (length.isUndefined()) {
31
+ handle.setType(StyleValueHandle::Type::Undefined);
32
+ } else if (length.isAuto()) {
33
+ handle.setType(StyleValueHandle::Type::Auto);
34
+ } else {
35
+ auto type = length.unit() == Unit::Point
36
+ ? StyleValueHandle::Type::Point
37
+ : StyleValueHandle::Type::Percent;
38
+ storeValue(handle, length.value().unwrap(), type);
39
+ }
40
+ }
41
+
42
+ void store(StyleValueHandle& handle, FloatOptional number) {
43
+ if (number.isUndefined()) {
44
+ handle.setType(StyleValueHandle::Type::Undefined);
45
+ } else {
46
+ storeValue(handle, number.unwrap(), StyleValueHandle::Type::Number);
47
+ }
48
+ }
49
+
50
+ StyleLength getLength(StyleValueHandle handle) const {
51
+ if (handle.isUndefined()) {
52
+ return StyleLength::undefined();
53
+ } else if (handle.isAuto()) {
54
+ return StyleLength::ofAuto();
55
+ } else {
56
+ assert(
57
+ handle.type() == StyleValueHandle::Type::Point ||
58
+ handle.type() == StyleValueHandle::Type::Percent);
59
+ float value = (handle.isValueIndexed())
60
+ ? std::bit_cast<float>(buffer_.get32(handle.value()))
61
+ : unpackInlineInteger(handle.value());
62
+
63
+ return handle.type() == StyleValueHandle::Type::Point
64
+ ? StyleLength::points(value)
65
+ : StyleLength::percent(value);
66
+ }
67
+ }
68
+
69
+ FloatOptional getNumber(StyleValueHandle handle) const {
70
+ if (handle.isUndefined()) {
71
+ return FloatOptional{};
72
+ } else {
73
+ assert(handle.type() == StyleValueHandle::Type::Number);
74
+ float value = (handle.isValueIndexed())
75
+ ? std::bit_cast<float>(buffer_.get32(handle.value()))
76
+ : unpackInlineInteger(handle.value());
77
+ return FloatOptional{value};
78
+ }
79
+ }
80
+
81
+ private:
82
+ void storeValue(
83
+ StyleValueHandle& handle,
84
+ float value,
85
+ StyleValueHandle::Type type) {
86
+ handle.setType(type);
87
+
88
+ if (handle.isValueIndexed()) {
89
+ auto newIndex =
90
+ buffer_.replace(handle.value(), std::bit_cast<uint32_t>(value));
91
+ handle.setValue(newIndex);
92
+ } else if (isIntegerPackable(value)) {
93
+ handle.setValue(packInlineInteger(value));
94
+ } else {
95
+ auto newIndex = buffer_.push(std::bit_cast<uint32_t>(value));
96
+ handle.setValue(newIndex);
97
+ handle.setValueIsIndexed();
98
+ }
99
+ }
100
+
101
+ static constexpr bool isIntegerPackable(float f) {
102
+ constexpr uint16_t kMaxInlineAbsValue = (1 << 11) - 1;
103
+
104
+ auto i = static_cast<int32_t>(f);
105
+ return static_cast<float>(i) == f && i >= -kMaxInlineAbsValue &&
106
+ i <= +kMaxInlineAbsValue;
107
+ }
108
+
109
+ static constexpr uint16_t packInlineInteger(float value) {
110
+ uint16_t isNegative = value < 0 ? 1 : 0;
111
+ return static_cast<uint16_t>(
112
+ (isNegative << 11) |
113
+ (static_cast<int32_t>(value) * (isNegative != 0u ? -1 : 1)));
114
+ }
115
+
116
+ static constexpr float unpackInlineInteger(uint16_t value) {
117
+ constexpr uint16_t kValueSignMask = 0b0000'1000'0000'0000;
118
+ constexpr uint16_t kValueMagnitudeMask = 0b0000'0111'1111'1111;
119
+ const bool isNegative = (value & kValueSignMask) != 0;
120
+ return static_cast<float>(
121
+ (value & kValueMagnitudeMask) * (isNegative ? -1 : 1));
122
+ }
123
+
124
+ SmallValueBuffer<4> buffer_;
125
+ };
126
+
127
+ } // namespace facebook::yoga
@@ -0,0 +1,124 @@
1
+ """Native API modules for device capabilities.
2
+
3
+ Cross-platform Python interfaces to common device APIs. Every module
4
+ here is a thin facade over a *native module*: a Swift class in
5
+ ``PythonNativeKit`` and a Kotlin class in the ``pythonnative`` Gradle
6
+ module registered under the same name (``"Camera"``, ``"Haptics"``,
7
+ ...). Facades reach them through
8
+ [`native_module`][pythonnative.native_modules.registry.native_module]
9
+ and the bridge described in ``docs/concepts/bridge.md``; there is no
10
+ Python-side Objective-C or JNI anywhere in this package.
11
+
12
+ Off device the same names resolve to plain Python implementations in
13
+ [`pythonnative.native_modules.fallback`][pythonnative.native_modules.fallback]
14
+ with safe defaults (in-memory buffers, ``"unknown"`` states, no-op
15
+ feedback), so the same code stays runnable in unit tests. The browser
16
+ preview (``pn start``) implements the modules a browser can honor
17
+ (``Alert``, ``Clipboard``, ``Device``, ``Linking``, ``Share``, ...) in
18
+ the page and falls back to the Python classes for the rest. Third-party
19
+ packages ship their own native modules the same way; see
20
+ ``docs/guides/native-modules.md``.
21
+
22
+ Two rules hold across every facade, so you never have to look one up:
23
+
24
+ 1. **Sync or async is decided by what the OS has to do.** A method is
25
+ a plain function when the answer is already on the device and
26
+ returns on the calling thread (read the pasteboard, check a
27
+ permission, read the battery level, Keychain get/set, file I/O).
28
+ It is a coroutine when the OS has to prompt the user, drive
29
+ hardware, or hand off to another process (camera and gallery
30
+ pickers, biometric prompts, permission requests, the share sheet,
31
+ GPS fixes, notification scheduling, remote push registration).
32
+ 2. **Failures raise; "nothing happened" returns a value.** A native
33
+ error (a rejected promise, a missing module, a bad argument) is a
34
+ [`NativeModuleError`][pythonnative.native_modules.NativeModuleError]
35
+ and propagates to the caller like any other Python exception. Outcomes
36
+ that are not errors, such as the user cancelling a picker, denying a
37
+ permission, or dismissing the share sheet, come back as ``None``,
38
+ ``False``, or a status string, and are documented per method. No
39
+ facade converts an exception into a default value.
40
+
41
+ Hardware / media:
42
+
43
+ - [`Camera`][pythonnative.native_modules.Camera]: photo capture and
44
+ gallery picking.
45
+ - [`Location`][pythonnative.native_modules.Location]: GPS and location.
46
+ - [`Battery`][pythonnative.native_modules.Battery]: charge level/state.
47
+ - [`Haptics`][pythonnative.native_modules.Haptics] /
48
+ [`Vibration`][pythonnative.native_modules.Vibration]: tactile feedback.
49
+ - [`Biometrics`][pythonnative.native_modules.Biometrics]: Face ID /
50
+ Touch ID / fingerprint auth.
51
+
52
+ System integration:
53
+
54
+ - [`FileSystem`][pythonnative.native_modules.FileSystem]: app-scoped
55
+ file I/O.
56
+ - [`Notifications`][pythonnative.native_modules.Notifications]: local
57
+ push notifications.
58
+ - [`Clipboard`][pythonnative.native_modules.Clipboard]: pasteboard
59
+ read/write.
60
+ - [`Share`][pythonnative.native_modules.Share]: system share sheet.
61
+ - [`Linking`][pythonnative.native_modules.Linking]: open URLs and deep
62
+ links.
63
+ - [`Permissions`][pythonnative.native_modules.Permissions]: runtime
64
+ permission checks/requests.
65
+ - [`SecureStore`][pythonnative.native_modules.SecureStore]: encrypted
66
+ secret storage.
67
+
68
+ Reactive state (with hooks):
69
+
70
+ - [`AppState`][pythonnative.native_modules.AppState] +
71
+ [`use_app_state`][pythonnative.use_app_state]: foreground/background
72
+ lifecycle.
73
+ - [`NetInfo`][pythonnative.native_modules.NetInfo] +
74
+ [`use_net_info`][pythonnative.use_net_info]: connectivity.
75
+ """
76
+
77
+ from .app_state import AppState, use_app_state
78
+ from .battery import Battery
79
+ from .biometrics import Biometrics
80
+ from .camera import Camera
81
+ from .clipboard import Clipboard
82
+ from .file_system import FileSystem
83
+ from .haptics import Haptics, Vibration
84
+ from .linking import Linking
85
+ from .location import Location
86
+ from .net_info import NetInfo, use_net_info
87
+ from .notifications import Notifications
88
+ from .permissions import Permissions
89
+ from .registry import (
90
+ BridgeModule,
91
+ NativeModule,
92
+ NativeModuleError,
93
+ PythonModule,
94
+ native_module,
95
+ register_python_module,
96
+ )
97
+ from .secure_store import SecureStore
98
+ from .share import Share
99
+
100
+ __all__ = [
101
+ "AppState",
102
+ "Battery",
103
+ "Biometrics",
104
+ "BridgeModule",
105
+ "Camera",
106
+ "Clipboard",
107
+ "FileSystem",
108
+ "Haptics",
109
+ "Linking",
110
+ "Location",
111
+ "NativeModule",
112
+ "NativeModuleError",
113
+ "NetInfo",
114
+ "Notifications",
115
+ "Permissions",
116
+ "PythonModule",
117
+ "SecureStore",
118
+ "Share",
119
+ "Vibration",
120
+ "native_module",
121
+ "register_python_module",
122
+ "use_app_state",
123
+ "use_net_info",
124
+ ]
@@ -0,0 +1,99 @@
1
+ """Foreground / background app lifecycle state.
2
+
3
+ [`AppState`][pythonnative.AppState] exposes the current lifecycle phase
4
+ (``"active"``, ``"inactive"``, or ``"background"``) and lets you
5
+ subscribe to transitions. The native ``AppState`` module pushes a
6
+ ``change`` event on every transition; off device, tests drive the same
7
+ path through
8
+ [`dispatch_app_state`][pythonnative.native_modules.app_state.dispatch_app_state].
9
+
10
+ Prefer the [`use_app_state`][pythonnative.use_app_state] hook inside
11
+ components; use the imperative API for non-UI code.
12
+
13
+ Example:
14
+ ```python
15
+ import pythonnative as pn
16
+
17
+ @pn.component
18
+ def Banner():
19
+ state = pn.use_app_state()
20
+ return pn.Text(f"App is {state}")
21
+ ```
22
+ """
23
+
24
+ from __future__ import annotations
25
+
26
+ from typing import Callable, List
27
+
28
+ from .. import diagnostics
29
+ from ..hooks import use_effect, use_state
30
+ from .registry import on_event
31
+
32
+ AppStateStatus = str # "active" | "inactive" | "background"
33
+
34
+ _VALID = ("active", "inactive", "background")
35
+ _current: AppStateStatus = "active"
36
+ _listeners: List[Callable[[AppStateStatus], None]] = []
37
+
38
+
39
+ class AppState:
40
+ """App lifecycle state interface."""
41
+
42
+ @staticmethod
43
+ def current_state() -> AppStateStatus:
44
+ """Return the current lifecycle phase."""
45
+ return _current
46
+
47
+ @staticmethod
48
+ def add_listener(callback: Callable[[AppStateStatus], None]) -> Callable[[], None]:
49
+ """Subscribe to lifecycle changes.
50
+
51
+ Returns:
52
+ A zero-arg function that unsubscribes when called.
53
+ """
54
+ _listeners.append(callback)
55
+
56
+ def _unsubscribe() -> None:
57
+ try:
58
+ _listeners.remove(callback)
59
+ except ValueError:
60
+ pass
61
+
62
+ return _unsubscribe
63
+
64
+
65
+ def dispatch_app_state(state: AppStateStatus) -> None:
66
+ """Update the current state and notify every listener.
67
+
68
+ Unknown values are ignored so a misbehaving host can't push garbage
69
+ into the tree.
70
+ """
71
+ global _current
72
+ if state not in _VALID or state == _current:
73
+ return
74
+ _current = state
75
+ for listener in list(_listeners):
76
+ try:
77
+ listener(state)
78
+ except Exception:
79
+ diagnostics.swallowed("app_state.dispatch_app_state")
80
+
81
+
82
+ on_event("AppState", "change", lambda payload: dispatch_app_state(str(payload)))
83
+
84
+
85
+ def use_app_state() -> AppStateStatus:
86
+ """Subscribe a component to [`AppState`][pythonnative.AppState].
87
+
88
+ Returns:
89
+ The current lifecycle phase; the component re-renders whenever
90
+ it changes.
91
+ """
92
+ state, set_state = use_state(_current)
93
+
94
+ def _subscribe() -> Callable[[], None]:
95
+ set_state(_current)
96
+ return AppState.add_listener(set_state)
97
+
98
+ use_effect(_subscribe, [])
99
+ return state
@@ -0,0 +1,75 @@
1
+ """Battery level and charging state.
2
+
3
+ [`Battery`][pythonnative.Battery] reports the current charge fraction
4
+ (``0.0`` to ``1.0``, or ``-1.0`` when the platform doesn't know) and
5
+ charging state, and lets you subscribe to changes. Both getters read a
6
+ value the OS already holds, so they are synchronous. The native
7
+ ``Battery`` module pushes a ``change`` event with ``{"level", "state"}``;
8
+ off device, tests drive the same path through
9
+ [`dispatch_battery`][pythonnative.native_modules.battery.dispatch_battery].
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ from typing import Any, Callable, Dict, List
15
+
16
+ from .. import diagnostics
17
+ from .registry import native_module, on_event
18
+
19
+ BatteryState = str # "unknown" | "unplugged" | "charging" | "full"
20
+
21
+ _listeners: List[Callable[[Dict[str, object]], None]] = []
22
+
23
+
24
+ class Battery:
25
+ """Battery interface (synchronous getters + change listener).
26
+
27
+ Raises:
28
+ NativeModuleError: If the native module fails.
29
+ """
30
+
31
+ @staticmethod
32
+ def get_level() -> float:
33
+ """Return the charge fraction in ``[0, 1]``, or ``-1.0`` when the platform can't report it."""
34
+ level = float(native_module("Battery").call("get_level"))
35
+ return level if 0.0 <= level <= 1.0 else -1.0
36
+
37
+ @staticmethod
38
+ def get_state() -> BatteryState:
39
+ """Return ``"charging"`` / ``"full"`` / ``"unplugged"`` / ``"unknown"``."""
40
+ state = str(native_module("Battery").call("get_state") or "unknown")
41
+ return state if state in ("unknown", "unplugged", "charging", "full") else "unknown"
42
+
43
+ @staticmethod
44
+ def add_listener(callback: Callable[[Dict[str, object]], None]) -> Callable[[], None]:
45
+ """Subscribe to battery changes; returns an unsubscribe fn.
46
+
47
+ Each callback receives ``{"level": float, "state": str}``.
48
+ """
49
+ _listeners.append(callback)
50
+
51
+ def _unsubscribe() -> None:
52
+ try:
53
+ _listeners.remove(callback)
54
+ except ValueError:
55
+ pass
56
+
57
+ return _unsubscribe
58
+
59
+
60
+ def dispatch_battery(level: float, state: BatteryState) -> None:
61
+ """Notify listeners of a battery change."""
62
+ payload: Dict[str, object] = {"level": level, "state": state}
63
+ for listener in list(_listeners):
64
+ try:
65
+ listener(dict(payload))
66
+ except Exception:
67
+ diagnostics.swallowed("battery.dispatch_battery")
68
+
69
+
70
+ def _on_native_change(payload: Any) -> None:
71
+ if isinstance(payload, dict):
72
+ dispatch_battery(float(payload.get("level", -1.0)), str(payload.get("state", "unknown")))
73
+
74
+
75
+ on_event("Battery", "change", _on_native_change)
@@ -0,0 +1,42 @@
1
+ """Biometric authentication (Face ID / Touch ID / fingerprint).
2
+
3
+ [`Biometrics`][pythonnative.Biometrics] gates an action behind the
4
+ device's biometric hardware via ``LAContext`` (iOS) and
5
+ ``BiometricPrompt`` (Android), both implemented in the native
6
+ ``Biometrics`` module.
7
+
8
+ ``is_available`` is synchronous (a capability lookup); ``authenticate``
9
+ is a coroutine that presents the system prompt and resolves to ``True``
10
+ on success or ``False`` when the user fails or cancels the prompt.
11
+
12
+ Example:
13
+ ```python
14
+ import pythonnative as pn
15
+
16
+ async def unlock():
17
+ if await pn.Biometrics.authenticate("Unlock your vault"):
18
+ show_secrets()
19
+ ```
20
+ """
21
+
22
+ from __future__ import annotations
23
+
24
+ from .registry import native_module
25
+
26
+
27
+ class Biometrics:
28
+ """Biometric authentication interface.
29
+
30
+ Raises:
31
+ NativeModuleError: If the native module fails.
32
+ """
33
+
34
+ @staticmethod
35
+ def is_available() -> bool:
36
+ """Return ``True`` when biometric auth can be attempted (enrolled hardware; ``False`` off device)."""
37
+ return bool(native_module("Biometrics").call("is_available"))
38
+
39
+ @staticmethod
40
+ async def authenticate(reason: str = "Authenticate") -> bool:
41
+ """Present the biometric prompt; resolve ``True`` on success, ``False`` on failure or cancel."""
42
+ return bool(await native_module("Biometrics").call_async("authenticate", reason=reason))