pythonnative 0.37.0__tar.gz → 0.38.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 (317) hide show
  1. {pythonnative-0.37.0/src/pythonnative.egg-info → pythonnative-0.38.0}/PKG-INFO +8 -8
  2. {pythonnative-0.37.0 → pythonnative-0.38.0}/README.md +4 -1
  3. {pythonnative-0.37.0 → pythonnative-0.38.0}/pyproject.toml +14 -16
  4. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/__init__.py +9 -1
  5. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/alerts.py +6 -14
  6. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/cli/pn.py +96 -10
  7. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/components/_base.py +31 -0
  8. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/components/controls.py +19 -16
  9. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/components/layout.py +5 -8
  10. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/components/lists.py +6 -6
  11. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/gestures.py +27 -6
  12. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/__init__.py +19 -0
  13. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/battery.py +13 -14
  14. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/biometrics.py +12 -14
  15. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/camera.py +10 -6
  16. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/clipboard.py +9 -11
  17. pythonnative-0.38.0/src/pythonnative/native_modules/file_system.py +145 -0
  18. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/haptics.py +14 -10
  19. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/linking.py +9 -8
  20. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/location.py +10 -12
  21. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/net_info.py +1 -4
  22. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/notifications.py +25 -32
  23. pythonnative-0.38.0/src/pythonnative/native_modules/permissions.py +108 -0
  24. pythonnative-0.38.0/src/pythonnative/native_modules/secure_store.py +52 -0
  25. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/share.py +5 -5
  26. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/navigation/__init__.py +2 -1
  27. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/navigation/hooks.py +46 -7
  28. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/navigation/state.py +30 -9
  29. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/project/android.py +23 -0
  30. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/project/builder.py +64 -35
  31. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/project/config.py +84 -24
  32. pythonnative-0.38.0/src/pythonnative/project/deps.py +703 -0
  33. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/project/doctor.py +53 -4
  34. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/project/runtime_assets.py +13 -14
  35. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/style.py +94 -44
  36. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/build.gradle +5 -2
  37. pythonnative-0.38.0/src/pythonnative/templates/android_template/build.gradle +10 -0
  38. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.properties +1 -1
  39. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/modules/PermissionsModule.kt +15 -4
  40. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Modules/PermissionModules.swift +25 -10
  41. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_template/PythonRuntime.swift +3 -2
  42. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_template.xcodeproj/project.pbxproj +35 -9
  43. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/utils.py +22 -27
  44. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/virtual_rows.py +10 -20
  45. {pythonnative-0.37.0 → pythonnative-0.38.0/src/pythonnative.egg-info}/PKG-INFO +8 -8
  46. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative.egg-info/SOURCES.txt +1 -0
  47. pythonnative-0.38.0/src/pythonnative.egg-info/requires.txt +4 -0
  48. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_animated_graph.py +2 -2
  49. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_appearance.py +21 -4
  50. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_bridge.py +15 -1
  51. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_cli.py +153 -0
  52. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_gestures.py +21 -0
  53. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_native_lists.py +2 -2
  54. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_native_modules.py +107 -2
  55. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_navigation.py +42 -1
  56. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_new_components.py +27 -14
  57. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_style.py +17 -2
  58. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_utils.py +5 -2
  59. pythonnative-0.37.0/src/pythonnative/native_modules/file_system.py +0 -236
  60. pythonnative-0.37.0/src/pythonnative/native_modules/permissions.py +0 -60
  61. pythonnative-0.37.0/src/pythonnative/native_modules/secure_store.py +0 -56
  62. pythonnative-0.37.0/src/pythonnative/templates/android_template/build.gradle +0 -7
  63. pythonnative-0.37.0/src/pythonnative.egg-info/requires.txt +0 -8
  64. {pythonnative-0.37.0 → pythonnative-0.38.0}/LICENSE +0 -0
  65. {pythonnative-0.37.0 → pythonnative-0.38.0}/setup.cfg +0 -0
  66. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/_ios_log.py +0 -0
  67. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/animated.py +0 -0
  68. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/appearance.py +0 -0
  69. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/bootstrap.py +0 -0
  70. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/bridge/__init__.py +0 -0
  71. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/bridge/android.py +0 -0
  72. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/bridge/codec.py +0 -0
  73. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/bridge/fake.py +0 -0
  74. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/bridge/ios.py +0 -0
  75. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/cli/__init__.py +0 -0
  76. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/component.py +0 -0
  77. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/components/__init__.py +0 -0
  78. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/components/media.py +0 -0
  79. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/components/overlays.py +0 -0
  80. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/components/pressable.py +0 -0
  81. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/components/structural.py +0 -0
  82. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/components/text.py +0 -0
  83. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/diagnostics.py +0 -0
  84. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/element.py +0 -0
  85. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/events.py +0 -0
  86. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/hooks.py +0 -0
  87. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/hosts/__init__.py +0 -0
  88. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/hosts/base.py +0 -0
  89. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/hosts/desktop.py +0 -0
  90. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/hosts/native.py +0 -0
  91. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/hot_reload.py +0 -0
  92. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/images.py +0 -0
  93. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/layout.py +0 -0
  94. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/mutations.py +0 -0
  95. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/app_state.py +0 -0
  96. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/desktop.py +0 -0
  97. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_modules/registry.py +0 -0
  98. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_views/__init__.py +0 -0
  99. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_views/base.py +0 -0
  100. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_views/bridge_backend.py +0 -0
  101. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/native_views/desktop.py +0 -0
  102. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/navigation/container.py +0 -0
  103. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/navigation/handle.py +0 -0
  104. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/navigation/host.py +0 -0
  105. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/navigation/linking.py +0 -0
  106. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/navigation/navigators.py +0 -0
  107. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/navigation/screen.py +0 -0
  108. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/net.py +0 -0
  109. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/platform.py +0 -0
  110. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/platform_metrics.py +0 -0
  111. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/preview.py +0 -0
  112. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/project/__init__.py +0 -0
  113. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/project/devices.py +0 -0
  114. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/project/icons.py +0 -0
  115. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/project/ios.py +0 -0
  116. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/project/permissions.py +0 -0
  117. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/project/plugins.py +0 -0
  118. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/py.typed +0 -0
  119. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/reconciler/__init__.py +0 -0
  120. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/reconciler/boundaries.py +0 -0
  121. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/reconciler/children.py +0 -0
  122. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/reconciler/core.py +0 -0
  123. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/reconciler/layout_pass.py +0 -0
  124. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/reconciler/vnode.py +0 -0
  125. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/runtime.py +0 -0
  126. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/scheduler.py +0 -0
  127. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/sdk/__init__.py +0 -0
  128. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/sdk/_components.py +0 -0
  129. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/storage.py +0 -0
  130. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/suspense.py +0 -0
  131. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/proguard-rules.pro +0 -0
  132. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/androidTest/java/com/pythonnative/android_template/ExampleInstrumentedTest.kt +0 -0
  133. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/AndroidManifest.xml +0 -0
  134. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt +0 -0
  135. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/ScreenFragment.kt +0 -0
  136. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/drawable/ic_launcher_background.xml +0 -0
  137. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +0 -0
  138. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/layout/activity_main.xml +0 -0
  139. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +0 -0
  140. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +0 -0
  141. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher.webp +0 -0
  142. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp +0 -0
  143. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher.webp +0 -0
  144. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp +0 -0
  145. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher.webp +0 -0
  146. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp +0 -0
  147. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp +0 -0
  148. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp +0 -0
  149. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp +0 -0
  150. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp +0 -0
  151. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/navigation/nav_graph.xml +0 -0
  152. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/values/colors.xml +0 -0
  153. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/values/strings.xml +0 -0
  154. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/values/themes.xml +0 -0
  155. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/values-night/themes.xml +0 -0
  156. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/xml/backup_rules.xml +0 -0
  157. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/main/res/xml/data_extraction_rules.xml +0 -0
  158. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/app/src/test/java/com/pythonnative/android_template/ExampleUnitTest.kt +0 -0
  159. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.jar +0 -0
  160. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/gradle.properties +0 -0
  161. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/gradlew +0 -0
  162. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/gradlew.bat +0 -0
  163. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/build.gradle +0 -0
  164. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/AndroidManifest.xml +0 -0
  165. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/PNBridge.kt +0 -0
  166. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/PythonHost.kt +0 -0
  167. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/animation/AnimationSpecs.kt +0 -0
  168. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/animation/PNAnimator.kt +0 -0
  169. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/bridge/JsonUtil.kt +0 -0
  170. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/bridge/MainThread.kt +0 -0
  171. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/bridge/PNLog.kt +0 -0
  172. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/bridge/PNRegistry.kt +0 -0
  173. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/bridge/PNTransaction.kt +0 -0
  174. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/bridge/TransactionApplier.kt +0 -0
  175. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/bridge/ViewRegistry.kt +0 -0
  176. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/components/BuiltinComponents.kt +0 -0
  177. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/components/ButtonManager.kt +0 -0
  178. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/components/ComponentManager.kt +0 -0
  179. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/components/ContainerManagers.kt +0 -0
  180. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/components/ControlManagers.kt +0 -0
  181. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/components/DatePickerManager.kt +0 -0
  182. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/components/ImageLoader.kt +0 -0
  183. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/components/ImageManager.kt +0 -0
  184. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/components/ModalManager.kt +0 -0
  185. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/components/PNColor.kt +0 -0
  186. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/components/PickerManager.kt +0 -0
  187. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/components/PortalManager.kt +0 -0
  188. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/components/PressableManager.kt +0 -0
  189. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/components/ScrollViewManager.kt +0 -0
  190. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/components/SegmentedControlManager.kt +0 -0
  191. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/components/StatusBarManager.kt +0 -0
  192. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/components/TabBarManager.kt +0 -0
  193. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/components/TextInputManager.kt +0 -0
  194. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/components/TextManager.kt +0 -0
  195. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/components/ViewStyler.kt +0 -0
  196. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/components/VirtualListManager.kt +0 -0
  197. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/components/WebViewManager.kt +0 -0
  198. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/gestures/GestureArbiter.kt +0 -0
  199. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/gestures/GestureCoordinator.kt +0 -0
  200. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/gestures/GestureRecognizers.kt +0 -0
  201. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/modules/BuiltinModules.kt +0 -0
  202. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/modules/DeviceModules.kt +0 -0
  203. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/modules/HostModule.kt +0 -0
  204. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/modules/MediaModules.kt +0 -0
  205. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/modules/NativeModule.kt +0 -0
  206. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/modules/NotificationsModule.kt +0 -0
  207. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/modules/StorageModules.kt +0 -0
  208. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/modules/SystemModules.kt +0 -0
  209. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/plugins/GeneratedPlugins.kt +0 -0
  210. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/screens/Navigator.kt +0 -0
  211. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/screens/PNScreenFragment.kt +0 -0
  212. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/screens/ScreenRegistry.kt +0 -0
  213. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/views/PNAccessibilityDelegate.kt +0 -0
  214. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/views/PNBorderDrawable.kt +0 -0
  215. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/views/PNEditText.kt +0 -0
  216. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/views/PNFrameLayout.kt +0 -0
  217. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/main/java/com/pythonnative/runtime/views/PNVirtualListView.java +0 -0
  218. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/test/java/com/pythonnative/runtime/AnimationSpecsTest.kt +0 -0
  219. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/test/java/com/pythonnative/runtime/GestureArbiterTest.kt +0 -0
  220. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/test/java/com/pythonnative/runtime/PNColorTest.kt +0 -0
  221. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/test/java/com/pythonnative/runtime/PNTransactionTest.kt +0 -0
  222. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/pythonnative/src/test/java/com/pythonnative/runtime/PromiseTest.kt +0 -0
  223. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/android_template/settings.gradle +0 -0
  224. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Package.swift +0 -0
  225. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Animation/PNAnimator.swift +0 -0
  226. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Bridge/PNBridge.swift +0 -0
  227. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Bridge/PNRegistry.swift +0 -0
  228. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Bridge/PNTransaction.swift +0 -0
  229. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Bridge/PNViewRegistry.swift +0 -0
  230. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNButtonManagers.swift +0 -0
  231. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNColor.swift +0 -0
  232. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNComponentManager.swift +0 -0
  233. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNContainerView.swift +0 -0
  234. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNControlManagers.swift +0 -0
  235. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNImageManager.swift +0 -0
  236. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNOverlayManagers.swift +0 -0
  237. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNPressableManager.swift +0 -0
  238. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNScrollViewManager.swift +0 -0
  239. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNTabBarManager.swift +0 -0
  240. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNTextInputManager.swift +0 -0
  241. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNTextManager.swift +0 -0
  242. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNTransform.swift +0 -0
  243. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNViewManager.swift +0 -0
  244. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNViewState.swift +0 -0
  245. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNViewStyler.swift +0 -0
  246. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNVirtualListManager.swift +0 -0
  247. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Components/PNWebViewManager.swift +0 -0
  248. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Gestures/PNGestureCoordinator.swift +0 -0
  249. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Modules/AlertModule.swift +0 -0
  250. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Modules/HostModule.swift +0 -0
  251. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Modules/LifecycleModules.swift +0 -0
  252. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Modules/MediaModules.swift +0 -0
  253. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Modules/PNNativeModule.swift +0 -0
  254. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Modules/SystemModules.swift +0 -0
  255. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Plugins/PNPluginRegistration.swift +0 -0
  256. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Screens/PNScreenRegistry.swift +0 -0
  257. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Screens/PNViewController.swift +0 -0
  258. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Support/PNCompat.swift +0 -0
  259. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Support/PNJSON.swift +0 -0
  260. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Support/PNLog.swift +0 -0
  261. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Sources/PythonNativeKit/Support/PNWindow.swift +0 -0
  262. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Tests/PythonNativeKitTests/PNColorTests.swift +0 -0
  263. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Tests/PythonNativeKitTests/PNGestureTests.swift +0 -0
  264. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Tests/PythonNativeKitTests/PNManagerTests.swift +0 -0
  265. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Tests/PythonNativeKitTests/PNModuleTests.swift +0 -0
  266. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/PythonNativeKit/Tests/PythonNativeKitTests/PNTransactionTests.swift +0 -0
  267. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_template/AppDelegate.swift +0 -0
  268. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_template/Assets.xcassets/AccentColor.colorset/Contents.json +0 -0
  269. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_template/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -0
  270. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_template/Assets.xcassets/Contents.json +0 -0
  271. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_template/Base.lproj/LaunchScreen.storyboard +0 -0
  272. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_template/BridgingHeader.h +0 -0
  273. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_template/Info.plist +0 -0
  274. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_template/SceneDelegate.swift +0 -0
  275. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_template/ViewController.swift +0 -0
  276. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_template.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -0
  277. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_templateTests/ios_templateTests.swift +0 -0
  278. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITests.swift +0 -0
  279. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITestsLaunchTests.swift +0 -0
  280. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/testing/__init__.py +0 -0
  281. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/testing/backend.py +0 -0
  282. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative/testing/harness.py +0 -0
  283. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative.egg-info/dependency_links.txt +0 -0
  284. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative.egg-info/entry_points.txt +0 -0
  285. {pythonnative-0.37.0 → pythonnative-0.38.0}/src/pythonnative.egg-info/top_level.txt +0 -0
  286. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_alert.py +0 -0
  287. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_animated.py +0 -0
  288. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_async_hooks.py +0 -0
  289. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_components.py +0 -0
  290. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_core_semantics.py +0 -0
  291. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_desktop_backend.py +0 -0
  292. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_element.py +0 -0
  293. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_events.py +0 -0
  294. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_extended_components.py +0 -0
  295. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_gesture_composition.py +0 -0
  296. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_hooks.py +0 -0
  297. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_hosts.py +0 -0
  298. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_hot_reload.py +0 -0
  299. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_images.py +0 -0
  300. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_incremental_render.py +0 -0
  301. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_interaction_props.py +0 -0
  302. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_ios_log.py +0 -0
  303. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_layout.py +0 -0
  304. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_metric_hooks.py +0 -0
  305. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_mutations.py +0 -0
  306. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_native_views.py +0 -0
  307. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_net.py +0 -0
  308. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_platform.py +0 -0
  309. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_platform_metrics.py +0 -0
  310. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_reconciler.py +0 -0
  311. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_ref.py +0 -0
  312. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_runtime.py +0 -0
  313. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_sdk.py +0 -0
  314. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_smoke.py +0 -0
  315. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_storage.py +0 -0
  316. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_suspense.py +0 -0
  317. {pythonnative-0.37.0 → pythonnative-0.38.0}/tests/test_transitions.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pythonnative
3
- Version: 0.37.0
3
+ Version: 0.38.0
4
4
  Summary: Cross-platform native UI toolkit for Android and iOS
5
5
  Author: Owen Carey
6
6
  License: MIT License
@@ -34,16 +34,13 @@ Classifier: Intended Audience :: Developers
34
34
  Classifier: License :: OSI Approved :: MIT License
35
35
  Classifier: Programming Language :: Python :: 3
36
36
  Classifier: Programming Language :: Python :: 3 :: Only
37
- Classifier: Programming Language :: Python :: 3.10
38
- Classifier: Programming Language :: Python :: 3.11
39
- Classifier: Programming Language :: Python :: 3.12
37
+ Classifier: Programming Language :: Python :: 3.13
38
+ Classifier: Programming Language :: Python :: 3.14
40
39
  Classifier: Topic :: Software Development :: User Interfaces
41
- Requires-Python: >=3.10
40
+ Requires-Python: >=3.13
42
41
  Description-Content-Type: text/markdown
43
42
  License-File: LICENSE
44
43
  Requires-Dist: requests>=2.31.0
45
- Requires-Dist: tomli>=2.0; python_version < "3.11"
46
- Requires-Dist: typing_extensions>=4.4; python_version < "3.11"
47
44
  Provides-Extra: build
48
45
  Requires-Dist: Pillow>=10.0; extra == "build"
49
46
  Dynamic: license-file
@@ -86,7 +83,7 @@ PythonNative is a cross-platform toolkit for building native Android and iOS app
86
83
  - **Hooks and function components:** Manage state with `use_state`, side effects with `use_effect` / `use_layout_effect`, refs and imperative handles with `use_ref` / `use_imperative_handle`, and navigation with `use_navigation`, all through one consistent pattern. Components can return a single element, a list of siblings, or `None`, and `Fragment`, `Portal`, and reactive `Provider` context work the way they do in React.
87
84
  - **Async-first rendering:** One `asyncio` event loop runs the whole framework on the platform's main thread. Components can be `async def` and `await` data directly in the body; `Suspense` boundaries show declarative loading states while they wait. `use_resource` fetches during render, `use_effect` accepts coroutine callbacks (cancelled automatically on unmount), `lazy` code-splits components, and `use_transition` / `use_deferred_value` keep the UI responsive during expensive updates.
88
85
  - **Developer feedback that finds your bugs:** In dev mode (`pn preview`, hot reload, or `PN_DEV=1`), uncaught errors from renders, effects, and event handlers show a full-screen RedBox with the traceback; unknown style keys and duplicate list keys print "did you mean" warnings; and conditional hooks raise a `HookOrderError` at the source instead of silently cross-wiring state.
89
- - **Typed `style` prop:** Pass all visual and layout properties through a single `style` dict, fully described by the `pn.Style` `TypedDict` and the ergonomic `pn.style(...)` helper for IDE autocomplete and static checking. Compose reusable styles with `StyleSheet`.
86
+ - **Typed `style` prop and theme:** Pass all visual and layout properties through a single `style` dict, fully described by the `pn.Style` `TypedDict` and the ergonomic `pn.style(...)` helper for IDE autocomplete and static checking. Compose reusable styles with `StyleSheet`, and read design tokens from a typed, immutable `pn.Theme` via `use_theme()` that follows light and dark mode by default.
90
87
  - **Cross-platform flexbox engine:** A pure-Python, Yoga-style layout engine computes frames once and applies them to native views, so `flex`, `padding`, `aspect_ratio`, and `position: "absolute"` produce the same geometry on Android and iOS.
91
88
  - **Virtual view tree + reconciler:** Element trees are diffed and patched with minimal native mutations, similar to React's reconciliation. Each commit lands as **one batched transaction** of mutation ops, and event callbacks are routed through a tag-based registry so re-renders that only change closures cost zero native calls. State updates re-render **locally**: only the component whose state changed (and its subtree) re-runs, and unchanged leaves reuse cached intrinsic measurements, so deep UIs stay responsive instead of re-rendering the whole app from the root on every tap.
92
89
  - **Native-driven animations:** The `Animated` API (timing / spring / decay / loop / stagger, awaitable or fire-and-forget) hands animations to Core Animation and `ViewPropertyAnimator` whenever possible, so no Python code runs per frame; a pure-Python ticker covers the rest. `interpolate`, arithmetic operators on animated nodes, `Animated.event` scroll binding, and `diff_clamp` cover the scroll-driven patterns (collapsing headers, parallax) that define native feel.
@@ -95,6 +92,7 @@ PythonNative is a cross-platform toolkit for building native Android and iOS app
95
92
  - **Native rendering core:** each commit is one serialized transaction applied by Swift and Kotlin component managers, the same shape as React Native's Fabric. Device APIs are native modules registered by name (TurboModules-style), callable from thin Python facades.
96
93
  - **Custom-component SDK:** Wrap any platform widget as a first-class element with type-checked props via `pythonnative.sdk` (`Props`, `@native_component`, `element_factory`). Plugins distributed on PyPI auto-register through the `pythonnative.handlers` entry-point group.
97
94
  - **CLI scaffolding:** `pn init` creates a ready-to-run project; `pn run android` and `pn run ios` build and launch your app.
95
+ - **PyPI packages, binary wheels included:** List requirements in `pythonnative.toml` and the CLI resolves them for the *device* (iOS wheels via PEP 730 and BeeWare's index, Android wheels via PEP 738 and Chaquopy), bundling numpy, Pillow, cryptography, and friends alongside pure-Python packages. `pn deps` reports what each target resolves to before you build, and a weekly-checked compatibility matrix keeps the docs honest.
98
96
  - **Instant desktop preview:** `pn preview` renders your app in a native desktop window via Tkinter with Fast Refresh on every save: iterate on layout, state, and navigation in milliseconds without booting a simulator or device. The reconciler, hooks, layout engine, and navigation are the same code that ships to the phone.
99
97
  - **Native-backed navigation:** Declarative `Stack`, `Tab`, and `Drawer` navigators inspired by React Navigation. The root stack drives the platform's native navigation controller (`UINavigationController` on iOS, AndroidX Navigation Component on Android), so transitions, back gestures, and the hardware back button match what users expect; `use_back_handler` intercepts the back action when a screen needs to.
100
98
  - **Fast Refresh hot reload:** `pn run --hot-reload` watches `app/` and patches edits into the running app on save, preserving component state across most changes.
@@ -104,6 +102,8 @@ PythonNative is a cross-platform toolkit for building native Android and iOS app
104
102
 
105
103
  ### Installation
106
104
 
105
+ Requires Python 3.13 or newer.
106
+
107
107
  ```bash
108
108
  pip install pythonnative
109
109
  ```
@@ -36,7 +36,7 @@ PythonNative is a cross-platform toolkit for building native Android and iOS app
36
36
  - **Hooks and function components:** Manage state with `use_state`, side effects with `use_effect` / `use_layout_effect`, refs and imperative handles with `use_ref` / `use_imperative_handle`, and navigation with `use_navigation`, all through one consistent pattern. Components can return a single element, a list of siblings, or `None`, and `Fragment`, `Portal`, and reactive `Provider` context work the way they do in React.
37
37
  - **Async-first rendering:** One `asyncio` event loop runs the whole framework on the platform's main thread. Components can be `async def` and `await` data directly in the body; `Suspense` boundaries show declarative loading states while they wait. `use_resource` fetches during render, `use_effect` accepts coroutine callbacks (cancelled automatically on unmount), `lazy` code-splits components, and `use_transition` / `use_deferred_value` keep the UI responsive during expensive updates.
38
38
  - **Developer feedback that finds your bugs:** In dev mode (`pn preview`, hot reload, or `PN_DEV=1`), uncaught errors from renders, effects, and event handlers show a full-screen RedBox with the traceback; unknown style keys and duplicate list keys print "did you mean" warnings; and conditional hooks raise a `HookOrderError` at the source instead of silently cross-wiring state.
39
- - **Typed `style` prop:** Pass all visual and layout properties through a single `style` dict, fully described by the `pn.Style` `TypedDict` and the ergonomic `pn.style(...)` helper for IDE autocomplete and static checking. Compose reusable styles with `StyleSheet`.
39
+ - **Typed `style` prop and theme:** Pass all visual and layout properties through a single `style` dict, fully described by the `pn.Style` `TypedDict` and the ergonomic `pn.style(...)` helper for IDE autocomplete and static checking. Compose reusable styles with `StyleSheet`, and read design tokens from a typed, immutable `pn.Theme` via `use_theme()` that follows light and dark mode by default.
40
40
  - **Cross-platform flexbox engine:** A pure-Python, Yoga-style layout engine computes frames once and applies them to native views, so `flex`, `padding`, `aspect_ratio`, and `position: "absolute"` produce the same geometry on Android and iOS.
41
41
  - **Virtual view tree + reconciler:** Element trees are diffed and patched with minimal native mutations, similar to React's reconciliation. Each commit lands as **one batched transaction** of mutation ops, and event callbacks are routed through a tag-based registry so re-renders that only change closures cost zero native calls. State updates re-render **locally**: only the component whose state changed (and its subtree) re-runs, and unchanged leaves reuse cached intrinsic measurements, so deep UIs stay responsive instead of re-rendering the whole app from the root on every tap.
42
42
  - **Native-driven animations:** The `Animated` API (timing / spring / decay / loop / stagger, awaitable or fire-and-forget) hands animations to Core Animation and `ViewPropertyAnimator` whenever possible, so no Python code runs per frame; a pure-Python ticker covers the rest. `interpolate`, arithmetic operators on animated nodes, `Animated.event` scroll binding, and `diff_clamp` cover the scroll-driven patterns (collapsing headers, parallax) that define native feel.
@@ -45,6 +45,7 @@ PythonNative is a cross-platform toolkit for building native Android and iOS app
45
45
  - **Native rendering core:** each commit is one serialized transaction applied by Swift and Kotlin component managers, the same shape as React Native's Fabric. Device APIs are native modules registered by name (TurboModules-style), callable from thin Python facades.
46
46
  - **Custom-component SDK:** Wrap any platform widget as a first-class element with type-checked props via `pythonnative.sdk` (`Props`, `@native_component`, `element_factory`). Plugins distributed on PyPI auto-register through the `pythonnative.handlers` entry-point group.
47
47
  - **CLI scaffolding:** `pn init` creates a ready-to-run project; `pn run android` and `pn run ios` build and launch your app.
48
+ - **PyPI packages, binary wheels included:** List requirements in `pythonnative.toml` and the CLI resolves them for the *device* (iOS wheels via PEP 730 and BeeWare's index, Android wheels via PEP 738 and Chaquopy), bundling numpy, Pillow, cryptography, and friends alongside pure-Python packages. `pn deps` reports what each target resolves to before you build, and a weekly-checked compatibility matrix keeps the docs honest.
48
49
  - **Instant desktop preview:** `pn preview` renders your app in a native desktop window via Tkinter with Fast Refresh on every save: iterate on layout, state, and navigation in milliseconds without booting a simulator or device. The reconciler, hooks, layout engine, and navigation are the same code that ships to the phone.
49
50
  - **Native-backed navigation:** Declarative `Stack`, `Tab`, and `Drawer` navigators inspired by React Navigation. The root stack drives the platform's native navigation controller (`UINavigationController` on iOS, AndroidX Navigation Component on Android), so transitions, back gestures, and the hardware back button match what users expect; `use_back_handler` intercepts the back action when a screen needs to.
50
51
  - **Fast Refresh hot reload:** `pn run --hot-reload` watches `app/` and patches edits into the running app on save, preserving component state across most changes.
@@ -54,6 +55,8 @@ PythonNative is a cross-platform toolkit for building native Android and iOS app
54
55
 
55
56
  ### Installation
56
57
 
58
+ Requires Python 3.13 or newer.
59
+
57
60
  ```bash
58
61
  pip install pythonnative
59
62
  ```
@@ -4,13 +4,17 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pythonnative"
7
- version = "0.37.0"
7
+ version = "0.38.0"
8
8
  description = "Cross-platform native UI toolkit for Android and iOS"
9
9
  authors = [
10
10
  { name = "Owen Carey" }
11
11
  ]
12
12
  readme = "README.md"
13
- requires-python = ">=3.10"
13
+ # The host interpreter must match the embedded runtime (app.python_version)
14
+ # for device builds, and the embedded runtimes are 3.13 and 3.14: CPython
15
+ # gained official iOS support (PEP 730) and Android support (PEP 738) in
16
+ # 3.13, which is what makes binary wheels from PyPI installable at all.
17
+ requires-python = ">=3.13"
14
18
  license = { file = "LICENSE" }
15
19
  classifiers = [
16
20
  "Development Status :: 2 - Pre-Alpha",
@@ -18,15 +22,12 @@ classifiers = [
18
22
  "License :: OSI Approved :: MIT License",
19
23
  "Programming Language :: Python :: 3",
20
24
  "Programming Language :: Python :: 3 :: Only",
21
- "Programming Language :: Python :: 3.10",
22
- "Programming Language :: Python :: 3.11",
23
- "Programming Language :: Python :: 3.12",
25
+ "Programming Language :: Python :: 3.13",
26
+ "Programming Language :: Python :: 3.14",
24
27
  "Topic :: Software Development :: User Interfaces",
25
28
  ]
26
29
  dependencies = [
27
30
  "requests>=2.31.0",
28
- "tomli>=2.0; python_version < '3.11'",
29
- "typing_extensions>=4.4; python_version < '3.11'",
30
31
  ]
31
32
 
32
33
  [project.optional-dependencies]
@@ -44,10 +45,10 @@ dev = [
44
45
  "pytest>=8.0",
45
46
  "pytest-asyncio>=0.23",
46
47
  "Pillow>=10.0",
47
- # `pn run ios` shells out to `sys.executable -m pip` to vendor the
48
- # app's [requirements].packages (project/builder.py), and the test
49
- # suite exercises that path. `uv sync` does not seed pip the way
50
- # `uv venv --seed` did.
48
+ # `pn deps` and `pn run ios` shell out to `sys.executable -m pip` to
49
+ # resolve and vendor the app's [requirements].packages for the device
50
+ # platform tags (project/deps.py), and the test suite exercises that
51
+ # path. `uv sync` does not seed pip the way `uv venv --seed` did.
51
52
  "pip>=24.0",
52
53
  ]
53
54
  docs = [
@@ -95,7 +96,7 @@ pythonnative = [
95
96
  ]
96
97
 
97
98
  [tool.ruff]
98
- target-version = "py39"
99
+ target-version = "py313"
99
100
  line-length = 120
100
101
  extend-exclude = [
101
102
  "templates",
@@ -136,10 +137,7 @@ convention = "google"
136
137
 
137
138
  [tool.black]
138
139
  line-length = 120
139
- target-version = ['py39']
140
-
141
- [tool.pytest.ini_options]
142
- asyncio_mode = "auto"
140
+ target-version = ['py313']
143
141
 
144
142
  # ── Semantic Release ────────────────────────────────────────────────
145
143
 
@@ -62,7 +62,7 @@ Example:
62
62
  ```
63
63
  """
64
64
 
65
- __version__ = "0.37.0"
65
+ __version__ = "0.38.0"
66
66
 
67
67
  from . import appearance, diagnostics, gestures, images, runtime, sdk
68
68
  from .alerts import Alert
@@ -190,6 +190,7 @@ from .style import (
190
190
  AutoCapitalize,
191
191
  Color,
192
192
  Dimension,
193
+ Display,
193
194
  EdgeInsets,
194
195
  FlexDirection,
195
196
  FlexWrap,
@@ -198,6 +199,7 @@ from .style import (
198
199
  KeyboardType,
199
200
  LayoutDirection,
200
201
  Overflow,
202
+ PointerEvents,
201
203
  Position,
202
204
  ReturnKeyType,
203
205
  ScaleType,
@@ -207,6 +209,8 @@ from .style import (
207
209
  StyleSheet,
208
210
  TextAlign,
209
211
  TextDecoration,
212
+ TextTransform,
213
+ Theme,
210
214
  ThemeContext,
211
215
  TransformSpec,
212
216
  default_theme,
@@ -314,6 +318,7 @@ __all__ = [
314
318
  "DEFAULT_DARK_THEME",
315
319
  "DEFAULT_LIGHT_THEME",
316
320
  "Dimension",
321
+ "Display",
317
322
  "EdgeInsets",
318
323
  "FlexDirection",
319
324
  "FlexWrap",
@@ -322,6 +327,7 @@ __all__ = [
322
327
  "KeyboardType",
323
328
  "LayoutDirection",
324
329
  "Overflow",
330
+ "PointerEvents",
325
331
  "Position",
326
332
  "ReturnKeyType",
327
333
  "ScaleType",
@@ -331,6 +337,8 @@ __all__ = [
331
337
  "StyleSheet",
332
338
  "TextAlign",
333
339
  "TextDecoration",
340
+ "TextTransform",
341
+ "Theme",
334
342
  "ThemeContext",
335
343
  "TransformSpec",
336
344
  "default_theme",
@@ -56,12 +56,9 @@ async def _present(
56
56
  implementation records the call and answers from the queue set by
57
57
  [`Alert.set_test_response`][pythonnative.alerts.Alert.set_test_response].
58
58
  """
59
- try:
60
- result = await native_module("Alert").call_async(
61
- "present", title=title, message=message, buttons=buttons, style=style
62
- )
63
- except Exception:
64
- return -1
59
+ result = await native_module("Alert").call_async(
60
+ "present", title=title, message=message, buttons=buttons, style=style
61
+ )
65
62
  try:
66
63
  return int(result)
67
64
  except (TypeError, ValueError):
@@ -135,14 +132,9 @@ class Alert:
135
132
  [`choose`][pythonnative.alerts.Alert.choose] and ``await``
136
133
  the result.
137
134
  """
138
- try:
139
- native_module("Alert").call(
140
- "show", title=title, message=message, buttons=[{"label": button, "style": "default"}], style="alert"
141
- )
142
- except Exception:
143
- from . import diagnostics
144
-
145
- diagnostics.swallowed("alerts.Alert.show")
135
+ native_module("Alert").call(
136
+ "show", title=title, message=message, buttons=[{"label": button, "style": "default"}], style="alert"
137
+ )
146
138
 
147
139
  @staticmethod
148
140
  async def confirm(
@@ -6,6 +6,9 @@ The console script `pn` (declared in `pyproject.toml`) dispatches to:
6
6
  ``app/``) into ``./name/``, or into the current directory when no name
7
7
  is given.
8
8
  - `pn doctor [platform]`: diagnose the local toolchain and config.
9
+ - `pn deps [platform]`: resolve ``[requirements].packages`` for every
10
+ device target and report which wheels would be used (or why a package
11
+ can't be installed), without building anything.
9
12
  - `pn preview [component]`: render the app in a desktop (Tkinter) window
10
13
  with Fast Refresh, the fast inner dev loop, no device required.
11
14
  - `pn devices [platform]`: list connected devices, emulators, and
@@ -41,6 +44,7 @@ from pathlib import Path
41
44
  from typing import Any, Dict, List, Optional, TextIO
42
45
 
43
46
  from ..project import builder as builder_mod
47
+ from ..project import deps as deps_mod
44
48
  from ..project import devices as devices_mod
45
49
  from ..project import doctor as doctor_mod
46
50
  from ..project.android import collect_logcat_filters
@@ -54,22 +58,29 @@ HOT_RELOAD_DEV_ROOT = "pythonnative_dev"
54
58
  # init
55
59
  # ======================================================================
56
60
 
57
- _MAIN_TEMPLATE = """import pythonnative as pn
61
+ _MAIN_TEMPLATE = """from typing import TypedDict
62
+
63
+ import pythonnative as pn
58
64
 
59
65
  Stack = pn.create_stack_navigator()
60
66
 
61
67
 
68
+ class DetailParams(TypedDict):
69
+ count: int
70
+
71
+
62
72
  @pn.component
63
73
  def HomeScreen():
64
74
  count, set_count = pn.use_state(0)
65
75
  nav = pn.use_navigation()
76
+ theme = pn.use_theme()
66
77
  return pn.ScrollView(
67
78
  pn.Column(
68
- pn.Text("Hello from PythonNative!", style={"font_size": 24, "bold": True}),
79
+ pn.Text("Hello from PythonNative!", style={"font_size": theme.font_size_title, "bold": True}),
69
80
  pn.Text(f"Tapped {count} times"),
70
81
  pn.Button("Tap me", on_press=lambda: set_count(count + 1)),
71
- pn.Button("Open detail", on_press=lambda: nav.navigate("Detail", {"count": count})),
72
- style={"spacing": 12, "padding": 16, "align_items": "stretch"},
82
+ pn.Button("Open detail", on_press=lambda: nav.navigate("Detail", count=count)),
83
+ style={"spacing": theme.spacing_large, "padding": 16, "align_items": "stretch"},
73
84
  )
74
85
  )
75
86
 
@@ -77,9 +88,9 @@ def HomeScreen():
77
88
  @pn.component
78
89
  def DetailScreen():
79
90
  nav = pn.use_navigation()
80
- params = pn.use_route()
91
+ route = pn.use_route(DetailParams)
81
92
  return pn.Column(
82
- pn.Text(f"Detail: count was {params.get('count', 0)}", style={"font_size": 20}),
93
+ pn.Text(f"Detail: count was {route.params['count']}", style={"font_size": 20}),
83
94
  pn.Button("Back", on_press=nav.go_back),
84
95
  style={"spacing": 12, "padding": 16},
85
96
  )
@@ -89,8 +100,8 @@ def DetailScreen():
89
100
  def App():
90
101
  return pn.NavigationContainer(
91
102
  Stack.Navigator(
92
- Stack.Screen("Home", component=HomeScreen, options={"title": "Home"}),
93
- Stack.Screen("Detail", component=DetailScreen, options={"title": "Detail"}),
103
+ Stack.Screen("Home", HomeScreen, title="Home"),
104
+ Stack.Screen("Detail", DetailScreen, title="Detail"),
94
105
  )
95
106
  )
96
107
  """
@@ -278,6 +289,56 @@ def app_id_command(args: argparse.Namespace) -> None:
278
289
  print(config.application_id if args.platform == "android" else config.bundle_id)
279
290
 
280
291
 
292
+ # ======================================================================
293
+ # deps
294
+ # ======================================================================
295
+
296
+
297
+ def deps_command(args: argparse.Namespace) -> None:
298
+ """Report how ``[requirements].packages`` resolve for each device target.
299
+
300
+ Runs pip in its cross-platform dry-run mode once per target (iOS
301
+ device, iOS Simulator, and one per Android ABI) and prints the
302
+ wheel each package would use, flagging binary wheels and their
303
+ source index. Exits non-zero when any target can't be satisfied,
304
+ so it doubles as a CI gate. ``--json`` emits the same data as a
305
+ machine-readable document.
306
+
307
+ Args:
308
+ args: Parsed namespace with optional ``platform``, ``json``, and
309
+ ``python`` (the interpreter to run pip with).
310
+ """
311
+ platform: Optional[str] = getattr(args, "platform", None)
312
+ as_json: bool = getattr(args, "json", False)
313
+ python: Optional[str] = getattr(args, "python", None)
314
+
315
+ config = _load_config_or_exit()
316
+ targets = deps_mod.targets_for(config, platform)
317
+ runner = builder_mod.SubprocessRunner()
318
+ if not as_json and config.requirements:
319
+ print(
320
+ f"Resolving {len(config.requirements)} requirement(s) for Python {config.python_version} "
321
+ f"across {len(targets)} target(s)...\n"
322
+ )
323
+ resolutions = deps_mod.resolve_all(config, targets, runner=runner, python=python)
324
+
325
+ if as_json:
326
+ print(
327
+ json.dumps(
328
+ {
329
+ "python_version": config.python_version,
330
+ "requirements": list(config.requirements),
331
+ "targets": [res.to_dict() for res in resolutions],
332
+ },
333
+ indent=2,
334
+ )
335
+ )
336
+ else:
337
+ print(deps_mod.format_report(resolutions, requirements=config.requirements))
338
+ if any(not res.ok for res in resolutions):
339
+ sys.exit(1)
340
+
341
+
281
342
  # ======================================================================
282
343
  # preview
283
344
  # ======================================================================
@@ -426,8 +487,18 @@ def run_project(args: argparse.Namespace) -> None:
426
487
  config = _load_config_or_exit()
427
488
  builder = builder_mod.Builder(config, log=print)
428
489
 
490
+ # Resolve third-party packages only for the destination being built
491
+ # (device wheels and Simulator wheels differ); prepare-only keeps both
492
+ # slices so the staged project builds for either in Xcode.
493
+ if prepare_only:
494
+ ios_sdks: tuple = deps_mod.IOS_SDKS
495
+ elif device is not None and device.kind == "device":
496
+ ios_sdks = ("iphoneos",)
497
+ else:
498
+ ios_sdks = ("iphonesimulator",)
499
+
429
500
  try:
430
- prepared = builder.prepare(platform)
501
+ prepared = builder.prepare(platform, ios_sdks=ios_sdks)
431
502
  except builder_mod.BuildError as exc:
432
503
  print(f"Error: {exc}")
433
504
  sys.exit(1)
@@ -593,7 +664,11 @@ def build_project(args: argparse.Namespace) -> None:
593
664
  sys.exit(1)
594
665
 
595
666
  try:
596
- prepared = builder.prepare(platform, release=not debug)
667
+ prepared = builder.prepare(
668
+ platform,
669
+ release=not debug,
670
+ ios_sdks=("iphonesimulator",) if debug else ("iphoneos",),
671
+ )
597
672
  if platform == "android":
598
673
  artifacts = builder.build_android(prepared, debug=debug)
599
674
  else:
@@ -1020,6 +1095,17 @@ def _build_parser() -> argparse.ArgumentParser:
1020
1095
  parser_doctor.add_argument("platform", nargs="?", choices=["android", "ios"], help="Restrict checks to a platform")
1021
1096
  parser_doctor.set_defaults(func=doctor_command)
1022
1097
 
1098
+ parser_deps = subparsers.add_parser(
1099
+ "deps", help="Check which wheels [requirements].packages resolve to on each device target"
1100
+ )
1101
+ parser_deps.add_argument("platform", nargs="?", choices=["android", "ios"], help="Restrict to a platform")
1102
+ parser_deps.add_argument("--json", action="store_true", help="Print a JSON report for scripting")
1103
+ parser_deps.add_argument(
1104
+ "--python",
1105
+ help="Interpreter to run pip with (default: the one running pn; any version works, pip cross-resolves)",
1106
+ )
1107
+ parser_deps.set_defaults(func=deps_command)
1108
+
1023
1109
  parser_preview = subparsers.add_parser("preview", help="Render the app in a desktop window")
1024
1110
  parser_preview.add_argument(
1025
1111
  "component",
@@ -76,6 +76,37 @@ def _make_element(
76
76
  return Element(name, out, list(children), key=key)
77
77
 
78
78
 
79
+ # ======================================================================
80
+ # RefreshControl attachment
81
+ # ======================================================================
82
+
83
+ REFRESH_CONTROL_TYPE = "RefreshControl"
84
+ """Element type produced by [`RefreshControl`][pythonnative.RefreshControl]."""
85
+
86
+
87
+ def _refresh_control_props(control: Optional[Element], *, owner: str) -> Optional[Dict[str, Any]]:
88
+ """Turn a ``RefreshControl`` element into the ``refresh_control`` wire prop.
89
+
90
+ Scroll containers hold their refresh control as a prop rather than
91
+ a child (the native side attaches a ``UIRefreshControl`` /
92
+ ``SwipeRefreshLayout`` to the scroll view itself), so the element
93
+ is unwrapped here into the flat dict the bridge and the event
94
+ extractor expect. Keeping it an element on the Python side means
95
+ users build it like every other piece of UI and get a clear error
96
+ if they pass the wrong thing.
97
+
98
+ Raises:
99
+ TypeError: If ``control`` is not a ``RefreshControl`` element.
100
+ """
101
+ if control is None:
102
+ return None
103
+ if not isinstance(control, Element) or control.type != REFRESH_CONTROL_TYPE:
104
+ raise TypeError(
105
+ f"{owner}(refresh_control=...) expects pn.RefreshControl(...), got {type(control).__name__}: {control!r}"
106
+ )
107
+ return dict(control.props)
108
+
109
+
79
110
  # ======================================================================
80
111
  # Rich text spans
81
112
  # ======================================================================
@@ -2,7 +2,7 @@
2
2
 
3
3
  ``Switch``, ``Slider``, ``ProgressBar``, ``ActivityIndicator``,
4
4
  ``Checkbox``, ``SegmentedControl``, ``DatePicker``, ``Picker``, the
5
- ``RefreshControl`` spec helper, and ``StatusBar``.
5
+ ``RefreshControl``, and ``StatusBar``.
6
6
  """
7
7
 
8
8
  from typing import Any, Callable, Dict, List, Literal, Optional
@@ -10,7 +10,7 @@ from typing import Any, Callable, Dict, List, Literal, Optional
10
10
  from ..element import Element
11
11
  from ..hooks import Ref
12
12
  from ..style import AccessibilityState, Color, StyleProp
13
- from ._base import _make_element
13
+ from ._base import REFRESH_CONTROL_TYPE, _make_element
14
14
 
15
15
 
16
16
  def Switch(
@@ -426,13 +426,17 @@ def RefreshControl(
426
426
  refreshing: bool = False,
427
427
  on_refresh: Optional[Callable[[], Any]] = None,
428
428
  tint_color: Optional[Color] = None,
429
- ) -> Dict[str, Any]:
430
- """Pull-to-refresh spec for [`ScrollView`][pythonnative.ScrollView] / [`FlatList`][pythonnative.FlatList].
429
+ ) -> Element:
430
+ """Pull-to-refresh control for [`ScrollView`][pythonnative.ScrollView] and the list components.
431
431
 
432
- Returns a plain dict that should be passed as the
433
- ``refresh_control=`` prop. Modeled as a dict (not an
434
- [`Element`][pythonnative.Element]) so the host scroll container can
435
- hold one without it appearing as a child node.
432
+ Pass the result as the ``refresh_control=`` prop of a
433
+ [`ScrollView`][pythonnative.ScrollView],
434
+ [`FlatList`][pythonnative.FlatList], or
435
+ [`SectionList`][pythonnative.SectionList]. It is a regular
436
+ [`Element`][pythonnative.Element] (type ``"RefreshControl"``) built
437
+ like every other piece of UI; the scroll container attaches it to
438
+ its native scroll view rather than rendering it as a child, and
439
+ rejects anything else with a ``TypeError``.
436
440
 
437
441
  Args:
438
442
  refreshing: Drive the spinner's visibility from a use_state
@@ -443,8 +447,7 @@ def RefreshControl(
443
447
  tint_color: Color of the spinner.
444
448
 
445
449
  Returns:
446
- Dict suitable for the ``refresh_control`` prop on a scroll
447
- container.
450
+ An [`Element`][pythonnative.Element] of type ``"RefreshControl"``.
448
451
 
449
452
  Example:
450
453
  ```python
@@ -467,12 +470,12 @@ def RefreshControl(
467
470
  )
468
471
  ```
469
472
  """
470
- spec: Dict[str, Any] = {"refreshing": bool(refreshing)}
471
- if on_refresh is not None:
472
- spec["on_refresh"] = on_refresh
473
- if tint_color is not None:
474
- spec["tint_color"] = tint_color
475
- return spec
473
+ return _make_element(
474
+ REFRESH_CONTROL_TYPE,
475
+ refreshing=bool(refreshing),
476
+ on_refresh=on_refresh,
477
+ tint_color=tint_color,
478
+ )
476
479
 
477
480
 
478
481
  def StatusBar(
@@ -12,7 +12,7 @@ from ..component import component
12
12
  from ..element import Element
13
13
  from ..hooks import Ref, use_keyboard_height, use_safe_area_insets, use_state
14
14
  from ..style import AccessibilityState, StyleProp, resolve_style
15
- from ._base import _make_element
15
+ from ._base import _make_element, _refresh_control_props
16
16
 
17
17
 
18
18
  def View(
@@ -281,7 +281,7 @@ def Spacer(
281
281
 
282
282
  def ScrollView(
283
283
  *children: Element,
284
- refresh_control: Optional[Dict[str, Any]] = None,
284
+ refresh_control: Optional[Element] = None,
285
285
  scroll_axis: Optional[Literal["vertical", "horizontal"]] = None,
286
286
  on_scroll: Optional[Callable[[Dict[str, float]], None]] = None,
287
287
  shows_scroll_indicator: bool = True,
@@ -302,11 +302,8 @@ def ScrollView(
302
302
 
303
303
  Args:
304
304
  *children: Child elements to scroll.
305
- refresh_control: Optional pull-to-refresh spec, typically
306
- constructed via
307
- [`RefreshControl`][pythonnative.RefreshControl]. The dict
308
- must have ``refreshing`` (bool) and ``on_refresh``
309
- (callable).
305
+ refresh_control: Optional [`RefreshControl`][pythonnative.RefreshControl]
306
+ element attached to the scroll view for pull-to-refresh.
310
307
  scroll_axis: ``"vertical"`` (default) or ``"horizontal"``.
311
308
  on_scroll: Callback invoked with ``{"x": …, "y": …}`` content
312
309
  offsets as the user scrolls.
@@ -333,7 +330,7 @@ def ScrollView(
333
330
  style=style,
334
331
  ref=ref,
335
332
  key=key,
336
- refresh_control=refresh_control,
333
+ refresh_control=_refresh_control_props(refresh_control, owner="ScrollView"),
337
334
  scroll_axis=scroll_axis,
338
335
  on_scroll=on_scroll,
339
336
  shows_scroll_indicator=False if shows_scroll_indicator is False else None,
@@ -124,7 +124,7 @@ def _VirtualizedList(
124
124
  header: Optional[Element] = None,
125
125
  footer: Optional[Element] = None,
126
126
  empty: Optional[Element] = None,
127
- refresh_control: Optional[Dict[str, Any]] = None,
127
+ refresh_control: Optional[Element] = None,
128
128
  on_end_reached: Optional[Callable[[], Any]] = None,
129
129
  on_end_reached_threshold: Optional[float] = None,
130
130
  on_viewable_items_changed: Optional[Callable[[List[Dict[str, Any]]], None]] = None,
@@ -464,7 +464,7 @@ def FlatList(
464
464
  get_item_height: Optional[Callable[[Any, int], float]] = None,
465
465
  estimated_item_height: Optional[float] = None,
466
466
  separator_height: float = 0,
467
- refresh_control: Optional[Dict[str, Any]] = None,
467
+ refresh_control: Optional[Element] = None,
468
468
  horizontal: bool = False,
469
469
  num_columns: int = 1,
470
470
  list_header: Optional[Element] = None,
@@ -509,8 +509,8 @@ def FlatList(
509
509
  estimated_item_height: Starting extent estimate for rows whose
510
510
  true size isn't known yet (default 44).
511
511
  separator_height: Gap below each row, in points.
512
- refresh_control: Optional pull-to-refresh spec from
513
- [`RefreshControl`][pythonnative.RefreshControl].
512
+ refresh_control: Optional [`RefreshControl`][pythonnative.RefreshControl]
513
+ element for pull-to-refresh.
514
514
  horizontal: Scroll horizontally (extents become widths).
515
515
  num_columns: Render items in a grid of this many columns.
516
516
  list_header: Element rendered once before all rows.
@@ -666,7 +666,7 @@ def SectionList(
666
666
  estimated_item_height: Optional[float] = None,
667
667
  section_header_height: Optional[float] = None,
668
668
  separator_height: float = 0,
669
- refresh_control: Optional[Dict[str, Any]] = None,
669
+ refresh_control: Optional[Element] = None,
670
670
  list_header: Optional[Element] = None,
671
671
  list_footer: Optional[Element] = None,
672
672
  list_empty: Optional[Element] = None,
@@ -699,7 +699,7 @@ def SectionList(
699
699
  estimated_item_height: Starting estimate for unmeasured rows.
700
700
  section_header_height: Header extent in points, when known.
701
701
  separator_height: Gap below each item, in points.
702
- refresh_control: Optional pull-to-refresh spec.
702
+ refresh_control: Optional [`RefreshControl`][pythonnative.RefreshControl] element.
703
703
  list_header: Element rendered once before everything.
704
704
  list_footer: Element rendered once after everything.
705
705
  list_empty: Element rendered when there are no sections.